📄 ad_key.asm
字号:
;===========================================================
;名 称:AD按键识别程序
;说 明:通过MCU的AD端口识别与之相连的按键,理论上一个8BIT
; 的AD端口能够识别255个按键
;入口参数:ADCDR
;出口参数:KEY_NAME
;程序入口:AD_KEY
;占用资源:AIN2(P32)、KEY_TMP、KEY_CODE、KEY_NAME、B、C
; ADCCR、ADCDR
;===========================================================
$include"TMP86P808.H";包含头文件
;-------------------------------
;中断及复位向量
;-------------------------------
CODE_INVEC SECTION CODE ABS=0XFFE0
INTVEC:
DW TO_RETI;/INT5 0XFFE0
DW TO_RETI;INTTXD1 0XFFE1
DW TO_RETI;INTRXD1 OXFFE2
DW TO_RETI;INT 0XFFE3
DW TO_RETI;INTTIC0 0XFFE4
DW TO_RETI;INTET0 0XFFE5
DW TO_RETI;INTTXD0 0XFFE6
DW TO_RETI;INTRXD0 0XFFE7
DW TO_RETI;INTT1 0XFFE8
DW INTTBT;INTTBT 0XFFE9
DW TO_RETI;INT1 0XFFEA
DW TO_RETI;/INTT0 0XFFEB
DW TO_RETN;INTWDT 0XFFEC
DW TO_RETN;INTATRAP 0XFFED
DW TO_RETN;INTUNDEF 0XFFEE
DW START;RESET 0XFFEF
;------------------------------------
;=========================================内存分配
;LCD_DAT0102 EQU 0X40
;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
HOUR EQU 0X4E
MIN EQU 0X4F
SEC EQU 0X50
MS EQU 0X51
TEN_MS EQU 0X52
;LBIT EQU 0X53
;HBIT EQU 0X54
;DIS_FLAG EQU 0X55
;----------------------------------------LED_DISP
;COM1_DATA EQU 0X56
;COM2_DATA EQU 0X57
;COM3_DATA EQU 0X58
;COM4_DATA EQU 0X59
;TEMP1 EQU 0X5A
;TEMP2 EQU 0X5B
;----------------------------------------I2C
;BIT_CNT EQU 0X5C
;WR_ADR EQU 0X5D
;RD_ADR EQU 0X5E
;WR_DATA EQU 0X5F
;RD_DATA EQU 0X60
;FLAG EQU 0X61
;----------------------------
;SDA_IN EQU 0XEF
;SDA_OUT EQU 0XFF
;---------------------------------------REMOTE_CTRL
;R_CODE EQU 0X62
;RAM_CNT EQU 0X63
;RBIT_CNT EQU 0X64
;RECV_FLAG EQU 0X65
;RCODE_ADR EQU 0X66;67H/68H/69H遥控码存储器开始地址
;---------------------------------------
KEY_TMP EQU 0X6A;按键名暂存器
KEY_NAME EQU 0X6B;按键名称
KEY_CODE EQU 0X6C;按键D值
KEY_FLAG EQU 0X6D;按键标志
BP_FLAG EQU 0X6F;蜂鸣器标志
BP_TIM EQU 0X70;蜂鸣器鸣响时间
;=======================================LCD_DISP位定义
TBTEN EQU 3
;LCD_DAT EQU 7
;LCD_CLK EQU 0
;LCD_CS EQU 0
;FLASH EQU 0
;---------------------------------------LED_DISP位定义
;LED_CLK EQU 6;P36
;LED_DAT EQU 7;P37
;LED_D0 EQU 5;P05
;LED_D1 EQU 6;P06
;LED_D2 EQU 1;P11
;LED_CLR EQU 2;P02
;-----------------------------------------I2C位定义
;SDA EQU 4
;SCL EQU 3
;READ_FLAG EQU 0
;-------------------------------------remote_CTRL位定义
;REV_OK EQU 0
;FIRST EQU 1
;HEAD EQU 2
;--------------------------------------AD_KEY位定义
ADS EQU 7
EOCF EQU 5
WAIT_POP EQU 0
BP_ON EQU 0;打开蜂鸣器标志,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),0XFF
LD (P0OUTCR),0XE5;
LD (P1CR),0XFF;P1全部输出
; LD (P2PRD),0X01;
LD (P3CR),0X00;
;------------------------------------------内存清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;启动TBT
SET (EIRL).6;允许TBT中断
EI;打开中断
LOOP1:
CALL AD_KEY
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
;----------------------------------------------蜂鸣器
LD CF,(BP_FLAG).BP_ON
J CC,TEN_MSF;是否要打开蜂鸣器
SET (P1).2
INC (BP_TIM)
CMP (BP_TIM),30
J CS,TEN_MSF;蜂鸣器是否鸣想了30ms
CLR (BP_FLAG).BP_ON
LD (BP_TIM),0
CLR (P1).2
;---------------------------------------------------
TEN_MSF:
LD (MS),0X0
INC (TEN_MS)
CMP (TEN_MS),0X64
J CS,CLOCK_EXIT
SECF:
LD (TEN_MS),0X0
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),0X3C
J CS,CLOCK_EXIT
LD (HOUR),0X0
CLOCK_EXIT:
POP L
POP H
POP C
POP B
POP A
RETI
;===========================================================
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,0X2710
DE_IX:
DEC IX
J NZ,DE_IX
RET
;===========================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -