;本程序用于PIC單片機外接鍵盤的識別,通過匯編程序,使按下K1鍵時第一個數碼管顯示1,按下K2鍵時第一
;個數碼管上顯示2,按下K3鍵時第一個數碼管上顯示3,按下K4鍵時第一個數碼管上顯示4,
;匯編程序對鍵盤的掃描采用查詢方式
LIST P=18F458
INCLUDE "P18F458.INC"
;所用的寄存器
JIANR EQU 0X20
FLAG EQU JIANR+1 ;標志寄存器
DEYH EQU JIANR+2
DEYL EQU JIANR+3
F0 EQU 0 ;FLAG的第0位定義為F0
ORG 0X00
GOTO MAIN
ORG 0X30
;*************以下為鍵盤碼值轉換表******************
CONVERT ADDWF PCL,1
RETLW 0XC0 ;0,顯示段碼與具體的硬件連接有關
RETLW 0XF9 ;1
RETLW 0XA4 ;2
RETLW 0XB0 ;3
RETLW 0X99 ;4
RETLW 0X92 ;5
RETLW 0X82 ;6
RETLW 0XD8 ;7
RETLW 0X80 ;8
RETLW 0X90 ;9
RETLW 0X88 ;A
RETLW 0X83 ;B
RETLW 0XC6 ;C
RETLW 0XA1 ;D
RETLW 0X86 ;E
RETLW 0X8E ;F
RETLW 0X7F ;"."
RETLW 0XBF ;"-"
RETLW 0X89 ;H
RETLW 0XFF ;DARK
RETURN
;***************PIC單片機鍵盤掃描匯編程序初始化子程序*****************
INITIAL
BCF TRISA,5 ;置RA5為輸出方式,以輸出鎖存信號
BCF TRISB,1
BCF TRISA,3
BCF TRISE,0
BCF TRISE,1
BSF TRISB,4 ;設置與鍵盤有關的各口的輸入輸出方式
BCF TRISC,5
BCF TRISC,3 ;設置SCK與SDO為輸出方式
BCF INTCON,GIE ;關閉所有中斷
MOVLW 0XC0
MOVWF SSPSTAT ;設置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;設置SPI的控制方式,允許SSP方式,并且時鐘下降
;沿發送數據,與"74HC595當其SCLK從低到高電平
;跳變時,串行輸入數據(DI)移入寄存器"的特點相對應
MOVLW 0X01
MOVWF JIANR ;顯示值寄存器(復用為鍵值寄存器)賦初值
CLRF FLAG ;清除標志寄存器
RETURN ;返回
;**************顯示子程序*****************
DISPLAY
CLRF PORTA
MOVWF SSPBUF
AGAIN
BTFSS PIR1,SSPIF
GOTO AGAIN
NOP
BCF PIR1,SSPIF
BSF PORTA,5 ;詳細的程序語句請參考http://www.zg4o1577.cn pic單片機教程語句部分,可在首頁搜索。
RETURN
;**************查鍵子程序*****************
KEYSCAN
BCF PORTB,1
BCF PORTA,3
BCF PORTE,0
BCF PORTE,1 ;K1,K2,K3,K4四條列線置0
NOP
NOP ;延時,使引腳的電平穩定
BTFSC PORTB,4
BCF FLAG,F0 ;RB4為1,表示沒鍵按下,清除標志F0
NOP
BTFSS PORTB,4
BSF FLAG,F0 ;RB4為0,表示有鍵按下,建立標志F0
RETURN
;**********鍵盤去抖子程序(約8ms的延時)** ***************
KEYDELAY
MOVLW 0X0A
MOVWF DEYH
AGAIN2 MOVLW 0XFF
MOVWF DEYL
AGAIN1 DECFSZ DEYL,1
GOTO AGAIN1
DECFSZ DEYH,1
GOTO AGAIN2
RETURN
;***************鍵服務子程序****************
;確定鍵值的子程序
KEYSERVE
JIANZHI BCF PORTB,1
BCF PORTA,3
MOVLW 0X03
MOVWF PORTE ;K1,K2置低電平,K3,K4置高電平
NOP
NOP ;使引腳電平穩定
BTFSS PORTB,4
GOTO K1K2 ;RB4為0,表示按鍵為K1,K2中的一個
GOTO K3K4 ;RB4為1,表示按鍵為K3,K4中的一個
K1K2 BCF PORTB,1
BSF PORTA,3 ;K1置低電平,K2置高電平
NOP
NOP ;使引腳電平穩定
BTFSS PORTB,4
GOTO K1 ;RB4為0,表示按鍵為K1
GOTO K2 ;RB4為1,表示按鍵為K2
K3K4 BCF PORTE,0
BSF PORTE,1 ;K3置低電平,K4置高電平
NOP
NOP ;使引腳電平穩定
BTFSS PORTB,4
GOTO K3 ;RB4為0,表示按鍵為K3
GOTO K4 ;RB4為1,表示按鍵為K4
K1 MOVLW 0X03
MOVWF JIANR
GOTO JIANW
K2 MOVLW 0X05
MOVWF JIANR
BCF PORTA,3
GOTO JIANW
K3 MOVLW 0X07
MOVWF JIANR
GOTO JIANW
K4 MOVLW 0X09
MOVWF JIANR ;以上根據按下的鍵把相應的值送給JIANR
BCF PORTE,1
JIANW BTFSS PORTB,4
GOTO JIANW ;為了防止一次按鍵多次識別,等鍵松開才返回
RETURN
;****************************************
MAIN NOP
CALL INITIAL ;調用初始化子程序
LOOP
CALL KEYSCAN ;查鍵
BTFSC FLAG,F0
CALL KEYDELAY ;若檢測到有鍵按下,則調用軟件延時子程序去抖動
BTFSC FLAG,F0
CALL KEYSCAN ;若第一次掃描到有鍵按下,則經過前面的延時去抖后
;再次進行鍵掃描
BTFSC FLAG,F0
CALL KEYSERVE ;若確認有鍵按下,則需要調用鍵服務程序
BTFSS FLAG,F0
GOTO LOOP ;如果無鍵按下,則反復進行鍵掃描
MOVF JIANR,W
CALL CONVERT ;把按鍵對應的數字轉換成待顯示的段碼
CALL DISPLAY ;調用顯示子程序
GOTO LOOP
END