之前一直想做個4*4鍵盤,終于成功了,分享出來,有需要的可以參考一下。圖片是自制的多功能多模式高速度電路通斷器,有需要的可聯系我,QQ503978598.
51單片機控制的4*4矩陣鍵盤的proteus原理圖:
所有資料打包下載:
4X4鍵盤顯示.zip
(114.67 KB, 下載次數: 129)
2016-10-15 12:13 上傳
點擊文件名下載附件
4X4鍵盤和顯示.ASM:
- ;占用單元30H~3CH,40H,A,B,DPTR,R0,R1,R2,R3,R4,R6,R7
- KEYBUF EQU 40H ;鍵號存放單元
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN: MOV KEYBUF,#0 ;初始鍵號設位0,也可以為任意值
- MOV R0,#30H ;顯示首地址
- MOV R2,#0CH ;計算數據存放單元個數
- CLR A
- QING: MOV @R0,A ;將數據存放單元清零
- INC R0
- DJNZ R2,QING
- MOV P0,#8FH ;關閉顯示
- MOV R1,#30H ;將顯示首地址存放R1里
- ;===============================================
- ;五位無符號顯示子程序
- DIS1: MOV R0,#30H ;把顯示數據第一位放在R0里
- MOV R2,#04H ;把顯示的位碼放在R2里
- MOV R3,#05H ;把顯示的長度放在R3里
- DIS2: MOV A,@R0
- ANL A,#0FH ;屏蔽顯示數據的高四位
- MOV B,A
- MOV A,R2
- ANL A,#0FH ;屏蔽位碼的高四位
- SWAP A
- ORL A,B
- MOV P0,A ;送總顯示數據到P0顯示
- LCALL DELY4ms ;調用延時4ms
- INC R0 ;取下一個顯示數據
- DEC R2
- DJNZ R3,DIS2 ;四位顯示晚后重新開始顯示
- ;===================================================
- ;鍵盤掃描子程序
- WAIT: MOV P1,#0FFH ;P1口送高電平
- CLR P1.0 ;第一行清零
- MOV A,P1 ;讀P1口
- ANL A,#0F0H ;低位屏蔽
- XRL A,#0F0H ;判斷低位是否有低電平 ,即判斷是否有按鍵按下
- JZ NOKEY1 ;地位有低電平繼續掃描,否者跳到第而行去掃描
- LCALL DELY10ms ;延時10ms去抖在進行判斷是否有按鍵按下
- MOV A,P1 ;繼續讀P1口
- ANL A,#0F0H ;判斷低位是否有低電平
- CJNE A,#0E0H,NK1 ;如果掃描數據不為0E0H就轉到NK1
- MOV KEYBUF,#0 ;否者判斷為0號鍵
- AJMP DK ;轉DK1查表程序
- NK1: CJNE A,#0D0H,NK2 ;如果掃描數據不為0D0H就轉到NK2
- MOV KEYBUF,#1 ;否者判斷為1號鍵
- AJMP DK ;轉DK2查表程序
- NK2: CJNE A,#0B0H,NK3 ;如果掃描數據不為0B0H就轉到NK3
- MOV KEYBUF,#2 ;否者判斷為2號鍵
- AJMP DK ;轉DK3查表程序
- NK3: CJNE A,#70H,NK4 ;如果掃描數據不為70H就轉到NK4
- AJMP SAN_CHU
- NK4: NOP
- NOKEY1: MOV P1,#0FFH ;和上面相同
- CLR P1.1
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY2
- LCALL DELY10MS
- MOV A,p1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY2
- MOV A,P1
- ANL A,#0F0H
- CJNE A,#0E0H,NK5
- MOV KEYBUF,#3
- AJMP DK
- NK5: CJNE A,#0D0H,NK6
- MOV KEYBUF,#4
- AJMP DK
- NK6: CJNE A,#0B0H,NK7
- MOV KEYBUF,#5
- AJMP DK
- NK7: CJNE A,#70H,NK8
- MOV KEYBUF,#10
- AJMP DK
- NK8: NOP
- NOKEY2: MOV P1,#0FFH
- CLR P1.2
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY3
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY3
- MOV A,P1
- ANL A,#0F0H
- CJNE A,#0E0H,NK9
- MOV KEYBUF,#6
- AJMP DK
- NK9: CJNE A,#0D0H,NK10
- MOV KEYBUF,#7
- AJMP DK
- NK10: CJNE A,#0B0H,NK11
- MOV KEYBUF,#8
- AJMP DK
- NK11: CJNE A,#70H,NK12
- AJMP DENG_HAO
- NK12: NOP
- NOKEY3: MOV P1,#0FFH
- CLR P1.3
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY4
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY4
- MOV A,P1
- ANL A,#0F0H
- CJNE A,#0E0H,NK13
- AJMP CHU
- NK13: CJNE A,#0D0H,NK14
- AJMP CHENG
- NK14: CJNE A,#0B0H,NK15
- AJMP JIAN
- NK15: CJNE A,#70H,NK16
- AJMP JIA
- NK16: NOP
- ;=======================================================
- ;查表求鍵值程序
- ;查表求鍵值程序
- DK: MOV B,#00H
- MOV A,KEYBUF ;查表程序 查對應的鍵號數據
- MOV DPTR,#TABLE ;把表頭地址放入DPTR
- MOVC A,@A+DPTR ;A里面存放的為鍵號,利用A和表頭地址找到對應的鍵號數據
- MOV B,A ;把查到的數據送往顯示單元
- INC R1 ;取下一個顯示單元
- MOV A,R1
- CJNE A,#36H,DKA1 ;判斷顯示單元是否已滿
- MOV R1,#35H ;35H,36H單元用于更好的控制五位顯示
- AJMP DKA
- DKA1: MOV 34H,33H ;按鍵代碼按左移顯示,先按先顯示
- MOV 33H,32H
- MOV 32H,31H
- MOV 31H,30H
- MOV 30H,B
- DKA: MOV A,P1 ;讀P1口
- ANL A,#0F0H ;屏蔽高四位
- XRL A,#0F0H ;地位是有低電平
- JNZ DKA ;如果有低電平繼續讀P1口,否者向下執行,查找第二行
- NOKEY4: LJMP DIS1
- ;===================================
- ;功能按鍵功能設定
- DENG_HAO:MOV DPTR,#JI_SUAN ;等號鍵功能通過加、減、乘、除設定的偏移量來調用子程序
- MOV A,3CH ;3CH存放的為功能程序入口地址偏移量
- JMP @A+DPTR ;轉移到按鍵功能程序
- JI_SUAN: AJMP JIA1 ;加計算子程序
- AJMP JIAN1 ;減計算子程序
- AJMP CHENG1 ;乘計算子程序
- AJMP CHU ;除計算子程序
- ;=======刪除鍵功能
- SAN_CHU: ACALL QING_DIS
- AJMP DKA
- ;=======加鍵功能
- JIA: MOV 3CH,#00H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=======減鍵功能
- JIAN: MOV 3CH,#02H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=======乘鍵功能
- CHENG: MOV 3CH,#04H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=======除鍵功能
- CHU: MOV 3DH,#06H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=================================
- ;存被加(減、乘、除)數,存放在37H~3BH里
- CUN_SHU: MOV 37H,30H ;36H存放的為最低位
- MOV 38H,31H
- MOV 39H,32H
- MOV 3AH,33H
- MOV 3BH,34H ;3AH存放的為最高位
- RET
- ;================================
- ;清除顯示單元
- QING_DIS: MOV R1,#30H
- QING1: MOV @R1,#00H
- INC R1
- MOV A,R1
- CJNE A,#36H,QING1
- MOV R1,#30H
- LOP1: RET
- ;================================
- ;十進制加法子程序
- JIA1: ;??????
- AJMP DKA
- ;================================
- ;十進制減法子程序
- JIAN1: ;??????
- AJMP DKA
- ;================================
- ;十進制乘法子程序
- CHENG1: ;??????
- AJMP DKA
- ;================================
- ;十進制除法子程序
- CHU1: ;??????
- AJMP DKA
- ;=============================================
- ;延時程序和查表表格
- DELY4ms: MOV R6,#8 ;延時4毫秒
- D1: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- RET
- DELY10ms:MOV R6,#20 ;延時10毫秒
- D2: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D2
- RET
- TABLE: DB 07H, 04H, 01H ; / 本表格是以鍵盤為參考 7 8 9 /
- DB 08H, 05H, 02H ; * 4 5 6 *
- DB 09H, 06H, 03H ; - 1 2 3 -
- DB 00H, 00H ;= + 清除 0 = +
- END
復制代碼
簡易的計算器.ASM
- KEYBUF EQU 40H ;鍵號存放單元
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN: MOV KEYBUF,#0 ;初始鍵號設位0,也可以為任意值
- MOV R0,#30H ;顯示首地址
- MOV R2,#0CH ;計算數據存放單元個數
- CLR A
- QING: MOV @R0,A ;將數據存放單元清零
- INC R0
- DJNZ R2,QING
- MOV P0,#8FH ;關閉顯示
- MOV R1,#30H ;將顯示首地址存放R1里
- ;===============================================
- ;五位無符號顯示子程序
- DIS1: MOV R0,#30H ;把顯示數據第一位放在R0里
- MOV R2,#04H ;把顯示的位碼放在R2里
- MOV R3,#05H ;把顯示的長度放在R3里
- DIS2: MOV A,@R0
- ANL A,#0FH ;屏蔽顯示數據的高四位
- MOV B,A
- MOV A,R2
- ANL A,#0FH ;屏蔽位碼的高四位
- SWAP A
- ORL A,B
- MOV P0,A ;送總顯示數據到P0顯示
- LCALL DELY4ms ;調用延時4ms
- INC R0 ;取下一個顯示數據
- DEC R2
- DJNZ R3,DIS2 ;四位顯示晚后重新開始顯示
- ;===================================================
- ;鍵盤掃描子程序
- WAIT: MOV P1,#0FFH ;P1口送高電平
- CLR P1.0 ;第一行清零
- MOV A,P1 ;讀P1口
- ANL A,#0F0H ;低位屏蔽
- XRL A,#0F0H ;判斷低位是否有低電平 ,即判斷是否有按鍵按下
- JZ NOKEY1 ;地位有低電平繼續掃描,否者跳到第而行去掃描
- LCALL DELY10ms ;延時10ms去抖在進行判斷是否有按鍵按下
- MOV A,P1 ;繼續讀P1口
- ANL A,#0F0H ;判斷低位是否有低電平
- CJNE A,#0E0H,NK1 ;如果掃描數據不為0E0H就轉到NK1
- MOV KEYBUF,#0 ;否者判斷為0號鍵
- AJMP DK ;轉DK1查表程序
- NK1: CJNE A,#0D0H,NK2 ;如果掃描數據不為0D0H就轉到NK2
- MOV KEYBUF,#1 ;否者判斷為1號鍵
- AJMP DK ;轉DK2查表程序
- NK2: CJNE A,#0B0H,NK3 ;如果掃描數據不為0B0H就轉到NK3
- MOV KEYBUF,#2 ;否者判斷為2號鍵
- AJMP DK ;轉DK3查表程序
- NK3: CJNE A,#70H,NK4 ;如果掃描數據不為70H就轉到NK4
- LJMP SAN_CHU
- NK4: NOP
- NOKEY1: MOV P1,#0FFH ;和上面相同
- CLR P1.1
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY2
- LCALL DELY10MS
- MOV A,p1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY2
- MOV A,P1
- ANL A,#0F0H
- CJNE A,#0E0H,NK5
- MOV KEYBUF,#3
- AJMP DK
- NK5: CJNE A,#0D0H,NK6
- MOV KEYBUF,#4
- AJMP DK
- NK6: CJNE A,#0B0H,NK7
- MOV KEYBUF,#5
- AJMP DK
- NK7: CJNE A,#70H,NK8
- MOV KEYBUF,#10 ;否者判斷為3號鍵
- AJMP DK ;轉DK4查表程序
- NK8: NOP
- NOKEY2: MOV P1,#0FFH
- CLR P1.2
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY3
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY3
- MOV A,P1
- ANL A,#0F0H
- CJNE A,#0E0H,NK9
- MOV KEYBUF,#6
- AJMP DK
- NK9: CJNE A,#0D0H,NK10
- MOV KEYBUF,#7
- AJMP DK
- NK10: CJNE A,#0B0H,NK11
- MOV KEYBUF,#8
- AJMP DK
- NK11: CJNE A,#70H,NK12
- LJMP DENG_HAO
- NK12: NOP
- NOKEY3: MOV P1,#0FFH
- CLR P1.3
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY4
- LCALL DELY10MS
- MOV A,P1
- ANL A,#0F0H
- XRL A,#0F0H
- JZ NOKEY4
- MOV A,P1
- ANL A,#0F0H
- CJNE A,#0E0H,NK13
- LJMP CHU
- NK13: CJNE A,#0D0H,NK14
- LJMP CHENG
- NK14: CJNE A,#0B0H,NK15
- LJMP JIAN
- NK15: CJNE A,#70H,NK16
- LJMP JIA
- NK16: NOP
- ;=======================================================
- ;查表求鍵值程序
- DK: MOV B,#00H
- MOV A,KEYBUF ;查表程序 查對應的鍵號數據
- MOV DPTR,#TABLE ;把表頭地址放入DPTR
- MOVC A,@A+DPTR ;A里面存放的為鍵號,利用A和表頭地址找到對應的鍵號數據
- MOV B,A ;把查到的數據送往顯示單元
- INC R1 ;取下一個顯示單元
- MOV A,R1
- CJNE A,#36H,DKA1 ;判斷顯示單元是否已滿
- MOV R1,#35H ;35H,36H單元用于更好的控制五位顯示
- AJMP DKA
- DKA1: MOV 34H,33H ;按鍵代碼按左移顯示,先按先顯示
- MOV 33H,32H
- MOV 32H,31H
- MOV 31H,30H
- MOV 30H,B
- DKA: MOV A,P1 ;讀P1口
- ANL A,#0F0H ;屏蔽高四位
- XRL A,#0F0H ;地位是有低電平
- JNZ DKA ;如果有低電平繼續讀P1口,否者向下執行,查找第二行
- NOKEY4: LJMP DIS1
- ;===================================
- ;功能按鍵功能設定
- DENG_HAO:MOV DPTR,#JI_SUAN ;等號鍵功能通過加、減、乘、除設定的偏移量來調用子程序
- MOV A,3CH ;3CH存放的為功能程序入口地址偏移量
- JMP @A+DPTR ;轉移到按鍵功能程序
- JI_SUAN: AJMP JIA1 ;加計算子程序
- AJMP JIAN1 ;減計算子程序
- AJMP CHENG1 ;乘計算子程序
- AJMP CHU ;除計算子程序
- ;=======刪除鍵功能
- SAN_CHU: ACALL QING_DIS
- AJMP DKA
- ;=======加鍵功能
- JIA: MOV 3CH,#00H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=======減鍵功能
- JIAN: MOV 3CH,#02H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=======乘鍵功能
- CHENG: MOV 3CH,#04H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=======除鍵功能
- CHU: MOV 3DH,#06H
- ACALL CUN_SHU
- ACALL QING_DIS
- AJMP DKA
- ;=================================
- ;存被加(減、乘、除)數,存放在37H~3BH里
- CUN_SHU: MOV 37H,30H ;36H存放的為最低位
- MOV 38H,31H
- MOV 39H,32H
- MOV 3AH,33H
- MOV 3BH,34H ;3AH存放的為最高位
- RET
- ;================================
- ;清除顯示單元
- QING_DIS: MOV R1,#30H
- QING1: MOV @R1,#00H
- INC R1
- MOV A,R1
- CJNE A,#36H,QING1
- MOV R1,#30H
- LOP1: RET
- ;================================
- ;十進制加法子程序
- JIA1:
- MOV A,37H ;個位被加數
- ADD A,30H ;個位被加數+加數
- MOV B,#10 ;十六進制除10轉換成BCD碼
- DIV AB
- MOV 30H,B ;余數即個位存放在30H
- MOV 37H,A ;商存放在37H
- MOV A,38H ;十位被加數
- ADD A,31H ;十位被加數+加數
- ADD A,37H ;加上個位之和的進位
- MOV 37H,#00H ;清除37H
- MOV B,#10 ;十六進制除10轉換成BCD碼
- DIV AB
- MOV 31H,B ;余數即十位存放在31H
- MOV 38H,A ;商存放在38H
- MOV A,39H ;百位計算同十位
- ADD A,32H
- ADD A,38H
- MOV 38H,#00H
- MOV B,#10
- DIV AB
- MOV 32H,B
- MOV 39H,A
- MOV A,3AH ;千位計算同十位
- ADD A,33H
- ADD A,39H
- MOV 39H,#00H
- MOV B,#10
- DIV AB
- MOV 33H,B
- MOV 3AH,A
- MOV A,3BH ;萬位計算同十位
- ADD A,34H
- ADD A,3AH
- MOV 3AH,#00H
- MOV B,#10
- DIV AB
- MOV 34H,B
- MOV 3BH,#00H
- AJMP DKA
- ;=====================
- JIAN1: AJMP DKA
- CHENG1: AJMP DKA
- CHU1: AJMP DKA
- ;=============================================
- ;延時程序和查表表格
- DELY4ms: MOV R6,#8 ;延時4毫秒
- D1: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- RET
- DELY10ms:MOV R6,#20 ;延時10毫秒
- D2: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D2
- RET
- TABLE: DB 07H, 04H, 01H ; / 本表格是以鍵盤為參考 7 8 9 /
- DB 08H, 05H, 02H ; * 4 5 6 *
- DB 09H, 06H, 03H ; - 1 2 3 -
- DB 00H, 00H ;= + 清除 0 = +
- END
復制代碼 |