控制组——第二次任务

任务代码解析

用到的子函数

Delay函数

给它一个值,它为你延时那么多毫秒,delay函数的优缺点在之前LED与数码管的笔记中有提,这里不再赘述
要注意的因为用到了_nop_要加上#include<INTRINS.H>

Locate函数和Num函数

Locate改成select好像更合适一点。
功能正如其名,定位与数字,这两个函数实现了第几位数码管、显示几与位选、段码之间的转换
至于为什么不合二为一,单纯打完了懒得改

Timer0Routine

我暂且将其称为中断函数,即每次中断所执行的代码都在这个子函数里面
值得一提的是,除非你在这个函数里控制数码管的显示,在此次任务里我认为这样做很麻烦,否则就要利用全局变量来正确地实现定时器的功能。

其他要点

1.在while循环内,定义完变量,声明完定时器后,利用switch(mode)来进行模式的切换
2.final变量的使用。在除模式4之外的模式中,都将final赋值为0,而在模式4中不进行赋值只做final++,我认为比较简单地实现了对是否第一次按下P3_3的检验

可进一步完善点

1.定位与显示函数的结合
2.按下按键时保持常亮

代码

#include <REGX52.H>
#include<INTRINS.H>

void Delay(unsigned int xms){
	unsigned char data i;
	while(xms--){
	_nop_();
	i = 2;
	while (--i);
	};
}
void Num(unsigned int number){
	switch (number){
	case 0:P0=0x3f;break;
	case 1:P0=0x06;break;
	case 2:P0=0x5b;break;
	case 3:P0=0x4f;break;
	case 4:P0=0x66;break;
	case 5:P0=0x6d;break;
	case 6:P0=0x7d;break;
	case 7:P0=0x07;break;
	case 8:P0=0x7f;break;
	case 9:P0=0x6f;break;
	}
}
void Locate(unsigned char location){
	switch(location){
	case 1:P2_4=1;P2_3=1;P2_2=1; break;
	case 2:P2_4=1;P2_3=1;P2_2=0; break;
	case 3:P2_4=1;P2_3=0;P2_2=1; break;
	case 4:P2_4=1;P2_3=0;P2_2=0; break;
	case 5:P2_4=0;P2_3=1;P2_2=1; break;
	case 6:P2_4=0;P2_3=1;P2_2=0; break;
	case 7:P2_4=0;P2_3=0;P2_2=1; break;
	case 8:P2_4=0;P2_3=0;P2_2=0; break;
	}
	}
	
void Timer0Init(void)	
{
	TMOD &= 0xF0;		
	TMOD |= 0x01;		
	TL0 = 0x9C;		
	TH0 = 0xFF;		
	TF0 = 0;		
	TR0 = 1;	
	ET0=1;
	EA=1;
	PT0=0;
}

	
		unsigned int count=0;
		unsigned int CNT=0;
	  int number = 0;
		int turn = 0;
		
void main(){
	unsigned int mode = 0;
	unsigned int final = 0;
	Timer0Init();
	while(1){
		if(P3_1==0){
		Delay(10);
		while(P3_1==0);
		Delay(10);
		mode = 1;		
		}
		
		if(P3_0==0){
		Delay(10);
		while(P3_0==0);
		Delay(10);
		mode = 2;	
		}
		
		if(P3_2==0){
		Delay(10);
		while(P3_2==0);
		Delay(10);
		mode = 3;}
		
		if(P3_3==0){
		Delay(10);
		while(P3_3==0);
		Delay(10);
		mode = 4;}
		
	
		switch(mode){
		case 1:
		final=0;
		Locate(1);P0=0x3e;Delay(2);P0=0x00;//Num(0);
		Locate(2);Num(1);Delay(2);P0=0x00;
		Locate(7);Num(0);Delay(2);P0=0x00;
		Locate(8);Num(1);Delay(2);P0=0x00;
		break;
		case 2:
		final=0;
		Locate(1);P0=0x3e;Delay(2);P0=0x00;
		Locate(2);Num(2);Delay(2);P0=0x00;
		if(number<=9){
		Locate(7);Num(0);Delay(2);P0=0;
		Locate(8);Num(number);Delay(2);P0=0;
		}
		if(number==10){
		Locate(7);Num(1);Delay(2);P0=0;
		Locate(8);Num(0);Delay(2);P0=0;
		}
		break;
		case 3:
		final=0;
		Locate(1);P0=0x3e;Delay(2);P0=0;//Num(0);
		Locate(2);Num(3);Delay(2);P0=0;
		Locate(7);Num(0);Delay(2);P0=0;
		Locate(8);Num(3);Delay(2);P0=0;
		if(turn == 1){
		Locate(5);P0=0x40;Delay(2);P0=0;
		Locate(6);P0=0x40;Delay(2);P0=0;
		}
		if(turn == 0){
		Locate(5);P0=0;Delay(2);P0=0;
		Locate(6);P0=0;Delay(2);P0=0;
		}
		break;
		case 4:
		Locate(1);P0=0x3e;Delay(2);P0=0;
		Locate(2);Num(4);Delay(2);P0=0;
		if(final==10){
		final=0;
		Locate(7);Num(final);Delay(2);P0=0;
		Locate(8);Num(final);Delay(2);P0=0;
		}
		if(final<10){
		Locate(7);Num(final);Delay(2);P0=0;
		Locate(8);Num(final);Delay(2);P0=0;
		}
		if(P3_3==0){
		Delay(10);
		while(P3_3==0)
		Delay(10);
		final++;
		}
		break;
		}
	
	}
}
	
	
	void Timer0Routine()       interrupt 1 
{
		TL0 = 0x9C;		
		TH0 = 0xFF;			
		count++;
		CNT++;
		if(count>=10000){
		count = 0;
		if(number==10){
		number=-1;}
		number++;
		}
		if(CNT==5000){
		if(turn==0)
			turn=1;
		else
			turn=0;
			CNT=0;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值