AVR键盘扫描

/**********************/
时间:2014年5月19日

作者:fengjianxin

8MHz晶振

/**********************/
#include<avr/io.h>//AVR通用头文件
#include<util/delay.h>//延时函数
typedef unsigned char uchar;
typedef unsigned int  uint;


#define LED_H()  DDRC //数码管段选控制口
#define LEDP_H() PORTC//数码管数据口
#define JianPan()DDRB //键盘扫描控制口
#define Jian_H() PORTB//键盘开始状态口
#define Jian_I() PINB //键盘扫描检测口


uchar Duanxuan[]={
                   0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71  
                  };//数据 注意共阴 共阳 数码管的值"相反" 




void Init()//初始化
{
    LED_H()  = 0xff;
    JianPan()= 0xf0;//高4位输出低4位输入
    Jian_H() = 0x0f;//打开低4位端口的高阻态这里高4位是输出故高阻态没用 
    LEDP_H() = 0x00;//关闭数码管
}
int main()
{
    Init();
    while(1)
    {   
        uchar Temp = 0;  //定义中间传递变量  这是很好的方法
        Jian_H() = 0xef; //预先处理键盘端口的输出状态
        _delay_ms(1);
        Temp = Jian_I(); //随时检测键盘端口的状态变化   
        while(Temp != 0xef)//若有变化进入   第一行端口检测
        { 
          _delay_ms(1);//延时消抖
          if(Temp == 0xee)//检测变化的值是多少
          {
            _delay_ms(1);
            LEDP_H() = ~Duanxuan[0];//这里是共阴数据 我在这里取反
            _delay_ms(1);
          }
          if(Temp == 0xed)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[1];
          _delay_ms(1);
          }
          if(Temp == 0xeb)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[2];
          _delay_ms(5);
          }
          if(Temp == 0xe7)
          {
  _delay_ms(1);
          LEDP_H() = ~Duanxuan[3];
          _delay_ms(1);
          }
          Temp = Jian_I();//循环内部检测键盘端口的值 以便跳出循环进入下一行端口检测
        } 


Jian_H() = 0xdf;
        _delay_ms(1);
        Temp = Jian_I();    
        while(Temp != 0xdf)//第二行端口检测
        { 
          _delay_ms(1);
          if(Temp == 0xde)
          {
            _delay_ms(1);
            LEDP_H() = ~Duanxuan[4];
            _delay_ms(1);
          }
          if(Temp == 0xdd)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[5];
          _delay_ms(1);
          }
          if(Temp == 0xdb)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[6];
          _delay_ms(1);
          }
          if(Temp == 0xd7)
          {
  _delay_ms(1);
          LEDP_H() = ~Duanxuan[7];
          _delay_ms(1);
          }
          Temp = Jian_I(); 
        } 


Jian_H() = 0xbf;
        _delay_ms(1);
        Temp = Jian_I();    
        while(Temp != 0xbf)//第三行端口检测
        { 
          _delay_ms(1);
          if(Temp == 0xbe)
          {
            _delay_ms(1);
            LEDP_H() = ~Duanxuan[8];
            _delay_ms(1);
          }
          if(Temp == 0xbd)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[9];
          _delay_ms(1);
          }
          if(Temp == 0xbb)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[10];
          _delay_ms(1);
          }
          if(Temp == 0xb7)
          {
  _delay_ms(1);
          LEDP_H() = ~Duanxuan[11];
          _delay_ms(1);
          }
          Temp = Jian_I(); 
        } 
        

Jian_H() = 0x7f;
        _delay_ms(1);
        Temp = Jian_I();    
        while(Temp != 0x7f)//第四行端口检测
        { 
          _delay_ms(1);
          if(Temp == 0x7e)
          {
            _delay_ms(1);
            LEDP_H() = ~Duanxuan[12];
            _delay_ms(1);
          }
          if(Temp == 0x7d)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[13];
          _delay_ms(1);
          }
          if(Temp == 0x7b)
          {
   _delay_ms(1);
          LEDP_H() = ~Duanxuan[14];
          _delay_ms(1);
          }
          if(Temp == 0x77)
          {
  _delay_ms(1);
          LEDP_H() = ~Duanxuan[15];
          _delay_ms(1);
          }
          Temp = Jian_I(); 
        }  
    }
}
/**********/
总结一下键盘检测的思路
相信  可以的
/***********/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值