一种新的代码风格~

研究了一会缓冲区,还有利用中断去检测键盘的算法,又中和了之前的代码风格,发展出了一种新的通用代码格式,这几天要好好熟悉~

定时器2ms中断

void Timer0_Init()
{
	TMOD=0x10;
	TH0=0xf8;
	TL0=0xcd;
	TH1=0x00;
	TL1=0x00;
	EA=1;
	ET0=1;
	ET1=0;
	TR0=1;
	TR1=0;
}

void Timer0_Service() interrupt 1
{
	static Key_Buf[4]={0xff,0xff,0xff,0xff};
	uchar i;
	
	Key_Buf[0]=(Key_Buf[0]<<1)|S7;
	Key_Buf[1]=(Key_Buf[1]<<1)|S6;
	Key_Buf[2]=(Key_Buf[2]<<1)|S5;
	Key_Buf[3]=(Key_Buf[3]<<1)|S4;
	
	for(i=0;i<4;i++)
	{
		if((Key_Buf[i]&0x0f)==0x0f)
			Key_State[i]=1;
		else if((Key_Buf[i]&0x0f)==0x00)
			Key_State[i]=0;
	}
	
	Scan_KeyAlone();
	Display_SMG();
}

键盘相关函数
1.对4个独立按键做一个遍历,根据前后状态,在下降沿得到键值。
2.可以根据键值分辨不同的按键,然后做出不同的处理。

/*==============================键盘相关函数================================*/
//扫描键盘
void Scan_KeyAlone()
{
	static Key_backup[4]={1,1,1,1};
	uchar i;
	for(i=0;i<4;i++)
	{
		if(Key_backup[i]!=Key_State[i])
		{
			if(Key_backup[i]!=0)
				Key_Action(Key_Value_Map[i]);
			Key_backup[i]=Key_State[i];
		}
	}
}

//处理按键S7
void Key_Dealwith_S7()
{
	if(SMG_state==2)
	{
		History_count++;
		if(History_count==5)
			History_count=1;
	}
	
	else if(SMG_state==3)
	{
		Blind_Distance+=10;
		if(Blind_Distance>30)
			Blind_Distance=0;
	}
}

//处理按键S6
void Key_Dealwith_S6()
{
	if(SMG_state!=3)
	{
		SMG_state=3;
	}
	else
	{
		SMG_state=1;
	}
}

//处理按键S5
void Key_Dealwith_S5()
{
	if(SMG_state!=2)
	{
		SMG_state=2;
	}
	else
	{
		SMG_state=1;
	}
}

//处理按键S4
void Key_Dealwith_S4()
{
	SMG_state=1;
	//Measure_Distance();
}

//根据键盘键值执行动作
void Key_Action(uchar num)
{
	switch(num)
	{
		case '7':	Key_Dealwith_S7();
					break;
		case '6':	Key_Dealwith_S6();
					break;
		case '5':	Key_Dealwith_S5();
					break;
		case '4':	Key_Dealwith_S4();
					break;
	}
}

/*==========================================================================*/

数码管相关函数
1.首先是显示函数,消影,开位选,开段选,这里采用静态变量来做位选,加到8后重新置0,这里加载的是数码管缓冲区的数据。
2.根据不同的显示界面,把不同的数据送入数码管缓冲区里。

/*=============================数码管相关函数===============================*/
//数码管显示函数
void Display_SMG()
{
	static i=0;
	Choose_HC138(6);
	P0=0xff;
	Choose_HC138(0);
	
	Choose_HC138(6);
	P0=0x01<<i;
	Choose_HC138(7);
	P0=SMG_Buf[i];			//数码管缓冲区的位与实际相对应
	Choose_HC138(0);
	
	i++;
	if(i==8)
	{
		i=0;
	}
}

//加载实时模式数据到缓冲区
void Load_date_Buf_1()
{
	char i;
	uchar num1=Distance_value[3];
	for(i=7;i>=5;i--)
	{
		SMG_Buf[i]=table[num1%10];
		num1=num1/10;
	}
	
	num1=Distance_value[2];
	for(i=4;i>=2;i--)
	{
		SMG_Buf[i]=table[num1%10];
		num1=num1/10;
	}
	
	SMG_Buf[1]=0xff;
	SMG_Buf[0]=table[11];
}

//回显界面 count代表第几次
void Load_date_Buf_2(uchar count)
{
	char i;
	uchar num2=Distance_value[4-count];
	for(i=7;i>=5;i--)
	{
		SMG_Buf[i]=table[num2%10];
		num2=num2/10;
	}
	
	for(i=4;i>0;i--)
	{
		SMG_Buf[i]=0xff;
	}
	
	SMG_Buf[0]=table[count];
}

//参数设置界面
void Load_date_Buf_3()
{
	char i;
	uchar num3=Blind_Distance;
	for(i=7;i>=5;i--)
	{
		SMG_Buf[i]=table[num3%10];
		num3=num3/10;
	}
	
	for(i=4;i>0;i--)
	{
		SMG_Buf[i]=0xff;
	}
	
	SMG_Buf[0]=table[10];
}

void Choose_SMG_state()
{
	switch(SMG_state)
	{
		case 1:	Load_date_Buf_1();
				break;
		case 2:	Load_date_Buf_2(History_count);
				break;
		case 3:	Load_date_Buf_3();
				break;
	}
}
/*==========================================================================*/

感觉新的代码风格的移植性应该挺好,国赛加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值