征集:键盘扫描源程序大全

来源:互联网 发布:网络盒子应用破解版 编辑:程序博客网 时间:2024/05/20 09:46
在codevisionAVR编译器下的代码为:
/****************************************************************************************/
#include
#include
#define uchar unsigned char
uchar dat;//这是扫描返回值变量
const uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,
                     0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //用来显示的断码
/*************************************************************************************/

 
该部分函数主要功能是检测是否有键按下:
uchar keyprass()
{
    PORTD = 0XFF;
    DDRD = 0XFF;
    
    PORTD = 0XF0;
    DDRD = 0X0F;
    if(PIND != 0XF0)
        return 1;
    else
        return 0;
}
/****************************************************/
该部分是键盘扫描:
uchar keyscan()
{
    uchar i = 0X7F,key;
    if(keyprass())
    {
        do
        {
            PORTD = 0XFF;
            DDRD = 0XFF;
            
            i = (i<<1)|(i>>7);//这个你们要仔细想想了,很有意思
            PORTD = i;
            DDRD = 0X0F;
            key = PIND & 0xF0;
        switch(PIND)
        {
            case 0xEE : dat = 0;break;
            case 0xDE : dat = 1;break;
            case 0xBE : dat = 2;break;
            case 0x7E : dat = 3;break;
            
            case 0xED : dat = 4;break;
            case 0xDD : dat = 5;break;
            case 0xBD : dat = 6;break;
            case 0x7D : dat = 7;break;
            
            case 0xEB : dat = 8;break;
            case 0xDB : dat = 9;break;
            case 0xBB : dat = 10;break;
            case 0x7B : dat = 11;break;
            
            case 0xE7 : dat = 12;break;
            case 0xD7 : dat = 13;break;
            case 0xB7 : dat = 14;break;
            case 0x77 : dat = 15;break;
        
        }
        }while(key == 0XF0);
       
    }
    return dat;
}
////////////////////////////////////////////////////////////////////
同过主函数来检测函数是否正确:
void main(void)
{
    PORTB = 0xff;
    DDRB = 0xff;
while (1)
      {
            if(keyprass())//这里没做消抖处理,请大家自行添加
                keyscan();
            PORTB = table[dat];
      };
}