|
之前一直想做個(gè)4*4鍵盤,終于成功了,分享出來(lái),有需要的可以參考一下。圖片是自制的多功能多模式高速度電路通斷器,有需要的可聯(lián)系我,QQ503978598.
654318428.jpg (74.54 KB, 下載次數(shù): 127)
下載附件
2016-10-15 12:13 上傳
51單片機(jī)控制的4*4矩陣鍵盤的proteus原理圖:
0.png (29.83 KB, 下載次數(shù): 116)
下載附件
2016-10-16 15:03 上傳
0.png (70.91 KB, 下載次數(shù): 148)
下載附件
2016-10-16 15:04 上傳
0.png (44.95 KB, 下載次數(shù): 115)
下載附件
2016-10-16 15:07 上傳
所有資料打包下載:
4X4鍵盤顯示.zip
(114.67 KB, 下載次數(shù): 129)
2016-10-15 12:13 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
4X4鍵盤和顯示.ASM:
- ;占用單元30H~3CH,40H,A,B,DPTR,R0,R1,R2,R3,R4,R6,R7
- KEYBUF EQU 40H ;鍵號(hào)存放單元
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN: MOV KEYBUF,#0 ;初始鍵號(hào)設(shè)位0,也可以為任意值
- MOV R0,#30H ;顯示首地址
- MOV R2,#0CH ;計(jì)算數(shù)據(jù)存放單元個(gè)數(shù)
- CLR A
- QING: MOV @R0,A ;將數(shù)據(jù)存放單元清零
- INC R0
- DJNZ R2,QING
- MOV P0,#8FH ;關(guān)閉顯示
- MOV R1,#30H ;將顯示首地址存放R1里
- ;===============================================
- ;五位無(wú)符號(hào)顯示子程序
- DIS1: MOV R0,#30H ;把顯示數(shù)據(jù)第一位放在R0里
- MOV R2,#04H ;把顯示的位碼放在R2里
- MOV R3,#05H ;把顯示的長(zhǎng)度放在R3里
- DIS2: MOV A,@R0
- ANL A,#0FH ;屏蔽顯示數(shù)據(jù)的高四位
- MOV B,A
- MOV A,R2
- ANL A,#0FH ;屏蔽位碼的高四位
- SWAP A
- ORL A,B
- MOV P0,A ;送總顯示數(shù)據(jù)到P0顯示
- LCALL DELY4ms ;調(diào)用延時(shí)4ms
- INC R0 ;取下一個(gè)顯示數(shù)據(jù)
- DEC R2
- DJNZ R3,DIS2 ;四位顯示晚后重新開(kāi)始顯示
- ;===================================================
- ;鍵盤掃描子程序
- WAIT: MOV P1,#0FFH ;P1口送高電平
- CLR P1.0 ;第一行清零
- MOV A,P1 ;讀P1口
- ANL A,#0F0H ;低位屏蔽
- XRL A,#0F0H ;判斷低位是否有低電平 ,即判斷是否有按鍵按下
- JZ NOKEY1 ;地位有低電平繼續(xù)掃描,否者跳到第而行去掃描
- LCALL DELY10ms ;延時(shí)10ms去抖在進(jìn)行判斷是否有按鍵按下
- MOV A,P1 ;繼續(xù)讀P1口
- ANL A,#0F0H ;判斷低位是否有低電平
- CJNE A,#0E0H,NK1 ;如果掃描數(shù)據(jù)不為0E0H就轉(zhuǎn)到NK1
- MOV KEYBUF,#0 ;否者判斷為0號(hào)鍵
- AJMP DK ;轉(zhuǎn)DK1查表程序
- NK1: CJNE A,#0D0H,NK2 ;如果掃描數(shù)據(jù)不為0D0H就轉(zhuǎn)到NK2
- MOV KEYBUF,#1 ;否者判斷為1號(hào)鍵
- AJMP DK ;轉(zhuǎn)DK2查表程序
- NK2: CJNE A,#0B0H,NK3 ;如果掃描數(shù)據(jù)不為0B0H就轉(zhuǎn)到NK3
- MOV KEYBUF,#2 ;否者判斷為2號(hào)鍵
- AJMP DK ;轉(zhuǎn)DK3查表程序
- NK3: CJNE A,#70H,NK4 ;如果掃描數(shù)據(jù)不為70H就轉(zhuǎn)到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 ;查表程序 查對(duì)應(yīng)的鍵號(hào)數(shù)據(jù)
- MOV DPTR,#TABLE ;把表頭地址放入DPTR
- MOVC A,@A+DPTR ;A里面存放的為鍵號(hào),利用A和表頭地址找到對(duì)應(yīng)的鍵號(hào)數(shù)據(jù)
- MOV B,A ;把查到的數(shù)據(jù)送往顯示單元
- INC R1 ;取下一個(gè)顯示單元
- 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 ;如果有低電平繼續(xù)讀P1口,否者向下執(zhí)行,查找第二行
- NOKEY4: LJMP DIS1
- ;===================================
- ;功能按鍵功能設(shè)定
- DENG_HAO:MOV DPTR,#JI_SUAN ;等號(hào)鍵功能通過(guò)加、減、乘、除設(shè)定的偏移量來(lái)調(diào)用子程序
- MOV A,3CH ;3CH存放的為功能程序入口地址偏移量
- JMP @A+DPTR ;轉(zhuǎn)移到按鍵功能程序
- JI_SUAN: AJMP JIA1 ;加計(jì)算子程序
- AJMP JIAN1 ;減計(jì)算子程序
- AJMP CHENG1 ;乘計(jì)算子程序
- AJMP CHU ;除計(jì)算子程序
- ;=======刪除鍵功能
- 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
- ;=================================
- ;存被加(減、乘、除)數(shù),存放在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
- ;================================
- ;十進(jìn)制加法子程序
- JIA1: ;??????
- AJMP DKA
- ;================================
- ;十進(jìn)制減法子程序
- JIAN1: ;??????
- AJMP DKA
- ;================================
- ;十進(jìn)制乘法子程序
- CHENG1: ;??????
- AJMP DKA
- ;================================
- ;十進(jìn)制除法子程序
- CHU1: ;??????
- AJMP DKA
- ;=============================================
- ;延時(shí)程序和查表表格
- DELY4ms: MOV R6,#8 ;延時(shí)4毫秒
- D1: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- RET
- DELY10ms:MOV R6,#20 ;延時(shí)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
復(fù)制代碼
簡(jiǎn)易的計(jì)算器.ASM
- KEYBUF EQU 40H ;鍵號(hào)存放單元
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN: MOV KEYBUF,#0 ;初始鍵號(hào)設(shè)位0,也可以為任意值
- MOV R0,#30H ;顯示首地址
- MOV R2,#0CH ;計(jì)算數(shù)據(jù)存放單元個(gè)數(shù)
- CLR A
- QING: MOV @R0,A ;將數(shù)據(jù)存放單元清零
- INC R0
- DJNZ R2,QING
- MOV P0,#8FH ;關(guān)閉顯示
- MOV R1,#30H ;將顯示首地址存放R1里
- ;===============================================
- ;五位無(wú)符號(hào)顯示子程序
- DIS1: MOV R0,#30H ;把顯示數(shù)據(jù)第一位放在R0里
- MOV R2,#04H ;把顯示的位碼放在R2里
- MOV R3,#05H ;把顯示的長(zhǎng)度放在R3里
- DIS2: MOV A,@R0
- ANL A,#0FH ;屏蔽顯示數(shù)據(jù)的高四位
- MOV B,A
- MOV A,R2
- ANL A,#0FH ;屏蔽位碼的高四位
- SWAP A
- ORL A,B
- MOV P0,A ;送總顯示數(shù)據(jù)到P0顯示
- LCALL DELY4ms ;調(diào)用延時(shí)4ms
- INC R0 ;取下一個(gè)顯示數(shù)據(jù)
- DEC R2
- DJNZ R3,DIS2 ;四位顯示晚后重新開(kāi)始顯示
- ;===================================================
- ;鍵盤掃描子程序
- WAIT: MOV P1,#0FFH ;P1口送高電平
- CLR P1.0 ;第一行清零
- MOV A,P1 ;讀P1口
- ANL A,#0F0H ;低位屏蔽
- XRL A,#0F0H ;判斷低位是否有低電平 ,即判斷是否有按鍵按下
- JZ NOKEY1 ;地位有低電平繼續(xù)掃描,否者跳到第而行去掃描
- LCALL DELY10ms ;延時(shí)10ms去抖在進(jìn)行判斷是否有按鍵按下
- MOV A,P1 ;繼續(xù)讀P1口
- ANL A,#0F0H ;判斷低位是否有低電平
- CJNE A,#0E0H,NK1 ;如果掃描數(shù)據(jù)不為0E0H就轉(zhuǎn)到NK1
- MOV KEYBUF,#0 ;否者判斷為0號(hào)鍵
- AJMP DK ;轉(zhuǎn)DK1查表程序
- NK1: CJNE A,#0D0H,NK2 ;如果掃描數(shù)據(jù)不為0D0H就轉(zhuǎn)到NK2
- MOV KEYBUF,#1 ;否者判斷為1號(hào)鍵
- AJMP DK ;轉(zhuǎn)DK2查表程序
- NK2: CJNE A,#0B0H,NK3 ;如果掃描數(shù)據(jù)不為0B0H就轉(zhuǎn)到NK3
- MOV KEYBUF,#2 ;否者判斷為2號(hào)鍵
- AJMP DK ;轉(zhuǎn)DK3查表程序
- NK3: CJNE A,#70H,NK4 ;如果掃描數(shù)據(jù)不為70H就轉(zhuǎn)到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號(hào)鍵
- AJMP DK ;轉(zhuǎn)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 ;查表程序 查對(duì)應(yīng)的鍵號(hào)數(shù)據(jù)
- MOV DPTR,#TABLE ;把表頭地址放入DPTR
- MOVC A,@A+DPTR ;A里面存放的為鍵號(hào),利用A和表頭地址找到對(duì)應(yīng)的鍵號(hào)數(shù)據(jù)
- MOV B,A ;把查到的數(shù)據(jù)送往顯示單元
- INC R1 ;取下一個(gè)顯示單元
- 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 ;如果有低電平繼續(xù)讀P1口,否者向下執(zhí)行,查找第二行
- NOKEY4: LJMP DIS1
- ;===================================
- ;功能按鍵功能設(shè)定
- DENG_HAO:MOV DPTR,#JI_SUAN ;等號(hào)鍵功能通過(guò)加、減、乘、除設(shè)定的偏移量來(lái)調(diào)用子程序
- MOV A,3CH ;3CH存放的為功能程序入口地址偏移量
- JMP @A+DPTR ;轉(zhuǎn)移到按鍵功能程序
- JI_SUAN: AJMP JIA1 ;加計(jì)算子程序
- AJMP JIAN1 ;減計(jì)算子程序
- AJMP CHENG1 ;乘計(jì)算子程序
- AJMP CHU ;除計(jì)算子程序
- ;=======刪除鍵功能
- 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
- ;=================================
- ;存被加(減、乘、除)數(shù),存放在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
- ;================================
- ;十進(jìn)制加法子程序
- JIA1:
- MOV A,37H ;個(gè)位被加數(shù)
- ADD A,30H ;個(gè)位被加數(shù)+加數(shù)
- MOV B,#10 ;十六進(jìn)制除10轉(zhuǎn)換成BCD碼
- DIV AB
- MOV 30H,B ;余數(shù)即個(gè)位存放在30H
- MOV 37H,A ;商存放在37H
- MOV A,38H ;十位被加數(shù)
- ADD A,31H ;十位被加數(shù)+加數(shù)
- ADD A,37H ;加上個(gè)位之和的進(jìn)位
- MOV 37H,#00H ;清除37H
- MOV B,#10 ;十六進(jìn)制除10轉(zhuǎn)換成BCD碼
- DIV AB
- MOV 31H,B ;余數(shù)即十位存放在31H
- MOV 38H,A ;商存放在38H
- MOV A,39H ;百位計(jì)算同十位
- ADD A,32H
- ADD A,38H
- MOV 38H,#00H
- MOV B,#10
- DIV AB
- MOV 32H,B
- MOV 39H,A
- MOV A,3AH ;千位計(jì)算同十位
- ADD A,33H
- ADD A,39H
- MOV 39H,#00H
- MOV B,#10
- DIV AB
- MOV 33H,B
- MOV 3AH,A
- MOV A,3BH ;萬(wàn)位計(jì)算同十位
- 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
- ;=============================================
- ;延時(shí)程序和查表表格
- DELY4ms: MOV R6,#8 ;延時(shí)4毫秒
- D1: MOV R7,#248
- DJNZ R7,$
- DJNZ R6,D1
- RET
- DELY10ms:MOV R6,#20 ;延時(shí)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
復(fù)制代碼 |
|