AVR单片机扫描4X4矩阵键盘并数码管显示程序

发布者:Meshulun最新更新时间:2015-05-12 来源: 51hei关键字:AVR单片机  4X4  矩阵键盘  数码管显示 手机看文章 扫描二维码
随时随地手机看文章
/*

          program name :   keyboard ;
     功能描述 :  扫描16个按键(4X4),并把键值显示在数码管上(两位);
 
     要点 :  在扫描按键时运用了比较复杂的两个for()循环嵌套式
     扫描方案,大大减少了程序量,循环嵌套方案让我纠结了好久,
 键值有0~9,上,下,左,右,确认,清零;
 
  体会:  又一个里程碑,泪奔啊...我似乎成了 代码男神  啊...;
  实验用时:  约等于14小时(每天2小时X7天); 
 
 
 完成时间: 2013-11-19 23:58:22
 
*/
#include
#include

#define uint8  unsigned char      //宏定义8位数据类型;
#define uint16 unsigned int       //宏定义16位数据类型;

 

          //  0 , 1  ,  2  , 3  , 4  , 5  , 6  , 
uint8 ak[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
        //    7  , 8  , 9 , 上  , 下   左 , 右  ;
            0x07,0x7f,0x6f,0x62 ,0x54,0x21,0x0c};
uint8  ge=8,shi=8 ,si=0;

void bit(uint8 h)    //数码管位选使能函数;
{
   PORTB|=0X02;   //数码管位选置1(透明状态);
   if(h==0)
    {
PORTB&=0XFD;   //清零(锁存状态);
}
}


void dat(uint8 u)   //数码管数据使能函数;   
{
   PORTB|=0X01;   
   if(u==0)
   {
     PORTB&=0XFE;
   }
}

void buzz(uint8 k)    //蜂鸣器函数;
{
   if(k==0)
    {
 PORTC&=~(0X80);
}
      else  PORTC|=0X80;

}


void delay(uint8 j)          //1=1000个计数周期;
{
   uint16  h=0;
   while(j--)
    {
for(h=0;h<1000;h++);
}
}


void mega16()       //初始化各个IO口;
{

  DDRA=0XFF;    //PA输出;
  DDRB=0XFF;    //PB输出;
  PORTA=0X00;   //PA 输出全0;
  delay(1);     //延时一下,1000个计数周期;
  bit(0);          //数码管共阴极全零;
  PORTA=0X3F;    //数码管数据口装载数据显示0;
  PORTB=1<<2;    //打开led流水灯灯;
  dat(0);        //锁存数码管数据口数据,八个数码管显示0;

  delay(30);    //延时一下;   
  DDRD=0X0F;   //PD口高四位输入,第四位输出;
  PORTD=0XFF;  //PD输入口内部上拉,输出口输出全1;
  DDRC=0XFF;   //PC口全部输出模式;
  PORTC=0X00;   //PC口输出全零;
}

void led()
{
   static uint8 g=0;
   
PORTA=0Xff;  //向数码管输入显示数据时,必先将共阴极全部置一,
         //否则数码管会出现阴影;
bit(0);     //八个数码管共阴极置一(低电平有效);
   switch(g)
{  case 0:  PORTA=ak[ge] ;dat(0);PORTA=0XFE;break;//数码管个位;
  case 1:  PORTA=ak[shi];dat(0);PORTA=0XFD;break; //数码管十位;
  default: break;   //否则...
}
      bit(0);
       g++;
            if(g==2)
{
  g=0;
}
}

[page]

shu(uint8 c)
{
          if(c<=2) {c++;}  //1~3;
else if(c==3) {ge=10;shi=10; return 0;}   //上;
     else if(c==11){ge=c ; shi=c; return 0;}   //下;
else if(c==7) {ge=12,shi=12; return 0;}   //左;
else if(c==15) {ge=13,shi=13; return 0;}   //右;
else if(c==13){return 0;}      //enter 确认;  ;
else if(c==14){ge=0; shi=0;  return 0;}  //清零;
else if((c>=8)&&(c<=10)){c-=1;}  //7~9;
else if(c==12){ge=0;return 0;}
else { ;}    //4~6;
 
 ge=c; shi=0;       
    
 
    
 

}


 key()
{    
    uint8  i=0 ,y=0,temp=0x10 ,v=0,ke=0 ,en[]={0xfe,0xfd,0xfb,0xf7};
//  temp用于检测每一行某个键是否按下; en数组是四列检测;             
    
for(v=0;v<4;v++)     //v每加一代表检测一列;
{  
 PORTD=en[v];     //检测四列;
 temp=0x10;        
for(y=0;y<4;y++)    //y每加一,代表检测一列中的一个按键;
{
if((PIND&temp)==0)    //如果有键被按下,进入;
 {  
    for(i=0;i<250;i++){led();}   //去抖延时并且扫描数码管;
if((PIND&temp)==0)        //再次确认有键被按下;
{
   buzz(1);      //蜂鸣器开;
for(i=0;i<200;i++){led();}   //鸣响延时;
for(i=0;i<200;i++){led();}   //鸣响延时;
buzz(0);      //蜂鸣器关;             
   
//===============生成键值部分================
if(v==1)y+=3;       //检测到第二行;        //
else if(v==2)y+=6;  //检测到第三行;        //
else if(v==3)y+=9;  //检测到第四行;        //
 else {;}          //检测到第一行;        //
ke=v+y;    //生成键值;                     //
//===========================================
shu(ke);    // 发送键值;
    while((PIND&temp)==0)led();   //等待按键弹起;
  for(i=0;i<250;i++){led();}    //等待一下;
   while((PIND&temp)==0)led();   //再次确认一下按键是否弹起;
  
  
  return 0;    //结束函数;
}
                               
    
 }  
 
  temp=temp<<1;  //左移一下代表检测下一个按键;
 
 }
        
           
     }
   
}


void main(void)
{
 

     mega16();  //初始化各个IO口;
buzz(1);   //蜂鸣器开;
delay(15); //延时1.5万计数周期;
buzz(0);   //蜂鸣器关;
PORTA=0xff;   //载入全1;
bit(0);       //把全1数据锁存在数码管共阴极(数码管灭); 
delay(15);   //延时1.5万计数周期;
 
while(1)
 {
    led();  //扫描数码管;  
key();  //扫描键盘;
          
 
  } 
}
 

关键字:AVR单片机  4X4  矩阵键盘  数码管显示 引用地址:AVR单片机扫描4X4矩阵键盘并数码管显示程序

上一篇:avr单片机8位定时器LED精确1秒闪烁程序
下一篇:AVR单片机外部中断触发的流水灯程序

推荐阅读最新更新时间:2024-03-16 14:01

51单片机之数码管静态显示
在对单片机编程以实现数码管静态显示数字之前,我们先来了解一下数码管的结构以及一些常识,对于数码管,有称八段数码管的,也有称七段数码管的,其实无非就是多在一个小数点h , 如上图所示,我们就拿带小数点的八段数码管来说 ,其实我们没必要说对数码管很陌生,因为数码管无非就是八块发光二极管集成在了一起,另外数码管有共阴极和共阳极数码管之分,说起共阴,共阳,大家可能会有所陌生,这里我们简单介绍一下: 共阴极数码管:将八只发光二极管的负极通过一根总线连接在了一起 , 然后每只二极管的正极被引了出来,通过二极管的单向导通性可知,当对应数码管的二极管段接入高电平时,二极管点亮。(换句话说,也就是说想让哪一只二极管点亮,就给哪只二极管高电平。下
[单片机]
51单片机之<font color='red'>数码管</font>静态<font color='red'>显示</font>
AVR单片机最小系统 基本硬件线路与分析
基本的AVR硬件线路,包括以下几部分: 1。复位线路 2。晶振线路 3。AD转换滤波线路 4。ISP下载接口 5。JTAG仿真接口 6。电源 7。串口电路 下面以本网站推荐的AVR入门芯片 ATmega16L-8AI 分析上述基本线路。(-8AI表示8M频率的TQFP贴片封装,工业级,更详细的型号含义资料,请参考: AVR芯片入门知识 ) 复位线路的设计(下图上面一部分) Mega16已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可(R6)。 为了可靠,再加上一只0.1uF的电容(C13)以消除干扰、
[单片机]
<font color='red'>AVR单片机</font>最小系统 基本硬件线路与分析
单片机AT89C51--6.数码管显示(含动态,静态)
1. 数码管显示原理 a为共阴极,b为共阳极 2. 静态与动态显示 静态显示 每个数码管的选段必须接入一个8位的数据线来保持显示字形码。当输入一次字形码后显示字形可以一直保持,直到输入新的字形码为止。 动态显示 将所有数码管的段选并联在一起,由位选控制,控制那个数码管有效。亮的数码管采用动态扫描方式。轮流向各位数码管送出字形码和对应位选,利用发光管的余晖和人肉眼的残留,使人们感觉数码管都在显示 3. 74HC573锁存器的工作原理 锁存器的作用:把数据输入端与输出端进行隔离或连接 OE端需要接地,才能让输出口Q有高低电平的转换 LE脚高,输出端Q随输入端D的数据变化而变化 LE脚低,输出端Q数据保持不变
[单片机]
单片机AT89C51--6.<font color='red'>数码管</font><font color='red'>显示</font>(含动态,静态)
独立按键和矩阵键盘原理
按键分类与输入原理 按键按照结构原理科分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关灯;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。 在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其他按键都是以开关状态来设置控制功能或输入数据的。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入时与软件结构密切相关的过程。 对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将按键输入,并检查是哪一个按键按下,将该键号送人累加器,然后通过跳转指令转入执行该键
[单片机]
独立按键和<font color='red'>矩阵键盘</font>原理
51单片机实例讲解,数码管显示数字“5555”程序
利用单片机及某些数字电路块的结合,可以实现静态字符的显示。本例是利用74LS164八位移位寄存器(串入、并出)与单片机串行口结合,使数码管静态显示数字“5555”。 (1)数码管显示数字“5555”硬件电路(见图20)。 图20 显示字符“5555”接线原理图 在图20的电路中,74LS164的相关引脚与数码管的a、b、c、d、e、f、g引脚相连接,并且74LS164为串行输入、并行输出,所以L4LS164串行输入的数据与数码管对应字符的关系见表7。 表7 L4LS164串行输入的数据与数码管对应字符的关系表 (2)数码管显示数字“5555”硬件电路元器件(见表8)。 表8 数码管显示数字“5555”硬件电路
[单片机]
51单片机实例讲解,<font color='red'>数码管</font><font color='red'>显示</font>数字“5555”程序
基于AVR单片机的酒驾监测追踪车载系统设计
简介: 文章提出了一种基于AVR单片机的酒后驾车监测追踪车载系统,主控芯片选用Atmel公司的ATmega16L。 文章提出了一种基于AVR单片机的酒后驾车监测追踪车载系统,主控芯片选用Atmel公司的ATmega16L。该系统由主控模块,酒精浓度检测模块,GPS定位模块,GSM无线数据传输模块,和报警显示模块组成。为了杜绝酒驶,各国也都提出了很多方法,在国外有使用如酒精钥匙Alcokey,红外相机监测酒驾等来进行实时监控。国内对于酒驾的检测主要还是使用一些常规方法,即用手持式呼气酒精测试和顶空气相色谱仪血液酒精检验。但是上述两种方法只能由交通监管人员设卡实施,给酒驾检测带来了很大的不便,也不能从根本上杜绝酒后驾驶的违章行为。
[单片机]
基于<font color='red'>AVR单片机</font>的酒驾监测追踪车载系统设计
51单片机-定时器&数码管扫描显示
1.定时器中断实现间隔切换 在第六章第4讲的测试代码中提到过数码管微闪烁问题,这是由于三八译码器的IO端口切换的间隔时间不均匀导致,这部分的问题宋老师已经在《手把手教你学51单片机》文档6.4.2节有详细解释,并在6.5.2节里解决了这个问题。数码管扫描函数我们使用定时器0强制实现间隔1ms切换三八译码器的IO输出,这样保证了每个数码管被点亮的时间都是均匀的。我们在主函数里不停地执行数码管显示函数。这里是测试代码,用定时器1实现add间隔50ms自增1,数码管显示add的值。 #include reg52.h #include function.h //详见第六章第8讲 #include timer.h u32 a
[单片机]
51单片机-定时器&<font color='red'>数码管</font>扫描<font color='red'>显示</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved