打印

AVR矩阵键盘程序

[复制链接]
3289|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sdu_yqc|  楼主 | 2011-7-16 15:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
在一本书上看到这么一个程序,感觉没错误。但用proteus仿真执行起来,不对。请指教电路图

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

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

//判断是否有键按下
uchar key_press()
{
//高四位输出全零,低四位输入
   
     DDRD=0XF0;
         PORTD=0X0F;_delay_ms(1);
     return PIND!=0X0F?1:0;
}
//键盘扫描
uchar key_scan()
{
/按键后,00001111变为0000XXXX,X中有一个0,其余为1
//下面判断按键发生在哪一行,赋值为行初值
switch(PIND)
{
   case 0B00001110:key_num=0;break;
   case 0B00001101:key_num=4;break;
   case 0B00001011:key_num=8;break;
   case 0B00000111:key_num=12;break;
   default:key_num=0xff;
}
//高四位输入,低四位输出全零
DDRD=0X0F;PORTD=0xF0;_delay_ms(1);
//按键后,11110000变为XXXX0000,X中有一个0,其余为1
//下面判断按键发生在第几列
switch(PIND)
{
    case 0B11100000:key_num+=0;break;
        case 0B11010000:key_num+=1;break;
        case 0B10110000:key_num+=2;break;
        case 0B01110000:key_num+=3;break;
        default:key_num=0xff;
}
return key_num;
}
void main(void)
{
uchar l;
DDRC=0XFF;PORTC=0X00;
while(1)
{
    if(key_press())
         l=key_scan();
        else continue;
    if(key_num<16)
        PORTC=seg_code[l];
    while(key_press()); //按键未释放,则等待
}
}

相关帖子

沙发
NE5532| | 2011-7-16 15:37 | 只看该作者
画流程图

使用特权

评论回复
板凳
sdu_yqc|  楼主 | 2011-7-16 16:21 | 只看该作者
2# NE5532 画了流程图,还是没看出来这个程序哪儿有问题……

使用特权

评论回复
地板
NE5532| | 2011-7-16 16:39 | 只看该作者
你先把流程图放上来再说,流程图可以用Word画,然后抓图

使用特权

评论回复
5
mcu5i51| | 2011-7-17 07:51 | 只看该作者
到AVR的10K电阻好像有点大

使用特权

评论回复
6
NE5532| | 2011-7-17 08:08 | 只看该作者
到AVR的10K电阻好像有点大
mcu5i51 发表于 2011-7-17 07:51


那个10k的电阻根本就是在乱加。

使用特权

评论回复
7
sdu_yqc|  楼主 | 2011-7-17 10:02 | 只看该作者
6# NE5532 我用另一个正确的程序,发现不加电阻就不对……不加电阻时,连检测按键有没有按下都做不到

使用特权

评论回复
8
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
9
sdu_yqc|  楼主 | 2011-7-17 10:39 | 只看该作者
本帖最后由 sdu_yqc 于 2011-7-17 10:41 编辑

4# NE5532

使用特权

评论回复
10
NE5532| | 2011-7-17 13:42 | 只看该作者
6# NE5532 我用另一个正确的程序,发现不加电阻就不对……不加电阻时,连检测按键有没有按下都做不到
sdu_yqc 发表于 2011-7-17 10:02


不是加电阻对不对的问题,是电阻拿来干什么的问题,你只知道不加不对,怎么能设计出正确的电路呢?听菜农的,加上拉。另外AVR的,键盘线不长,扫描速度不高的,内上拉也是可以用的,串电阻是解决ESD的问题,在仿真软件里你根本看不到这个特性。

使用特权

评论回复
11
NE5532| | 2011-7-17 13:44 | 只看该作者
流程图应该没有大问题,只是里面没有写端口输入输出切换,现在你可以跟着流程图来调程序,逐步跟踪,看哪一步的执行结果和你想的不一样。

使用特权

评论回复
12
xd54622| | 2011-7-19 21:25 | 只看该作者
逛逛

使用特权

评论回复
13
lidaji0| | 2011-11-29 23:13 | 只看该作者
这里真是个学习的好地方

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

140

帖子

1

粉丝