1、PIC单片机按键检测单双击长短按识别硬件PIC16F883芯片,10个按键,4位数码管。【芯片引脚】【数码管连接】PORTC连接数码管的8段LED,PORTA连接数码管的4个共阴极(控制选通位)。【按键连接】按键扫描程序在上一篇博文里面有说明,现在还是使用上面的扫面方式(代码都是一样的)。用记录按键按下和弹起的时间判断是不是长按和双击。TMR1设置,1:4分频、1:8预分频,计数周期为8uS。TMR1溢出一次时间为0.524288 S keypress记录TMR1溢出的次数。keypress大于等于2就跳出检测,认为他是长按(时间为1.048576S)。keypress1 且keyreleas
2、e 1 ,再次按下的keypress1就认为是双击。如下图:KP按键按下,KR按键弹起。【实现代码】1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191
3、201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192
4、202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193
5、203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194
6、204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195
7、205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196
8、206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197
9、207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198
10、208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199
11、20921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992#include_CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF &
12、 _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT_CONFIG _CONFIG2, _WRT_OFF & _BOR21Vudata_shrcounter res 1 ;计数个位counter0 res 1 ;计数十位counter1 res 1 ;扫描按键变量counter2 res 1 ;延时程序微调参数key_state res 1 ;按键状态keynum res 1 ;按键标号swap res 1 ;确认按键转换值keypress res 1keypressbak res 1keyrelease res 1
13、LED1 res 1LED2 res 1LED3 res 1LED4 res 1UDATAcounter3 res 1counter4 res 1sign res 1reset code 0x0000pagesel startgoto start;int_vector code 0x0004codestartbanksel ANSEL ;设置PORTA为数字模式clrf ANSELbanksel ANSELH ;设置PORTB为数字模式clrf ANSELHbanksel TRISB ;设置PORTB为输入模式movlw b11111111movwf TRISBbanksel WPUB ;设置
14、PORTB弱上拉movlw b11111111movwf WPUBbanksel OPTION_REGmovlw b01000101 ;TMR0 64分频movwf OPTION_REGbanksel T1CONmovlw b10010001 ;打开TMR1,设置1:8预分频,内部时钟源1:4分频movwf T1CONbanksel TRISA ;设置PORTA为输出,接数码管的共阴极movlw b11110000movwf TRISAbanksel PORTAclrf PORTAbanksel TRISCmovlw b00000000 ;设置PORTC为输出,接8段数码管movwf TRIS
15、Cclrf counter1loopmovlw HIGH Table1movwf PCLATHmovf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0movwf key_statemovlw b11001000iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case1incf co
16、unter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O状态movwf key_statemovlw b11001000iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case2incf counter1,1movf counter1,0call Ta
17、ble1banksel TRISBmovwf TRISBmovf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O状态movwf key_statemovlw b11001000iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case3incf counter1,1movf counter1,0call Table1banksel TRISBmovwf TRISBmo
18、vf counter1,0call Table1banksel PORTBmovwf PORTBmovf PORTB,0 ;读取I/O状态movwf key_statemovlw b11001000iorwf key_state,1movf counter1,0call Table1xorwf key_state,0movwf swapcomf swap,1incfsz swap,1goto case4goto continuecase1btfsc key_state,4goto key2movlw d1movwf keynumcall DealKeyPressgoto continuekey
19、2btfsc key_state,2goto key3movlw d2movwf keynumcall DealKeyPressgoto continuekey3btfsc key_state,1goto key4movlw d3movwf keynumcall DealKeyPressgoto continuekey4btfsc key_state,0goto continuemovlw d4movwf keynumcall DealKeyPressgoto continuecase2;-;下面代码实现K10K8K5的按键处理btfsc key_state,2goto key8movlw d
20、10movwf keynumcall DealKeyPressgoto continue;-;处理K8key8btfsc key_state,1goto key5movlw d8movwf keynumcall DealKeyPressgoto continue;-;处理K5key5btfsc key_state,0goto case3movlw d5movwf keynumcall DealKeyPressgoto continuecase3;-;处理K6/K9btfsc key_state,1goto key6movlw d9movwf keynumcall DealKeyPressgot
21、o continuekey6btfsc key_state,0goto case4movlw d6movwf keynumcall DealKeyPressgoto continuecase4;-;处理K7btfsc key_state,0goto continuemovlw d7movwf keynumcall DealKeyPresscontinuecall displayclrf counter1goto loop;-;按键去抖,约8mSdelaymovlw d4movwf counter2LOOP2banksel TMR0clrf TMR0LOOP1banksel INTCONbtfss INTCON,T0IFgoto LOOP1bcf INTCON,T0IFdecfsz counter2,1goto LOOP2return
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2