標(biāo)題: PIC單片機(jī)控制數(shù)碼管顯示4*4矩陣鍵盤(pán)對(duì)應(yīng)按鍵號(hào) [打印本頁(yè)]
作者: hurong 時(shí)間: 2013-6-12 23:28
標(biāo)題: PIC單片機(jī)控制數(shù)碼管顯示4*4矩陣鍵盤(pán)對(duì)應(yīng)按鍵號(hào)
;使用C口作鍵盤(pán)掃描,7段數(shù)碼管顯示按鍵號(hào) ,63系列通用寄存器地址:20~7FH, A0~FFH ,未達(dá)到預(yù)期目的,只用個(gè)位數(shù)顯示按鍵號(hào)時(shí)正常工作,增加按鍵號(hào)轉(zhuǎn)換(用2位數(shù)顯示),則提示“STACK OVERFLOW"--堆棧溢出.編譯后機(jī)器碼容量為1.3KB左右,未超過(guò)CALL跳轉(zhuǎn)范圍——1頁(yè)(2K) 。
#include P16C63A.INC
KEYCODE EQU H'0020'
KEYNUM EQU H'0021'
CC EQU H'0024'
TABADD EQU H'0025'
SW EQU H'0026'
GW EQU H'0027'
;PD EQU H'0028'
ORG H'0000'
GOTO MAIN
ORG H'0010'
MAIN MOVLW H'00'
TRIS PORTA
TRIS PORTB ;RB口全為輸出,用作驅(qū)動(dòng)7段數(shù)碼管
MOVWF KEYNUM
MOVLW H'F0'
TRIS PORTC ; 設(shè)置RC低四位為輸出,高四位為輸入
MOVLW TABLE
MOVWF TABADD
MOVLW H'0001'
; MOVWF PD ;用來(lái)判斷按鍵號(hào)是否大于9
LOOP
CALL KEYSCAN
; CALL JUDGE ;判斷是按鍵號(hào)是否大于9
; XORLW H'0001'
; BTFSS STATUS,Z
CALL XIAO
; GOTO DASHU
XS CALL DISP_2
GOTO LOOP ;循環(huán)掃描、顯示按鍵號(hào)
JUDGE
MOVLW H'0A'
SUBWF KEYNUM,0
BTFSC STATUS,0 ; C標(biāo)志
; RETLW 0 ;小于10
; RETLW 1 ; 10以上的按鍵號(hào)
GOTO XIAO
GOTO DASHU
XIAO MOVLW 0
MOVWF SW
MOVF KEYNUM,0
MOVWF GW
RETLW 0
; GOTO XS
DASHU
MOVLW H'01'
MOVWF SW
MOVLW H'0A'
SUBWF KEYNUM,0
MOVWF GW
RETLW 0
; GOTO XS
DISP_2
MOVLW H'02'
MOVWF PORTA
MOVF SW,0
CALL DISP
CALL DELAY
MOVLW H'01'
MOVWF PORTA
MOVF GW,0
CALL DISP
CALL DELAY
RETLW 0
DELAY MOVLW 0
MOVWF CC
LL DECFSZ CC,1
GOTO LL
RETLW 0
DISP ; MOVF KEYNUM,0 ;輸入W,輸出W
ADDWF TABADD,0
CALL CONV
MOVWF PORTB
RETLW 0
CONV MOVWF PCL ;取碼,輸入W(0~F),輸出W
TABLE RETLW H'C0'
RETLW H'F9'
RETLW H'A4'
RETLW H'B0'
RETLW H'99'
RETLW H'92'
RETLW H'82'
RETLW H'F8'
RETLW H'80'
RETLW H'90'
RETLW H'88'
RETLW H'83'
RETLW H'C6'
RETLW H'A1'
RETLW H'86'
RETLW H'8E' ;0~F 數(shù)碼管代碼
RETLW H'C0'
KEYSCAN MOVLW H'FE' ;第一行置低(RC0輸出0)
MOVWF PORTC
NOP
MOVF PORTC,0 ;讀RC各端口狀態(tài)
ANDLW H'F0' ;屏蔽低四位,只需要低四位來(lái)判斷
MOVWF KEYCODE ;保存端口狀態(tài)
MOVLW H'F0'
SUBWF KEYCODE,0 ;與初值比較,看是否有鍵按下
BTFSS STATUS,Z ;有鍵按下(不等于初值,Z為零)則結(jié)束掃描
GOTO GETNUM1
MOVLW H'FD' ;第二行置低(RC1輸出0)
MOVWF PORTC
NOP
MOVF PORTC,0 ;讀RC各端口值
ANDLW H'F0' ;屏蔽低四位,只需要低四位來(lái)判斷
MOVWF KEYCODE ;保存端口狀態(tài)
MOVLW H'F0'
SUBWF KEYCODE,0 ;與初值比較,看是否有鍵按下
BTFSS STATUS,Z ;有鍵按下(不等于初值,Z為零)則結(jié)束掃描
GOTO GETNUM2
MOVLW H'FB' ;第三行置低(RC2輸出0)
MOVWF PORTC
NOP
MOVF PORTC,0 ;讀RC各端口值
ANDLW H'F0' ;屏蔽低四位,只需要低四位來(lái)判斷
MOVWF KEYCODE ;保存端口狀態(tài)
MOVLW H'F0'
SUBWF KEYCODE,0 ;與初值比較,看是否有鍵按下
BTFSS STATUS,Z ;有鍵按下(不等于初值,Z為零)則結(jié)束掃描
GOTO GETNUM3
MOVLW H'F7' ;第四行置低(RC3輸出0)
MOVWF PORTC
NOP
MOVF PORTC,0 ;讀RC各端口值
ANDLW H'F0' ;屏蔽低四位,只需要低四位來(lái)判斷
MOVWF KEYCODE ;保存端口狀態(tài)
MOVLW H'F0'
SUBWF KEYCODE,0 ;與初值比較,看是否有鍵按下
BTFSS STATUS,Z ;有鍵按下(不等于初值,Z為零)則結(jié)束掃描
GOTO GETNUM4
FH RETLW 0 ; 子程序返回
QUDOU MOVF PORTC,0 ;去抖處理
SUBWF KEYCODE,0
BTFSC STATUS,Z
GOTO QUDOU
GOTO FH
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |