- 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
初步帮你改造成这样,可以实现确认键,取消键的功能,但取消键还不是实时确认的,只有在一个输出段输出完成后才会响应,要实现这时的响应取消键,还要进行改造,主要从定时器的应用入手.