⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ts1602-lcd.asm

📁 1多功能显示器能通过按键二和按键三来调整LCD显示站名
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=============================================================================;
; 		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 + -