/********************************************************** 4*3矩陣按鍵讀寫函數(shù)*********************************************************///按鍵讀寫程序//行1 P65//行2 P62//行3 P51//行4 P67 P5:1 P6:257//列1 P63//列2 P64//列3 P66//按鍵解碼//行4:0,1,2;行1:3,4,5;行3:6,7,8;行2:9,10,11;//*0# 123 789 456 const uchar key_rel[]={0x0a,0x00,0x0b,0x01,0x02,0x03,0x07,0x08,0x09,0x04,0x05,0x06}; void scan_key(void){uchar i;keybuf=0xff;get_bit=0;/*方法一:行輸出,列輸入,影響AT24C02,led閃爍//睡眠喚醒,欠壓檢測,聲光指示的端口方向不需改動(dòng)//行輸出0//P5CR=0x0d;//0000 1101初始化P5全為輸出口P5CR=0xf0;P6CR=0x5b;//0101 1011//列輸入1P6CR|=0x58;//0101 1000///方法二:列輸出,行輸入,列1串10K,輸出不了低電平可能識別不了//不會影響AT24C02,led指示,其它操作需要從新定義端口方向//列輸出0P6CR=0xa7;//1010 0111//行輸入1P5CR|=0x02;//0000 0010P6CR|=0xa4;//1010 1000*//*方法三:先使用方法二掃描列,最后列1單獨(dú)讀寫//列1讀寫實(shí)驗(yàn)P5CR=0xf0;P6CR=0x5b;//0101 1011//列輸入1P6CR|=0x58;//0101 1000/KH1=0;KH2=0;KH3=0;KH4=0;if(KL1==0)keybuf=0x01;//列1有按鍵按下while(KL1==0);//列23,讀寫*///按鍵讀寫程序終結(jié)版,低電平掃行2,行全拉低//行輸出0P6CR=0x5b;//0101 1011//列輸入1P6CR|=0x58;//0101 1000/for(i=0;i4;i++){switch(i){//無AT24C02操作盡量不開啟KH4給AT24C02供電case 0:KH1=1;KH2=1;KH3=1;KH4=0;break;//掃描行四case 1:KH1=0;KH2=1;KH3=1;KH4=0;break;//掃描行一case 2:KH1=1;KH2=1;KH3=0;KH4=0;break;//掃描行三//最后掃描紅綠LED公共端,全部拉低,全掃描無LED點(diǎn)亮case 3:KH1=0;KH2=0;KH3=0;KH4=0;break;//掃描行二}delay(200);if(KL1==0){keybuf=0x00;get_bit=1;break;}if(KL2==0){keybuf=0x01;get_bit=1;break;}if(KL3==0){keybuf=0x02;get_bit=1;break;}}if(get_bit==1)//獲取按鍵值{get_bit=0;//延時(shí)去除抖動(dòng)//delay(250);////掃描狀態(tài)已經(jīng)保存switch(keybuf){case 0x00:if(KL1==0)get_bit=1;;break;case 0x01:if(KL2==0)get_bit=1;;break;case 0x02:if(KL3==0)get_bit=1;;break;default:keybuf=0xff;}if(get_bit==1){keybuf=i+i+i+keybuf;//解碼按鍵i=key_rel[keybuf];//解碼按鍵keybuf=i;//獲取按鍵值//按鍵聲光指示buzzer();//等待按鍵彈起KH1=0;KH2=0;KH3=0;KH4=0;delay(80);while((KL1KL2KL3)==0);}else keybuf=0xff;}else keybuf=0xff;//無效按鍵//行2讀寫無效分析//TCC引腳下CONT指令0x0*}/********************************************************** END key_scan*********************************************************/
評論