0.png (51.21 KB, 下載次數: 85)
下載附件
2018-6-13 00:42 上傳
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (64.65 KB, 下載次數: 84)
下載附件
2018-6-13 00:43 上傳
單片機源程序如下:
- #include <REGX51.H>
- DIN EQU P3.0
- CLK EQU P3.1
- DBUF EQU 30H
- TEMP EQU 40H
-
- ORG 0000H
- MOV 30H,#00
-
- MAIN: ACALL DISP ;獲取段碼,并輸送給數碼顯示管
- ACALL KEY ;獲取鍵值
- AJMP MBIN
-
- ;判斷鍵值子程序
- KEY: MOV P1,#0FFH ;初始化
- MOV A,P1 ;P1為按下的鍵,給累加器A
- CJNE A#0FFH,K00 ;判斷是否有鍵按下,沒按就循環,按下就跳到K00
- AJMP KEY
-
- K00: ACALL DELAY ;運行延時子程序,消除抖動操作
- MOV A,P1
- CJNE A,#OFFH,K01 ;二次判斷是否按下,沒按跳轉回KEY
- AJMP KEY1
-
- ;開始判斷按下的是那個鍵
- K01: MOVR3,#9 ;設置判斷的循環次數,判斷9次,1~9鍵
- MOV R2,#00H ;設置查表偏移值,從00H開始
- MOV B,A ;A內為按下的值,賦給B,之后做判斷使用
- MOV DPTR,#K0TAB ;賦表頭地址(鍵值表(K0TAB))給DPTR
-
- K02: MOV A,R2 ;偏移值賦給累加器A
- MOVC A,@A+DPTR ;偏移值加表頭地址得到的鍵值賦給累加器A
- CJNE AB,K04 ;判斷按下的鍵值和查表的到的鍵值是否一致,不同則跳轉
-
- K03: MOV A,P1
- CJNE A,#0FFH,K03 ;第三次重新判斷按下的鍵
- ACALL DELAY ;延時消除抖動操作
- MOV A,R2 ;偏移值給累加器A?
- RET ;返回
-
- K04: INC R2 ;偏移值加一
- DJNZ R3K02 ;循環次數減一,不等于0,跳轉到K02
- MOV A #OFFH ;循環結束,給累加器A賦值FFH
- AJMP KEY ;跳轉到KEY,重新開始此子程序
-
- K0TAB: DB 0FFH,0FEH,0FDH,0FBH,0F7H ;鍵值表
- DB 0EFH,0DFH,0BFH,7FH
-
- DISP: MOV DFUF,A ;段碼值給DBUF,A(KEY子程序得到的鍵碼值)給DBUF(30H)
- MOV RO,#DBUF ;30H給R0
- MOV R1,#TEMP ;40H給R1
-
- DP10: MOV DPTR,#SEGTAB ;表頭地址給DPTR
- MOV A,@R0 ;((R0))給累加器A,R0=30H
- MOVC A,A+DPTR ;表頭地址加累加器A(鍵碼)的值(A=DBUF=30H=鍵碼),查表后得到段碼值再給A, (A=段碼)
- MOV @R1,A ;上段代碼得到的A內的段碼給((R1)),((R1))=TEMP=40H,40H=段碼值
- MOV RO,#TEMP ;40H再給R0
-
- DP12: MOV R2,#8 ;設置循環次數
- MOV A,@R0 ;段碼再給累加器A
-
- DP13: RLC A ;循環左移A(循環左移段碼)逐個移動到CY位
- MOV DIN,C ;CY內的值再給DIN,傳送到74LS164
- CLR CLK ;清零CLK口
- SETB CLK ;再給CLK口置1
- DJNZ R2.DP13 ;循環減一,循環8次,輸送完段碼八個位
- RET ;返回主程序
-
- SEGTAB: DB 3FH,06H,5BH,4FH,66H ;段碼表
- DB 6DH,7DH,07H,7FH,6FH
-
- DELAY1: MOV R4.#20 ;延時程序,10ms
- AA1: MOV R5,#250
- AA: DJNZ R5,AA
- DJNE R4 AA1
- RET
- END
復制代碼
所有資料51hei提供下載:
新建文件夾.rar
(597.3 KB, 下載次數: 39)
2018-6-12 15:01 上傳
點擊文件名下載附件
仿真圖 下載積分: 黑幣 -5
|