单片机
返回首页

avr 矩阵键盘扫描,一种比较简单的方法

2016-08-21 来源:eefocus

  avr 矩阵键盘扫描,一种比较简单的方法。 - liuyunqian@yeah - 嵌入式学习

 

#include
#include
#define uchar unsigned char
#define uint unsigned int
#pragma data:code   //随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。
const table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c ,
       0x39,0x5e,0x79,0x71,0};
#pragma data:data//随后的数据将存贮在数据区,即RAM区,此区可存贮常量和变量。         
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_scan()
{
    
uchar i,j,m,n;
uchar key=0;
uchar t[4]={0x7f,0xbf,0xdf,0xef};

for(i=0;i<4;i++)
{
   DDRD=0XF0;
   j=t[i];
  
   PORTD=j;
  
   if((PIND&0X01)==0)
   {
    delay(5);
    if((PIND&0X01)==0)
    {
     while((PIND&0X01)==0);
     return key;
     break;
    }
   }
   key++;
  
   if((PIND&0X02)==0)
   {
    delay(5);
    if((PIND&0X02)==0)
    {
     while((PIND&0X02)==0);
     return key;
     break;
    }
   }
   key++;
   if((PIND&0X04)==0)
   {
    delay(5);
    if((PIND&0X04)==0)
    {
     while((PIND&0X04)==0);
     return key;
     break;
    }
   }
   key++;
   if((PIND&0X08)==0)
   {
    delay(5);
    if((PIND&0X08)==0)
    {
     while((PIND&0X08)==0);
     return key;
     break;
    }
   }
   key++;
}
return 0xff;//如果没有健按下返回0xff

}

void main()
{
   uchar s=0;
   show_init();
while(1)
{
   s=key_scan();
   if(s!=0xff)//如果有健按下,,显示
    show(0,s);
  
}
   
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 用数字电路CD4069制作的万能遥控轻触开关

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

    相关电子头条文章