📄 ts1602-lcd.asm
字号:
;=============================================================================;
; MCU:8051 ;
; FUNCTION:DISPLAY Date Time Temperature Site ;
; 多功能显示器同时显示温度、时间、日期、站点 ;
; 通过按键4选择调节时间还是日期 ;
; 再用按键二和按键三来调整时间和日期 ;
; Chen.Feikun 2008.4.25 ;
;=============================================================================;
;小时暂存
HOUR EQU 51H ;小时暂存
HOUR_H EQU 32H ;小时十位-LCD最终显示数值/ASCII码
HOUR_L EQU 33H ;小时个位-LCD最终显示数值/ASCII码
;分钟暂存
MINUTE EQU 50H ;分钟暂存
MIN_H EQU 35H ;分钟十位-LCD最终显示数值/ASCII码
MIN_L EQU 36H ;分钟个位-LCD最终显示数值/ASCII码
;秒定义
SECONG EQU 53H ;秒暂存
;月份暂存
MONTH EQU 58H ;月份暂存,查表用
MONTH_H EQU 39H ;月份名称高字节
MONTH_M EQU 3AH ;月份名称中字节
MONTH_L EQU 3BH ;月份名称低字节
;日期暂存
DATE EQU 57H ;日期暂存
DATE_H EQU 3DH ;日期十位/ASCII码
DATE_L EQU 3EH ;日期个位/ASCII码
;站点暂存
SITE EQU 59H ;站点暂存,查表用
SITE_1 EQU 42H ;站点显示第一位
SITE_2 EQU 43H ;站点显示第二位
SITE_3 EQU 44H ;站点显示第三位
SITE_4 EQU 45H ;站点显示第四位
SITE_5 EQU 46H ;站点显示第五位 最多五位
;温度暂存
A_BIT EQU 54H ;温度转换暂存
TEMPER_H EQU 55H ;温度转换高字节暂存
TEMPER_L EQU 56H ;温度转换低字节暂存
TEMP_H EQU 4DH ;温度值十位显示/ASCII码
TEMP_L EQU 4EH ;温度值个位显示/ASCII码
DS1820_DQ BIT P0.0 ;DS18B20数据脚
;TIMER0计数指针
NUM EQU 52H ;TIMER0计数指针
;LCD定义
LCD EQU P2 ;数据线
EN BIT P1.0 ;LCD 片选脚
RW BIT P1.1 ;LCD 读写控制,0写入LCD,1读LCD
RS BIT P1.2 ;LCD 0连接内部指令控制器IR,1连接内部寄存器DR
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME0
ORG 0030H
MAIN:
;初始化设定及赋初值===========================================================;
MOV SP,#70H
MOV SECONG,#00 ;秒钟由0开始计数
MOV MINUTE,#59 ;分钟由0开始计数
MOV HOUR,#23 ;时钟由0开始计数
MOV DATE,#30
MOV NUM,#20
MOV MONTH,#00H ;从第一月开始显示Jan
MOV MONTH_H,#04AH
MOV MONTH_M,#061H
MOV MONTH_L,#06EH
MOV SITE,#00H ;从上海站开始显示
MOV SITE_1,#053H
MOV SITE_2,#048H
MOV SITE_3,#061H
MOV SITE_4,#069H
MOV SITE_5,#0FEH
;LCD固定显示编码==============================================================;
MOV 30H,#054H ;"T" 第一行第一个字符
MOV 31H,#0FEH ;" "
MOV HOUR_H,#030H
MOV HOUR_L,#030H
;MOV 34H,#03AH ;":"
MOV MIN_H,#030H
MOV MIN_L,#030H
MOV 37H,#0FEH ;" "
MOV 38H,#0FEH ;" "
MOV 3CH,#05BH ;"["
MOV DATE_H,#030H
MOV DATE_L,#030H
MOV 3FH,#05DH ;"]" 第一行第十六个字符
MOV 40H,#1 ;自建字符 箭头,第二行第一个字符
MOV 41H,#0FEH ;" "
MOV 47H,#0FEH ;" "
MOV 48H,#0FEH ;" "
MOV 49H,#054H ;"T"
MOV 4AH,#065H ;"e"
MOV 4BH,#0FEH ;" "
MOV 4CH,#0FEH ;" "
MOV 4FH,#0 ;自建字符 摄氏度 第二行第十六个字符
MOV TMOD,#01H ;T0 方式一,16位定时
MOV TH0,#04CH ;50MS的定时 OSC=11.0592MHZ
MOV TL0,#000H
SETB EA ;开全局中断
SETB ET0 ;开T0中断
SETB TR0 ;T0计数功能
LCALL LCDINT
;==============================主函数=========================================;
STAR:
LCALL GET_TEMP
LCALL CHANGE
;;=============================按键扫描子程序==================================;
SCANKEY:
MOV P0,#0FFH
JNB P0.1,K2 ;第一次按下K2键,调站点加一
JNB P0.2,K3 ;第一次按下K3键,调站点减一
JNB P0.3,K4ONE ;第一次按下K4键
LJMP LOOP
;第一次按下K2键,站点加一===============
K2:
LCALL DELAY ;延时消抖
JB P0.1,K4NEXT1 ;无键按下跳出显示
JNB P0.1,$ ;等待K2键按下
INC SITE ;站点加一,响应按键
MOV A,SITE
CLR C
CJNE A,#7,SS1 ;站点不等于7则跳查表
MOV SITE,#0 ;站点=7,则从第一站开始显示
LJMP LOOP
SS1:
LJMP LOOP ;返回显示
;=======================================
;第一次按下K3键,站点减一===============
K3:
LCALL DELAY ;延时消抖
JB P0.2,K4NEXT1 ;无键按下跳出显示
JNB P0.2,$ ;等待K3键按下
MOV A,SITE
CLR C
CJNE A,#0,SS2 ;站点不等于0则跳查表
MOV SITE,#7 ;等于0则从最后一站开始显示
LJMP LOOP ;返回显示
SS2:
DEC SITE ;站点减一,响应按键
LJMP LOOP ;返回显示
;======================================
;第一次按下K4三种情况=========================================================;
K4ONE:
JNB P0.3,$
MOV P0,#0FFH ;再次扫描按键
JNB P0.1,K42 ;K4按下的情况下按K2键,时钟加一
JNB P0.2,K43 ;K4按下的情况下按K3键,分钟加一
JNB P0.3,K44 ;K4按下的情况下按K4键,第二次按下K4键,转调整日期
LJMP K4ONE ;循环扫描
;返回显示子程序=========================
K4NEXT1:
LCALL DELAY ;延时消抖
JB P0.3,K4NEXT1
JNB P0.3,$ ;等待键按下
LJMP LOOP ;松开则返回显示
;时钟加一===============================
K42:
LCALL DELAY ;延时消抖
JB P0.1,K4NEXT1 ;无键按下则返回显示
JNB P0.1,$ ;等待键按下
INC HOUR ;K4按下的情况下按K2键,时钟加一
MOV A,HOUR
CLR C
CJNE A,#24,HH1 ;不等于24则跳转显示
MOV HOUR,#00H ;第24小时显示00
LCALL UPDATE_BUF ;刷新显示缓存
LCALL DISPLAY ;调用显示子程序
LJMP K4ONE ;再次扫描
HH1:
LCALL UPDATE_BUF
LCALL DISPLAY
LJMP K4ONE
;=======================================
;分钟加一===============================
K43:
LCALL DELAY ;延时消抖
JB P0.2,K4NEXT ;无键按下则返回显示
JNB P0.2,$ ;等待键按下
INC MINUTE ;K4按下的情况下按K3键,分钟加一
MOV A,MINUTE
CLR C
CJNE A,#60,MM1 ;不足60分转显示
MOV MINUTE,#00H ;第60分钟显示00
LCALL UPDATE_BUF ;刷新显示缓存
LCALL DISPLAY ;调用显示子程序
LJMP K4ONE ;再次扫描
MM1:
LCALL UPDATE_BUF
LCALL DISPLAY
LJMP K4ONE
;=======================================
;第二次按下K4三种情况=========================================================;
K44:
JNB P0.3,$
MOV P0,#0FFH ;按键扫描
JNB P0.1,K442 ;两次按下K4,再按下K2,转月份加一
JNB P0.2,K443 ;两次按下K4,再按下K3,转日期加一
JNB P0.3,K4NEXT ;三次按下K4,返回显示
LJMP K44 ;循环扫描
;月加一=================================
K442:
LCALL DELAY ;延时消抖
JB P0.1,K4NEXT ;无键按下返回显示
JNB P0.1,$ ;等待键按下
MOV A,MONTH
CLR C
INC MONTH ;月份加一,响应按键
CJNE A,#11,LL1 ;不到十二月,转查表显示
MOV MONTH,#0 ;到十二月,从一月份开始显示
LCALL UPDATE_BUF ;刷新显示缓存
LCALL DISPLAY ;调用显示子程序
LJMP K44 ;再次扫描
LL1:
LCALL UPDATE_BUF
LCALL DISPLAY
LJMP K44
;返回显示子程序=========================
K4NEXT:
LCALL DELAY ;延时消抖
JB P0.3,K4NEXT
JNB P0.3,$
LJMP LOOP
;日期加一===============================
K443:
LCALL DELAY ;延时消抖
JB P0.2,K4NEXT ;无键按下返回显示
JNB P0.2,$ ;等待键按下
INC DATE ;日期加一
MOV A,DATE ;日期30天,
CLR C
CJNE A,#31,DD1 ;不足30天,则转显示
MOV DATE,#01H ;第31天,则从第一天开始显示
LCALL UPDATE_BUF ;刷新显示缓存
LCALL DISPLAY ;调用显示子程序
LJMP K44 ;再次扫描
DD1:
LCALL UPDATE_BUF
LCALL DISPLAY
LJMP K44
LOOP:
LCALL UPDATE_BUF ;更新显示缓冲子函数
LCALL DISPLAY ;显示子函数
LCALL DELAY_5ms
LJMP STAR
;=======================================
;===========================更新显示缓冲子函数================================;
UPDATE_BUF:
LCALL UPDATE_DATE ;更新日期
LCALL UPDATE_SITE ;更新站点
LCALL UPDATE_TIME ;更新时间
LCALL UPDATE_YUE ;更新月份
RET
;更新日期===============================
UPDATE_DATE:
MOV A,DATE
MOV B,#10
DIV AB
ADD A,#30H
MOV DATE_H,A
MOV A,B
ADD A,#30H
MOV DATE_L,A
RET
;更新站点===============================
UPDATE_SITE:
PUSH SITE
MOV R0,#5 ;5个地址显示站点
MOV R1,#SITE_1 ;首地址赋R1
MOV DPTR,#TAB1
MOV A,SITE
AA1: MOVC A,@A+DPTR
MOV @R1,A
INC R1 ;地址加一
MOV A,SITE
ADD A,#8 ;以8为倍数查表
MOV SITE,A
DJNZ R0,AA1 ;每个站名查表5次
POP SITE
RET
UPDATE_TIME:
;分钟===================================
MOV A,MINUTE
MOV B,#10
DIV AB
ADD A,#30H
MOV MIN_H,A
MOV A,B
ADD A,#30H
MOV MIN_L,A
;小时
MOV A,HOUR
MOV B,#10
DIV AB
ADD A,#30H
MOV HOUR_H,A
MOV A,B
ADD A,#30H
MOV HOUR_L,A
RET
;更新月份===============================
UPDATE_YUE:
PUSH MONTH
MOV R0,#3 ;三个地址显示月份
MOV R1,#MONTH_H ;首地址赋R1
MOV DPTR,#TAB2
MOV A,MONTH
BB1: MOVC A,@A+DPTR
MOV @R1,A
INC R1 ;地址加一
MOV A,MONTH
ADD A,#12 ;以12为倍数查表
MOV MONTH,A
DJNZ R0,BB1
POP MONTH
RET
;=============================================================================;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -