📄 test.asm
字号:
;*****************************************************
;Company :CHK.ELEC.LTD
;File Name : SINGLE_KEY_ADVANCE.asm
;Author :XiaoWu
;Create Data : 2005-11-10
;Last Modified : 2005-11-21
;Description :infared key check
;单按键触发,优先前面排列的按键
; PE.0 PE.1 PE.2 PE.3 PF.0 PF.1 PF.2 PF.3
;
; S_LED0 S_LED1 S_LED2 S_LED3 S_LED4 S_LED5 S_LED6 S_LED7
;
; [KEY0] [KEY1] [KEY2] [KEY3] [KEY4] [KEY5] [KEY6] [KEY7]
;
; R_LED0 R_LED1 R_LED2 R_LED3 R_LED4 R_LED5 R_LED6 R_LED7
;
; PA.0 PA.1 PA.2 PA.3 PB.0 PB.1 PB.2 PB.3
; AN0 AN1 AN2 AN3 AN4 AN5 AN6 AN7
;
; OUTPUT:PC.0 PC.1 PC.2 PC.3 PD.0 PD.1 PD.2 PD.3
;
;Version : 1.0
;*****************************************************
;******* SET GOLBAL DEFINE ********
GEN_REG1 EQU 30H ;3个通用寄存器
GEN_REG2 EQU 31H
GEN_REG3 EQU 32H
GEN_REG_LED EQU 33H ;AD采样通道设置
GEN_REG_ADCH EQU 34H ;发射红外输出脚设置
GEN_REG_AD_COUNT_VALUE EQU 35H ;采样次数转存器
GEN_REG_COMP_CONST EQU 36H ;采样比较常量转存器
AD_8_COUNT EQU 37H ;采样次数寄存器
AD_TEMPL EQU 38H ;临时存储AD数据高4位
AD_TEMPH EQU 39H ;临时存储AD数据低4位
KEY_FLAG EQU 3AH ;按键标志XXXX 初次按键,二次按键,去抖标志,松开标志
KEY_PORT_FLAG EQU 3BH ;用来设置PORTE 或者 PORTF,发射红外输出端口设置
KEY_PORTA_PRESS_FLAG EQU 3CH ;存储端口A的按键KEY0.KEY1,KEY2,KEY3(XXXX)标志位
KEY_PORTB_PRESS_FLAG EQU 3DH ;存储端口B的按键KEY4.KEY5,KEY6,KEY7(XXXX)标志位
AD_LIGHT_DATA1L EQU 40H ;8次采样数据存取
AD_LIGHT_DATA1H EQU 41H ;灯灭数据高
AD_LIGHT_DATA2L EQU 42H ;灯亮数据低
AD_LIGHT_DATA2H EQU 43H ;灯亮数据高
COMM_DATA EQU 50H ;通信数据寄存器
COMM_BUF EQU 51H ;缓存器
OUT_FLAG EQU 52H ;输出数据
OUT_FLAG_DIFF EQU 53H ;输出数据反码
TIME_OVER_FLAG EQU 54H ;超时标志
COMM_CLK EQU 1000B ;时钟线 PC.3
COMM_SDA EQU 0100B ;数据线 PC.2
COMM_PORT EQU 0AH ;PORTC
COMP_CONST_SHORT EQU 03H ;开始预测量时比较常量,小
AD_COUNT_VALUE_SHORT EQU 04H ;预测量次数
COMP_CONST_LONG EQU 0AH ;后面再测量时比较常量,大
AD_COUNT_VALUE_LONG EQU 0FH ;再测量次数
AD_COMP_HIGH EQU 05H ;比较电压差值的高4位常数,可以通过修改这里改变红外感应灵敏度
AD_COMP_LOW EQU 04H ;比较电压差值的低4位常数
;******* END DEFINE SET ***********
ORG 0000H
JMP START ;START PROGRAM
;ORG 0001H
RTNI ;AD 中断返回
;RTNI
JMP TO_SERVER ;T0 中断
RTNI ;T1 中断
;RTNI
JMP COMM_SERVER ;EX 中断
;**** START PROGRAM ***
START:
CALL INITMCU ;初始化单片机寄存器,中断等
LDI GEN_REG_AD_COUNT_VALUE, AD_COUNT_VALUE_SHORT ;AD采样次数
LDI GEN_REG_COMP_CONST, COMP_CONST_SHORT ;初始化
LDI AD_LIGHT_DATA1L, AD_COMP_LOW ;初始化AD存储值
LDI AD_LIGHT_DATA1H, AD_COMP_HIGH
LDI AD_LIGHT_DATA2L, AD_COMP_LOW
LDI AD_LIGHT_DATA2H, AD_COMP_HIGH
;********** 主程序 *****************
MAIN:
LDI KEY_PORTA_PRESS_FLAG,0H ;清按键触发标志
LDI KEY_PORTB_PRESS_FLAG,0H
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_SHORT ;传送预测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_SHORT ;传送预测试比较值
LDI KEY_PORT_FLAG, 0H ;设置扫描端口A,按键0,1,2,3
LDA GEN_REG_AD_COUNT_VALUE ;送预测量次数至AD_8_COUNT
STA AD_8_COUNT
; 按键0查询
;CHECK_0:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN0通道
LDI GEN_REG_LED,1110B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ CHECK_1 ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTA_PRESS_FLAG,01H ;KEY_0 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY0 ;对该按键进行长扫描
; 按键1查询
CHECK_1:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN1通道
LDI GEN_REG_LED,1101B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ CHECK_2 ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTA_PRESS_FLAG,02H ;KEY_1 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY1 ;对该按键进行长扫描
; 按键2查询
CHECK_2:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN2通道
LDI GEN_REG_LED,1011B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ END_PROCESS ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTA_PRESS_FLAG,04H ;KEY_2触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY2 ;对该按键进行长扫描
; 按键3查询
CHECK_3:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN3通道
LDI GEN_REG_LED,0111B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ CHECK_4 ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTA_PRESS_FLAG,08H ;KEY_3 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY3 ;对该按键进行长扫描
;按键4查询
CHECK_4:
LDI KEY_PORT_FLAG, 01H ;设置扫描按键4,5,6,7
LDI KEY_FLAG, 00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH, 00H ;AN4通道
LDI GEN_REG_LED, 1110B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ CHECK_5 ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTB_PRESS_FLAG,01H ;KEY_4 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY4 ;对该按键进行长扫描
; 按键5查询
CHECK_5:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN5通道
LDI GEN_REG_LED,1101B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ CHECK_KEY6 ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTB_PRESS_FLAG,02H ; KEY_5 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY5 ;对该按键进行长扫描
; 按键6查询
CHECK_6:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN6通道
LDI GEN_REG_LED,1011B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ CHECK_KEY7 ;若未触发则检测下一个按键
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTB_PRESS_FLAG,04H ;KEY_6 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY6 ;对该按键进行长扫描
; 按键7查询
CHECK_7:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN7通道
LDI GEN_REG_LED,0111B
CALL AD_CHECK ;调用AD_CHECK子程序,进行AD采样比较
BAZ END_PROCESS ;若未触发则按键处理子程序
CALL DELAY ;若触发,则延时对该按键进行长扫描
ORIM KEY_PORTB_PRESS_FLAG,08H ;KEY_7 触发,置标志位
LDI GEN_REG_AD_COUNT_VALUE,AD_COUNT_VALUE_LONG ;传送长测试按键值
LDI GEN_REG_COMP_CONST,COMP_CONST_LONG ;传送长测试比较值
LDA GEN_REG_AD_COUNT_VALUE
STA AD_8_COUNT ;设置测量次数
JMP CHECK_KEY7 ;对该按键进行长扫描
;出错处理子程序
ERR_STA:
LDI KEY_PORTA_PRESS_FLAG,0H ;清按键触发标志
LDI KEY_PORTB_PRESS_FLAG,0H
JMP END_PROCESS ;结束跳出子程序
;结束跳出子程序
END_PROCESS:
;显示
LDI GEN_REG1,0FH ;反转触发标志并输出
EOR KEY_PORTA_PRESS_FLAG,0H ;送端口A按键触发标志
STA PORTD ;端口D输出
LDA KEY_PORTB_PRESS_FLAG
BA0 $+4
BA1 $+5
LDI PORTC,0110B ;灭
JMP MAIN ;清标志子程序
LDI PORTC,0100B ;端口C输出
JMP $+2 ;跳出
LDI PORTC,0010B ;端口C输出
; LDA KEY_PORTA_PRESS_FLAG
; BA1 $+3
; LDI PORTD,0FH
; JMP $+2
; LDI PORTD,0EH
;===========================================
;将按键转换成16进制,即按键0-1;按键1-2;按键7-8;灯亮数值代替那个按键触发
LDA KEY_PORTA_PRESS_FLAG ;读端口A按键标志
BA0 $+11 ;按键0,则FLAG=01H
BA1 $+12 ;按键1,则FLAG=02H
BA2 $+13 ;按键2,则FLAG=03H
BA3 $+14 ;按键3,则FLAG=04H
;
LDA KEY_PORTB_PRESS_FLAG
BA0 $+14 ;按键4,则FLAG=05H
BA1 $+15 ;按键5,则FLAG=06H
BA2 $+16 ;按键6,则FLAG=07H
BA3 $+17 ;按键7,则FLAG=08H
LDI OUT_FLAG,0H ;给值OUT_FLAG
JMP $+16 ;跳到CLEAR_FLAG
LDI OUT_FLAG,01H
JMP $+14
LDI OUT_FLAG,02H
JMP $+12
LDI OUT_FLAG,03H
JMP $+10
LDI OUT_FLAG,04H
JMP $+8
LDI OUT_FLAG,05H
JMP $+6
LDI OUT_FLAG,06H
JMP $+4
LDI OUT_FLAG,07H
JMP $+2
LDI OUT_FLAG,08H
LDI GEN_REG1,0FH
EOR OUT_FLAG
STA OUT_FLAG_DIFF ;OUT_FLAG的反码
JMP MAIN ;跳回主程序
;*******************************************************************************;
;再扫描按键0
CHECK_KEY0:
LDI KEY_FLAG,00H ;CLEAR KEY_FLAG 清除AD电压变化大于1.25V的次数
LDI GEN_REG_ADCH,00H ;AN0通道
LDI GEN_REG_LED,1110B ;设置红外输出管脚
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -