📄 lcd_clock.asm
字号:
;===========================================================
;名 称:LCD液晶时钟程序
;说 明:基于TBT的实时时钟,LCD显示,可通过按键实现设置时间
; 设定定时等功能;KEY1为SET功能键,KEY2/KEY3为"+""-"
; 功能键,KEY4为定时设置键(定时时间到后蜂鸣器鸣叫)
;入口参数:HOUR、MIN、SEC
;出口参数:-
;程序入口:LCD_DISP
;占用资源:40H~50H,B、C、WA、HL、IX
;涉及模块:TBT
;===========================================================
$include"TMP86P808.H";包含头文件
;-------------------------------
;中断及复位向量
;-------------------------------
CODE_INVEC SECTION CODE ABS=0XFFE0
INTVEC:
DW TO_RETI;/INT5 0XFFE0
DW TO_RETI;INTTXD1 0XFFE2
DW TO_RETI;INTRXD1 OXFFE4
DW TO_RETI;INT 0XFFE6
DW TO_RETI;INTTIC0 0XFFE8
DW TO_RETI;INTET0 0XFFEA
DW TO_RETI;INTTXD0 0XFFEC
DW TO_RETI;INTRXD0 0XFFEE
DW TO_RETI;INTT1 0XFFF0
DW INTTBT;INTTBT 0XFFF2
DW TO_RETI;INT1 0XFFF4
DW TO_RETI;/INTT0 0XFFF6
DW TO_RETN;INTWDT 0XFFF8
DW TO_RETN;INTATRAP 0XFFFA
DW TO_RETN;INTUNDEF 0XFFFC
DW START;RESET 0XFFFE
;------------------------------------
;=========================================内存分配
LCD_DAT0102 EQU 0X40;LCD显示数据
LCD_DAT0304 EQU 0X41
LCD_DAT0506 EQU 0X42
LCD_DAT0708 EQU 0X43
LCD_DAT0910 EQU 0X44
LCD_DAT1112 EQU 0X45
LCD_DAT13 EQU 0X46
LCD_DAT1415 EQU 0X47
LCD_DAT1617 EQU 0X48
LCD_DAT1819 EQU 0X49
LCD_DAT2021 EQU 0X4A
LCD_DAT2223 EQU 0X4B
LCD_DAT24 EQU 0X4C
;-----------------------------------------------------------
LCD_BCNT EQU 0X4D;LCD显示位计数器
HOUR EQU 0X4E;小时寄存器
MIN EQU 0X4F;分钟计时器
SEC EQU 0X50;秒计时器
MS EQU 0X51;毫秒寄存器
TEN_MS EQU 0X52;10毫秒寄存器
;----------------------------------------HEX转换BCD子程序
LBIT EQU 0X53;BCD转换高位
HBIT EQU 0X54;BCD转换低位
;-----------------------------------------按键扫描子程序
KEY_TMP EQU 0X55;按键名暂存器
KEY_NAME EQU 0X56;按键名称
KEY_CODE EQU 0X57;按键AD值
;------------------------------------------
KEY_FLAG EQU 0X58;按键标志
WAIT_POP EQU 0;按键等代谈起标志,=1表示有按键按下,等待弹起
KEY_TIMON EQU 1;按键消抖计时标志,=1开始计时
;---------------------------------------------
DIS_FLAG EQU 0X59;显示标志寄存器
FLASH EQU 0;闪烁标志,=1时显示允许
;----------------------------------------------
BP_FLAG EQU 0X5A;蜂鸣器标志
BP_ON EQU 0;打开蜂鸣器标志,1有效
;------------------------------------------------
BP_TIM EQU 0X5B;蜂鸣器鸣响时间
FLASH_TIM EQU 0X5C;闪动时间
;------------------------------------------------
MENU EQU 0X5D;菜单寄存器
H_SET EQU 0;小时设置
M_SET EQU 1;分钟设置
S_SET EQU 2;秒设置
;-------------------------------------------------
KN_BUF EQU 0X5E;按键名缓存
;============================================特殊位标志定义
TBTEN EQU 3;TBT启动位,=1有效
LCD_DAT EQU 1;LCD数据p31
LCD_CLK EQU 1;LCD时钟p11
LCD_CS EQU 0;LCD片选p10
ADS EQU 7;AD启动标志,1有效
EOCF EQU 5;AD结束标志,=1表示转换结束
;=============================================主程序开始
MAIN_CODE SECTION CODE ABS=0XE000
START:
LD SP,0X13F;堆栈指针
LD (SYSCR2),0X80;单时钟模式
LD (WDTCR1),0X00
LD (WDTCR2),0XB1;禁用WDT
LD (P0),0X0
LD (P1),0X0
LD (P2),0X0
LD (P3),0y00111101
LD (P0OUTCR),0Xff;
LD (P1CR),0XFF;P1输出
; LD (P2PRD),0X01;
LD (P3CR),0y11000010;
;------------------------------------------内存清0
RAM_CLR:
LD HL,0X40
LD WA,0X13F-0X40
RCLR1:
LD (HL),0X0
INC HL
DEC WA
J F,RCLR1
;---------------------------------------------------主循环
LOOP:
SET (BP_FLAG).BP_ON
LD (TBTCR),0X05;每次中断约1MS-4MHZ晶振
DI
SET (TBTCR).TBTEN
SET (EIRL).6
EI;打开TBT中断
LOOP1:
CALL AD_KEY;按键识别
CALL KEY_OP;按键处理
CALL LCD_DISP;显示
J LOOP1
;===========================================================
;===========================================================
NO_USEINT SECTION CODE MEDIUM
TO_RETI:
RETI
TO_RETN:
RETN
;===========================================================
;==========================================TBT构成的实时时钟
INTTBT:
PUSH A
PUSH B
PUSH C
PUSH H
PUSH L;压栈
MSF:
INC (MS);每次中断约等于1ms
CMP (MS),0X0A
J CS,CLOCK_EXIT;是否大于等于10ms
;----------------------------------------------蜂鸣器
BP_TIME:
LD CF,(BP_FLAG).BP_ON
J CC,FLASH_TIME;是否要打开蜂鸣器
SET (P1).2
INC (BP_TIM)
CMP (BP_TIM),30
J CS,FLASH_TIME;蜂鸣器是否鸣想了30ms
CLR (BP_FLAG).BP_ON
LD (BP_TIM),0
CLR (P1).2
;---------------------------------------------------
;---------------------------------------------0.5S闪动
FLASH_TIME:
INC (FLASH_TIM)
CMP (FLASH_TIM),99
J CS,TEN_MSF
LD (FLASH_TIM),0
CPL (DIS_FLAG).FLASH;每0.5秒闪动一次
;----------------------------------------------------
TEN_MSF:
LD (MS),0X0
INC (TEN_MS)
CMP (TEN_MS),198
J CS,CLOCK_EXIT
SECF:
LD (TEN_MS),0X0
CMP (MENU),0;在设置状态下计时停止
J NE,CLOCK_EXIT
INC (SEC)
CMP (SEC),0X3C
J CS,CLOCK_EXIT
MINF:
LD (SEC),0X0
INC (MIN)
CMP (MIN),0X3C
J CS,CLOCK_EXIT
HOURF:
LD (MIN),0X0
INC (HOUR)
CMP (HOUR),24
J CS,CLOCK_EXIT
LD (HOUR),0X0
CLOCK_EXIT:
POP L
POP H
POP C
POP B
POP A
RETI
;===========================================================
;===========================================================
;名 称:AD按键识别程序
;说 明:通过MCU的AD端口识别与之相连的按键,理论上一个8BIT
; 的AD端口能够识别255个按键
;入口参数:-
;出口参数:KEY_NAME
;程序入口:AD_KEY
;占用资源:
;===========================================================
AD_KEY:
LD (ADCCR2),0y00010100;速率为19.5us,4mhz
LD (ADCCR1),0y00100000;选择AD通道0,单次启动
SET (ADCCR1).ADS;启动AD
WAIT_AD:
LD CF,(ADCDR2).EOCF
J CC,WAIT_AD;等待AD转换结束
LD A,(ADCDR1);读取AD结果
LD (KEY_CODE),A;转存结果
J Z,NOKEY;AD结果如果为0则没有按键按下
;------------------------延时30ms消抖
CALL DELY10MS
CALL DELY10MS
CALL DELY10MS
CALL DELY10MS
;---------------------------延时结束
SET (ADCCR1).ADS;启动AD
WAIT_AD1:
TEST (ADCDR2).EOCF
J T,WAIT_AD1;等待AD转换结束
LD A,(ADCDR1);读取AD结果
LD (KEY_CODE),A
J Z,NOKEY;释放消抖
SET (KEY_FLAG).WAIT_POP;有按键按下,设置标志
READ_KEY:
CMP (KEY_CODE),0XDC;220
J CS,RDK_N1;如果AD值小于220则进入下一个按键判断
LD (KEY_TMP),0X09
J AD_KEY
RDK_N1:
CMP (KEY_CODE),0XC4;196
J CS,RDK_N2
LD (KEY_TMP),0X08
J AD_KEY
RDK_N2:
CMP (KEY_CODE),0XB4;180
J CS,RDK_N3
LD (KEY_TMP),0X07
J AD_KEY
RDK_N3:
CMP (KEY_CODE),0XA5;165
J CS,RDK_N4
LD (KEY_TMP),0X06
J AD_KEY
RDK_N4:
CMP (KEY_CODE),0X9B;155
J CS,RDK_N5
LD (KEY_TMP),0X05
J AD_KEY
RDK_N5:
CMP (KEY_CODE),0X91;145
J CS,RDK_N6
LD (KEY_TMP),0X04
J AD_KEY
RDK_N6:
CMP (KEY_CODE),0X87;.135
J CS,RDK_N7
LD (KEY_TMP),0X03
J AD_KEY
RDK_N7:
CMP (KEY_CODE),0X7E;.126
J CS,RDK_N8
LD (KEY_TMP),0X02
J AD_KEY
RDK_N8:
CMP (KEY_CODE),0X75;.115
J CS,RDK_N9
LD (KEY_TMP),0X01
RET
RDK_N9:
LD (KEY_TMP),0X00
CLR (KEY_FLAG).WAIT_POP
RET
NOKEY:
LD CF,(KEY_FLAG).WAIT_POP;是否处于等待按键放开状态
J CC,KEY_EXIT
CLR (KEY_FLAG).WAIT_POP
LD A,(KEY_TMP)
LD (KEY_NAME),A
SET (BP_FLAG).BP_ON
KEY_EXIT:
RET
;===========================================================
;===========================================================
DELY10MS:
LD IX,6000
DE_IX:
DEC IX
J NZ,DE_IX
RET
;===========================================================
;===========================================================
;
;
;
;
;===========================================================
KEY_OP:
CMP (KEY_NAME),0
J EQ,KOP_EXIT
CMP (KEY_NAME),1
J EQ,KEY_SET
CMP (KEY_NAME),2
J EQ,KEY_ADD
CMP (KEY_NAME),3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -