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 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作