;該pic單片機(jī)鍵盤(pán)程序通過(guò)PORTB的"電平變化中斷"進(jìn)行鍵盤(pán)的輸入,使按下K1鍵時(shí)第一個(gè)數(shù)碼管顯示1,按下K2 ;鍵時(shí)第一個(gè)數(shù)碼管上顯示2,按下K3鍵時(shí)第一個(gè)數(shù)碼管上顯示3,按下K4鍵時(shí)第一個(gè)數(shù)碼管上顯示4 ;對(duì)鍵盤(pán)的掃描采用中斷方式
LIST P=18F458 INCLUDE "P18F458.INC"
;所用的寄存器 JIANR EQU 0X20 DEYH EQU JIANR+1 DEYL EQU JIANR+2 ORG 0X00 GOTO MAIN ORG 0X08 GOTO INTSERVE ORG 0X30 ;************以下為碼值轉(zhuǎn)換表************** CONVERT ADDWF PCL,1 RETLW 0XC0 ;0,顯示段碼與具體的硬件連接有關(guān) 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 ;***************初始化子程序*************** INITIAL CLRF INTCON ;禁止總中斷和外圍中斷 BSF INTCON,RBIE ;B口變位中斷允許 BCF INTCON2,7 ;使弱上拉有效 BSF INTCON2,0 ;B口變位中斷高優(yōu)先級(jí) BSF RCON,7 ;使能中斷優(yōu)先級(jí) BCF TRISA,5 ;置RA5為輸出方式,以輸出鎖存信號(hào) BCF TRISB,1 BCF TRISA,3 BCF TRISE,0 BCF TRISE,1 BSF TRISB,4 ;設(shè)置與鍵盤(pán)有關(guān)的各口的輸入輸出方式 BCF TRISC,5 BCF TRISC,3 ;設(shè)置SCK與SDO為輸出方式 MOVLW 0XC0 MOVWF SSPSTAT ;設(shè)置SSPSTAT寄存器 MOVLW 0X30 MOVWF SSPCON1 ;設(shè)置SPI的控制方式,允許SSP方式,并在時(shí)鐘下降 ;沿發(fā)送數(shù)據(jù),與“74HC595當(dāng)其SCLK從低到高電平 ;跳變時(shí),串行輸入數(shù)據(jù)(DI)移入寄存器"的特點(diǎn)相對(duì)應(yīng)。 MOVLW 0X01 MOVWF JIANR ;顯示值寄存器賦初值 BCF PORTB,1 BCF PORTA,3 BCF PORTE,0 BCF PORTE,1 ;K1,K2,K3,K4四條列線(xiàn)置0,為電平變化中斷的 ;產(chǎn)生創(chuàng)造初始條件 MOVF PORTB,W ;讀PORTB端口,建立變位中斷的初始條件 ; (由高到低時(shí)中斷) RETURN ;返回 ;*************中斷服務(wù)子程序***************** INTSERVE NOP BCF INTCON,RBIF ;中斷標(biāo)志清0 CALL KEYDELAY ;調(diào)用8ms的軟件延時(shí)子程序,以消除抖動(dòng) MOVF PORTB,W ;讀PORTB的值,并同時(shí)改變中斷發(fā)生的條件,可屏蔽 ;一次按鍵松開(kāi)時(shí)產(chǎn)生的無(wú)效的中斷,又可以防止按鍵 ;時(shí)間過(guò)長(zhǎng)發(fā)生連續(xù)中斷 BTFSC PORTB,4 RETFIE ;判斷為干擾,則返回,并可以屏蔽一次無(wú)用的中斷 CALL KEYSERVE ;調(diào)用鍵服務(wù)子程序,確定鍵值 BCF PORTB,1 BCF PORTA,3 BCF PORTE,0 BCF PORTE,1 ;送低電平至K1,K2,K3,K4,以防止鍵掃描時(shí)改變 ;K1,K2,K3,K4的電平,從而改變中斷條件 BCF INTCON,RBIF ;鍵掃描時(shí)可能會(huì)產(chǎn)生“電平變化”而使RBIF ;置1,再清除一次RBIF以求避免額外中斷 MOVF JIANR,W ;把需要顯示的值送給W寄存器 CALL CONVERT ;查要顯示的段碼 CALL DISPLAY ;調(diào)用顯示子程序 RETFIE ;中斷返回 ;***************顯示子程序****************** DISPLAY CLRF PORTA MOVWF SSPBUF LOOP NOP BTFSS PIR1,SSPIF GOTO LOOP NOP BCF PIR1,SSPIF BSF PORTA,5 ;詳細(xì)程序語(yǔ)句請(qǐng)參考3. 1. 3節(jié) RETURN ;*********鍵盤(pán)去抖子程序(8ms的延時(shí))****************** KEYDELAY MOVLW 0X0A MOVWF DEYH AGAIN2 MOVLW 0XFF MOVWF DEYL AGAIN1 DECFSZ DEYL,1 GOTO AGAIN1 DECFSZ DEYH,1 GOTO AGAIN2 ;具體程序語(yǔ)句參考3. 2節(jié) RETURN ;***************鍵服務(wù)子程序****************** KEYSERVE JIANZHI ;確定鍵值的子程序 BCF PORTB,1 BCF PORTA,3 MOVLW 0X03 MOVWF PORTE ;K1,K2置低電平,K3,K4置高電平 NOP NOP ;使引腳電平穩(wěn)定 BTFSS PORTB,4 GOTO K1K2 ;RB4為0,表示按鍵為K1,K2中的一個(gè) GOTO K3K4 ;RB4為1,表示按鍵為K3,K4中的一個(gè)
K1K2 BCF PORTB,1 BSF PORTA,3 ;K1置低電平,K2置高電平 NOP NOP ;使引腳電平穩(wěn)定 BTFSS PORTB,4 GOTO K1 ;RB4為0,表示按鍵為K1 GOTO K2 ;RB4為1,表示按鍵為K2
K3K4 BCF PORTE,0 BSF PORTE,1 ;K3置低電平,K4置高電平 NOP NOP ;使引腳電平穩(wěn)定 BTFSS PORTB,4 GOTO K3 ;RB4為0,表示按鍵為K3 GOTO K4 ;RB4為1,表示按鍵為K4,以上對(duì)鍵盤(pán)進(jìn)行掃描, ;來(lái)確定是哪一個(gè)鍵按下 K1 MOVLW 0X03 MOVWF JIANR GOTO RET K2 MOVLW 0X05 MOVWF JIANR BCF PORTA,3 GOTO RET K3 MOVLW 0X07 MOVWF JIANR GOTO RET K4 MOVLW 0X09 MOVWF JIANR ;以上根據(jù)按下的鍵把相應(yīng)的值送給JIANR BCF PORTE,1 RET NOP RETURN ;**************************************** MAIN NOP CALL INITIAL ;調(diào)用初始化子程序 BSF INTCON,GIE ;總中斷允許 HERE GOTO HERE ;等待中斷發(fā)生 END |