|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
MCU:AT89S51 LCD:1602
实现LCD 上显示时间
;*******************************************************************
;DB[0-7]接P1.0-P1.7
;E接P0.0, R/W接P0.1, RS接P0.2
;*******************************************************************
;赋值给接LCD的功能引脚
E EQU P0.0
RW EQU P0.1
RS EQU P0.2
SDDRAM EQU 34H ;用于储存设置 DDRAM 地址指令
;定义时, 分, 秒计数储存单元
HOUR EQU 32H
MIN EQU 31H
SEC EQU 30H
;显示时间用
HH EQU 35H ;小时的高位
HL EQU 36H ;小时的低位
MH EQU 37H ;分钟的高位
ML EQU 38H ;分钟的低位
SH EQU 39H ;秒钟的高位
SL EQU 3AH ;秒钟的低位
ORG 0000H
AJMP MAIN ;上电跳往主程序
ORG 000BH ;定时器0溢出处理
AJMP T0OVERFLOW
ORG 0040H
MAIN: ;初始化LCD
MOV A, #38H ;功能设置, 8位数据总线, 5*7点阵
LCALL WRCMD
MOV A, #01H ;清屏LCD
LCALL WRCMD
MOV A, #0CH ;显示开关控制, 开显示, 关光标显示, 关闪烁显示
LCALL WRCMD
MOV A, #06H ;设置输入模式, 完成字符传送后, AC自动加1, 显示不发生移位
LCALL WRCMD
MOV A, #84H ;初始时, 设置AC指向DDRAM的第5位
LCALL SETAC
;时钟程序, 用SEC单元保存秒, 用MIN单元保存分, 用HOUR单元保存时
MOV TMOD, #01H ;启用定时器0的模式1, 作为定时器
SETB ET0 ;允许定时器0溢出中断
SETB EA ;允许中断
MOV TH0, #3CH ;赋初值,每50ms中断一次
MOV TL0, #0B0H
SETB TR0 ;启动定时器0
MOV HOUR, #00H ;初始化为0时0分0秒
MOV MIN, #00H
MOV SEC, #00H
;显示初始时间
LCALL DIS_H
MOV A, #0B0H ;显示间隔符-
LCALL WRDATA
LCALL DIS_M
MOV A, #0B0H
LCALL WRDATA
LCALL DIS_S
MOV 33H, #14 ;存储中断次数, 查看1秒是否到了
HERE: SJMP HERE ;等待中断
T0OVERFLOW:
PUSH ACC ;保护现场
PUSH PSW
CLR TR0 ;暂停计数, 重新装入数据
MOV TH0, #3CH ;装入数据, 20ms中断一次
MOV TL0, #0B0H
SETB TR0
DJNZ SEC, RETURN;判断1秒是否到了
;1秒到了往下执行
INC SEC ;秒增1
LCALL DIS_S ;显示时间
MOV 33H, #14H ;重置中断次数
;判断1分是否到了
MOV A, SEC
CJNE A, #3CH, RETURN
;1分到了往下执行
MOV SEC, #00H ;秒清0
INC MIN ;分增1
MOV A, SEC
LCALL DIS_M ;显示时间
;判断1小时是否到了
MOV A, MIN
CJNE A, #3CH, RETURN
;1小时到了往下执行
MOV MIN, #00H ;分清0
INC HOUR ;时增1
;判断小时是否为24
MOV A, HOUR
CJNE A, #18H, RETURN
;小时为24往下执行
MOV HOUR, #00H ;24进制, 清0
LCALL DIS_H ;显示时间
AJMP RETURN
RETURN: POP PSW ;恢复现场
POP ACC
RETI
SETAC: PUSH ACC ;保护现场
MOV A, SDDRAM ;设置 AC 的地址
LCALL WRCMD
POP ACC ;恢复现场
RET
;往LCD中写入指令子程序
WRCMD: ACALL CHEBUSY
CLR RS
CLR RW
MOV P1, A
SETB E
NOP
CLR E
RET
;往LCD写数据子程序
WRDATA: ACALL CHEBUSY
SETB RS
CLR RW
MOV P1, A
SETB E
NOP
CLR E
RET
;从LCD中读数据子程序
REDATA: MOV P1, #0FFH
ACALL CHEBUSY
SETB RS
SETB RW
SETB E
MOV A, P1
CLR E
RET
;检查LCD是否忙碌
CHEBUSY:MOV P1, #0FFH
CLR RS
SETB RW
SETB E
BUSY: JB P1.7, BUSY
CLR E
RET
DIGIT: DB '0123456789'
DIGIT1: DB '00-00-00'
DIS_H: ;显示小时
PUSH ACC ;保护现场
PUSH DPL
PUSH DPH
MOV HH, HOUR
MOV R0, #HH
MOV R1, #HL
LCALL BSECVRT ;转化成可显示的BCD码
MOV DPTR, #DIGIT
;显示小时的高位
MOV A, HH
MOVC A, @A+DPTR
MOV SDDRAM, #84H;设置 AC 的地址为DDRAM第5位
LCALL SETAC
LCALL WRDATA
;显示小时的低位
MOV A, HL
MOVC A, @A+DPTR
LCALL WRDATA
POP DPH ;恢复现场
POP DPL
POP ACC
RET
DIS_M: ;显示分钟
PUSH ACC ;保护现场
PUSH DPL
PUSH DPH
MOV MH, MIN
MOV R0, #MH
MOV R1, #ML
LCALL BSECVRT
MOV DPTR, #DIGIT
;显示分钟的高位
MOV A, MH
MOVC A, @A+DPTR
MOV SDDRAM, #87H;设置 AC 的地址为DDRAM的第8位
LCALL SETAC
LCALL WRDATA
;显示分钟的低位
MOV A, ML
MOVC A, @A+DPTR
LCALL WRDATA
POP DPH ;恢复现场
POP DPL
POP ACC
RET
DIS_S: ;显示秒
PUSH ACC ;保护现场
PUSH DPL
PUSH DPH
MOV SH, SEC
MOV R0, #SH
MOV R1, #SL
LCALL BSECVRT
MOVC A, @A+DPTR
;显示秒钟的高位
MOV A, SH
MOVC A, @A+DPTR
MOV SDDRAM, #8BH;设置 AC 的地址为DDRAM的第11位
LCALL SETAC
LCALL WRDATA
;显示秒钟的低位
MOV A, SL
MOVC A, @A+DPTR
LCALL WRDATA
POP DPH ;恢复现场
POP DPL
POP ACC
RET
BSECVRT:;将8位2进制数转化成两个BCD码
PUSH ACC ;保护现场
PUSH B
PUSH DPH
PUSH DPL
MOV A, @R0
MOV B, #0AH
DIV AB
MOV @R0, A
MOV @R1, B
POP DPL ;恢复现场
POP DPH
POP B
POP ACC
RET
END |
|