本帖最后由 warm_ice 于 2009-10-15 09:44 编辑
LIST P=69P42
ROMSIZE=3072
;**********************************
;系统寄存器
;**********************************
IE EQU 00H;中断使能标志寄存器
IRQ EQU 01H;中断请求寄存器
T0M EQU 02H;定时器0
T0L EQU 04H;定时器0低4位
T0H EQU 05H;定时器0高4位
PORTA EQU 08H
PORTB EQU 09H
PORTC EQU 0AH;按键PORTC.0取消,PORTC.1打开输出
PORTD EQU 0BH
PORTE EQU 0CH;输出PORT
TBR EQU 0EH;查表寄存器
INX EQU 0FH;索引寄存器
DPL EQU 10H;查表指针低4位
DPM EQU 11H;查表指针中3位
DPH EQU 12H;查表指针高3位
PCCR EQU 1AHORTC输入/输出控制寄存器
PECR EQU 1CHORTE输入/输出控制寄存器
WDT EQU 1FH;看门狗定时器
;***********************************
;用户寄存器
;**********************************
AC_BACK EQU 30H;A备份寄存器
TEMP EQU 31H;临时寄存器
TEMERL_0 EQU 32H;定时时间低4位
TEMERH_0 EQU 33H;定时时间高4位
CT0 EQU 34H
CT1 EQU 35H;延时用
KEY_ST EQU 36H;键状态寄存器
CT2 EQU 37H
CT3 EQU 38H
CT4 EQU 39H
CT5 EQU 3AH
CT6 EQU 3BH
KEY_STATE EQU 3CH ;记录按键状态,00H为无按键,0AH为取消键,05H为确认键
;**********************************
;程序
;**********************************
ORG 0000H
JMP RESET
RTNI
RTNI
RTNI
JMP PORT_IST
;************************************
ORT_IST中断服务子程序
;************************************
PORT_IST:
STA AC_BACK,00H
LDI IRQ,00H
;检测按键状态
KEY_CK:
LDA PORTC,00H;取PORTC按键值
STA TEMP,00H;把按键值存放在临时寄存器当中
CALL DELAY
LDA PORTC,00H
SUB TEMP,00H
BNZ KEY_CK99
LDA TEMP, 00H
EORIM TEMP,0001B
BA0 KEY_CK99
LDI KEY_STATE,0AH;取消键
BA1 KEY_CK99
LDI KEY_STATE,05H;确认键
JMP PORT_IST_END
KEY_CK99:
LDI KEY_STATE,00H ;无按键状态
PORT_IST_END:
ORIM IE,0001B
LDA AC_BACK,00H
RTNI
;************************************
;上电程序
;************************************
RESET:
NOP
;-------------------------------------
;清用户寄存器
POWER_RESET:
LDI DPL,00H
LDI DPM,03H
LDI DPH,00H;从30H开始
POWER_RESET_1:
LDI INX,00H
ADIM DPL,01H
LDI TEMP,00H
ADCM DPM,00H
BA3 POWER_RESET_2
JMP POWER_RESET_3
POWER_RESET_2:
ADIM DPH,01H
POWER_RESET_3:
SBI DPH,01H
BNZ POWER_RESET_1
SBI DPM,04H
BNZ POWER_RESET_1;到0BFH结束
;----------------------------------------
;初始化系统寄存器
LDI T0L,0FH
LDI T0H,0EH
LDI T0M,00H
LDI PORTC,00H
LDI PCCR,00H;输入口
LDI PORTE,00H
LDI PECR,0FH;输出口
;主程序
MAIN:
ORT_IST中断
PORT_INT_SET:
LDI PORTE,00H
LDI PORTA,0FH
LDI PORTB,0CH
LDI PORTC,0FH
LDI PORTD,0FH;打开上拉电阻使用下降沿中断
NOP
NOP ;等待程序稳定
LDI IE,0001B;允许PORT中断
NOP
HALT
NOP
NOP
;*********************************************
KEY_CHECK:
LDA KEY_STATE,00H ;判断有无按键按下,无按键,返回等待状态
BAZ PORT_INT_SET
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
SBI KEY_STATE,05H ;判断确认键是否按下,按下进行输出,否则返回
BNZ PORT_INT_SET
KEY_CK_2:
LDI PORTE,0001B
CALL DELAY_1E0输出
NOP
KEY_CK_3:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0010B
CALL DELAY_1E1输出
NOP
KEY_CK_4:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,1000B
CALL DELAY_1E3输出
NOP
KEY_CK_5:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,1011B
CALL DELAY_1E0,1,3同时输出
NOP
KEY_CK_6:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0000B
CALL DELAY_1;关闭所有PE口输出
NOP
KEY_CK_7:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0111B;打开所有PE口输出
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
CALL DELAY_1
NOP
KEY_CK_8:
SBI KEY_STATE,0AH ;判断取消键是否按下,按下取消键返回
BAZ PORT_INT_SET
LDI PORTE,0000B;关闭所有PE口输出
NOP
CALL DELAY_1
CALL DELAY_1
JMP PORT_INT_SET
;延时去抖动
DELAY:
LDI CT0,01H
SBIM CT0,01H
BC $-1
RTNI
DELAY_1:
LDI CT2,02H
LDI CT3,0FH
LDI CT4,0FH
LDI CT5,0FH
LDI CT6,0FH
SBIM CT6,01H
BC $-1
SBIM CT5,01H
BC $-4
SBIM CT4,01H
BC $-7
SBIM CT3,01H
BC $-0AH
SBIM CT2,01H
BC $-0DH
RTNI
;********************************************
END
初步帮你改造成这样,可以实现确认键,取消键的功能,但取消键还不是实时确认的,只有在一个输出段输出完成后才会响应,要实现这时的响应取消键,还要进行改造,主要从定时器的应用入手. |