添付: マイコン・アセンブラ・プログラム(counter_v1_1.asm) ;Timer0(1sec=12.5msec*80,12.5msec*1000/0.05/4=62500,62500/256=244.14) ;Timer1(0.5msec*1000/0.05/4=2500,2500/16=156.25→156*16=2496,2496*0.05*4/1000=0.4992) INCLUDE "P16F819.INC" LIST P=16F819 ;コンフィグ→クロック信号HS、パワーアップタイマのみオン ;セラロック20MHz __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CP_OFF ;ファイルレジスタ定義 N EQU 0x20 ON EQU 0x21 TMP EQU 0x22 W1 EQU 0x23 W2 EQU 0x24 N1 EQU 0x25 N2 EQU 0x26 N3 EQU 0x27 N4 EQU 0x28 N5 EQU 0x29 N6 EQU 0x2A N7 EQU 0x2B N8 EQU 0x2C N9 EQU 0x2D T1 EQU 0x2E T2 EQU 0x2F T3 EQU 0x30 T4 EQU 0x31 T5 EQU 0x32 T6 EQU 0x33 T7 EQU 0x34 NC EQU 0x35 BIC EQU 0x36 WB EQU 0x37 SB EQU 0x38 TU EQU 0x39 NCL EQU 0x3A NCH EQU 0x3B TM EQU 0x3C NN1 EQU 0x3D NN2 EQU 0x3E NN3 EQU 0x3F NN4 EQU 0x40 TMM EQU 0x41 TMM0 EQU 0x42 FN0 EQU 0x43 TDM EQU 0x44 SC EQU 0x45 VNCL EQU 0x46 VNCH EQU 0x47 NT1 EQU 0x48 NT2 EQU 0x49 NT3 EQU 0x4A NT4 EQU 0x4B NT5 EQU 0x4C NTL EQU 0x4D ; ORG 0 ;リセットベクタ GOTO START ORG 4 ;割込みベクタ BCF INTCON,TMR0IF ;割り込みフラグをクリア MOVWF WB ;Wレジスタ退避 SWAPF STATUS,0 ;STATUS取り出し MOVWF SB ;STATUS退避 BANKSEL TMR0 MOVLW 0x0B ;カウント値=12を再ロード MOVWF TMR0 INCF TU,1 ;TUレジスタをカウントアップ SWAPF SB,0 ;STATUS戻し MOVWF STATUS SWAPF WB,1 ;Wレジスタ戻し SWAPF WB,0 RETFIE ; START BANKSEL ADCON1 MOVLW B'10001110' ;AN0のみA入力、A/Dクロック分割なし、右詰め MOVWF ADCON1 MOVLW B'10001' ;RA0,RA4を入力ポート、RA1-RA3を出力ポート MOVWF TRISA MOVLW B'00001111' ;RB0-RB3を入力ポート、RB4-RB7を出力ポート MOVWF TRISB BANKSEL ADCON0 MOVLW B'10000000' ;A/D OFF、CH0、Fosc32 MOVWF ADCON0 BANKSEL OPTION_REG MOVLW B'10000111' ;256カウントモード指定 MOVWF OPTION_REG ;プリスケーラへ出力 BANKSEL TMR0 MOVLW 0x0B ;カウント値=12(=256-244) MOVWF TMR0 ;タイマーへ出力 BSF INTCON,TMR0IE ;タイマー割り込み許可 BSF INTCON,GIE ;全体割り込み許可 BSF PORTA,3 ;TxD=H CLRF TMR1H CLRF TMR1L ;初期設定 CLRF TM CLRF TU CLRF ON CLRF N1 CLRF N2 CLRF N3 CLRF N4 CLRF N5 CLRF N6 CLRF N7 CLRF N8 CLRF N9 CLRF T1 CLRF T2 CLRF T3 CLRF T4 CLRF T5 CLRF T6 CLRF T7 CLRF NC CLRF NCL CLRF NCH CLRF NN1 CLRF NN2 CLRF NN3 CLRF NN4 CLRF TMM CLRF TMM0 CLRF TDM CLRF SC CLRF VNCL CLRF VNCH CLRF NT1 CLRF NT2 CLRF NT3 CLRF NT4 CLRF NT5 CLRF TMR2 ;LCD表示 CALL INIT CALL DCNT CALL DTME CALL DCPM CALL DCPMU CALL HVD CALL DCHNU ; MAIN BTFSS PORTB,2 GOTO SEL1 BTFSS PORTB,3 GOTO SEL3 GOTO SEL2 SEL1 MOVLW 0x06 MOVWF NTL MOVF TU,0 ;TUレジスタが80でリセット(12.5msec*80=1sec) ADDLW 0xB0 ;0xB0=D'176',80+176=256 BTFSS STATUS,C GOTO CINI CLRF TU CALL TCNT INCF TM,1 ;TM=TM+1(sec) MOVF TM,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSC STATUS,C GOTO SEL11 GOTO CINI SEL11 ;10sec毎にカウント数の6倍をCPMとして表示 CLRF TM CALL DCPM CLRF NT1 CLRF NT2 CLRF NT3 CLRF NT4 CLRF NT5 GOTO MAIN ; SEL2 MOVLW 0x02 MOVWF NTL MOVF TU,0 ;TUレジスタが80でリセット(12.5msec*80=1sec) ADDLW 0xB0 ;0xB0=D'176',80+176=256 BTFSS STATUS,C GOTO CINI CLRF TU CALL TCNT INCF TM,1 ;TM=TM+1(sec) MOVF TM,0 ADDLW 0xE2 ;0xE2=D'226',30+226=256 BTFSC STATUS,C GOTO SEL21 GOTO CINI SEL21 ;30sec毎にカウント数の2倍をCPMとして表示 CLRF TM CALL DCPM CLRF NT1 CLRF NT2 CLRF NT3 CLRF NT4 CLRF NT5 GOTO MAIN ; SEL3 MOVLW 0x01 MOVWF NTL MOVF TU,0 ;TUレジスタが80でリセット(12.5msec*80=1sec) ADDLW 0xB0 ;0xB0=D'176',80+176=256 BTFSS STATUS,C GOTO CINI CLRF TU CALL TCNT INCF TM,1 ;TM=TM+1(sec) MOVF TM,0 ADDLW 0xC4 ;0xC4=D'196',60+196=256 BTFSC STATUS,C GOTO SEL31 GOTO CINI SEL31 ;60sec毎にカウント数をCPMとして表示 CLRF TM CALL DCPM CLRF NT1 CLRF NT2 CLRF NT3 CLRF NT4 CLRF NT5 GOTO MAIN ; CINI BTFSS PORTA,4 ;RA4がクリアならばCPASへ GOTO CPAS PRISE ;パルスの立上りを検出 BSF ON,0 ;レジスタONのビット0をセット GOTO MAIN CPAS BTFSS ON,0 ;レジスタONのビット0がクリアならばMAINへ GOTO MAIN PDOWN ;パルスの立下りを検出 MOVF TMR1H,0 ADDLW 0xED BTFSS STATUS,C ;TMR1H>=0x13+0xED=19+237=256 GOTO T1CLR MOVF TMR1L,0 ADDLW 0x78 BTFSC STATUS,C ;TMR1L>=0x88+0x78=136+120=256 GOTO CSTART ;TMR>=19*256+136=5000=1msec/(0.05usec*4) T1CLR ;TMR1リスタート CLRF TMR1H CLRF TMR1L MOVLW B'00000001' MOVWF T1CON BCF ON,0 ;レジスタONのビット0をクリア GOTO MAIN CSTART ;カウント+1 INCF NC,1 ;NC=NC+1(RS232C出力用) INCF N1,1 ;N1=N1+1(LCD表示用1位) MOVF N1,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N1 INCF N2,1 ;N2=N2+1(LCD表示用10位) MOVF N2,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N2 INCF N3,1 ;N3=N3+1(LCD表示用100位) MOVF N3,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N3 INCF N4,1 ;N4=N4+1(LCD表示用1,000位) MOVF N4,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N4 INCF N5,1 ;N5=N5+1(LCD表示用10,000位) MOVF N5,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N5 INCF N6,1 ;N6=N6+1(LCD表示用100,000位) MOVF N6,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N6 INCF N7,1 ;N7=N7+1(LCD表示用1,000,000位) MOVF N7,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N7 INCF N8,1 ;N8=N8+1(LCD表示用10,000,000位) MOVF N8,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N8 INCF N9,1 ;N9=N9+1(LCD表示用100,000,000位) MOVF N9,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNC CLRF N9 ; LNC LNTL INCF NT1,1 ;NT1=NT1+1(LCD表示用1位) MOVF NT1,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNTC CLRF NT1 INCF NT2,1 ;NT2=NT2+1(LCD表示用10位) MOVF NT2,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNTC CLRF NT2 INCF NT3,1 ;NT3=NT3+1(LCD表示用100位) MOVF NT3,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNTC CLRF NT3 INCF NT4,1 ;NT4=NT4+1(LCD表示用1,000位) MOVF NT4,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNTC CLRF NT4 INCF NT5,1 ;NT5=NT5+1(LCD表示用10,000位) MOVF NT5,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LNTC CLRF NT5 LNTC DECFSZ NTL,1 GOTO LNTL CLRF TMR1H ;TMR1リスタート CLRF TMR1L MOVLW B'00000001' MOVWF T1CON BCF ON,0 ;レジスタONのビット0をクリア GOTO MAIN ; TCNT INCF T1,1 ;T1=T1+1(sec) MOVF T1,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T1 INCF T2,1 ;T2=T2+1(10sec) MOVF T2,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T2 INCF T3,1 ;T3=T3+1(100sec) MOVF T3,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T3 INCF T4,1 ;T4=T4+1(1,000sec) MOVF T4,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T4 INCF T5,1 ;T5=T5+1(10,000sec) MOVF T5,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T5 INCF T6,1 ;T6=T6+1(100,000sec) MOVF T6,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T6 INCF T7,1 ;T7=T7+1(1,000,000sec) MOVF T7,0 SUBLW 0x0A BTFSS STATUS,Z GOTO LTC CLRF T7 LTC ;LCD表示(毎秒) CALL DCNT ;カウント数 CALL DTME ;経過秒数 CALL HVD ;HV ; CALL PUT8 ;NCをRS232C送信 RETURN ; PUT8 ;RS232C送信 BCF INTCON,TMR0IE ;タイマー割り込み禁止 BCF PORTA,3 ;STARTBIT=L CALL WAIT104 ;9600bps MOVLW 0x08 MOVWF BIC ;BITCOUNT=8 LBIC BSF STATUS,C RRF NC,1 BTFSS STATUS,C BCF PORTA,3 ;L BTFSC STATUS,C BSF PORTA,3 ;H CALL WAIT104 DECFSZ BIC,1 GOTO LBIC BSF PORTA,3 ;STOPBIT=H CALL WAIT104 BSF INTCON,TMR0IE ;タイマー割り込み許可 BSF INTCON,GIE ;全体割り込み許可 CLRF NC RETURN ; HVD ;HV表示 BCF INTCON,TMR0IE ;タイマー割り込み禁止 MOVLW B'10000001' ;A/D ON MOVWF ADCON0 CALL WAIT25u BSF ADCON0,GO LRA0 BTFSC ADCON0,GO GOTO LRA0 BSF INTCON,TMR0IE ;タイマー割り込み許可 BSF INTCON,GIE ;全体割り込み許可 BANKSEL ADRESL MOVF ADRESL,0 BANKSEL VNCL MOVWF VNCL BANKSEL ADRESH MOVF ADRESH,0 MOVWF VNCH CALL VBTD CALL DCHN RETURN ; VBTD ;(VNCL+VNCH)を10進数で表示 CLRF NN1 CLRF NN2 CLRF NN3 CLRF NN4 BTFSS VNCL,0 ;(VNCL,0)*1 GOTO VLN1 INCF NN1,1 ;NN1=NN1+1 CALL N1U VLN1 BTFSS VNCL,1 ;(VNCL,1)*2 GOTO VLN2 MOVLW 0x02 ADDWF NN1,1 ;NN1=NN1+2 CALL N1U VLN2 BTFSS VNCL,2 ;(VNCL,2)*4 GOTO VLN3 MOVLW 0x04 ADDWF NN1,1 ;NN1=NN1+4<7 CALL N1U VLN3 BTFSS VNCL,3 ;(VNCL,3)*8 GOTO VLN4 MOVLW 0x08 ADDWF NN1,1 ;NN1=NN1+8<15 CALL N1U VLN4 BTFSS VNCL,4 ;(VNCL,4)*16 GOTO VLN5 MOVLW 0x06 ADDWF NN1,1 ;NN1=NN1+6 CALL N1U MOVLW 0x01 ADDWF NN2,1 ;NN2=NN2+1<3 CALL N2U VLN5 BTFSS VNCL,5 ;(VNCL,5)*32 GOTO VLN6 MOVLW 0x02 ADDWF NN1,1 ;NN1=NN1+2 CALL N1U MOVLW 0x03 ADDWF NN2,1 ;NN2=NN2+3<6 CALL N2U VLN6 BTFSS VNCL,6 ;(VNCL,6)*64 GOTO VLN7 MOVLW 0x04 ADDWF NN1,1 ;NN1=NN1+4 CALL N1U MOVLW 0x06 ADDWF NN2,1 ;NN2=NN2+6<13 CALL N2U VLN7 BTFSS VNCL,7 ;(VNCL,7)*128 GOTO VLN8 MOVLW 0x08 ADDWF NN1,1 ;NN1=NN1+8 CALL N1U MOVLW 0x02 ADDWF NN2,1 ;NN2=NN2+2 CALL N2U MOVLW 0x01 ADDWF NN3,1 ;NN3=NN3+1<2 CALL N3U VLN8 BTFSS VNCH,0 ;(VNCH,0)*256 GOTO VLN9 MOVLW 0x06 ADDWF NN1,1 ;NN1=NN1+6 CALL N1U MOVLW 0x05 ADDWF NN2,1 ;NN2=NN2+5 CALL N2U MOVLW 0x02 ADDWF NN3,1 ;NN3=NN3+2 CALL N3U VLN9 BTFSS VNCH,1 ;(VNCH,1)*512 GOTO VLN10 MOVLW 0x02 ADDWF NN1,1 ;NN1=NN1+2 CALL N1U MOVLW 0x01 ADDWF NN2,1 ;NN2=NN2+1 CALL N2U MOVLW 0x05 ADDWF NN3,1 ;NN3=NN3+5 CALL N3U VLN10 RETURN ; DCNT ;カウント数をLCDに表示 CLRF FN0 ;ゼロサプレッション・フラグ MOVF N9,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO SN9 BSF FN0,0 ;ゼロでなければ表示 MOVLW B'10000000' ;1行1桁目 CALL CMD MOVF N9,0 ;100,000,000位 MOVWF N CALL LCD CALL DAT SN9 BTFSC FN0,0 GOTO SN91 MOVF N8,1 BTFSC STATUS,Z GOTO SN8 BSF FN0,0 SN91 MOVLW B'10000001' ;1行2桁目 CALL CMD MOVF N8,0 ;10,000,000位 MOVWF N CALL LCD CALL DAT SN8 BTFSC FN0,0 GOTO SN81 MOVF N7,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO SN7 BSF FN0,0 ;ゼロでなければ表示 SN81 MOVLW B'10000010' ;1行3桁目 CALL CMD MOVF N7,0 ;1,000,000位 MOVWF N CALL LCD CALL DAT SN7 BTFSC FN0,0 GOTO SN71 MOVF N6,1 BTFSC STATUS,Z GOTO SN6 BSF FN0,0 SN71 MOVLW B'10000011' ;1行4桁目 CALL CMD MOVF N6,0 ;100,000位 MOVWF N CALL LCD CALL DAT SN6 BTFSC FN0,0 GOTO SN61 MOVF N5,1 BTFSC STATUS,Z GOTO SN5 BSF FN0,0 SN61 MOVLW B'10000100' ;1行5桁目 CALL CMD MOVF N5,0 ;10,000位 MOVWF N CALL LCD CALL DAT SN5 BTFSC FN0,0 GOTO SN51 MOVF N4,1 BTFSC STATUS,Z GOTO SN4 BSF FN0,0 SN51 MOVLW B'10000101' ;1行6桁目 CALL CMD MOVF N4,0 ;1,000位 MOVWF N CALL LCD CALL DAT SN4 BTFSC FN0,0 GOTO SN41 MOVF N3,1 BTFSC STATUS,Z GOTO SN3 BSF FN0,0 SN41 MOVLW B'10000110' ;1行7桁目 CALL CMD MOVF N3,0 ;100位 MOVWF N CALL LCD CALL DAT SN3 BTFSC FN0,0 GOTO SN31 MOVF N2,1 BTFSC STATUS,Z GOTO SN2 BSF FN0,0 SN31 MOVLW B'10000111' ;1行8桁目 CALL CMD MOVF N2,0 ;10位 MOVWF N CALL LCD CALL DAT SN2 BTFSC FN0,0 GOTO SN21 MOVF N1,1 BTFSC STATUS,Z GOTO SN1 BSF FN0,0 SN21 MOVLW B'10001000' ;1行9桁目 CALL CMD MOVF N1,0 ;1位 MOVWF N CALL LCD CALL DAT SN1 MOVLW B'10001001' ;1行10桁目 CALL CMD MOVLW B'01100011' ;c CALL DAT RETURN ; DCHN ;HV(チャンネル×10)をLCDに表示 CLRF FN0 ;ゼロサプレッション・フラグ MOVF NN4,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO SNV4 BSF FN0,0 MOVLW B'10001010' ;1行11桁目 CALL CMD MOVF NN4,0 ;1,000位 MOVWF N CALL LCD CALL DAT GOTO SNV40 SNV4 MOVLW B'10001010' ;1行11桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNV40 BTFSC FN0,0 GOTO SNV41 MOVF NN3,1 BTFSC STATUS,Z GOTO SNV3 BSF FN0,0 SNV41 MOVLW B'10001011' ;1行12桁目 CALL CMD MOVF NN3,0 ;100位 MOVWF N CALL LCD CALL DAT GOTO SNV30 SNV3 MOVLW B'10001011' ;1行12桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNV30 BTFSC FN0,0 GOTO SNV31 MOVF NN2,1 BTFSC STATUS,Z GOTO SNV2 BSF FN0,0 SNV31 MOVLW B'10001100' ;1行13桁目 CALL CMD MOVF NN2,0 ;10位 MOVWF N CALL LCD CALL DAT GOTO SNV20 SNV2 MOVLW B'10001100' ;1行13桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNV20 BTFSC FN0,0 GOTO SNV21 MOVF NN1,1 BTFSC STATUS,Z GOTO SNV1 BSF FN0,0 SNV21 MOVLW B'10001101' ;1行14桁目 CALL CMD MOVF NN1,0 ;1位 MOVWF N CALL LCD CALL DAT GOTO SNV0 SNV1 MOVLW B'10001101' ;1行14桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNV0 RETURN ; DCHNU MOVLW B'10001110' ;1行15桁目 CALL CMD MOVLW B'00110000' ;0 CALL DAT MOVLW B'10001111' ;1行16桁目 CALL CMD MOVLW B'01010110' ;V CALL DAT RETURN ; DCPM ;CPMをLCD表示 CLRF FN0 ;ゼロサプラッション・フラグ MOVF NT5,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO SNN5 BSF FN0,0 MOVLW B'11001000' ;2行9桁目 CALL CMD MOVF NT5,0 ;10,000位 MOVWF N CALL LCD CALL DAT GOTO SNN50 SNN5 MOVLW B'11001000' ;2行9桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNN50 BTFSC FN0,0 GOTO SNN51 MOVF NT4,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO SNN4 BSF FN0,0 SNN51 MOVLW B'11001001' ;2行10桁目 CALL CMD MOVF NT4,0 ;1,000位 MOVWF N CALL LCD CALL DAT GOTO SNN40 SNN4 MOVLW B'11001001' ;2行10桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNN40 BTFSC FN0,0 GOTO SNN41 MOVF NT3,1 BTFSC STATUS,Z GOTO SNN3 BSF FN0,0 SNN41 MOVLW B'11001010' ;2行11桁目 CALL CMD MOVF NT3,0 ;100位 MOVWF N CALL LCD CALL DAT GOTO SNN30 SNN3 MOVLW B'11001010' ;2行11桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNN30 BTFSC FN0,0 GOTO SNN31 MOVF NT2,1 BTFSC STATUS,Z GOTO SNN2 BSF FN0,0 SNN31 MOVLW B'11001011' ;2行12桁目 CALL CMD MOVF NT2,0 ;10位 MOVWF N CALL LCD CALL DAT GOTO SNN1 SNN2 MOVLW B'11001011' ;2行12桁目 CALL CMD MOVLW B'00100000' ;null CALL DAT SNN1 MOVLW B'11001100' ;2行13桁目 CALL CMD MOVF NT1,0 ;1位 MOVWF N CALL LCD CALL DAT RETURN ; DCPMU ;LCDに単位CPMを表示 MOVLW B'11001101' ;2行14桁目 CALL CMD MOVLW B'01000011' ;C CALL DAT MOVLW B'11001110' ;2行15桁目 CALL CMD MOVLW B'01010000' ;P CALL DAT MOVLW B'11001111' ;2行16桁目 CALL CMD MOVLW B'01001101' ;M CALL DAT RETURN ; DTME ;経過時間(秒)をLCDに表示 CLRF FN0 ;ゼロサプレッション・フラグ MOVF T7,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST7 BSF FN0,0 MOVLW B'11000000' ;2行1桁目 CALL CMD MOVF T7,0 ;1,000,000位 MOVWF N CALL LCD CALL DAT ST7 BTFSC FN0,0 GOTO ST71 MOVF T6,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST6 BSF FN0,0 ST71 MOVLW B'11000001' ;2行2桁目 CALL CMD MOVF T6,0 ;100,000位 MOVWF N CALL LCD CALL DAT ST6 BTFSC FN0,0 GOTO ST61 MOVF T5,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST5 BSF FN0,0 ST61 MOVLW B'11000010' ;2行3桁目 CALL CMD MOVF T5,0 ;10,000位 MOVWF N CALL LCD CALL DAT ST5 BTFSC FN0,0 GOTO ST51 MOVF T4,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST4 BSF FN0,0 ST51 MOVLW B'11000011' ;2行4桁目 CALL CMD MOVF T4,0 ;1,000位 MOVWF N CALL LCD CALL DAT ST4 BTFSC FN0,0 GOTO ST41 MOVF T3,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST3 BSF FN0,0 ST41 MOVLW B'11000100' ;2行5桁目 CALL CMD MOVF T3,0 ;100位 MOVWF N CALL LCD CALL DAT ST3 BTFSC FN0,0 GOTO ST31 MOVF T2,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST2 BSF FN0,0 ST31 MOVLW B'11000101' ;2行6桁目 CALL CMD MOVF T2,0 ;10位 MOVWF N CALL LCD CALL DAT ST2 BTFSC FN0,0 GOTO ST21 MOVF T1,1 ;ゼロならばスキップ BTFSC STATUS,Z GOTO ST1 BSF FN0,0 ST21 MOVLW B'11000110' ;2行7桁目 CALL CMD MOVF T1,0 ;1位 MOVWF N CALL LCD CALL DAT ST1 MOVLW B'11000111' ;2行8桁目 CALL CMD MOVLW B'01110011' ;s CALL DAT RETURN ; N1U ;1位(NN1)繰り上がり計算 MOVF NN1,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN1U MOVLW 0x0A SUBWF NN1,1 ;NN1=NN1-10 INCF NN2,1 ;NN2=NN2+1 MOVF NN2,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN1U MOVLW 0x0A SUBWF NN2,1 ;NN2=NN2-10 INCF NN3,1 ;NN3=NN3+1 MOVF NN3,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN1U MOVLW 0x0A SUBWF NN3,1 ;NN3=NN3-10 INCF NN4,1 ;NN4=NN4+1 MOVF NN4,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN1U MOVLW 0x0A SUBWF NN4,1 ;NN4=NN4-10 LN1U RETURN ; N2U ;10位(NN2)繰り上がり計算 MOVF NN2,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN2U MOVLW 0x0A SUBWF NN2,1 ;NN2=NN2-10 INCF NN3,1 ;NN3=NN3+1 MOVF NN3,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN2U MOVLW 0x0A SUBWF NN3,1 ;NN3=NN3-10 INCF NN4,1 ;NN4=NN4+1 MOVF NN4,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN2U MOVLW 0x0A SUBWF NN4,1 ;NN4=NN4-10 LN2U RETURN ; N3U ;100位(NN3)繰り上がり計算 MOVF NN3,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN3U MOVLW 0x0A SUBWF NN3,1 ;NN3=NN3-10 INCF NN4,1 ;NN4=NN4+1 MOVF NN4,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN3U MOVLW 0x0A SUBWF NN4,1 ;NN4=NN4-10 LN3U RETURN ; N4U ;1000位(NN4)繰り上がり計算 MOVF NN4,0 ADDLW 0xF6 ;0xF6=D'246',10+246=256 BTFSS STATUS,C GOTO LN4U MOVLW 0x0A SUBWF NN4,1 ;NN4=NN4-10 LN4U RETURN ; INIT ;LCDイニシャライズ CALL WAIT5 ;15msec待ち CALL WAIT5 CALL WAIT5 MOVLW B'00110000' MOVWF PORTB BCF PORTA,1 ;RS=0 NOP BSF PORTA,2 ;E=1 NOP BCF PORTA,2 ;E=0 CALL WAIT5 ;5msec待ち MOVLW B'00110000' MOVWF PORTB BCF PORTA,1 ;RS=0 NOP BSF PORTA,2 ;E=1 NOP BCF PORTA,2 ;E=0 CALL WAIT01 ;100usec待ち MOVLW B'00110000' MOVWF PORTB BCF PORTA,1 ;RS=0 NOP BSF PORTA,2 ;E=1 NOP BCF PORTA,2 ;E=0 CALL WAIT01 ;100usec待ち MOVLW B'00100000' ;4ビットモード MOVWF PORTB BCF PORTA,1 ;RS=0 NOP BSF PORTA,2 ;E=1 NOP BCF PORTA,2 ;E=0 CALL WAIT2 MOVLW B'00101100' ;4ビット、2行表示 CALL CMD MOVLW B'00001100' ;ディスプレイ制御 CALL CMD MOVLW B'00000001' ;表示クリア CALL CMD MOVLW B'00000110' ;エントリーモード CALL CMD RETURN ; CMD ;制御信号出力 MOVWF TMP ANDLW B'11110000' MOVWF PORTB BCF PORTA,1 ;RS=0 NOP NOP BSF PORTA,2 ;E=1 NOP NOP BCF PORTA,2 ;E=0 SWAPF TMP,0 ANDLW B'11110000' MOVWF PORTB BCF PORTA,1 ;RS=0 NOP NOP BSF PORTA,2 ;E=1 NOP NOP BCF PORTA,2 ;E=0 CALL WAIT2 RETURN ; DAT ;データ出力 MOVWF TMP ANDLW B'11110000' MOVWF PORTB MOVF TMP,0 MOVWF PORTB BSF PORTA,1 ;RS=1 NOP NOP BSF PORTA,2 ;E=1 NOP NOP BCF PORTA,2 ;E=0 SWAPF TMP,0 ANDLW B'11110000' MOVWF PORTB BSF PORTA,1 ;RS=1 NOP NOP BSF PORTA,2 ;E=1 NOP NOP BCF PORTA,2 ;E=0 CALL WAIT2 RETURN ; LCD ;NをASCIIに変換 MOVF N,1 BTFSC STATUS,Z RETLW B'00110000' ;0 MOVF N,0 SUBLW 0x01 BTFSC STATUS,Z RETLW B'00110001' ;1 MOVF N,0 SUBLW 0x02 BTFSC STATUS,Z RETLW B'00110010' ;2 MOVF N,0 SUBLW 0x03 BTFSC STATUS,Z RETLW B'00110011' ;3 MOVF N,0 SUBLW 0x04 BTFSC STATUS,Z RETLW B'00110100' ;4 MOVF N,0 SUBLW 0x05 BTFSC STATUS,Z RETLW B'00110101' ;5 MOVF N,0 SUBLW 0x06 BTFSC STATUS,Z RETLW B'00110110' ;6 MOVF N,0 SUBLW 0x07 BTFSC STATUS,Z RETLW B'00110111' ;7 MOVF N,0 SUBLW 0x08 BTFSC STATUS,Z RETLW B'00111000' ;8 MOVF N,0 SUBLW 0x09 BTFSC STATUS,Z RETLW B'00111001' ;9 RETLW B'00101010' ;* ; WAIT5 ;5msec待ちサブルーチン MOVLW 0x32 ;W2=50(50*0.1m=5msec) MOVWF W2 LW5 CALL WAIT01 DECFSZ W2,1 GOTO LW5 RETURN ; WAIT2 ;2msec待ちサブルーチン MOVLW 0x14 ;W2=20(20*0.1m=2msec) MOVWF W2 LW2 CALL WAIT01 DECFSZ W2,1 GOTO LW2 RETURN ; WAIT01 ;100usec(0.1msec)待ちサブルーチン MOVLW 0xA5 ;W1=165(165*0.2u*3+0.2u*5=100usec) MOVWF W1 LW01 DECFSZ W1,1 GOTO LW01 RETURN ; WAIT104 ;104usec待ちサブルーチン(20MHz) MOVLW 0xAB ;W1=171(171*0.2u*3+0.2u*5+0.2u*2=104usec),1sec/9600=104.17usec MOVWF W1 LW104 DECFSZ W1,1 GOTO LW104 NOP NOP RETURN ; WAIT25u ;25usec待ちサブルーチン MOVLW 0x28 ;W1=40(40*0.2u*3+0.2u*5=25usec) MOVWF W1 LW25u DECFSZ W1,1 GOTO LW25u RETURN ; END