三分钟让你掌握51单片机的4×4键盘识别与74LS164驱动数码显示

控制/MCU

1811人已加入

描述

;P1口外接4×4键盘,输出使用74LS164驱动一位数码显示器。

;当按下任一键时,在数码显示器上显示键值。

;程序用汇编语言编写,用PROTEUS仿真调试的画面如下:

51单片机

;程序如下:

ORG 0000H

LJMP START

ORG 0030H

START:

MOV P1, #255

MOV 60H, #16

MAIN:

CALL DISPLAY

;SJMP $

M_LOOP:

CALL K_SCAN ;扫描程序

JB ACC.4, M_LOOP

LJMP MAIN

;---------------------------------------

DISPLAY:

MOV A, 60H

MOV DPTR, #D_TAB ;码表首地址

MOVC A, @A + DPTR

CPL A

MOV R2, #8

INI1:

RRC A

MOV P3.0, C ;A中低位输出至P3.0

CLR P3.1 ;移位脉冲

SETB P3.1

DJNZ R2, INI1 ;移位8次

RET

;-------------------------

D_TAB: ;段码表

DB 03FH, 006H, 05BH, 04FH

DB 066H, 06DH, 07DH, 007H

DB 07FH, 06FH, 077H, 07CH

DB 039H, 05EH, 079H, 071H, 000H

;---------------------------------------

K_SCAN:

MOV P1, #240 ;各行皆为0

MOV A, P1 ;读出列

CJNE A, #240, COW ;有键按下转移

SETB ACC.4 ;没有按键的标记

RET

;-------------------------

COW:

MOV P1, #15 ;各列皆为0

ADD A, P1

MOV 60H, A ;保存键码

;-------------------------

MOV DPTR, #KEY_TAB ;键码表首地址

MOV R2, #0 ;从第0个开始查

K_S1:

MOV A, R2

INC R2

MOVC A, @A + DPTR

CJNE A, 60H, K_S1 ;与60H内容比较,不等则继续查

DEC R2

CJNE R2, #16, K_ED

SETB ACC.4 ;没有按键的标记

RET

;-------------------------

K_ED: ;有键按下

MOV 60H, R2 ;保存按键号码

CALL DELAY ;消除抖动

WAIT:

MOV P1, #0F0H

MOV A, P1

CJNE A, #0F0H, WAIT ;等待释放

CLR A

RET

;-------------------------

KEY_TAB: ;键码表

DB 07EH, 0BEH, 0DEH, 0EEH

DB 07DH, 0BDH, 0DDH, 0EDH

DB 07BH, 0BBH, 0DBH, 0EBH

DB 077H, 0B7H, 0D7H, 0E7H

;---------------------------------------

DELAY: ;延时

MOV R5, #10

D2: MOV R6, #2

D1: MOV R7, #248

DJNZ R7, $

DJNZ R6, D1

DJNZ R5, D2

RET

;---------------------------------------

END

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分