利用51单片机实现4*4矩阵键盘扫描,并摁下相应键时在LED上显示相应键值,通过两位动态显示。通过中断方式实现。采用汇编语言。
单片机源程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 0003H
- LJMP INT
- ORG 0040H
- MAIN:MOV SP,#70H
- MOV 30h,#00h
- SETB EX0
- SETB IT0
- SETB EA
- MOV DPTR,#TAB
- MOV P2,#0F0H;p2口高四位置1低四位置0
- INT:PUSH ACC
- MOV P2,#0F0H
- MOV A,P2;a为11110000
- JNB ACC.4,E1;键盘查询,不为1跳转,为1顺序 查询p4口 下同
- JNB ACC.5,E2
- JNB ACC.6,E3
- JNB ACC.7,E4
- SETB EX0
- RETI
- E1: MOV 20h,#0 ;按键在哪一行,第一行加0
- LJMP KEYH
- E2: MOV 20h,#4 ;第二行家4
- LJMP KEYH
- E3: MOV 20H,#8 ;第三行加8
- LJMP KEYH
- E4: MOV 20h,#12;第四行加12
- LJMP KEYH
- KEYH:
- MOV P2,#0FH
- MOV A,P2
- JNB ACC.0,DO
- JNB ACC.1,D1
- JNB ACC.2,D2
- JNB ACC.3,D3
- RETI
- DO: MOV A,#0 ;第一列加0,下同
- ADD A,20H
- DA A
- MOV 30H,A
- SJMP EXIT
- D1: MOV A,#1
- ADD A,20H
- DA A
- mov 30h,a
- Sjmp EXIT
- D2: MOV A,#2
- ADD A,20H
- DA A
- MOV 30H,A
- SJMP EXIT
- D3: MOV A,#3
- ADD A,20H
- DA A
- MOV 30H,A
- EXIT:
- MOV A,30H
- ANL A,#0FH ;a的高四位清零留下个位
- MOVC A,@A+DPTR
- CLR P1.1 ;位选
- SETB P1.0
- MOV P0,A
- MOV A,#0FFH;p0清零
- MOV P0,A ;p0清零
- MOV A,30H
- ANL A,#0F0H
- SWAP A;留下十位
- MOVC A,@A+DPTR
- CLR P1.0
- SETB P1.1
- MOV P0,A
- MOV A,#0FFH
- MOV P0,A
- LJMP INT
- DELAY:MOV R0,#2;延时
- D: MOV R1,#25
- DJNZ R1,$
- DJNZ R0,D
- RET
- TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
- END
复制代码
|