HFUT_ROSE 2020-12-05 22:54 采纳率: 0%
浏览 18

C51定时器问题,求助大佬

欲实现使用一个一位的数码管,从0开始显示,每隔1s显示数加一,加至16清零继续循环。按下button1间隔时间增长0.5s,按下button2间隔时间缩短0.5s。

/*{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
0~F*/

#include <reg52.h>	
#include <intrins.h>
#define u16 unsigned int 	
#define u8  unsigned char 
#define KEY P1

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 i=0,keynum;
u8 T=1000;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void delay(u16 j)
{
	while(j--);	
}

void keydown();
	
void Timer0Init()               //用定时器0控制两次扫描的时间间隔
{
	TMOD=0X01;
	TH0=0XFC;
	TL0=0X18;	
	ET0=1;
	EA=1;
	TR0=1;	
  while(!TF0);
  TF0 = 0;
}

void lighting()
{
		if(i<16)
			{
				P0=smgduan[i];
			}	
}	

void main()
{	

	while(1)
	{	
		keydown();
		Timer0Init();
		lighting();
	  if(i==16){i=0;}
	}		
}

void Timer0() interrupt 1
{
	static u16 k;
	TH0=0XFC;	
	TL0=0X18;
	TR0=1;
	k++;
	if(k==T)
	{
		k=0;
		i++;
	}	
}

void keydown()
{
if(KEY!=0x0f)
{
  delay(100);
	if(KEY!=0x0f)
	{
	switch(KEY)
   {
		case(0x77):keynum=0;break;
		case(0xbb):keynum=1;break;
	 }
	}
}
if(keynum==0) {T+=500;}
else if(keynum==1){T-=500;}	
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-09 15:24
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 Pwm双极模式H桥驱动控制电机
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题