微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新手!才研究程序就遇到这样问题,求助

新手!才研究程序就遇到这样问题,求助

时间:10-02 整理:3721RD 点击:
能不能不要打击我的信心。
(1)使用三个按键控制最后两位数码管设置一个二位数字,其中一个按键控制加数字,一个按键控制减数字,一个按键控制切换所控制的数码管。
(2)设定好数字后,利用定时器使这个数字以一秒为间隔倒计数到0,后再从0以一秒为间隔正计数到该数字。
(3)整个计数过程中,令LED小灯随数字的改变而亮灭。

求指点,能加我Q?2411499466

发帖辛苦了,小编 支持

很简单的呀

一个定时程序,如果感觉无所下手,可以考虑一步一步的去实现。或者说一个一个模块的去实现。一个是数码管显示模块,电路设计是静态显示还是动态显示,不一样的设计需要不一样的程式算法;一个是按键检测模块;一个是定时模块,可以考虑用中断产生一个时基;最后就是把模块整合,实现功能要求。学习还是要慢慢来,一个一个功能模块的去学习。

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=                 //数模
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x67,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
int count=20;                //要设定的数(0~99)
int number=0;
uchar a=0xfe;                //位选
uchar b=0xfd;
uchar flag=1;                //顺加和逆减的标志
sbit key1=P1^0;                //加数
sbit key2=P1^1;                //减数
sbit key3=P1^2;                //改位选
sbit led=P1^3;                //led
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void Init_time0()          
{
        TMOD=0x01;
        EA=1;
        ET0=1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
}
void keyscan()
{
        TR0=0;
        if(key1==0)
        {
                delay(2);
                if(key1==0)
                {
                        number++;
                        if(number==100)
                                number=0;
                }
                while(!key1);
                delay(2);
                while(!key1);
        }
        if(key2==0)
        {
                delay(2);
                if(key2==0)
                {
                        number--;
                        if(number<0)
                                number=99;
                }
                while(!key2);
                delay(2);
                while(!key2);
        }

        if(key3==0)
        {
                delay(2);
                if(key3==0)
                {
                        a=_crol_(a,1);
                        b=_crol_(b,1);
                }
                while(!key3);
                delay(2);
                while(!key3);
        }
        TR0=1;
}
void display()
{
        P2=a;                                        //位选
        P0=table[number/10];        //段选
        delay(2);
        P2=b;
        P0=table[number%10];
        delay(2);
}
int main(void)
{
        Init_time0();
        while(1)
        {
                keyscan();
                display();
        }
        return 0;
}
void exter0() interrupt 1
{
        static uint t=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t++;
        if(t==20)
        {
                t=0;
                led=~led;
                if(flag)
                {
                        number++;
                        if(number==100)
                                number=0;
                        if(number==count)
                                flag=0;                       
                }
                else
                {
                        number--;
                        if(number==0)
                                flag=1;
                }
        }       
}
基本可以这样写。具体的你可以完善下

亲,我运行没错,可是仿真上就有错误了

我想问一下,用定时器倒数那个应该有个按键触发吧。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top