KEYCARD BIT 00H ;用于标志是否有键按下
KEYCOU EQU 5AH ;用于记录按下键的次数
ORG 0000H ;程序开始
AJMP START
ORG 30H ;为避免占用中断向量区,主程序从30H开始
START:
MOV SP,#5FH ;设置堆栈的初始地址
MOV P3,#0FH ;P3,P2,P0的初始化
MOV P2,#00H
MOV P0,#0FFH
CLR KEYCARD ;有按键标志清0
MOV KEYCOU,#0 ;计数初值赋0
LOOP: ;循环扫描键盘
ACALL KEY_CHECK
JNB KEYCARD,DISPLAY
INC KEYCOU
DISPLAY: ;显示程序
MOV A,KEYCOU ;选显示第一位高位
DA A
ANL A,#0xF0 ;获得高四位
SWAP A ;将A的高四位和低四位对调
MOV DPTR,#TAB ;获得对应的显示码
MOVC A,@A+DPTR
MOV P0,A ;把显示码传至A口
MOV P2,#01H ;选通P2.0,显示
ACALL DELAY1S
MOV A,KEYCOU
DA A
ANL A,#0x0F
MOVC A,@A+DPTR
MOV P0,A
MOV P2,#02H ;选通P2.1,显示
ACALL DELAY1S
AJMP LOOP
KEY_CHECK: ;看有没有键按下
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_CER ;如果读入的与写出的不相等,延时消抖
CLR KEYCARD
RET
KEY_CER: ;延时,再读入,看是否真的有键按下
ACALL DELAY1S
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,KEY_CE
CLR KEYCARD
RET
KEY_CE:
MOV A,P3 ;直等到按键放下,则算作一次
ANL A,#0FH
CJNE A,#0FH,KEY_CE
SETB KEYCARD ;真的有键按下,则置标志位
RET
DELAY1S: ;延时函数
MOV R7,#10
D1:
MOV R6,#50
DJNZ R6,$
DJNZ R7,D1
RET
KEY_VALUE: ;键值表
DB 0EBH,0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H
TAB: ;显示码
DB 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
END
上一篇:单片机流水灯小程序
下一篇:实例源码2---基于51单片机的摇摇棒制作
推荐阅读最新更新时间:2024-11-12 19:19
设计资源 培训 开发板 精华推荐
- MC33074DTBR2G 桥式电流放大器的典型应用
- ESP8266主控二路小车驱动板
- 移动电源控制板 - KRALYN3D
- 【训练营】立创EDA小白灯-994348A
- RDR-942 - 65 W USB PD 3.0 + PPS 电源,带 ZVS,使用 InnoSwitch4-Pro PowiGaN、ClampZero 和英集芯 USB Type-C PD 控制器
- 具有延迟启动的 TS2596SCS50 RL 2A、5V、150KHz 降压 DC-DC 转换器的典型(可调输出电压版本)应用
- LT6656AIDC-5、5V ADC 电压基准和桥式励磁电源的典型应用
- 基于STM32F103的mini二轮平衡车设计
- AD8657ARMZ-RL反相运算放大器配置的典型应用电路
- S32K3X4EVB-Q257: 通用应用的全功能评估和开发板