反转法键盘扫描 ATmega128

发布者:山宝宝最新更新时间:2016-01-15 来源: eefocus关键字:反转法  键盘扫描  ATmega128 手机看文章 扫描二维码
随时随地手机看文章
#include

#include
#define  F_CPU 7372800  
#include
#include
#include

//***********************************************************************
//   定义变量区
//***********************************************************************

#define delay_us(x)     _delay_us(x)         //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)         //AVR GCC延时函数 x(ms)

#define uchar           unsigned char
#define uint            unsigned int

#define key_io          PORTC               //独立键盘与PC4和PC5连接
#define key_ior         PINC                //读取IO口值为PINC的值
uchar key;

#define Data_IO         PORTA                //数码管数据口
#define Data_DDR        DDRA                 //数码管数据口方向寄存器
#define D_LE0         PORTD &= ~(1 << PD4) //数码管段控制位为0,锁存端口数据
#define D_LE1           PORTD |= (1 << PD4)  //数码管段控制位为1,锁存器输出与端口一致
#define W_LE0         PORTD &= ~(1 << PD5) //数码管位控制位为0
#define W_LE1           PORTD |= (1 << PD5)  //数码管位控制位为1


//***********************************************************************
//   共阴数码管显示的断码表0~F
//***********************************************************************

uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar num[4][4]={{1,2,3,4},
               {5,6,7,8},
               {9,0,10,11},
               {12,13,14,15}};
//***********************************************************************
//   IO端口初始化
//***********************************************************************

void system_init()
{
    Data_IO=0xFF;             //数据口为输出
    Data_DDR=0xFF;

    PORTD=0xFF;               //74HC573的控制口,设置为输出
    DDRD=0xFF;
}

//*************************************************************************
//   74HC573控制数码管动态扫描显示函数
//*************************************************************************

void Display_Key(uchar num)
{
  uchar i,j;
  system_init();
   j=0x01;                    //此数据用来控制位选
  for(i=0;i<8;i++)
  {
    D_LE1;                    //控制数码管段数据的74HC573的LE管脚置高
    W_LE1;                    //控制数码管位的74HC573的LE管脚置高
    Data_IO=0x00;             //设置要显示的位,也就是哪一个数码管亮,这里是八个一起显示
    W_LE0;                    //锁存位数据,下面送上段数据以后,就显示出来了
 j=(j<<1);
    Data_IO=table[num];       //送要显示的数据,就是段数据,如显示0送的是0x3f
    D_LE0;                    //锁存段数据,数码管亮一个时间片刻
    delay_ms(1);              //显示一个时间片刻,会影响亮度和闪烁性

  }

}

//**********************************************************************
// 键盘扫描子程序,采用反转的方式
//**********************************************************************
uchar keyboardscan(void)
{
  uchar statevalue,key_checkin,key_check;
  uchar i,j;
  i=j=0;
  key_io=0xf0;                    //在IO口由输出方式变为输入方式时要延迟一个周期
  key_io=0xf0;                    //采取写两次的方法延时
  key_checkin=key_ior;            //读取IO口状态,判断是否有键按下
  if(key_checkin!=0xf0)           //IO口值发生变化则表示有键按下
  {
    delay_ms(20);                 //键盘消抖,延时20MS
    key_checkin=key_ior;
    if(key_checkin!=0xf0)
    {
     key_check=key_ior;
     switch (key_check)           //根据读到的IO口值判断按键的按下情况
     {
     case 0x70:i=0;break;
     case 0xb0:i=1;break;
     case 0xd0:i=2;break;
     case 0xe0:i=3;break;
  default: break;
     }
 
     //反转
     DDRC=0xf0;
     PORTC=0x0f;
     key_io=0x0f;
     key_io=0x0f;
     key_checkin=key_ior;
     
     if(key_checkin!=0x0f)
     {
       key_check=key_ior;
       switch (key_check)           //根据读到的IO口值判断按键的按下情况
       {
       case 0x07:j=0;break;
       case 0x0b:j=1;break;
       case 0x0d:j=2;break;
       case 0x0e:j=3;break;
    default: break;
       }
      key=num[i][j];
  }
  //复位
      DDRC=0x0f;                        //PC口上拉电阻使能
      PORTC=0xf0;                       //PC高四位输入低四位输出
    }
 
  }
  else
  {
  statevalue=0xff;                      //无按键时返回值
  key=statevalue;
  return(key);
  }
  return key;
}

//*************************************************************************
//   主程序
//*************************************************************************

void main()

     
 
   uint key_store=0x01;
   DDRC=0x0f;                        //PC口上拉电阻使能
      PORTC=0xf0;                       //PC高四位输入低四位输出

     
while(1)
  {

  keyboardscan();                       //键盘扫描,看是否有按键按下
    if(key!=0xff)                  //如果有按键按下,则显示该按键键值0~15
      {
       { switch(key)
    
       case 1:  Display_Key(0x01);key_store=0x01;break;   //根据键值显示到数码管上
       case 2:  Display_Key(0x02);key_store=0x02;break;
       case 3:  Display_Key(0x03);key_store=0x03;break;
       case 4:  Display_Key(0x04);key_store=0x04;break;
       case 5:  Display_Key(0x05);key_store=0x05;break;
       case 6:  Display_Key(0x06);key_store=0x06;break;
       case 7:  Display_Key(0x07);key_store=0x07;break;
       case 8:  Display_Key(0x08);key_store=0x08;break;
       case 9:  Display_Key(0x09);key_store=0x09;break;
       case 0:  Display_Key(0x00);key_store=0x00;break;
       case 10: Display_Key(0x0a);key_store=0x0a;break;
       case 11: Display_Key(0x0b);key_store=0x0b;break;
       case 12: Display_Key(0x0c);key_store=0x0c;break;
       case 13: Display_Key(0x0d);key_store=0x0d;break;
          case 14: Display_Key(0x0e);key_store=0x0e;break;
             case 15: Display_Key(0x0f);key_store=0x0f;break;
           }

          }
 
       }
  else
  {
  Display_Key(key_store);              //没有按键的时候显示上次的键值
  }

  }

}

关键字:反转法  键盘扫描  ATmega128 引用地址:反转法键盘扫描 ATmega128

上一篇:AVR单片机研究(6):单片机系统开发的典型流程
下一篇:JTAGICE mkII 或是 AVR单片机 的问题

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

AVR单片机Atmega128外扩RAM
由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器)、I/O寄存器、扩展I/O寄存器和内部SRAM的连续内部存储空间。所以在扩展外部RAM时,和内部SRAM地址重叠的外部RAM地址是不能直接访问的。也就是说扩展的外部RAM每64k要浪费掉内部SRAM那么大的空间(AT90系列如此)。所幸的是mega系列解决了这一缺点,专门有一个寄存器XMCRB用来解决对与内部SRAM地址空间相同地址的外部RAM访问。其低三位XMM2 、XMM1 、XMM0三位的设置,决定高位地址线PC口的哪些口线被释放为普通I/O,而不是作为高位地址。这
[单片机]
AVR单片机<font color='red'>Atmega128</font>外扩RAM
ATmega128实现工业设备的主控制板
使用ATmega128实现一个工业设备的主控制板,它与由ATmega8管理的按键和 LED 显示构成的控制面板距离在2米左右,两者之间采用 USART通信联系。考虑到在实际应用中,俩者之间交换的数据很少,通信速度也不需要很高,重要的是保证通信的可靠和抗干扰,因此在硬件设计上采用电流环的连接方式,见图5.4。 在图中通信双方采用光隔和三极管,将USART的电平变化变成电流变化后传送连接,如同工业上使用的20mA电流环通信一样,大大提高了通信的抗干扰能力。 通信协议和规程的制定: l.通信速率采用2400bps(速率太高时电流环的变化会跟不上)。 2. 用户数据包采用定长格式,每个数据包长度为6个字节,其中第1个字
[单片机]
ATmega128 time1溢出中断。定时器1在该模式下用法和51的一样
#include iom128v.h #define uchar unsigned char #define uint unsigned int #pragma interrupt_handler timer1:15/*定时器溢出中断向量标号*/ uchar t=0; void timer1() { TCNT1H=(65536-50000)/256; TCNT1L=(65536-50000)%256; t++; if(t==20) { t=0; PORTA=~PORTA; PORTA|=0xfe; } } void IO_init() { DDRA=
[单片机]
ATmega128 ALU
ATmega128 ALU 与32 个通用工作寄存器直接相连。寄存器与寄存器之间、寄存器与立即数之间 的ALU 运算只需要一个时钟周期。ALU 操作分为3 类:算术、逻辑和位操作。此外还提 供了支持无/ 有符号数和分数乘法的乘法器。具体请参见指令集。
[单片机]
基于单片机和μC/OS-II的在线钠离子分析仪的设计
   1 引言   水和蒸汽是热力系统中的锅炉、汽轮机、过热器等设备的重要工作介质。当火力发电厂正常运行时,热力设备中都有水或蒸汽在流动。水、汽的品质都有规定的指标,一旦水、汽品质的指标超标,就会加速热力设备的腐蚀、结垢和积盐。当水汽中携带一些含钠的杂质时,将会导致汽轮机金属材料的点蚀、应力腐蚀或腐蚀疲劳,这些腐蚀通常会造成重大的经济损失。严重时甚至造成重大事故。钠离子含量是发电厂水汽品质的重要指标之一。因此,为防止结垢、结盐,减缓系统中金属部件的腐蚀。保证系统的安全经济运行,必须对电厂水汽系统中钠离子含量进行严格监测和控制。    2 测量原理   钠离子的测量是基于电化学中的电位分析法,由测量电极和参比电极及待测溶
[嵌入式]
工业设备中LED显示和键盘扫描设计
工业设备、汽车电子及仪器仪表中普遍使用LED显示器,原因是LED显示器成本低廉、使用灵活、封装体积小。 开发这类设备时,常常会由于CPU资源不足而不得不采用扩展接口芯片来满足应用系统的需要,而出现这种情况的原因之一是键盘显示占用了太多的系统资源,键盘显示通常采用以下两种方式:(1)采用并行接口的键盘显示专用芯片8279。但8279所需外围元件多(显示驱动、译码等)、占用电路板面积大、综合成本较高;(2)采用通用并行I/O芯片扩展(如8155等),但此方案同样需要驱动显示,同时键盘显示扫描还需占用大量CPU时间;针对这一应用,MAXIM公司推出了带有键盘扫描的LED显示驱动电路MAX6955,该器件具有400kbps、I2C
[电源管理]
51单片机矩阵键盘扫描和显示按下的次数
KEYCARD BIT 00H ;用于标志是否有键按下 KEYCOU EQU 5AH ;用于记录按下键的次数 ORG 0000H ;程序开始 AJMP START ORG 30H ;为避免占用中断向量区,主程序从30H开始 START: MOV SP,#5FH ;设置堆栈的初始地址 MOV P3,#0FH ;P3,P2,P0的初始化 MOV P2,#00H MOV P0,#0FFH CLR KEYCARD ;有按键标志清0 MOV KEYCOU,#0 ;计数初值赋0 LOOP: ;循环扫描键盘 ACALL KEY
[单片机]
工业设备中LED显示和键盘扫描设计
工业设备、汽车电子及仪器仪表中普遍使用LED显示器,原因是LED显示器成本低廉、使用灵活、封装体积小。 开发这类设备时,常常会由于CPU资源不足而不得不采用扩展接口芯片来满足应用系统的需要,而出现这种情况的原因之一是键盘显示占用了太多的系统资源,键盘显示通常采用以下两种方式:(1)采用并行接口的键盘显示专用芯片8279。但8279所需外围元件多(显示驱动、译码等)、占用电路板面积大、综合成本较高;(2)采用通用并行I/O芯片扩展(如8155等),但此方案同样需要驱动显示,同时键盘显示扫描还需占用大量CPU时间;针对这一应用,MAXIM公司推出了带有键盘扫描的LED显示驱动电路MAX6955,该器件具有400kbps、I2C兼容的2
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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