📄 tmp_lcd_clock.asm
字号:
;===========================================================
;名 称:LCD液晶时钟程序
;说 明:基于TBT的实时时钟,LCD显示,可通过按键实现设置时间
; 设定定时等功能;KEY1为SET功能键,KEY2/KEY3为"+""-"
; 功能键,KEY4为定时设置键(定时时间到后蜂鸣器鸣叫),
; 同时LED数码管显示两路温度传感器测得温度。
;入口参数: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时显示允许
T_DIS EQU 1;温度刷新标志,=1时允许刷新刷新频率1Hz
;----------------------------------------------
BP_FLAG EQU 0X5A;蜂鸣器标志
BP_ON EQU 0;打开蜂鸣器标志,1有效
;------------------------------------------------
BP_TIM EQU 0X5B;蜂鸣器鸣响时间
FLASH_TIM EQU 0X5C;闪动时间
KEY_TIM EQU 0X65;按键消抖时间
;------------------------------------------------
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表示转换结束
;=======================================================
;----------------------------------------LED_DISP
COM1_DATA EQU 0X5F
COM2_DATA EQU 0X60
COM3_DATA EQU 0X61
COM4_DATA EQU 0X62
TEMP1 EQU 0X63
TEMP2 EQU 0X64
;=======================================LCD_DISP位定义
;---------------------------------------LED_DISP位定义
COM1 EQU 2;P02
COM2 EQU 3;P03
COM3 EQU 4;P04
COM4 EQU 5;P05
LED_CLK EQU 7;P20
LED_DAT EQU 6;P06
TEMP3 EQU 0X6E
;---------------------------------------AD_INPUT
TTEMP1 EQU 0X71
TTEMP2 EQU 0X72
TTEMP3 EQU 0X73
;=============================================主程序开始
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;显示
CALL LED_DISP
LD CF,(DIS_FLAG).T_DIS;刷新标志判断
J CS,LOOP1
CALL AD_INPUT
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),0X05
J CS,CLOCK_EXIT;是否大于等于10ms
;----------------------------------------------按键
KEY_TIME:
LD CF,(KEY_FLAG).KEY_TIMON
J CC,BP_TIME
INC (KEY_TIM)
;----------------------------------------------蜂鸣器
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:
CPL (DIS_FLAG).T_DIS
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则没有按键按下
;-------------------------------------------------------
SET (KEY_FLAG).KEY_TIMON
CMP (KEY_TIM),10
J CS,KEY_EXIT
CLR (KEY_FLAG).KEY_TIMON
LD (KEY_TIM),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
J EQ,KEY_DOWN
KOP_EXIT:
LD (KEY_NAME),0
RET
;---------------------------------------SET按键
KEY_SET:
LD A,(MENU);菜单数据到A
J NZ,KSET_N1;非0则进入下一个菜单
SET (MENU).H_SET;=0则进入小时设置
J KOP_EXIT
KSET_N1:
SHLC A
LD (MENU),A
LD CF,(MENU).3;菜单是否结束?
J CC,KOP_EXIT;没结束退出
LD (MENU),0
J KOP_EXIT
;---------------------------------------UP按键
KEY_ADD:
CMP (MENU),1
J EQ,KU_HSET
CMP (MENU),2
J EQ,KU_MSET
CMP (MENU),4
J EQ,KU_SSET
J KOP_EXIT
;-------------------------------小时设置状态下按UP键
KU_HSET:
INC (HOUR)
CMP (HOUR),24
J CS,KOP_EXIT
LD (HOUR),0
J KOP_EXIT
;-------------------------------分钟设置状态下按UP键
KU_MSET:
INC (MIN)
CMP (MIN),60
J CS,KOP_EXIT
LD (MIN),0
J KOP_EXIT
;-------------------------------秒钟设置状态下按UP键
KU_SSET:
INC (SEC)
CMP (SEC),60
J CS,KOP_EXIT
LD (SEC),0
J KOP_EXIT
;---------------------------------------DOWN按键
KEY_DOWN:
CMP (MENU),1
J EQ,KD_HSET
CMP (MENU),2
J EQ,KD_MSET
CMP (MENU),4
J EQ,KD_SSET
J KOP_EXIT
;-------------------------------小时设置状态下按DOWN键
KD_HSET:
DEC (HOUR)
CMP (HOUR),255
J NE,KOP_EXIT
LD (HOUR),23
J KOP_EXIT
;-------------------------------分钟设置状态下按DOWN键
KD_MSET:
DEC (MIN)
CMP (MIN),255
J NE,KOP_EXIT
LD (MIN),59
J KOP_EXIT
;-------------------------------秒钟设置状态下按DOWN键
KD_SSET:
DEC (SEC)
CMP (SEC),255
J NE,KOP_EXIT
LD (SEC),59
J KOP_EXIT
;===========================================================
;===========================================================
;名 称:LCD驱动程序(基于HT1621)
;说 明:控制HT1621驱动LCD段码液晶
;入口参数:HOUR、MIN、SEC
;出口参数:-
;程序入口:LCD_DISP
;占用资源:
;涉及模块:
;===========================================================
LCD_DISP:
LD HL,LCD_DAT0102
LCD_DCLR:
LD (HL),0X00
INC HL
CMP HL,0X4D
J NE,LCD_DCLR;LCD数据清零
;-------------------------------------小时显示,LDAT2021/1819
LD CF,(MENU).H_SET;在设置状态闪烁
J CC,HOUR_DIS
LD CF,(DIS_FLAG).FLASH
J CC,MIN_DTEST
HOUR_DIS:
LD A,(HOUR)
LD (LBIT),A;24小时制
CALL HEX2BCD
LD C,(HBIT)
LD HL,DIS_TABLCD
LD A,(HL+C);查表得出显示码
LD (LCD_DAT2021),A
LD C,(LBIT)
LD HL,DIS_TABLCD
LD A,(HL+C)
LD (LCD_DAT1819),A
;---------------------------------------分显示
MIN_DTEST:
LD CF,(MENU).M_SET;在设置状态闪烁
J CC,MIN_DIS
LD CF,(DIS_FLAG).FLASH
J CC,SEC_DTEST
MIN_DIS:
LD A,(MIN)
LD (LBIT),A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -