打印
[AVR单片机]

初学者求助,一个简单小程序,效果有时有有时没有

[复制链接]
1366|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dichters|  楼主 | 2014-8-6 17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能是一个口输出4盏灯,按下按钮,4盏灯按二进制+1,用上升沿触发。
我想做一个小实验来实现这个功能,将来要设计更多按键,因此不能用中断,我就用逻辑来实现判断。但是做出来以后,按下键,有时候起作用,有时候不起作用QAQ
求指导代码QAQ


/******
按键计数功能函数,PC0接按键,按键后,在上升沿,PD[0:3]四位显示二进制+1。
******/

#include <iom16v.h>
#include <macros.h>

/*****
延时函数,最小1ms。使用T/C0,8M内置时钟或等值外部晶振
****/
void delayms(unsigned int j)
{
    unsigned int i;
    TCCR0 = 0x00; //stop
    OCR0  = 0x7D;  //set compare
    TCCR0 = 0x03; //start timer
    for(i=0;i<j;i++)
    {
        TCNT0 = 0x83; //set count
        while(TCNT0!=0XFF);
    }

}//延时函数结束

/******
计数进位功能,在PD[0:3]显示
******/
void count(unsigned int i)
{
            if(i)
            {
                    if(PORTD==0x0f)
                    PORTD=0x00;//计到1111归零
                        else
                 PORTD=PORTD+1;
            }
}//计数功能函数结束

void main(void)
{
        unsigned int qn=0,qn1=0,qn2=0; //qn是未防抖的现在状态,qn1是经过防抖检测的现在状态,qn2是前一个状态。
        DDRD=0xff;
        PORTD=0x03;
        DDRC=0x00;//PD[0:3]实现功能,PD[4:5]显示qn1和qn2的实时状态以做参考


    while(1)
    {
                //防抖
                qn=(PINC&0x01);
                if(!qn)
                qn1=0;
                else
                {
                    delayms(50);
                    if(qn)
                    qn1=1;
                }//防抖结束
               
                if(qn1&&!qn2)//上升沿(现在状态1,前一状态0)
        {
                        count(1);
                delayms(10);
                }
                //主要功能结束
               
                qn2=(PINC&0x01);//记录下一个循环的qn2
               
    }
}

相关帖子

沙发
dichters|  楼主 | 2014-8-6 17:23 | 只看该作者
艾玛忘了说,用的是atmega16,内置8M晶振

使用特权

评论回复
板凳
huangxz| | 2014-8-7 09:42 | 只看该作者
AVR现在环境比较差用的人比较少了吧,想验证一下,都不知道win8下面装什么软件好

使用特权

评论回复
地板
xjz2000| | 2014-8-7 10:05 | 只看该作者
你的延时函数有问题,你让主程序在那死等,根本做不了别的事情。况且你的延时函数也单独用了一个计时器0,还不如用一个计时器0的中断。延时的正确方式,是主程序看一下有没有到延时的值,没有到继续做别的事情,有到则做延时到的事情,只有这样主程序才能效率高

使用特权

评论回复
5
dichters|  楼主 | 2014-8-7 11:22 | 只看该作者
xjz2000 发表于 2014-8-7 10:05
你的延时函数有问题,你让主程序在那死等,根本做不了别的事情。况且你的延时函数也单独用了一个计时器0, ...

找到问题了,我不应该在延时函数里设置计时器的,放到主函数里就好了,THX

使用特权

评论回复
6
dichters|  楼主 | 2014-8-7 11:23 | 只看该作者
huangxz 发表于 2014-8-7 09:42
AVR现在环境比较差用的人比较少了吧,想验证一下,都不知道win8下面装什么软件好 ...

哦?怎么说,初学者不懂行情,求介绍。看到不少人都说AVR不行。

使用特权

评论回复
7
longmaodo| | 2014-8-7 14:34 | 只看该作者
AVR怎么不行了  挺好的呀   还有如果自己开发 还不要使用最新系统的比较好  
WIN7就不错了 WIN8真心没用过 因为用的软件都是盗版的 害怕没有驱动

使用特权

评论回复
8
huangxz| | 2014-8-7 22:17 | 只看该作者
dichters 发表于 2014-8-7 11:23
哦?怎么说,初学者不懂行情,求介绍。看到不少人都说AVR不行。

早年avrstudio和winavr配合相当默契,而且使用的开发工具很便宜,avr_isp几块钱就搞定了,从as5.0以后,开发环境变的出奇的大,avr,avr32,arm集成在一起,开发工具也支持的不太方便,所以用起来相当麻烦,反而现在arm用起来越来越方便了,cortex-m0,m3,一个keil搞定,开发工具都是通用的,和谐的jlink也就几十块钱而已

使用特权

评论回复
9
longmaodo| | 2014-8-8 16:08 | 只看该作者
huangxz 发表于 2014-8-7 22:17
早年avrstudio和winavr配合相当默契,而且使用的开发工具很便宜,avr_isp几块钱就搞定了,从as5.0以后, ...

话说配置熔丝什么的真的是很麻烦呀
我用STM32都比用AVR简单

使用特权

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

本版积分规则

1

主题

6

帖子

0

粉丝