AVR矩阵键盘程序

[复制链接]
4250|12
 楼主| sdu_yqc 发表于 2011-7-16 15:26 | 显示全部楼层 |阅读模式
在一本书上看到这么一个程序,感觉没错误。但用proteus仿真执行起来,不对。请指教电路图

  1. #include<avr/io.h>
  2. #include<util/delay.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. const uchar seg_code[]=        {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
  6.                          0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~9,A~F,共阴数码管
  7. uchar key_num=16;  //表示无按键

  8. //判断是否有键按下
  9. uchar key_press()
  10. {
  11. //高四位输出全零,低四位输入
  12.    
  13.      DDRD=0XF0;
  14.          PORTD=0X0F;_delay_ms(1);
  15.      return PIND!=0X0F?1:0;
  16. }
  17. //键盘扫描
  18. uchar key_scan()
  19. {
  20. /按键后,00001111变为0000XXXX,X中有一个0,其余为1
  21. //下面判断按键发生在哪一行,赋值为行初值
  22. switch(PIND)
  23. {
  24.    case 0B00001110:key_num=0;break;
  25.    case 0B00001101:key_num=4;break;
  26.    case 0B00001011:key_num=8;break;
  27.    case 0B00000111:key_num=12;break;
  28.    default:key_num=0xff;
  29. }
  30. //高四位输入,低四位输出全零
  31. DDRD=0X0F;PORTD=0xF0;_delay_ms(1);
  32. //按键后,11110000变为XXXX0000,X中有一个0,其余为1
  33. //下面判断按键发生在第几列
  34. switch(PIND)
  35. {
  36.     case 0B11100000:key_num+=0;break;
  37.         case 0B11010000:key_num+=1;break;
  38.         case 0B10110000:key_num+=2;break;
  39.         case 0B01110000:key_num+=3;break;
  40.         default:key_num=0xff;
  41. }
  42. return key_num;
  43. }
  44. void main(void)
  45. {
  46. uchar l;
  47. DDRC=0XFF;PORTC=0X00;
  48. while(1)
  49. {
  50.     if(key_press())
  51.          l=key_scan();
  52.         else continue;
  53.     if(key_num<16)
  54.         PORTC=seg_code[l];
  55.     while(key_press()); //按键未释放,则等待
  56. }
  57. }

本帖子中包含更多资源

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

×
NE5532 发表于 2011-7-16 15:37 | 显示全部楼层
画流程图
 楼主| sdu_yqc 发表于 2011-7-16 16:21 | 显示全部楼层
2# NE5532 画了流程图,还是没看出来这个程序哪儿有问题……
NE5532 发表于 2011-7-16 16:39 | 显示全部楼层
你先把流程图放上来再说,流程图可以用Word画,然后抓图
mcu5i51 发表于 2011-7-17 07:51 | 显示全部楼层
到AVR的10K电阻好像有点大
NE5532 发表于 2011-7-17 08:08 | 显示全部楼层
到AVR的10K电阻好像有点大
mcu5i51 发表于 2011-7-17 07:51


那个10k的电阻根本就是在乱加。
 楼主| sdu_yqc 发表于 2011-7-17 10:02 | 显示全部楼层
6# NE5532 我用另一个正确的程序,发现不加电阻就不对……不加电阻时,连检测按键有没有按下都做不到
hotpower 发表于 2011-7-17 10:33 | 显示全部楼层
那个10k的电阻根本就是在乱加。
NE5532 发表于 2011-7-17 08:08


应该加上拉电阻,再行输出应该用OC门。
上拉电阻应该加在输入IO上。
设行输出,列输入。

方法有二:
1.将行电阻改为二极管阻止线与的发生。
2.将真双向IO改成“准双向IO”
   即输出恒为0,用方向来控制,输出方式实际输出为0,输入方式实际输出为1

评分

参与人数 1威望 +1 收起 理由
张允 + 1

查看全部评分

 楼主| sdu_yqc 发表于 2011-7-17 10:39 | 显示全部楼层
本帖最后由 sdu_yqc 于 2011-7-17 10:41 编辑

4# NE5532

本帖子中包含更多资源

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

×
NE5532 发表于 2011-7-17 13:42 | 显示全部楼层
6# NE5532 我用另一个正确的程序,发现不加电阻就不对……不加电阻时,连检测按键有没有按下都做不到
sdu_yqc 发表于 2011-7-17 10:02


不是加电阻对不对的问题,是电阻拿来干什么的问题,你只知道不加不对,怎么能设计出正确的电路呢?听菜农的,加上拉。另外AVR的,键盘线不长,扫描速度不高的,内上拉也是可以用的,串电阻是解决ESD的问题,在仿真软件里你根本看不到这个特性。
NE5532 发表于 2011-7-17 13:44 | 显示全部楼层
流程图应该没有大问题,只是里面没有写端口输入输出切换,现在你可以跟着流程图来调程序,逐步跟踪,看哪一步的执行结果和你想的不一样。
xd54622 发表于 2011-7-19 21:25 | 显示全部楼层
lidaji0 发表于 2011-11-29 23:13 | 显示全部楼层
这里真是个学习的好地方
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

140

帖子

1

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