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

📄 12864f.txt

📁 一个完整的12864液晶显示模块的示例程序,主要是一个时钟日历功能
💻 TXT
📖 第 1 页 / 共 2 页
字号:
;**************变量的定义*****************
RS            BIT      P0.0            ;LCD数据/命令选择端(H/L)
RW            BIT          P0.1          ;LCD读/写选择端(H/L)
EP            BIT      P0.2            ;LCD使能控制
PRE            BIT        P1.4            ;调整键(K1)
ADJ            BIT      P1.5            ;调整键(K2)
comdat        equ p2
led equ p0.3

YEAR            DATA      18H            ;年,月,日变量
MONTH            DATA      19H
DATE            DATA      1AH
WEEK            DATA      1BH

HOUR            DATA      1CH            ;时,分,秒,百分之一秒变量
MIN            DATA      1DH
SEC            DATA      1EH
SEC100            DATA      1FH



STATE            DATA      23H

LEAP            BIT      STATE.1            ;是否闰年标志1--闰年,0--平年

KEY_S            DATA      24H            ;当前扫描键值
KEY_V            DATA      25H            ;上次扫描键值

DIS_BUF_U0      DATA      26H            ;LCD第一排显示缓冲区
DIS_BUF_U1      DATA      27H
DIS_BUF_U2      DATA      28H
DIS_BUF_U3      DATA      29H
DIS_BUF_U4      DATA      2AH
DIS_BUF_U5      DATA      2BH
DIS_BUF_U6      DATA      2CH
DIS_BUF_U7      DATA      2DH
DIS_BUF_U8      DATA      2EH
DIS_BUF_U9      DATA      2FH
DIS_BUF_U10      DATA      30H
DIS_BUF_U11      DATA      31H
DIS_BUF_U12      DATA      32H
DIS_BUF_U13      DATA      33H
DIS_BUF_U14      DATA      34H
DIS_BUF_U15      DATA      35H


DIS_BUF_L0      DATA      36H            ;LCD第三排显示缓冲区
DIS_BUF_L1      DATA      37H
DIS_BUF_L2      DATA      38H
DIS_BUF_L3      DATA      39H
DIS_BUF_L4      DATA      3AH
DIS_BUF_L5      DATA      3BH
DIS_BUF_L6      DATA      3CH
DIS_BUF_L7      DATA      3DH
DIS_BUF_L8      DATA      3EH
DIS_BUF_L9      DATA      3FH
DIS_BUF_L10      DATA      40H
DIS_BUF_L11      DATA      41H
DIS_BUF_L12      DATA      42H
DIS_BUF_L13      DATA      43H
DIS_BUF_L14      DATA      44H
DIS_BUF_L15      DATA      45H

FLAG            DATA      46H            ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3-闹钟秒
                             ;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。
DIS_H            DATA      47H
DIS_M            DATA      48H
DIS_S            DATA      49H

DIS_S0            DATA      4AH
DIS_S1            DATA      4BH
DIS_S2            DATA      4CH
DIS_S3            DATA      4DH
DIS_S4            DATA      4EH
DIS_S5            DATA      4FH


;******************初始化***********************
           ORG      0000H
           LJMP      START
           ORG      000BH
           LJMP      TIMER0

           ORG      0100H
START:            MOV      SP,#60H
           MOV      R0,#18H
           MOV      A,#00H
                clr led
