×
单片机 > 单片机程序设计 > 详情

AVR矩阵键盘程序

发布时间:2020-05-28 发布时间:
|
搞了一顿竟然连矩阵键盘的程序都不会写

do
    {
     i=(i<<1|i>>7);
     PORTD=i;
     DDRD=0X0F;//
     key=PIND;//不论如何配置DDxn,都可以通过读取PINxn 寄存器来获得引脚电平
     j=key&0xf0;
    
    }while(j==0xf0);//直到发现按键按下。若没有找到按键按下 的,继续循环

i的初值0x7f。i=(i<<1|i>>7);之后。i=1111 1110b

                                     第二次,i=    1111 1101b

                                      保证只有一位为0


 

下面是程序,写得很巧妙

#include
#include
#define uchar unsigned char
#define uint unsigned int
#pragma data:code   //save to areas of program
const table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c ,
       0x39,0x5e,0x79,0x71,0};
           
void delay(uint ms)
{
   uint i,j;
for(i=0;i for(j=0;j<1141;j++);
}
void show_init()
{
    DDRA|=BIT(3);
   DDRB=0XFF;
   DDRA|=BIT(4);
}
void show(uchar aa,uchar bb)//第aa个数码管显示bb
{
    
    //PORTB=0XFF;
    PORTA|=BIT(4);
    PORTB=~BIT(aa);
    PORTA&=~BIT(4);
    
     PORTA|=BIT(3);
    PORTB=table[bb];
    PORTA&=~BIT(3);

    
    delay(10);
}
uchar key_press()
{
   uchar i;
DDRD=0XFF;
PORTD=0XF0;

DDRD=0X0F;
i=PIND;
if(i==0xf0)
{
   DDRD=0XFF;
   return 0;
  
}
else
{
   DDRD=0XFF;
   return 1;
}
}
uchar key_scan()
{
    uchar key,i=0x7f,j,code;
   delay(10);
   if(key_press())
   {
      do
    {
     i=(i<<1|i>>7);
     PORTD=i;
     DDRD=0X0F;
     key=PIND;
     j=key&0xf0;
    
    }while(j==0xf0);
   
    while(key_press());
   
    switch(key)
    {
    case 0x7e: code=0;break;
     case 0xbe: code=1;break;
     case 0xde: code=2;break;
     case 0xee: code=3;break;
    
     case 0x7d: code=4;break;
     case 0xbd: code=5;break;
     case 0xdd: code=6;break;
     case 0xed: code=7;break;
    
     case 0x7b: code=8;break;
     case 0xbb: code=9;break;
     case 0xdb: code=10;break;
     case 0xeb: code=11;break;
    
     case 0x77: code=12;break;
     case 0xb7: code=13;break;
     case 0xd7: code=14;break;
     case 0xe7: code=15;break;
    
    }
   }
   
return code;
}

void main()
{
   uchar s;
   show_init();
while(1)
{
   if(key_press())
   {
   s=key_scan();
    show(0,s);
   }
}
   
}

 


关键字:AVR  矩阵键盘 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
8051单片机的函数发生器的设计