数码管是共阳极
键盘是这样的
我想依次按下12345,然后led也依次显示12345
可是哪里错了 ,我不知道
ORG 0000H
MAIN: MOV 30H, #00H
MOV 31H, #00H
MOV 32H, #00H
MOV 33H, #00H
MOV 34H, #00H ;存放值的单元清零
MOV 3CH, #10H
MOV 3BH, #08H
MOV 3AH, #04H
MOV 39H, #02H
MOV 38H, #01H ;位选信号
MOV 60H, #0C0H
MOV 61H, #0F9H
MOV 62H, #0A4H
MOV 63H, #0B0H
MOV 64H, #99H
MOV 65H, #92H
MOV 66H, #82H
MOV 67H, #0F8H
MOV 68H, #80H
MOV 69H, #90H ;赋段码初值
MOV A, #00H
MOV SP, #70H
L1:
MOV P1, #0F0H
LCALL KS1 ;查有无键闭合
CJNE A, #0FFH, LK1 ;有键闭合,消颤
LCALL XIANSHI ;调显示子程序
AJMP L1 ;没有键闭合,继续查询
LK1: LCALL YANSHI
LCALL KS1 ;再查
CJNE A, #0FFH, LK0 ;有就转处理
LCALL LK1 ;没有再查
LK0: MOV A, P1 ;判断按键是否松开
CJNE A, #0F0H, LK2
AJMP LK0
LK2: MOV A, 5DH
CJNE A, #7BH, Lk3
LJMP L70
LK3: CJNE A, #0BBH, Lk4
LJMP L60
LK4: CJNE A, #0DBH, Lk5
LJMP L50
LK5: CJNE A, #7DH, Lk6
LJMP L71
LK6: CJNE A, #0BDH, Lk7
LJMP L61
LK7: CJNE A, #0DDH, Lk8
LJMP L51
LK8: CJNE A, #7EH, Lk9
LJMP L72
LK9: CJNE A, #0BEH, Lk10
LJMP L62
LK10: CJNE A, #0DEH, Lk11
LJMP L52
LK11: CJNE A, #0B7H, Lk12
LJMP L63
LK12: CJNE A, #0E7H, Lk13
LJMP L43
LK13: CJNE A, #0EBH, Lk14
LJMP L42
LK14: CJNE A, #0EDH, Lk15
LJMP L41
LK15: CJNE A, #0EEH, Lk16
LJMP L40
LK16: CJNE A, #0D7H, Lk17
LJMP L53
LK17: CJNE A, #77H, Lk18
LJMP L73
LK18: AJMP L1
L70: MOV 37H, #01H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L60: MOV 37H, #02H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L50: MOV 37H, #03H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L71: MOV 37H, #04H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L61: MOV 37H, #05H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L51: MOV 37H, #06H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L72: MOV 37H, #07H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L62: MOV 37H, #08H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L52: MOV 37H, #09H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
L63: MOV 37H, #00H
LCALL YIWEI
LCALL XIANSHI
LJMP L1
l43: LJMP L1
L42: LJMP L1
L41: LJMP L1
L40: LJMP L1
L53: LJMP L1
L73: LJMP L1
P74: LJMP MAIN
;*************************************************************************************************
; * * *
; 查询有无键按下,若有键按下,A不全为1 * * *
; * * *
; * * *
;*************************************************************************************************
KS1: MOV P1, #0F0H ;线反转法, ;**
MOV A, P1 ;**
ANL A, #0F0H ;**
MOV B, A ;**
MOV P1, #0FH ;**
MOV A, P1 ;**
ANL A, #0FH ;**
ORL A, B ;有键按下,A不全为1 ;**
RET ;**
;*************************************************************************************************
YIWEI: MOV A, #00H
CJNE A, 30H, L8
CJNE A, 31H, L9
CJNE A, 32H, L10
CJNE A, 33H, L11
CJNE A, 34H, L12
MOV 34H, 37H
LJMP L13
L8: LJMP MAIN ;返回查询
L9: MOV 30H, 31H
MOV 31H, 32H
MOV 32H, 33H
MOV 33H, 34H
MOV 34H, 37H
LJMP L13
L10: MOV 31H, 32H
MOV 32H, 33H
MOV 33H, 34H
MOV 34H, 37H
LJMP L13
L11: MOV 32H, 33H
MOV 33H, 34H
MOV 34H, 37H
LJMP L13
L12: MOV 33H, 34H
MOV 34H, 37H
L13: RET
;*************************************************************************************************
; * * *
; 让数字显示在数码管上 * * *
; * * *
; * * *
;*************************************************************************************************
;**
;**
XIANSHI: MOV A, #00H ;**
CJNE A, 30H, L15 ;**
CJNE A, 31H, L16 ;**
CJNE A, 32H, L17 ;**
CJNE A, 33H, L18 ;**
CJNE A, 34H, L29 ;**
MOV 5EH, #01H ;**
AJMP L30 ;**
;**
L15: MOV 5EH, #05H ;**
AJMP L30 ;**
L16: MOV 5EH, #04H ;**
AJMP L30 ;**
L17: MOV 5EH, #03H ;**
AJMP L30 ;**
L18: MOV 5EH, #02H ;**
AJMP L30 ;**
L29: MOV 5EH, #01H ;判断缓存区里面有几位数字 ;**
AJMP L30 ;**
;**
;**
;**
L30: MOV R7, 5EH ;**
MOV R0, #34H ;**
MOV R1, #38H ;**
;**
L57: MOV P3, @R1 ;**
MOV A, @R0 ;**
;**
MOV 5FH, R0 ;**
MOV R0, #60H ;**
ADD A, R0 ;**
MOV R0, A ;**
;**
MOV P2, @R0 ;**
MOV R0, 5FH ;**
DEC R0 ;**
INC R1 ;**
DJNZ R7, L57 ;**
;**
RET ;**
;**
;*************************************************************************************************
YANSHI: MOV R7, #120
DL1: MOV R6, #200
DL2: DJNZ R6, DL2
DJNZ R7, DL1
RET
END
此帖出自
小平头技术问答
我这么的跟你说,对于按键的编程,也有过一些改变,越变越快,越变越精简,我很久没用汇编语言了,大部分都是用C,对于4*4矩阵,以前是一行一行扫描一列一列扫描,耗时!现在是正反两次扫描就可解决,你电路图中读的是P1口,而且51单片机的IO口是准双向口,要先赋1,再读。
现在说一下程序:
你事先放两个表,一个正转扫描得到的值得表,一个反转得到的值得表
mov P1,#0fh ; 行为低,列为高
mov a,P1 ;读P1 低四位 有键按键 比如为:0x00001101 P1.1被拉低为0
cpl a ;取反 0x11110010
and a, #0fh ;屏蔽高四位 0x00000010 这就是正转的按键
mov dptr,#tab1 ; 查表,得到列的键值
mov a,@a+dptr
mov 53h,a ; 存起来
翻转时 原理一样
mov P1,#0f0h ; 行为高,列为低
mov a,P1 ;读P1 低四位 有键按键 比如为:0x11010000 P1.5被拉低为0 P1.5与P1.1相连的
; 按键是哪个就知道吧
cpl a ;取反 0x00101111
and a, #0f0h ;屏蔽低四位 0x00100000 这就是反转的按键
XCHD a ;半字节交换 ,不然表就写的很大了 0x00000010
mov dptr,#tab2 ; 查表,得到列的键值
mov a,@a+dptr
add a,53h ;
mov 53h,a; 存起来了总键值
至于表 也跟你写了吧,反正也写的差不多了
tab1 db 01h,02h,00h,03h,00h,00h,00h,04h ;只需要关心1,2,4,8 梯度为1
tab2 db 00h,04h,00h,08h,00h,00h,00h,0ch ;也只需要关心1,2,4,8 梯度为4
已经按键五次,显示了比如说“12345”,继续再按下1~5中某个键,比如说按下3,你希望显示什么?
1、不响应,仍然显示“12345”。
2、响应按键,显示“23453”。
3、重新开始,首位显示“3”,其余四位灭。
……
能帮我在源程序上面改一下吗?
就是按下一个数字键后把这个数字传到最低位,其余的数字顺序左移一位,然后再显示出来,
直到下一次按键
一周热门 更多>