avr单片机按键程序

编程语言及工具

99人已加入

描述

  什么是avr单片机

  AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通讯设备、家用电器等各个领域。AVR单片机是 Atmel 公司 1997 年推出的 RISC 单片机。RISC(精简指令系统计算机)是相对于CISC(复杂指令系统计算机)而言的。RISC 并非只是简单地去减少指令,而是通过使计算机的结构更加简单合理而提高运算速度的。

  RISC 优先选取使用频率最高的简单指令,避免复杂指令:并固定指令宽度,减少指令格式和寻址方式的种类,从而缩短指令周期,提高运行速度。由于 AVR 采用了 RISC 的这种结构,使AVR系列单片机都具备了1MIPS/MHz(百万条指令每秒/兆赫兹)的高速处理能力。

  

  avr单片机按键程序

  按键控制流程

  state action

  0检测是否有按下

  1消抖

  2检测是否有按下行扫描列读取出健值送出键值,并移至高4位

  3 行扫描列读取出健值跟上一次比较相问计时(2s)加一。计调转下- 一个状态(长按);不同则转到1(组合键可以在这一状态下判断)

  4 行扫描,列该取出健值跟上: 一次比较相同计时(100ms)加一,计满送出键值,不同则转到1

  #idefine LPT 1200

  #define LPT_SEND_DATA 200

  #define JUDGE_KEY_DOWN 0

  #detine WAITKEYSTATE 1g

  4define SEND_KEY_VALUE 2

  #idefine JUDGE_ LOONG PRESS 3

  #define LOONG PRESS_ ACTION 4

  #define KEY_UP_STATE 5

  #define key_port PORTC

  #define key_dd DDRC

  #define key_in PINC

  #define key_IO 0xF0

  / 备配10 的输入输出h.1为输出0 为输入

  #define key_L 0xF0

  /1|输出来低位输出

  #define key_R 0x0F

  /行输入,高位读入

  unsigned char key_pin[ h- {0x10,0x20,0x40,0x80} ;

  const unsigned char key_table[-{

  0x0O,0x01,0x02.0xf,0x3,.0xfJOXfJoxf.oxo4.0xf.Oxf.Xff.offoxf.oxT.oxf/ 第一行

  0x 10,0x05.0x06,0x1f;.Ox07,0xf.Oxf,0of.38.OXfG.OXfQ.Xf.Xf.Oxf.oxf.oxtf;/ 第二行

  0x20,0x09,0x0a,0xf,0xOb,0xtf:Oxf;Oxf.oxOc,OxfofOoxf.OXf.OXf(oqif.0./ 第三行

  0x30,0x0d,0x0e,0xf,0x0f,0xf,Oxtf.Oxf;.0x 10,0xff.Oxf,0xf.offixf,0xf.oxf‘1第四行

  {

  volatile unsigned char key_value_old;

  volatile unsigned int key_time;

  volatile unsigned char state;

  volatile unsigned char j:

  {

  unsigned char key_scan(void)

  unsigned char j;

  for(j-0;j4j+ +)

  {

  key_port-key_pin[j l;

  key_pinui

  key_port“ I

  /_NOPO :_NOPO;NOP0;_NOPO:_NOP( );_NOP( );

  i( (key_in & key_R)!= 0x00 )

  /reurn (key_lablelj + key_in]);/ i-0,5,10,15

  /PORTD- key_table[i《c4 + key_in];

  /IPORTD- key_in;

  /key_part=0x0f;

  /retum j;

  switch(key_in )

  case 0b00010001: return 0;

  break;

  case 0b00100001: return 1;

  break;

  case 0b00011000: return 12;

  break;

  case 0b00101000: return 13;

  break;

  case 0b01001000: recurn 14;

  break;

  case 0b10001000: return 15;

  break;

  defaul :break;

  key_port” key_IO;

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分