新手!才研究程序就遇到这样问题,求助
(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;
}
}
}
基本可以这样写。具体的你可以完善下
亲,我运行没错,可是仿真上就有错误了
我想问一下,用定时器倒数那个应该有个按键触发吧。