MEM_INI:      MOV      @R0,A
           INC      R0
           CJNE      R0,#5FH,MEM_INI
           LCALL      DELAY_5ms      ;初始化LCD
           MOV      R0,#38H            ;设置LCD为16X2显示,5X7点阵,八位数据接口
           LCALL      LCD_WCMD
           LCALL      DELAY_5ms
           MOV      R0,#0CH            ;设置LCD开显示及光标形式(光标不闪烁,不显?-")
           LCALL      LCD_WCMD
           LCALL      DELAY_5ms
           MOV      R0,#06H            ;LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
           LCALL      LCD_WCMD
           LCALL      DELAY_5ms
           MOV      R0,#01H            ;清除LCD的显示内容
           LCALL      LCD_WCMD
           LCALL      DELAY_5ms

           MOV      YEAR,#5            ;置年初值
           MOV      MONTH,#1      ;置月初值
           MOV      DATE,#1            ;置日初值
           MOV      DIS_S0,#77H      ;"w"
           MOV      DIS_S1,#69H      ;"i"
           MOV      DIS_S2,#6CH      ;"l"
           MOV      DIS_S3,#6CH      ;"l"
           MOV      DIS_S4,#61H      ;"a"
           MOV      DIS_S5,#72H      ;"r"
           LCALL      WEEK_PRO
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO      ;屏显初始化

;*********************主程序*********************
MAIN:            MOV      IE,#8AH            ;CPU开中断,Timer0,Timer1开中断
           MOV      TMOD,#01H      ;Timer0,Timer1工作于模式1, 16位定时方式
           MOV      TH0,#0DCH      ;Timer0置10ms定时初值
           MOV      TL0,#00H

           SETB      TR0                ;Timer0启动
           MOV      KEY_V,#03H

MAIN_1:            LCALL      KEY_SCAN
           MOV      A,KEY_S
           XRL      A,KEY_V
           JZ      MAIN_1
           LCALL      DELAY_5ms
           LCALL      DELAY_5ms
           LCALL      KEY_SCAN
           MOV      A,KEY_S
           XRL      A,KEY_V
           JZ      MAIN_1
           MOV      KEY_V,KEY_S
           MOV      A,KEY_V
           XRL      A,#01H
           JNZ      MAIN_2
           CLR      TR0            ;进入调整状态,禁止Timer0
           MOV      IE,#00H            ;CPU禁止中断
           LCALL      KEY_PRE_PRO      ;PRE按键按下,调用PRE按键处理程序
           SJMP      MAIN_1
MAIN_2:            MOV      A,KEY_V
           XRL      A,#02H
           JNZ      MAIN_1
           LCALL      KEY_ADJ_PRO      ;ADJ按键按下,调用PRE按键处理程序
           SJMP      MAIN_1

;*******************按键扫描程序******************
KEY_SCAN:      CLR      A
           MOV      P3,#0FFH
           MOV      C,PRE
           MOV      ACC.1,C
           MOV      C,ADJ
           MOV      ACC.0,C
           MOV      KEY_S,A                  ;本次扫描键值存入KEY_S

           RET

;**************PRE按键处理程序*******************
KEY_PRE_PRO:      INC      FLAG
           MOV      R4,FLAG
                MOV      R0,#0EH
           LCALL      LCD_WCMD      ;显示光标"_",整个光标不闪烁
KEY_PRE_4:      CJNE      R4,#1,KEY_PRE_5
           MOV      DIS_S0,#74H      ;"t"
           MOV      DIS_S1,#69H      ;"i"
           MOV      DIS_S2,#6dH      ;"m"
           MOV      DIS_S3,#65H      ;"e"
           MOV      DIS_S4,#3aH      ;":"
           MOV      DIS_S5,#20H      ;" "
           MOV      R1,#50H            ;"P"
           MOV      DIS_H,HOUR
           MOV      DIS_M,MIN
           MOV      DIS_S,SEC
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO      ;更新屏显内容
           MOV      R0,#02H
           LCALL      LCD_POS            ;光标置年调整位置
           JMP      KEY_PRE_E
KEY_PRE_5:      CJNE      R4,#2, KEY_PRE_6
           MOV      R0,#04H
           LCALL      LCD_POS            ;光标置月调整位置
           JMP      KEY_PRE_E
KEY_PRE_6:      CJNE      R4,#3,KEY_PRE_7
           MOV      R0,#06H
           LCALL      LCD_POS            ;光标置日调整位置
           JMP      KEY_PRE_E
KEY_PRE_7:      CJNE      R4,#4,KEY_PRE_8
           MOV      R0,#14H
           LCALL      LCD_POS            ;光标置时调整位置
           JMP      KEY_PRE_E
KEY_PRE_8:      CJNE      R4,#5,KEY_PRE_9
           MOV      R0,#16H
           LCALL      LCD_POS            ;光标置分调整位置
           JMP      KEY_PRE_E
KEY_PRE_9:      CJNE      R4,#6,KEY_PRE_10
           MOV      R0,#17H
           LCALL      LCD_POS            ;光标置秒调整位置
           JMP      KEY_PRE_E
KEY_PRE_10:      MOV      FLAG,#0            ;FLAG到11,就清零
           MOV      R0,#0CH
           LCALL      LCD_WCMD      ;设置LCD开显示及光标不闪烁,不显示"-"
           MOV      R0,#01H
           LCALL      LCD_WCMD      ;清除LCD的显示内容
           MOV      IE,#8AH            ;CPU开中断,TIMER0,TIMER1开中断
           SETB      TR0            ;启动TIMER0
KEY_PRE_E:
           RET

;**************ADJ按键处理程序*******************
KEY_ADJ_PRO:   MOV      R0,#0CH
     LCALL      LCD_WCMD      ;设置LCD开显示及光标不闪烁,不显示"-"
               MOV      R5,FLAG


KEY_ADJ_4:      CJNE      R5,#1,KEY_ADJ_5            ;FLAG=5,调整年
           INC      YEAR
           MOV      A,YEAR
           CJNE      A,#100,KEY_ADJ_4_1
           MOV      YEAR,#0
KEY_ADJ_4_1:      LCALL      WEEK_PRO
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
           MOV      R0,#05H
           LCALL      LCD_POS
           JMP      KEY_ADJ_E
KEY_ADJ_5:      CJNE      R5,#2,KEY_ADJ_6            ;FLAG=6,调整月
           INC      MONTH
           MOV      A,MONTH
           CJNE      A,#13,KEY_ADJ_5_1
           MOV      MONTH,#1
KEY_ADJ_5_1:      LCALL      WEEK_PRO
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
           MOV      R0,#08H
           LCALL      LCD_POS
           JMP      KEY_ADJ_E
KEY_ADJ_6:      CJNE      R5,#3,KEY_ADJ_7            ;FLAG=7,调整日
           INC      DATE
           MOV      A,MONTH
           XRL      A,#2
           JNZ      KEY_ADJ_6_2            ;不是二月跳转
           MOV      A,DATE                  ;
           MOV      C,LEAP                  ;判断是否闰年
           JC      KEY_ADJ_6_1
           XRL      A,#29                  ;平年二月日期28天
           JNZ      KEY_ADJ_6_5
           JMP      KEY_ADJ_6_4
KEY_ADJ_6_1:      XRL      A,#30                  ;闰年二月日期29天
           JNZ      KEY_ADJ_6_5
           JMP      KEY_ADJ_6_4            ;跳转到月处理
KEY_ADJ_6_2:      MOV      A,MONTH
           XRL      A,#4
           JZ      KEY_ADJ_6_3
           MOV      A,MONTH
           XRL      A,#6
           JZ      KEY_ADJ_6_3
           MOV      A,MONTH
           XRL      A,#9
           JZ      KEY_ADJ_6_3
           MOV      A,MONTH
           XRL      A,#11
           JZ      KEY_ADJ_6_3
           MOV      A,DATE
           XRL      A,#32                  ;大月日期31天
           JNZ      KEY_ADJ_6_5
           JMP      KEY_ADJ_6_4
KEY_ADJ_6_3:      MOV      A,DATE
           XRL      A,#31                  ;小月日期30天
           JNZ      KEY_ADJ_6_5
KEY_ADJ_6_4:      MOV      DATE,#1
KEY_ADJ_6_5:      LCALL      WEEK_PRO
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
           MOV      R0,#0BH
           LCALL      LCD_POS
           JMP      KEY_ADJ_E
