[Atmel] 用AtmelStudio6.2跑mega16例程(15):距阵按键

[复制链接]
1113|0
 楼主| ddllxxrr 发表于 2014-9-16 21:32 | 显示全部楼层 |阅读模式
距阵按键也很好理解,就是发收换位,一排管脚前几个发,后几个收,然后在反过来。
以下是Proteus的仿真结果。

以下是在Atmel Studio 6,2的运行结果


以下是程序:
  1. /*
  2. * GccApplication22.c
  3. *
  4. * Created: 2014-9-16 21:23:06
  5. *  Author: Administrator
  6. */


  7. #include <avr/io.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. uchar tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,  //共阳极LED  0~F的段码
  11. 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x00};

  12. void  delay(uint k)
  13. {
  14.         uint  m,n;
  15.         for(m=0;m<k;m++)
  16.         {
  17.                 for(n=0;n<114;n++);
  18.         }
  19. }
  20. uchar ScanKey()
  21. {
  22.         uchar temp,temp1,key;
  23.         temp=PIND;
  24.         temp&=0x0F;
  25.         switch(temp)
  26.         {
  27.                 case 0x0E:
  28.                 {
  29.                         DDRD=0x0F;
  30.                         PORTD=0xF0;
  31.                         delay(5);
  32.                         temp1=PIND;
  33.                         temp1&=PIND;
  34.                         switch(temp1)
  35.                         {
  36.                                 case 0xE0:
  37.                                 key=0;
  38.                                 break;
  39.                                 case 0xD0:
  40.                                 key=1;
  41.                                 break;
  42.                                 case 0xB0:
  43.                                 key=2;
  44.                                 break;
  45.                                 case 0x70:
  46.                                 key=3;
  47.                                 break;
  48.                                 default:
  49.                                 key=0;
  50.                                 break;
  51.                         }
  52.                         DDRD=0xF0;
  53.                         PORTD=0x0F;
  54.                         break;
  55.                 }
  56.                 case 0x0D:
  57.                 {
  58.                         DDRD=0x0F;
  59.                         PORTD=0xF0;
  60.                         delay(5);
  61.                         temp1=PIND;
  62.                         temp1&=PIND;
  63.                         switch(temp1)
  64.                         {
  65.                                 case 0xE0:
  66.                                 key=4;
  67.                                 break;
  68.                                 case 0xD0:
  69.                                 key=5;
  70.                                 break;
  71.                                 case 0xB0:
  72.                                 key=6;
  73.                                 break;
  74.                                 case 0x70:
  75.                                 key=7;
  76.                                 break;
  77.                                 default:
  78.                                 key=0;
  79.                                 break;
  80.                         }
  81.                         DDRD=0xF0;
  82.                         PORTD=0x0F;
  83.                         break;
  84.                 }
  85.                 case 0x0B:
  86.                 {
  87.                         DDRD=0x0F;
  88.                         PORTD=0xF0;
  89.                         delay(5);
  90.                         temp1=PIND;
  91.                         temp1&=PIND;
  92.                         switch(temp1)
  93.                         {
  94.                                 case 0xE0:
  95.                                 key=8;
  96.                                 break;
  97.                                 case 0xD0:
  98.                                 key=9;
  99.                                 break;
  100.                                 case 0xB0:
  101.                                 key=10;
  102.                                 break;
  103.                                 case 0x70:
  104.                                 key=11;
  105.                                 break;
  106.                                 default:
  107.                                 key=0;
  108.                                 break;
  109.                         }
  110.                         DDRD=0xF0;
  111.                         PORTD=0x0F;
  112.                         break;
  113.                 }
  114.                 case 0x07:
  115.                 {
  116.                         DDRD=0x0F;
  117.                         PORTD=0xF0;
  118.                         delay(5);
  119.                         temp1=PIND;
  120.                         temp1&=PIND;
  121.                         switch(temp1)
  122.                         {
  123.                                 case 0xE0:
  124.                                 key=12;
  125.                                 break;
  126.                                 case 0xD0:
  127.                                 key=13;
  128.                                 break;
  129.                                 case 0xB0:
  130.                                 key=14;
  131.                                 break;
  132.                                 case 0x70:
  133.                                 key=15;
  134.                                 break;
  135.                                 default:
  136.                                 key=0;
  137.                                 break;
  138.                         }
  139.                         DDRD=0xF0;
  140.                         PORTD=0x0F;
  141.                         break;
  142.                 }
  143.                 default:
  144.                 key=0;
  145.                 break;
  146.         }
  147.         return(key);
  148. }
  149. int main(void)
  150. {
  151.         uchar temp,keynum;
  152.         DDRD=0xF0;
  153.         PORTD=0x0F;
  154.         DDRC=0xFF;
  155.         PORTC=0xFF;
  156.         while (1)
  157.         {
  158.                 temp=PIND;  //判断是否有按键
  159.                 temp&=0x0F;
  160.                 if(temp==0x0F)
  161.                 {
  162.                         continue;
  163.                 }
  164.                 else
  165.                 {
  166.                         delay(100);  //约10ms延时去抖
  167.                         temp=PIND;   //判断是否有按键
  168.                         temp&=0x0F;
  169.                 }
  170.                 if(temp==0x0F)
  171.                 {
  172.                         continue;
  173.                 }
  174.                 else
  175.                 {
  176.                         keynum=ScanKey();
  177.                         PORTC=tab[keynum];
  178.                 }
  179.                 while(temp!=0x0F)
  180.                 {
  181.                         temp=PIND;
  182.                         temp&=0x0F;
  183.                 }
  184.         }
  185. }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2404

主题

7001

帖子

68

粉丝
快速回复 在线客服 返回列表 返回顶部