4x4矩阵键盘+一位数码管共阳显示程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;****************************************************
;*******4x4矩阵键盘和一位数码管共阳显示程序*********** *
;****************************************************
ORG 0000H
LJMP SMG_JIANCE
ORG 0030H
MOV SP,#60H ;将堆栈值设定在60H之后
SMG_JIANCE:;数码管检测程序,查看是否有损坏段
MOV DPTR,#JIANCE_TAB ;取检测数码管段好坏表值
MOV R2,#00 ;设定查表初始值,从a段开始检测
LOOP: MOV A,R2 ;将初始值送给累加器A
MOVC A,@A+DPTR ;查表去表值
MOV P0,A ;将所查表值送P0端口显示
LCALL DELAY_500MS ;延时500ms
INC R2 ;差标值自加1
CJNE R2,#10,LOOP ;判断是否等于10,等于调回主程序,否则循环查表检测,直到完毕
AJMP MIAN
MIAN: ;主程序
MOV P1,#0F0H ;初始化P1端口引脚列高,行低
MOV A,P1 ;读取P1端口值
CJNE A,#0F0H,K_IN1 ;判断是否有键按下?若相等时没有按下,返回MIAN,否则执行K_IN1
SJMP MIAN
K_IN1: ;消抖判断部分
ACALL DELAY ;调用延时消抖
MOV A,P1 ;再读取P1端口值
CJNE A,#0F0H,K_IN2 ;再确认判断是否有键按下?若相等时没有按下,返回MIAN,否则执行K_IN2
SJMP MIAN
K_IN2: ;已确认有键按下,作数据处理
MOV B,#0FEH
K_IN21: MOV P1,B ;其中1行置低
MOV A,P1
ANL A,#0F0H
CJNE A,#0F0H,K_IN3 ;此行有键按下?
MOV A,B ;无
RL A ;置下1行低
MOV B,A
SJMP K_IN21 ;扫描下1行
K_IN3: MOV 30H,P1 ;有,取键值
MOV R3,#00H ;初始化键号
MOV DPTR,#K_TAB ;取键值表首地址
K_IN4: MOV A,R3
MOVC A,@A+DPTR ;取键值
CJNE A,30H,NEXT ;不等,取下1键值
ACALL DISP ;显示
WAIT: ;等待按键释放
MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,WAIT
SJMP MIAN ;返回主程序等待下1次按键操作
NEXT: INC R3 ;键号计数器+1
SJMP K_IN4
DELAY_500MS:;延时用于数码管检测段
MOV R3,#30
DE: LCALL DELAY
DJNZ R3,DE
RET
DELAY: ;延时用于消抖处理
MOV R0,#20
DL1: MOV R1,#250
DJNZ R1,$
DJNZ R0,DL1
RET
DISP: ;将查表的数码管码表值送入P0端口,点亮数码管显示
MOV DPTR,#D_TAB
MOV A,R3
MOVC A,@A+DPTR
MOV P0,A
RET
JIANCE_TAB:;数码管检测段编码表
DB 0FFH ;全灭
DB 0FEH,0FDH,0FBH,0F7H ;a b c d
DB 0EFH,0DFH,0BFH,07FH ;e f g h
DB 0C0H ;显示 0 “零”
K_TAB: ;4X4矩阵键盘按键编码值表
DB 0EEH,0DEH,0BEH,7EH
DB 0EDH,0DDH,0BDH,7DH
DB 0EBH,0DBH,0BBH,7BH
DB 0E7H,0D7H,0B7H,77H
D_TAB: ;7段LED数码管显示0——F码表(共阳极)
DB 0C0H,0F9H,0A4H,0B0H ;0 1 2 3
DB 99H, 92H, 82H,0F8H ;4 5 6 7
DB 80H, 90H, 88H, 83H ;8 9 A B
DB 0C6H,0A1H, 86H, 8EH ;C D E F

END

相关文档
最新文档