×
单片机 > 单片机程序设计 > 详情

PIC单片机lcd显示时钟演示程序

发布时间:2020-06-06 发布时间:
|

include  
;*---- 
; 定义 LCD数据& 控制I/O口 
LCD_DATA equ PORTB 
LCD_CNTL1 equ PORTB 
LCD_CNTL2 equ PORTA  
; 定义 LCD控制相应的I/O引脚 


RS equ 1 
E equ 5 

; LCD 模块命令 
DISP_ON EQU 0x00C ; 开显示 
DISP_ON_C EQU 0x00E ; 开显示, 开指针 
DISP_ON_B EQU 0x00F ; 开显示, 开指针,开闪烁 
DISP_OFF EQU 0x008 ; 关显示 
CLR_DISP EQU 0x001 ; 清显示的操作数 
ENTRY_INC EQU 0x006 ; 操作数 
ENTRY_INC_S EQU 0x007 ; 操作数 
ENTRY_DEC EQU 0x004 ; 操作数 
ENTRY_DEC_S EQU 0x005 ; 操作数 
DD_RAM_ADDR EQU 0x080 ; 初始化第一行显示的操作数 
DD_RAM_UL EQU 0x0c0 ; 初始化第二行显示的操作数 

; 设置显示相关寄存器 
Byte EQU 20H 
Count EQU 21H 
Count1 EQU 22H 
Count2 EQU 23H 
LCD_DATA1 EQU 24H 
PORTDB EQU 25H 
Temp EQU 26H 
TempH EQU 27H 
TempL EQU 28H 
INTSIG EQU 29H 
RTCCSIG1 EQU 2AH 
RTCCSIG EQU 2BH 
ALRSIG EQU 2CH 
Hour EQU 2DH 
HourH EQU 2EH 
HourL EQU 2FH 
HourL1 EQU 30H 
HourH1 EQU 31H 
Mins EQU 32H 
Mins1 EQU 33H 
MinsH EQU 34H 
MinsL EQU 35H 
MinsH1 EQU 36H 
MinsL1 EQU 37H 
Secs EQU 38H 
SecsH EQU 39H 
SecsL EQU 3AH 
ALRH1 EQU 3BH 
ALRM1 EQU 3CH 
ALRH2 EQU 3DH 
ALRM2 EQU 3EH 
ALRH3 EQU 3FH 
ALRM3 EQU 40H 
_WREG EQU 41H 
_STATUS EQU 42H 
Hour1 EQU 43H 
ADRESB EQU 44H 
BKM EQU 45H 
;*---- 

org 0 
nop 
goto start 
org 4 
goto ISR 

org 10 

CalTable 
bcf STATUS,RP0 
bcf PCLATH,0 
movlw 0x66 ; 进行校准处理 
subwf Temp,w ; 
addwf PCL,f ; 将补偿结果与 PCL相加 
dt 0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5 
dt 6,6,6,7,7,7,8,8,8,9,9,0xa,0xa,0xb,0xb,0xc,0xc 
dt 0xd,0xd,0xe,0xe,0xf,0xf,0xf,0x10,0x10,0x10 
dt 0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14,0x14,0x14 
dt 0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x17,0x18,0x18 
dt 0x19,0x19,0x1a,0x1a,0x1b,0x1b,0x1c,0x1c,0x1c 
dt 0x1d,0x1d,0x1d,0x1e,0x1e,0x1f,0x1f,0x20,0x20 
dt 0x21,0x21,0x22,0x22,0x23,0x23,0x24,0x24,0x25,0x25 
dt 0x26,0x26,0x27,0x28,0x29,0x29,0x2a,0x2a,0x2b,0x2b 
dt 0x2c,0x2d,0x2e,0x2f,0x30,0x32 

start 
call InitLCD 
clrf RTCCSIG 
clrf RTCCSIG1 
clrf INTSIG 
clrf Hour 
clrf Hour1 
clrf Mins 
clrf Mins1 
clrf Secs 
clrf ALRSIG 
movlw 20h 
movwf BKM 
movlw b'10001111' 
movwf PORTDB 
movlw 0ffh 
movwf TMR0 
movlw 00 
movwf TMR1L 
movlw 80h 
movwf TMR1H 
movlw b'00001111' 
movwf T1CON 
bsf STATUS,RP0 
bsf PIE1,TMR1IE 
bcf STATUS,RP0 
movlw b'10111111' 
OPTION 
movlw b'11110000' 
movwf INTCON 
main 
movlw 80h 
call SendCmd 
call DisplayTime ;显示时间 
movlw 0c0h 
call SendCmd 
movlw 'H' 
call putcLCD 
movlw 'e' 
call putcLCD 
movlw 'l' 
call putcLCD 
movlw 'l' 
call putcLCD 
movlw 'o' 
call putcLCD 
movlw ' ' 
call putcLCD 
movlw '!' 
call putcLCD 
movlw ' ' 
call putcLCD 
movlw ':' 
call putcLCD 
movlw ')' 
call putcLCD 
movlw ' ' 
call putcLCD 
movlw ' ' 
call putcLCD 
call BkLight ;背光控制 
call TempM ;显示温度 
btfsc ALRSIG,1 
call ALR1 
btfsc ALRSIG,2 
call ALR2 
btfsc ALRSIG,3 
call ALR3 
bcf STATUS,RP0 
bcf PCLATH,0 
movf RTCCSIG,W 
addwf PCL,1 
goto main 
goto RtccS1 
goto RtccS2 
goto Rtccs3 
goto Rtccs4 
clrf RTCCSIG 
clrf RTCCSIG1 
goto main 
;*===== 
ALR1 bcf STATUS,RP0 
movf Hour,W 
xorwf ALRH1,W 
btfss STATUS,Z 
goto ALREND 
movf Mins,W 
xorwf ALRM1,W 
btfss STATUS,Z 
goto ALREND 
bsf STATUS,RP0 
clrf TRISD 
bcf STATUS,RP0 
bcf STATUS,C 
rlf PORTDB,1 
btfsc STATUS,C 
bsf PORTDB,0 
movf PORTDB,W 
movwf PORTD 
return 
;*--- 
ALR2 bcf STATUS,RP0 
movf Hour,W 
xorwf ALRH2,W 
btfss STATUS,Z 
goto ALREND 
movf Mins,W 
xorwf ALRM2,W 
btfss STATUS,Z 
goto ALREND 
bsf STATUS,RP0 
clrf TRISD 
bcf STATUS,RP0 
bcf STATUS,C 
rlf PORTDB,1 
btfsc STATUS,C 
bsf PORTDB,0 
movf PORTDB,W 
movwf PORTD 
return 
;*---- 
ALR3 bcf STATUS,RP0 
movf Hour,W 
xorwf ALRH3,W 
btfss STATUS,Z 
goto ALREND 
movf Mins,W 
xorwf ALRM3,W 
btfss STATUS,Z 
goto ALREND 
bsf STATUS,RP0 
clrf TRISD 
bcf STATUS,RP0 
bcf STATUS,C 
rlf PORTDB,1 
btfsc STATUS,C 
bsf PORTDB,0 
movf PORTDB,W 
movwf PORTD 
return 
;*--- 
ALREND 
bsf STATUS,RP0 
movlw 0ffh 
movwf TRISD 
return 
;*===== 
RtccS1 
movlw 80h 
call SendCmd 
call DisplayTime 
call LongDelay 
movlw 0c0h 
call SendCmd ;line2, 00 
movlw 'S' 
call putcLCD 
movlw 'e' 
call putcLCD 
movlw 't' 
call putcLCD 
movlw ' ' 
call putcLCD 
movlw 'T' 
call putcLCD 
movlw 'i' 
call putcLCD 
movlw 'm' 
call putcLCD 
movlw 'e' 
call putcLCD ;show "Set Time" 
movlw ' ' 
call putcLCD 
movlw ' ' 
call putcLCD 
movlw ' ' 
call putcLCD 
movlw ' ' 
call putcLCD 
bsf PCLATH,0 
movf RTCCSIG1,W 
addwf PCL,1 
goto SetHour 
goto SetMins 
clrf INTSIG 
incf RTCCSIG 
clrf RTCCSIG1 
goto main 
;*---- 
SetHour 
movlw 80h 
call Selshow 
movlw d'24' 
subwf INTSIG,W 
btfsc STATUS,C 
goto $+4 
movf INTSIG,w 
movwf Hour 
goto RtccS1 
clrf INTSIG 
movwf Hour 
goto RtccS1 
;*---- 
SetMins 
movlw 83h 
call Selshow 
movlw d'60' 
subwf INTSIG,W 
btfsc STATUS,C 
goto $+4 
movf INTSIG,w 
movwf Mins 
goto RtccS1 
clrf INTSIG 
movwf Mins 
goto RtccS1 
;*===== 
RtccS2 
bcf STATUS,RP0 
movlw 0c0h 
call SendCmd 
call Alarm 
movlw '1' 
call putcLCD 
movlw ' ' 
call putcLCD 
S2 movlw 80h 
call SendCmd 
call DisplayTime 
call DispTime 
call LongDelay 
bsf PCLATH,0 
movf RTCCSIG1,W 
addwf PCL,1 
goto SetAlH2 
goto SetAlM2 
movf Hour1,w 
movwf ALRH1 
movf Mins1,w 
movwf ALRM1 
clrf INTSIG 
clrf RTCCSIG1 
incf RTCCSIG 
goto main 
;*--- 
SetAlH2 
movlw 0c7h 
call Selshow 
movf INTSIG,W 
btfss STATUS,Z 
bsf ALRSIG,1 
movf INTSIG,W 
movwf Hour1 
movlw d'24' 
subwf Hour1,W 
btfss STATUS,C 
goto S2 
clrf INTSIG 
clrf Hour1 
goto S2 
SetAlM2 
movlw 0cah 
call Selshow 
movf INTSIG,W 
btfss STATUS,Z 
bsf ALRSIG,1 
movf INTSIG,W 
movwf Mins1 
movlw d'60' 
subwf Mins1,W 
btfss STATUS,C 
goto S2 
clrf INTSIG 
clrf Mins1 
goto S2 
;*---- 
Alarm movlw 'A' 
call putcLCD 
movlw 'l' 
call putcLCD 
movlw 'a' 
call putcLCD ; 
movlw 'r' 
call putcLCD 
movlw 'm' 
call putcLCD ; 
return 
;*---- 
Selshow 
call SendCmd 
movlw ' ' 
call putcLCD 
movlw ' ' 
call putcLCD 
call LongDelay 
return 
;*===== 
Rtccs3 
bcf STATUS,RP0 
movlw 0c0h 
call SendCmd 
call Alarm 
movlw '2' 
call putcLCD 
movlw ' ' 
call putcLCD 
S3 movlw 80h 
call SendCmd 
call DisplayTime 
call DispTime 
call LongDelay 
bsf PCLATH,0 
movf RTCCSIG1,w 
addwf PCL,1 
goto SetAlH3 
goto SetAlM3 
movf Hour1,w 
movwf ALRH2 
movf Mins1,w 
movwf ALRM2 
clrf INTSIG 
clrf RTCCSIG1 
incf RTCCSIG 
goto main 
;*--- 
SetAlH3 
movlw 0c7h 
call Selshow 
movf INTSIG,W 
btfss STATUS,Z 
bsf ALRSIG,2 
movf INTSIG,W 
movwf Hour1 
movlw d'24' 
subwf Hour1,W 
btfss STATUS,C 
goto S3 
clrf INTSIG 
clrf Hour1 
goto S3 
SetAlM3 
movlw 0cah 
call Selshow 
movf INTSIG,W 
btfss STATUS,Z 
bsf ALRSIG,1 
movf INTSIG,W 
movwf Mins1 
movlw d'60' 
subwf Mins1,W 
btfss STATUS,C 
goto S3 
clrf INTSIG 
clrf Mins1 
goto S3 
;*===== 
Rtccs4 
movlw 80h 
call SendCmd 
call DisplayTime 
bcf STATUS,RP0 
movlw 0c0h 
call SendCmd 
call Alarm 
movlw '3' 
call putcLCD 
movlw ' ' 
call putcLCD 
S4 call DispTime 
call LongDelay 
bsf PCLATH,0 
movf RTCCSIG1,w 
addwf PCL,1 
goto SetAlH4 
goto SetAlM4 
movf Hour1,w 
movwf ALRH3 
movf Mins1,w 
movwf ALRM3 
clrf INTSIG 
clrf RTCCSIG1 
incf RTCCSIG 
goto main 
;*--- 
SetAlH4 
movlw 0c7h 
call Selshow 
movf INTSIG,W 
btfss STATUS,Z 
bsf ALRSIG,3 
movf INTSIG,W 
movwf Hour1 
movlw d'24' 
subwf Hour1,W 
btfss STATUS,C 
goto S4 
clrf INTSIG 
clrf Hour1 
goto S4 
SetAlM4 
movlw 0cah 
call Selshow 
movf INTSIG,W 
btfss STATUS,Z 
bsf ALRSIG,1 
movf INTSIG,W 
movwf Mins1 
movlw d'60' 
subwf Mins1,W 
btfss STATUS,C 
goto S4 
clrf INTSIG 
clrf Mins1 
goto S4 
;*===== 
ISR 
Push 
movwf _WREG ; 存 WREG状态 
swapf STATUS,W ; 存 STATUS 
movwf _STATUS 
;*---- 
bcf STATUS,RP0 
btfsc PIR1,TMR1IF 
call TimeAdj 
btfsc INTCON,INTF 
call IntDeal 
btfsc INTCON,T0IF 
call RtccDeal 

;*---- 
Pop 
swapf _STATUS,W ; Restore STATUS 
movwf STATUS 
swapf _WREG,F ; Restore WREG w/o 
swapf _WREG,W ; affecting STATUS 
retfie 
;*===== 
TimeAdj 
bcf STATUS,RP0 
bcf PIR1,TMR1IF 
movlw 00h 
movwf TMR1L 
movlw 80h 
movwf TMR1H 
incf Secs,1 
movlw d'60' 
xorwf Secs,W 
btfss STATUS,Z 
goto TE 
clrf Secs 
incf Mins,1 
movlw d'60' 
xorwf Mins,W 
btfss STATUS,Z 
goto TE 
clrf Mins 
incf Hour 
movlw d'24' 
xorwf Hour,W 
btfss STATUS,Z 
goto TE 
clrf Hour 
TE 
return 
;*===== 
IntDeal 
bcf INTCON,INTF 
bsf PORTB,0 
btfsc PORTB,0 ;\ 
goto $+5 ; \ 
call Delay 
bsf PORTB,0 ; 按键去抖动 
btfsc PORTB,0 
goto $+2 ; / 
incf INTSIG 
return 
;*===== 
RtccDeal 
bcf STATUS,RP0 
movlw 0ffh ; 
movwf TMR0 
bcf INTCON,T0IF 
bsf PORTA,4 
btfsc PORTA,4 ;\ 
goto RtcWr ; \ 
call Delay 
bsf PORTA,4 ; 按键去抖动 
btfsc PORTB,4 
goto RtcWr ; / 
movf RTCCSIG,W 
sublw 04h 
btfss STATUS,C 
goto WRONG 
movf RTCCSIG1,W 
sublw 03h 
btfss STATUS,C 
goto WRONG 
movf RTCCSIG,W 
addwf RTCCSIG1,W 
btfsc STATUS,Z 
goto $+3 
incf RTCCSIG1 
goto RtcWr 
incf RTCCSIG 
goto RtcWr 

WRONG 
clrf RTCCSIG 
clrf RTCCSIG1 
RtcWr return 
;*===== 
BkLight 
bsf STATUS,RP0 
bcf ADCON1,ADFM ;ADRESH all 8-bit,H 
bcf STATUS,RP0 
movlw b'01010001' 
movwf ADCON0 ;select AD2,Fosc/8 
decfsz BKM 
goto $-1 
bsf ADCON0,GO 
btfss PIR1,ADIF 
goto $-1 
bcf PIR1,ADIF 
;READ ADRES--- 
movf ADRESH,W 
movwf ADRESB 
bsf STATUS,RP0 
bcf TRISE,0 ;SELECT RE0 OUTPUT 
bcf STATUS,RP0 
movlw b'10000000' ;critICal value of lightness 
subwf ADRESB,W 
btfss STATUS,C 
goto $+4 ;c=0,ADRESBbcf STATUS,RP0 
bsf PORTE,0 ;c=1,backlight on 
goto $+3 
bcf STATUS,RP0 
bcf PORTE,0 
movlw 20h 
movwf BKM 
return 
;*===== 
TempM ;temprature measure 
bsf STATUS,RP0 
bcf ADCON1,ADFM ;ADRESH all 8-bit 
bcf STATUS,RP0 
movlw b'01001001' ;select AD1,FOSC/8 
movwf ADCON0 
decfsz BKM 
goto $-1 
bsf ADCON0,GO 
btfss PIR1,ADIF 
goto $-1 
bcf PIR1,ADIF 
;bsf STATUS,RP0 
movf ADRESH,W 
;bcf STATUS,RP0 
movwf Temp 
call CalTable 
movwf Temp 
call Bin2BCDT ; 进行BCD码调整 
movlw 08ah ; 从第一行的第0A个位置开始 
call SendCmd 
movf TempH,W ; 显示温度 
call putcLCD 
movf TempL,W 
call putcLCD 
movlw 'C' ; 显示“C”(表示摄氏度) 
call putcLCD 
movlw 20h 
movwf BKM 
return 
;************************************************ 
;* Bin2BCDT - 将 Temp 寄存器内的二进制数转 * 
;* 换为相应的 ASCII 码并存为 TempH:TempL 的形式 * 
;************************************************ 
Bin2BCDT 
bcf STATUS,RP0 
clrf TempH ; Initialize variables 
movf Temp,W 
movwf TempL 
Ttenth ; Subtract 10 from low variable 
movlw .10 ; until result is subwf TempL,W ; subtraction, increment the 
btfss STATUS,C ; temperature high byte. 
goto Over0 
movwf TempL 
incf TempH,F 
goto Ttenth 
Over0 
movlw 0x30 ; Make decimal ASCII by adding 
addwf TempH,F ; '0' to high and low byte 
addwf TempL,F 
return 
;************************************************* 
;* DisplayTime - 将显示指针移至第一行,调用Bin2BCD* 
;* 子程序将Secs 和 Mins寄存器内的数据转换为相应的* 
;* ASCII 码, 然后送 LCD显示. * 
;************************************************* 
DisplayTime 
bcf STATUS,RP0 
call Bin2BCD ; 调用二进制与bcd码转换子程序 
movf HourH,W ; 显示小时高位 
call putcLCD ; 
movf HourL,W ; 显示小时低位 
call putcLCD ; 
movlw ':' 
call putcLCD ; 显示 ':' 
movf MinsH,W ; 显示分钟高位 
call putcLCD ; 
movf MinsL,W ; 显示分钟低位 
call putcLCD ; 
movlw ':' ; 显示 ':' 
call putcLCD 
movf SecsH,W ; 显示秒钟高位 
call putcLCD ; 
movf SecsL,W ; 显示秒钟低位 
call putcLCD ; 
return 
;************************************************ 
;* Bin2BCD - 将 Secs & Mins 寄存器内的二进制数转* 
;* 换为相应的 ASCII 码并存为 SecsH:SecsL 及 * 
;* MinsH:MinsL,HourH:HourL的形式. * 
;************************************************ 
Bin2BCD 
bcf STATUS,RP0 
clrf HourH ; 初始化变量 
movf Hour,W ; 转换“时” 
movwf HourL 
Hourth ; Loop to subtract 10 
movlw .10 ; from low byte and 
subwf HourL,W ; increment high byte 
btfss STATUS,C ; while low byte is > 0 
goto Next 
movwf HourL 
incf HourH,F 
goto Hourth 
Next 
clrf MinsH ; 初始化变量 
movf Mins,W ; 转换“分” 
movwf MinsL 
Mtenth ; Loop to subtract 10 
movlw .10 ; from low byte and 
subwf MinsL,W ; increment high byte 
btfss STATUS,C ; while low byte is > 0 
goto Next1 
movwf MinsL 
incf MinsH,F 
goto Mtenth 
Next1 
clrf SecsH ; 初始化变量 
movf Secs,W ; 转换“秒” 
movwf SecsL 
Stenth ; Loop to subtract 10 
movlw .10 ; from low byte and 
subwf SecsL,W ; increment high byte 
btfss STATUS,C ; while low byte is > 0 
goto Over 
movwf SecsL 
incf SecsH,F 
goto Stenth 
Over 
movlw 0x30 ; 
addwf HourH,F ; 
addwf HourL,F ; Add 0x30 ('0') to all 
addwf MinsH,F ; variables to convert 
addwf MinsL,F ; a number 0 - 9 to an 
addwf SecsH,F ; ASCII equivalent 
addwf SecsL,F ; '0' to '9' 
return 
;*==== 
DispTime 
bcf STATUS,RP0 
movlw 0c7h 
call SendCmd 
call Bin2BCa ; 调用二进制与bcd码转换子程序 
movf HourH1,W ; 显示小时高位 
call putcLCD ; 
movf HourL1,W ; 显示小时低位 
call putcLCD ; 
movlw ':' ; 显示 ':' 
call putcLCD 
movf MinsH1,W ; 显示分钟高位 
call putcLCD ; 
movf MinsL1,W ; 显示分钟低位 
call putcLCD ; 
return 
;*---- 
Bin2BCa 
bcf STATUS,RP0 
clrf HourH1 ; 初始化变量 
movf Hour1,W ; 转换“时” 
movwf HourL1 
Hourth1 ; Loop to subtract 10 
movlw .10 ; from low byte and 
subwf HourL1,W ; increment high byte 
btfss STATUS,C ; while low byte is > 0 
goto Nexta 
movwf HourL1 
incf HourH1,F 
goto Hourth1 
Nexta 
clrf MinsH1 ; 初始化变量 
movf Mins1,W ; 转换“分” 
movwf MinsL1 
Mtenth1 ; Loop to subtract 10 
movlw .10 ; from low byte and 
subwf MinsL1,W ; increment high byte 
btfss STATUS,C ; while low byte is > 0 
goto Over1 
movwf MinsL1 
incf MinsH1,F 
goto Mtenth1 
Over1 
movlw 0x30 ; 
addwf HourH1,F ; 
addwf HourL1,F ; Add 0x30 ('0') to all 
addwf MinsH1,F ; variables to convert 
addwf MinsL1,F ; a number 0 - 9 to an 
return ; ASCII equivalent 
;******************************************************************* 
;* LCD 模块子程序 * 
;******************************************************************* 
;InitLCD——初始化LCD模块 * 
;******************************************************************* 
InitLCD 
bcf STATUS,RP0 ; Bank 0 
bcf STATUS,RP1 
clrf LCD_DATA ; 清 LCD 数据 & 控制位 
bsf STATUS,RP0 ; Bank 1 
movlw 0xc1 ; 设置RB1~RB5为输出 
movwf LCD_DATA 
bcf TRISA,5 

bcf STATUS,RP0 ; 
movlw 0x00 ; 
movwf LCD_DATA 
bsf LCD_CNTL2, E 
bcf LCD_CNTL2, E 

movlw 0x08 ; 
movwf LCD_DATA 
bsf LCD_CNTL2, E 
bcf LCD_CNTL2, E 
call LongDelay 
call LongDelay 

movlw b'00101000' 
call SendCmd 
movlw DISP_ON ; 开显示 
call SendCmd 
movlw ENTRY_INC ; 设置指针移动方式 
call SendCmd 
movlw DD_RAM_ADDR ; 设置起始地址 
call SendCmd 

InitLCDEnd ; 
bcf STATUS,RP0 ; 
movlw CLR_DISP ; 
call SendCmd 
return 

;******************************************************************* 
;*putcLCD—— 将字符数据送入 LCD * 
;* 本程序将字符数据分成了高半字节和低半字节分别输入 * 
;* 先送入的是高半字节 * 
;******************************************************************* 
putcLCD 
bcf STATUS,RP0 
movwf Byte ; 存 WREG 到 Byte 寄存器 
swapf Byte,W ; 写入高半字节 
movwf LCD_DATA1 
rlf LCD_DATA1,1 
rlf LCD_DATA1,1 
movlw 0x3c 
andwf LCD_DATA1,1 
movf LCD_DATA1,w 
movwf LCD_DATA 
bsf LCD_CNTL1, RS ; 设置为送数据模式 
bsf LCD_CNTL2, E ; 发送数据信号 
bcf LCD_CNTL2, E 

movf Byte,W ; 接着送低半字节 
movwf LCD_DATA1 
rlf LCD_DATA1,1 
rlf LCD_DATA1,1 
movlw 0x3c 
andwf LCD_DATA1,1 
movf LCD_DATA1,w 
movwf LCD_DATA 
bsf LCD_CNTL1, RS ; 设置为送数据模式 
bsf LCD_CNTL2, E ; 发送数据信号 
bcf LCD_CNTL2, E 
call Delay 
return 

;******************************************************************* 
;* SendCmd - 送命令到 LCD * 
;* 本程序将命令数据分成了高半字节和低半字节分别输入 * 
;* 先送入的是高半字节 * 
;******************************************************************* 
SendCmd 
bcf STATUS,RP0 
movwf Byte ; 存 WREG 到 Byte 寄存器 
swapf Byte,W ; 送入命令的高字节 
movwf LCD_DATA1 
rlf LCD_DATA1,1 
rlf LCD_DATA1,1 
movlw 0x3c 
andwf LCD_DATA1,1 
movf LCD_DATA1,w 
movwf LCD_DATA 
bcf LCD_CNTL1,RS ; 设置为送命令模式 
bsf LCD_CNTL2,E ; 发送数据信号 
bcf LCD_CNTL2,E 
movf Byte,W ; 接着送命令的低字节 

movwf LCD_DATA1 
rlf LCD_DATA1,1 
rlf LCD_DATA1,1 
movlw 0x3c 
andwf LCD_DATA1,1 
movf LCD_DATA1,w 
movwf LCD_DATA 
bcf LCD_CNTL1,RS ; 设置为送命令模式 
bsf LCD_CNTL2,E ; 发送数据信号 
bcf LCD_CNTL2,E 
call Delay 
return 
;******************************************************************* 
;* Delay - 延时子程序 * 
;******************************************************************* 
Delay ; call指令占用2个指令周期 
bcf STATUS,RP0 
clrf Count ; 清 Count占用1个指令周期 
Dloop 
decfsz Count,f ; 这两行指令将延时 
goto Dloop ; (256 * 3) -1 个指令周期 
return ; return占用2个指令周期 

;******************************************************************* 
;* LongDelay - 长延时子程序 * 
;******************************************************************* 
LongDelay 
bcf STATUS,RP0 
clrf Count 
clrf Count1 
movlw 0x03 
movwf Count2 
LDloop 
decfsz Count,f 
goto LDloop 
decfsz Count1,f 
goto LDloop 
decfsz Count2,f 
goto LDloop 
return 
;*------ 
END



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机的多路AD切换程序设计