📄 lcd电子钟.asm
字号:
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,ADRESB<critical
bcf 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 < 0. On each
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -