ここの所EEPROMなどの実験をして来ましたその全体のプログラムです。
実験は細切れで発表して来ましたが、ここにパソコン内のプログラムを出しておきます。1.文字の書き込み、これはロータリエンコーダで文字を選択してSWを押すと画面に出て確定するもの、同時にEEPROMに書き込まれる。
2.8文字しか画面に出ない(手持ちのLCDの関係)。
3.電源を入れると、書き込んだ文字がLCDのアドレス0xC0の所に出ます。
4.途中、0xffとすると読み出しは中止して、画面はそこまでしか出ません。
5.始めにそれを書き込んで中止すると、元々プログラム内にあるこの場合[MY CALL]が画面に出ます。あまり参考にはならないかも知れませんが一応公開しておきます。PIC-15/17/18/21/22/23までのプログラムで最終実験のプログラムです。
ここの説明は各項目の所を見て下さい。写真はPIC 17と同じで、タクトSWを一つ付けているだけです。部品変更無しなので続けて実験をしていました。2007/MAY/5
;------------------------------------------------------- ; LCD Display A/D 2inputs ; 4MHz ; 2007/3/9 4/7 4/22 By M.Kikuchi ;------------------------------------------------------- list P=PIC16F819 include "P16F819.inc" __CONFIG 0x3f42 ERRORLEVEL -302 ;------------------------------------------------------- TEMP EQU 20H ;tempolary work LCD_D EQU 22H ;LCD CNT1 EQU 23H ;WAIT LOOP CNT2 EQU 24H ; CNT3 EQU 25H ; WORK1 EQU 26H ; EE_RST EQU 27H ; EE_REND EQU 28H ; LCD_ADR EQU 30H ;1 FLAG EQU 31H ;0=right 1=left for Rotary encoder K_FLAG EQU 32H ;For Key Control TEMP2 EQU 71H ;tempolary LCD_RS set 2 ;LCD Control RB2 PORTB 4-7=LCD LCD_E set 3 ;LCD Control RB3 RE_S0 set 0 ;RB0 Rotary encoder input RE_S1 set 1 ;RB1 Rotary encoder input ;------------------------------------------------------- ORG 0 BEGIN CALL PORT_INI ;PORT Start CALL LCD_INI ;LCD (Low cost type) call EE_RB ;EEPROM check movlw 80H ; subwf EE_RST,W ;write ? btfsc STATUS,Z CALL MY_CALL ;LCD MY call ;mode of Datainput movlw 0x0e ;Cusor-brink mode CALL LCD_CMD ; movlw 0x80 ;LCD-Adrress movwf LCD_ADR ; CALL LCD_CMD ; clrf K_FLAG ;------------------------------------------------------- MAIN_0 movlw '0' ;input start DATA movwf TEMP2 ; CALL LCD_DATA ; movf LCD_ADR,W ;Address back CALL LCD_CMD ; MAIN clrf FLAG call RE_CHECK ;Rotary encoder movf FLAG,F ;flag check btfsc STATUS,Z ;activ on RE ? goto M_KEY ;not to again btfss FLAG,0 ; goto MAIN_3 decf TEMP2,W ;be for character sublw ' ' btfsc STATUS,C movlw 0xff btfss STATUS,C decf TEMP2,W movwf TEMP2 MAIN_2 movf TEMP2,W CALL LCD_DATA ;LCD_SET movf LCD_ADR,W ;Address back CALL LCD_CMD ; goto M_KEY MAIN_3 incfsz TEMP2,F ;next character goto MAIN_2 movlw ' ' movwf TEMP2 goto MAIN_2 ;--------------------------------------------------- M_KEY call KEY_SW ;check SW1 btfss K_FLAG,0 ;bit0=SW1 goto MAIN ;not FLAG ; EEPROM Write movf LCD_ADR,W ;EEPROM address call EE_WR ;Write call TIME05S ; bcf K_FLAG,0 ;FLAG clr incf LCD_ADR,F movf LCD_ADR,W ;Address CALL LCD_CMD M_KEY2 goto MAIN_0 ;----------------------------------------------------------- ;W > EEADR + TEMP2(EEDATA) + EE_WR ;2004/4/20 EE_WR banksel EEADR ;bank 2 movwf EEADR movf TEMP2,W movwf EEDATA banksel EECON1 ;bank 3 bcf EECON1,EEPGD ;EEPROM bsf EECON1,WREN ;write step 1 movlw 0x55 movwf EECON2 ;step 2 movlw 0xAA movwf EECON2 ;step 3 bsf EECON1,WR ;start step 4 bcf EECON1,WREN ; EE_WRL btfsc EECON1,WR ;WR clr? step 5 goto $-1 ;no to loop banksel TEMP ;bank 0 return ;----------------------------------------------------------- ;2007/4/23 EEROM READ and to LCD ;if data='ff'to end :end address to end ;if EE_RST=0x80 :not write EE_RB movlw 0xc0 ;LCD address call LCD_CMD ;command movlw 0x80 ;start movwf EE_RST ;register movlw 0x88 ;end movwf EE_REND ;register EE_RM movf EE_RST,W ;EE address set call EE_READ ;read movwf TEMP ;keep sublw 0xff ;no data btfsc STATUS,Z ;=? goto EE_EX ;yes to movf TEMP,W ;retrun call LCD_DATA ;display incf EE_RST,F ;+1 movf EE_RST,W ;to W subwf EE_REND,W ;end of datas btfss STATUS,Z ;= goto EE_RM ;again EE_EX return ;----------------------------------------------------------- EE_READ banksel EEADR ;bank 2 movwf EEADR ;set banksel EECON1 ;bank 3 bcf EECON1,EEPGD ;EEPROM bsf EECON1,RD ;read banksel EEDATA ;bank 2 movf EEDATA,W ;data read banksel TEMP ;bank 0 return ;----------------------------------------------------------- MY_CALL movlw 0xC1 ;LCD Positin CALL LCD_CMD movlw 'J' ;LCD TEST CALL LCD_DATA movlw 'A' ;LCD TEST CALL LCD_DATA movlw '1' ;LCD TEST CALL LCD_DATA movlw 'H' ;LCD TEST CALL LCD_DATA movlw 'W' ;LCD TEST CALL LCD_DATA movlw 'O' ;LCD TEST CALL LCD_DATA call TIME05S ;WAIT call TIME05S ;WAIT RETURN ;------------------------------------------------------- KEY_SW BSF STATUS,RP0 ;Bank1 bsf TRISB,2 ;RB2 input(1) BCF STATUS,RP0 ;Bank0 call TIME07M btfss PORTB,2 ;KEY1 check bsf K_FLAG,0 ;KEY data(bit0) ; BSF STATUS,RP0 ;Bank1 bcf TRISB,2 ;RB2 output BCF STATUS,RP0 ;Bank0 return ;------------------------------------------------------- RE_CHECK clrf FLAG ;set btfsc PORTB,RE_S0 return ;exit call TIME07M btfsc PORTB,RE_S0 ;again return RE_LOOP btfss PORTB,RE_S0 goto RE_LOOP call TIME07M btfss PORTB,RE_S0 ;again goto RE_LOOP btfsc PORTB,RE_S1 ; goto RE_DOWN ;------------------------------------------------------- RE_UP bsf FLAG,0 ;right return RE_DOWN bsf FLAG,1 ;left return ;------------------------------------------------------- ; LCD Data & LCD Command W=DATA ; LCD_E=LOW(unactive) :LCD_D LCD_DATA MOVWF LCD_D ANDLW 0F0H ;mask MOVWF PORTB BSF PORTB,LCD_RS ;RS high goto LCD_C2 ;------------------------------------------------------- LCD_CMD MOVWF LCD_D ANDLW 0F0H ;hight 4bits MOVWF PORTB ; BCF PORTB,LCD_RS ;RS low LCD_C2 movf PORTB,W ;RS keep andlw 4 movwf WORK1 BSF PORTB,LCD_E ;E high nop BCF PORTB,LCD_E ;E low SWAPF LCD_D,W ;low 4bits ANDLW 0F0H iorwf WORK1,W MOVWF PORTB ; BSF PORTB,LCD_E ;E High nop BCF PORTB,LCD_E ;E Low call TIME40 ;Wait 40uS over BCF PORTB,LCD_RS ;for DATA return ;------------------------------------------------------- ; LCD start Programm LCD_INI CALL TIME5M ;5m sec*3 CALL TIME5M CALL TIME5M MOVLW 030H ;Function set 8bits mode MOVWF PORTB BCF PORTB,LCD_RS ;RS BSF PORTB,LCD_E ;E high nop BCF PORTB,LCD_E ;E low CALL TIME5M MOVLW 020H ;Function set 4bits mode MOVWF PORTB BCF PORTB,LCD_RS ;RS BSF PORTB,LCD_E nop BCF PORTB,LCD_E CALL TIME100 ;100usec ;from 4bit mode MOVLW 28H ;2 Lines CALL LCD_CMD MOVLW 0CH ;Display on D=1 Cusor=0 Blink=0 CALL LCD_CMD MOVLW 06H ;Entry I/D(Increment)=1 S=0 CALL LCD_CMD LCD_CLR ; LCD all clear MOVLW 01H CALL LCD_CMD call TIME1M6 ;over 1.64mS RETURN ; PORT start Programm ;------------------------------------------------------- PORT_INI BANKSEL ADCON1 MOVLW 0x2B ;00101011 MOVWF TRISA ;PORTA input(1) out(0) MOVLW 0x03 ;RB0 MOVWF TRISB ;PORTB movlw B'00000011' movwf ADCON1 ; ; :011x=Configure all pins as digital inputs bcf OPTION_REG,7 ;PULL UP BANKSEL PORTB CLRF PORTB RETURN ;------------------------------------------------------- ; WAIT 4MHz (1usec=1step) ; TIME40 :40usec TIME100 :100usec ; TIME1M6 :1.6msec TIME5M :5msec ;------------------------------------------------------- TIME100 ;100usec MOVLW D'31' MOVWF CNT1 GOTO T_LP1 ;(2+3*31-1+4)=98+call ;------------------------------------------------------- TIME40 ;40usec MOVLW D'11' MOVWF CNT1 T_LP1 DECFSZ CNT1,F ;2+3*11-1=34 GOTO T_LP1 NOP NOP RETURN ;34+4 =38+call ;------------------------------------------------------- TIME1M6 MOVLW 11H ;17msec for LCD GOTO TIME1M+1 TIME1M ;1msec(about) MOVLW D'10' MOVWF CNT2 T_LP2 CALL TIME100 ;2+(100)*10-1=1001 DECFSZ CNT2,F GOTO T_LP2 RETURN ;2=1014+call ;------------------------------------------------------- TIME5M ;5msec(about) MOVLW D'50' GOTO TIME1M+1 TIME07M MOVLW D'7' ;0.7msec GOTO TIME1M+1 ;------------------------------------------------------- TIME05S MOVLW D'100' ;5msec*100=0.5Sec MOVWF CNT3 T_LP3 CALL TIME5M DECFSZ CNT3,F GOTO T_LP3 RETURN ;-------------------------------------------- END
もどる [MAIN MENU]