KEY_ADJ_7:      CJNE      R5,#4,KEY_ADJ_8            ;FLAG=8,调整时
           INC      HOUR
           MOV      A,HOUR
           CJNE      A,#24,KEY_ADJ_7_1
           MOV      HOUR,#0
KEY_ADJ_7_1:      MOV      DIS_H,HOUR
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
           MOV      R0,#49H
           LCALL      LCD_POS
           JMP      KEY_ADJ_E
KEY_ADJ_8:      CJNE      R5,#5,KEY_ADJ_9            ;FLAG=9,调整分
           INC      MIN
           MOV      A,MIN
           CJNE      A,#60,KEY_ADJ_8_1
           MOV      MIN,#0
KEY_ADJ_8_1:      MOV      DIS_M,MIN
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
           MOV      R0,#4CH
           LCALL      LCD_POS
           JMP      KEY_ADJ_E
KEY_ADJ_9:      CJNE      R5,#6,KEY_ADJ_E      ;FLAG=10,调整秒
           INC      SEC
           MOV      A,SEC
           CJNE      A,#60,KEY_ADJ_9_1
           MOV      SEC,#0
KEY_ADJ_9_1:      MOV      DIS_S,SEC
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
           MOV      R0,#4FH
           LCALL      LCD_POS
           JMP      KEY_ADJ_E
KEY_ADJ_E:
           RET

;***************Timer0定时中断程序*****************
TIMER0:            MOV        TH0,#0DCH
           MOV      TL0,#00H
           INC        SEC100
           MOV        A,SEC100
           CJNE      A,#100,TIMER0_E
           MOV      SEC100,#0
           LCALL      TIME_PRO
           MOV      A,SEC                  ;"willar显示1秒钟,消失一秒种,形成闪动
           ANL      A,#01
           JZ      TIMER0_1
           MOV      DIS_S0,#"G"
           MOV      DIS_S1,#"u"
           MOV      DIS_S2,#"i"
           MOV      DIS_S3,#"L"
           MOV      DIS_S4,#"i"
           MOV      DIS_S5,#"n"
           SJMP      TIMER0_2
TIMER0_1:      MOV      DIS_S0,#"b"
           MOV      DIS_S1,#"u"
           MOV      DIS_S2,#"s"
           MOV      DIS_S3,#"^"
           MOV      DIS_S4,#"-"
           MOV      DIS_S5,#"^"
TIMER0_2:
           MOV      DIS_H,HOUR
           MOV      DIS_M,MIN
           MOV      DIS_S,SEC
           LCALL      UPDATE_BUF
           LCALL      DISPLAY_PRO
TIMER0_E:
           RETI



;**************时间日期处理函数******************
TIME_PRO:      INC      SEC                  ;秒处理
           MOV      A,SEC
           CJNE      A,#60,TIME_PRO_e
           MOV      SEC,#0
           INC      MIN                  ;分处理
           MOV      A,MIN
           CJNE      A,#60,TIME_PRO_e
           MOV      MIN,#0
           INC      HOUR                  ;时处理
           MOV      A,HOUR
           CJNE      A,#24,TIME_PRO_e
           MOV      HOUR,#0
           INC      DATE                  ;日处理(日处理要考虑是否闰年,大月,小月)
           MOV      A,MONTH
           XRL      A,#2
           JNZ      TIME_PRO_D2            ;不是二月,转TIME_PRO_D2
           MOV      A,DATE                  ;
           MOV      C,LEAP                  ;判断是否闰年
           JC      TIME_PRO_D1
           XRL      A,#29                  ;平年二月日期28天
           JNZ      TIME_PRO_W
           SJMP      TIME_PRO_M            ;跳转到月处理
TIME_PRO_D1:      XRL      A,#30                  ;闰年二月日期29天
           JNZ      TIME_PRO_W
           SJMP      TIME_PRO_M            ;跳转到月处理
TIME_PRO_D2:      MOV      A,MONTH
           XRL      A,#4
           JZ      TIME_PRO_D3
           MOV      A,MONTH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -