上次看了圈圈的按键程序,就自己依葫芦画瓢的把4X4的键盘写成了那种形式。<br />////////////////////////////////////////////<br />//4X4键盘转化成0-15,状态存储在KeyPress中。<br />//按下为0,弹起为1.<br />// 0 1 2 3<br />// 4 5 6 7<br />// 8 9 10 11<br />// 12 13 14 15<br />///////////////////////////////////////////////<br /><br />虽然程序是写出来了,测试了下程序,还行。但是好像太占RAM了。<br /><br /><br />void Key_Init()<br />{<br /> #ifdef MATRIX<br /> KeyOld=0xffff;<br /> KeyLast=0xffff;<br /> #else<br /> KeyOld=0xf0;<br /> KeyLast=0xf0;<br /> #endif<br /><br /> KeyCount=0;<br /> KeyDown=0;<br /> KeyUp=0;<br />}<br /><br />uchar KeyScan4X4()<br />{<br /> uchar sccode,recode,key_temp;<br /> HCODE&=0xf0;<br /> LCODE|=0xf0;<br /> KeyPress=0xffff;<br /> key_temp=0xff;<br /> if((LCODE&0xf0)!=0xf0)<br /> {<br /> sccode=0xfe; //行扫描<br /> while(sccode != 0xef) //将扫描4次,key_temp为每次键值相 或的值 //<br /> {<br /> <br /> HCODE= sccode; <br /> recode=0xff; // 输出行扫描码 //<br /> if ((LCODE&0xf0) != 0xf0) // 本行有键按下 //<br /> {<br /> recode = (LCODE&0xf0)|0x0f; // 只要高位,低位置1 //<br /> key_temp&=(sccode&recode);<br /> <br /> }<br /> KeyPress=(KeyPress>>4)|0xf000;<br /> KeyPress&=(((recode>>4)<<12)|0x0fff); //当前行 >>4得到列值 <<12与KeyPress格式对齐<br /> sccode = (sccode << 1)|0x01; // 扫描码0向高位移动 //<br /> }<br /> }<br /> return key_temp; <br />}<br /> <br />void KeyState0() <br />{ <br /> KeyCurrent=KeyScan(); //获取当前键值<br /> if(KeyCurrent!=KeyOld) //与上一次键值不等,说明发生了改变。<br /> {<br /> KeyOld=KeyCurrent; //保存新键值。<br /> KeyCount=0;<br /> return;<br /> }<br /> else<br /> {<br /> KeyCount++;<br /> if(KeyCount>=KEYCOUNT) //确认为有效按键(包括空键).<br /> {<br /> KeyCount=KEYCOUNT; //停止计数<br /><br /> #ifndef MATRIX<br /> KeyPress=KeyOld; //保存当前按键<br /> #endif <br /><br /> KeyDown|=((~KeyPress)&KeyLast); //按下的键(不会自动清除,若用完后应把相应位清除)<br /> KeyUp|=(KeyPress&(~KeyLast)); //弹起的键(不会自动清除,若用完后应把相应位清除)<br /> KeyLast=KeyPress;<br /> }<br /> } <br />}<br /><br /><br />void main()<br />{<br /> <br /> <br /> SFR_Init();<br /> Key_Init();<br /> while(1)<br /> {<br /> //4X4键盘<br /> if(KeyUp&0x8000) //Key15弹起执行<br /> {<br /> KeyUp&=0x7fff; //清弹起标志<br /> P00=~P00;<br /> } <br /> if(KeyUp&0x0001) //Key0弹起执行<br /> {<br /> KeyUp&=0xfffe;<br /> P01=~P01;<br /> } <br /> if(KeyUp&0x0002) <br /> {<br /> KeyUp&=0xfffd; <br /> P02=~P02;<br /> } <br /> if(KeyUp&0x0004)<br /> {<br /> KeyUp&=0xfffb;<br /> P03=~P03;<br /> } <br /> <br /> //////////////////////////////////<br /> if(KeyUp&0x1000 )<br /> {<br /> KeyDown&=0xefff;<br /> KeyUp&=0xefff; <br /> } <br /> if(KeyUp&0x2000)<br /> {<br /> KeyDown&=0xdfff;<br /> KeyUp&=0xdfff;<br /> }<br /><br /> if(KeyDown&0x1000) //Key12与Key13按下时,执行。<br /> {<br /> if(KeyDown&0x2000)<br /> {<br /> P0=~P0;<br /> KeyDown&=0xdfff;<br /> }<br /> } <br />/////////////////////////////////////// <br /> }<br />}<br /><br />void timer1() interrupt 3 //按键扫描<br />{<br /> TH1= (-10000)/256;<br /> TL1= (-10000)%256;<br /> KeyState0();<br />} |
|