1. 連接實驗箱上的數碼管,編程在上面顯示數字2017 2. 連接實驗箱上的鍵盤和數碼管,編寫程序,將鍵盤輸入值寫在數碼管的最右端,原來的數值,向左端移動。 3. 消除按鍵一次,輸入多次的情況
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
圖片1.png (48 KB, 下載次數: 84)
下載附件
2020-6-7 09:37 上傳
單片機源程序如下:
- ORG 0000H
- MAIN: CLR P1.0 ;因為是共陰極的二極管,故當P1.0電平為低電平時,二極管會亮
- MOV P0,#5BH ;2
- LCALL D1MS ;延時
- SETB P1.0 ;置位,不選中這一位
- CLR P1.1 ;和上述方法一樣
- MOV P0,#3FH ;0
- LCALL D1MS;
- SETB P1.1
- CLR P1.2 ;和上述方法一樣
- MOV P0,#06H ;1
- LCALL D1MS
- SETB P1.2
- CLR P1.3 ;和上述方法一樣
- MOV P0,#07H ;7
- LCALL D1MS
- SETB P1.3
- LJMP MAIN ;循環顯示
- D1MS: MOV R7,#02H
- DL: MOV R6,#0FFH
- DL1: DJNZ R6,DL1
- DJNZ R7,DL
- RET
- END
- 2和3:
- KBUF DATA 30H ;顯示緩沖區,存放要顯示的數據
- ORG 0000H
- LJMP START1
- ORG 0100H
- START1: LCALL KEY ;調用KEY,有沒有鍵按下
- JC START4 ;判斷進位位,如果進位位為1,證明沒鍵按下
-
- PUSH ACC ;A中存放的是鍵值的序號
- MOV R0,#KBUF ;顯示器的位置左移
- MOV R1,#KBUF+1
- MOV R7,#7
- START2: MOV A,@R1
- MOV @R0,A
- INC R0
- INC R1
- DJNZ R7,START2
- POP ACC
- MOV @R0,A
- ;功能鍵的按鈕
- CJNE A,#0FH,START4 ;判斷累加器的值是否是0F,如果不是跳轉到START4
- START: MOV R0,#KBUF
- MOV R7,#8
- MOV A,#0
- START0: MOV @R0,A
- INC R0
- DJNZ R7,START0
- START4: LCALL DISP
- SJMP START1
- ;①判斷有沒有鍵按下
- KEY: MOV P1,#0FFH ;讓顯示器熄滅
- MOV P3,#0FFH ;通過P3口讀入信息,提前送入1
- MOV P0,#00H
- MOV A,P3
- ANL A,#0FH ;只要低四位的數據
- CJNE A,#0FH,KEY1 ;判斷是不是全1,若全1,證明沒鍵按下,否則,證明有鍵按下,跳轉到KTY1
- SJMP NOKEY
- ;②抖動問題
- KEY1: CALL DELAY ;延時,先消除抖動
- MOV A,P3
- ANL A,#0FH
- CJNE A,#0FH,KEY2 ;判斷是不是全1,若全1,證明是抖動,沒鍵按下,否則,是真正的有鍵按下
- SJMP NOKEY
- ;③確實哪一列的鍵被按下
- KEY2: MOV R6,#04H ;循環4次
- MOV R5,#0FEH ;存放的是每一列應該輸入的值
- KEY3: MOV P0,R5 ;P0.0為0
- MOV A,P3 ;讀取P3口
- ANL A,#0FH ;只要低四位
- CJNE A,#0FH,KEY4 ;判斷是不是全1,若全1,證明此列沒鍵按下,順序執行,否則,在此列有鍵按下,轉到KEY4
-
- MOV A,R5
- RL A ;循環左移一位
- MOV R5,A
- DJNZ R6,KEY3 ;判斷4次循環是否結束,沒結束,繼續執行上述過程
- SJMP NOKEY ;四次都結束,且中間沒有轉到KEY4,證明沒鍵按下
- ;④此列上有鍵按下,顯示鍵值
- KEY4: SWAP A ;半字節交換,高4位有效
- MOV B,A ;B存儲
- MOV A,R5 ;R5是列值
- ANL A,#0FH ;只要低四位
- ORL B,A ;組合值,去查表
- MOV DPTR,#TAB1
- MOV R7,#16 ;共16個鍵,循環16次
- MOV R5,#0 ;從第0個開始
- KEY5: MOV A,R5
- MOVC A,@A+DPTR ;讀取值
- CJNE A,B,KEY7 ;判斷是否和獲得的組合值是否相等。相等,順序執行,否則,轉到KEY7
- ;⑤鍵是否抬起的問題
- KEY6: MOV A,P3 ;等著鍵抬起
- ANL A,#0FH ;只要低四位
- CJNE A,#0FH,KEY6 ;不是0FH,證明沒抬起來
- MOV A,R5 ;A中存放的是鍵值的序號
- SJMP EXIT
- KEY7: INC R5 ;序號加1,繼續循環
- DJNZ R7,KEY5
- NOKEY: SETB C ;進位位為1,證明沒鍵按下
- EXIT: RET
- ;延時程序
- DELAY: MOV R5,#02H
- DL: MOV R6,#0FFH
- DL1: DJNZ R6,DL1
- DJNZ R5,DL
- RET
- ;顯示程序
- DISP: MOV DPTR,#TAB
- MOV R0,#KBUF ;存放要顯示的數據
- MOV R7,#8 ;共8個字節
- MOV R4,#1 ;存放字位
- DISP0: MOV A,@R0 ;通過R0得到要顯示的值
- MOVC A,@A+DPTR ;查表得到字型碼
- MOV P1,A ;送到P1口顯示
- MOV A,R4
- MOV P0,A ;字位送到P0口
- RL A ;左移一位
- MOV R4,A ;又送到R4
- LCALL DELAY ;延時
- MOV P1,#0FFH ;關顯示
- INC R0 ;R0加一
- DJNZ R7,DISP0 ;判斷8位是否全部顯示,若沒有,則繼續顯示,否則返回
- RET
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,82H,0C6H,0A1H,86H,8EH ;共陽極字型碼
- TAB1: DB 0EEH,0EDH,0EBH,0E7H,0DEH,0DDH,0DBH,0D7H,0BEH,0BDH,0BBH,0B7H,07EH,07DH,07BH,77H ;鍵值表
- END
復制代碼
51hei.png (5.11 KB, 下載次數: 73)
下載附件
2020-6-7 19:45 上傳
所有資料51hei提供下載:
實驗連接圖 源碼.zip
(18.43 KB, 下載次數: 12)
2020-6-7 09:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|