蓝桥杯大赛单片机组国信长天开发板个人总结 | 驱动总结

38译码器的驱动设计

1. 头文件

#ifndef __ENABLE_138_H_
#define __ENABLE_138_H_

#include"main.h"


extern void Enable_74HC138(uchar ch);


#endif

2. 源文件

/*************************************************************************
程序功能: --74HC138的驱动
	
编程人信息:
姓名:	Pandas
Email:	itworkstation@hotmail.com
专业:	电子信息工程专业
**************************************************************************/

#include"Enable_138.h"

void Enable_74HC138(uchar ch)
{
 	GPIO_74HC138=(GPIO_74HC138&0x1f)|(ch<<5);	  // 000 	1:0010 0000
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	GPIO_74HC138&=0x1f;
}

数码管显示

1. 头文件

#ifndef __LED_7SEG_H_
#define __LED_7SEG_H_

#include"main.h"


extern void Display_Led_7seg(void);
//extern void Display_Data(uchar D1,D2,D3,D4,D5,D6,D7,D8);
extern void Display_Data(uchar *p);
extern void Display_ChooseMode(uchar Dis_Mode,uchar Start_Addr,uchar Finishi_Addr);

#endif

2. 源文件

/*************************************************************************
程序功能: --数码管的驱动
	
编程人信息:
姓名:	Pandas
Email:	itworkstation@hotmail.com
专业:	电子信息工程专业
**************************************************************************/
#include"Led_7seg.h"
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff,  //0-f   灭 	共阳数码管					
					0xC0&0x7f,0xF9&0x7f,0xA4&0x7f,0xB0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xF8&0x7f,0x80&0x7f,0x90&0x7f,
					0xbf,0x89,0x9c,0xc6,0xC1//-  H  ℃(两个字节0x89,0x9c)	 U

};
uchar DisBuff_WE[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};	//用来存放位选
uchar DisBuff_DU[8]={0};	//用来存放段选
uchar Display_fif[8]={0}; //用来做位选缓存

void Display_Led_7seg()
{
	static uchar DisNum=0;

	Led_7seg_GPIO=table[Led_OFF_DU];	//消隐
	Enable_74HC138(Led_7seg_DU);

	Led_7seg_GPIO=DisBuff_WE[DisNum];	//打开位
	Enable_74HC138(Led_7seg_WE);

	Led_7seg_GPIO=table[DisBuff_DU[DisNum]];	//送入段码
	Enable_74HC138(Led_7seg_DU);

	DisNum++;
	if(DisNum>7)
	{
		DisNum=0;	
	}
}
//void Display_Data(uchar D1,D2,D3,D4,D5,D6,D7,D8)
//{
//	DisBuff_DU[0]=D1;
//	DisBuff_DU[1]=D2;
//	DisBuff_DU[2]=D3;
//	DisBuff_DU[3]=D4;
//	DisBuff_DU[4]=D5;
//	DisBuff_DU[5]=D6;
//	DisBuff_DU[6]=D7;
//	DisBuff_DU[7]=D8;
//}
void Display_Data(uchar *p)
{
	DisBuff_DU[0]=p[0];
	DisBuff_DU[1]=p[1];
	DisBuff_DU[2]=p[2];
	DisBuff_DU[3]=p[3];
	DisBuff_DU[4]=p[4];
	DisBuff_DU[5]=p[5];
	DisBuff_DU[6]=p[6];
	DisBuff_DU[7]=p[7];
}
/******************************************
程序说明:
控制数码管显示状态
*******************************************/
void Display_ChooseMode(uchar Dis_Mode,uchar Start_Addr,uchar Finishi_Addr)
{
	uchar i=0;
	static bit Flag_Once_Mode1=1,Flag_Once_Mode2=1,Flag_Once_Mode3=1;
	if(Dis_Mode==0)	  //正常显示
	{		
		Flag_Once_Mode2=1;Flag_Once_Mode3=1;
		if(Flag_Once_Mode1==1)
		{
			for(i=0;i<=7;i++)
			{	
				Display_fif[i]=0<<i;
				DisBuff_WE[i]=1<<i;
			}
		}
		Flag_Once_Mode1=0;
	}
	else if(Dis_Mode==1)	//地址起始到地址终止闪烁
	{
		Flag_Once_Mode1=1;Flag_Once_Mode3=1;
		if(Flag_Once_Mode2==1)
		{
			for(i=0;i<=7;i++)
			{	
				Display_fif[i]=0<<i;
				DisBuff_WE[i]=1<<i;
			}	
		}
		Flag_Once_Mode2=0;

		for(i=0;i<=7;i++)
		{
			if(i<Start_Addr)
			{
				Display_fif[i]=1<<i;
			}
			if(i>=Start_Addr && i<=Finishi_Addr)	  
			{
				if(Display_fif[i])
					Display_fif[i]=0<<i;
				else
					Display_fif[i]=1<<i;	
			}
			if(i>Finishi_Addr)
			{
				Display_fif[i]=1<<i;	
			}
			DisBuff_WE[i]=Display_fif[i];
		}
	}
	else if(Dis_Mode==2)	 //对应两个起止位 位置闪烁
	{
		Flag_Once_Mode1=1;Flag_Once_Mode2=1;
		if(Flag_Once_Mode3==1)
		{
			for(i=0;i<=7;i++)
			{	
				Display_fif[i]=0<<i;
				DisBuff_WE[i]=1<<i;
			}	
		}
		Flag_Once_Mode3=0;
		for(i=0;i<=7;i++)
		{
			if(i!=Start_Addr && i!=Finishi_Addr )
			{
				Display_fif[i]=1<<i;
			}
			else	  
			{
				if(Display_fif[i])
					Display_fif[i]=0<<i;
				else
					Display_fif[i]=1<<i;	
			}
			DisBuff_WE[i]=Display_fif[i];
		}	
	}
	else{}		
}

LED灯

1. 头文件

#ifndef __LED_SET_H__
#define __LED_SET_H__

#include"main.h"

typedef struct
{
	uchar Mode_Switch_In;
	uint LED_SETTime_In;
	uchar PWM_Grade_In;
	uchar PWM_MAX_In;
} LED_InitTypeDef;

extern void Led_Set(uchar ch,uchar Mode); 
extern void LED_FreshMode_Set(LED_InitTypeDef *LED_Struct);
extern void LED_FreshMode(bit Flag_LED_PWMRun);
extern void LED_Handle_Pwm();


#endif

2. 源文件

/*************************************************************************
程序功能: --LED灯的驱动
	
编程人信息:
姓名:	Pandas
Email:	itworkstation@hotmail.com,需要辅助可以邮件@我哦
专业:	电子信息工程专业
**************************************************************************/
#include"LED_SET.h"
static uchar led_fif=0xff;		//led指示灯缓冲
uint LED_SETTime=100;//LED状态切换速度
uchar Mode_Switch=1;
uchar PWM_Grade=40; //LED高低电平切换等级
uchar LED_PWM_Grade_Max=49;
/*
*********************************************************************************************************
功能:设定对应的LED灯
参数:ch :选择某一个LED,1-8;或者全部:9   	   Mode:LED模式
*********************************************************************************************************
*/
void Led_Set(uchar ch,uchar Mode) 
{
	if(Mode==0)				   //关闭LED
	{
		switch(ch)
		{
			case 1:led_fif|=0x01;break;
			case 2:led_fif|=0x02;break;
			case 3:led_fif|=0x04;break;
			case 4:led_fif|=0x08;break;
			case 5:led_fif|=0x10;break;
			case 6:led_fif|=0x20;break;
			case 7:led_fif|=0x40;break;
			case 8:led_fif|=0x80;break;
			case 9:led_fif|=0xff;break;	//关闭全部
			default:break;
		}	
	}
	else if(Mode==1)				   //打开LED
	{
		switch(ch)
		{
			case 1:led_fif&=0xfe;break;
			case 2:led_fif&=0xfd;break;
			case 3:led_fif&=0xfb;break;
			case 4:led_fif&=0xf7;break;
			case 5:led_fif&=0xef;break;
			case 6:led_fif&=0xdf;break;
			case 7:led_fif&=0xbf;break;
			case 8:led_fif&=0x7f;break;
			case 9:led_fif&=0x00;break;	 //打开全部
			default:break;
		}		
	}
	else if(Mode==2)			   //LED闪烁
	{
		switch (ch)
		{
			case 1:if(led_fif&0x01){led_fif&=0xfe;}else{led_fif|=0x01;};break;
			case 2:if(led_fif&0x02){led_fif&=0xfd;}else{led_fif|=0x02;};break;
			case 3:if(led_fif&0x04){led_fif&=0xfb;}else{led_fif|=0x04;};break;
			case 4:if(led_fif&0x08){led_fif&=0xf7;}else{led_fif|=0x08;};break;
			case 5:if(led_fif&0x10){led_fif&=0xef;}else{led_fif|=0x10;};break;
			case 6:if(led_fif&0x20){led_fif&=0xdf;}else{led_fif|=0x20;};break;
			case 7:if(led_fif&0x40){led_fif&=0xbf;}else{led_fif|=0x40;};break;
			case 8:if(led_fif&0x80){led_fif&=0x7f;}else{led_fif|=0x80;};break;
			case 9:if(led_fif&0x80){led_fif&=0x00;}else{led_fif|=0xff;};break;		 //闪烁全部
			default:break;
		}
	}
	else{}
	LED_IO=led_fif;
	Enable_74HC138(LED_8_Select);
} 
void LED_FreshMode_Set(LED_InitTypeDef *LED_Struct)
{
	Mode_Switch=LED_Struct->Mode_Switch_In;
	LED_SETTime=LED_Struct->LED_SETTime_In;	
	PWM_Grade=LED_Struct->PWM_Grade_In;		
	LED_PWM_Grade_Max=LED_Struct->PWM_MAX_In;
}
void LED_FreshMode(bit Flag_LED_PWMRun)	 //	 LED_SETTime:1/100US
{
	static uint LED_Mode_Count=0,Led_Mode_TurnCount=0;
	uchar i=0;
	switch(Mode_Switch)						//语句用来计时,以控制状态改变					 
	{
		 case 0: 
		 		
				break;
		 case 1: 
		 		LED_Mode_Count++;
		 		if(LED_Mode_Count>=LED_SETTime)
				{
					LED_Mode_Count=0;
					Led_Mode_TurnCount++;
					if(Led_Mode_TurnCount>16)
						Led_Mode_TurnCount=1;					
				}
		 	break;
		 case 2:
		 	break;
		 default:break;
	}
	if(Flag_LED_PWMRun)		  //PWM 有效与否就像数码管一样,只是控制开关,不能改变其原有亮的状态,此为赋值方法		  
	{
		switch(Mode_Switch)											 
		{
			 case 0:
			 		 
					break;
			 case 1: 
					if(Led_Mode_TurnCount<9)
					{	
						for(i=1;i<=Led_Mode_TurnCount;i++)				
							Led_Set(i,State_ON);	
					}
					if((Led_Mode_TurnCount>=9)&&(Led_Mode_TurnCount<=16))
					{
						for(i=1;i<(17-Led_Mode_TurnCount);i++)	//从1到N 为亮			
							Led_Set(i,State_ON);
						for(i=8;i>=17-Led_Mode_TurnCount;i--)
							Led_Set(i,State_OFF);						
					}								
			 	break;
			 case 2:
			 	break;
			 default:break;
		}	
	}
	else
	{
		Led_Set(LED_Select_All,State_OFF);	
	}
}
bit Flag_LED_PWM=0;
void LED_Handle_Pwm()
{
	static uint LED_Grade_Time=0;
	if(LED_Grade_Time==0)	
		Flag_LED_PWM=1;
	if(LED_Grade_Time==PWM_Grade)	
		Flag_LED_PWM=0;
	if(LED_Grade_Time>LED_PWM_Grade_Max)
	{	
		Flag_LED_PWM=1;
		LED_Grade_Time=0;
	}
	LED_Grade_Time++;
	LED_FreshMode(Flag_LED_PWM);
}

独立按键

1. 头文件

#ifndef __KEY_DULI_TIME_H_
#define __KEY_DULI_TIME_H_

#include"main.h"

sbit Key_S7=P3^0;
sbit Key_S6=P3^1;
sbit Key_S5=P3^2;
sbit Key_S4=P3^3;

extern uchar Key_Scan();
extern void Key_Time();

#endif

2. 源文件

/*************************************************************************
程序功能: --独立按键的驱动
	
编程人信息:
姓名:	Pandas
Email:	itworkstation@hotmail.com
专业:	电子信息工程专业
**************************************************************************/
#include"Key_Duli_time.h"
uint xdata Key_T_Count=0; //按键按下长按计时
bit Key_Flag_Time=0;  //用于启动长按定时
#define KEY_TIME 500  //用于判定多久算长按
/******************************************
程序说明:
为了不影响其它IO口,所以没有进行整体P3口的读写操作
*******************************************/
uchar Key_Scan()
{
	uchar Key_Num=20;
	if(Key_S7==0)
	{
		Delay_ms(10);
		if(Key_S7==0)
		{
			Key_Num=0;	
			Key_T_Count=0;
		}	
		while(!Key_S7)
		{
			Key_Flag_Time=1;
			if(Key_T_Count>KEY_TIME)
			{
				break;
			}
		}
		goto Break;
	}
	if(Key_S6==0)
	{
		Delay_ms(10);
		if(Key_S6==0)
		{
			Key_Num=1;	
			Key_T_Count=0;
		}	
		while(!Key_S6)
		{
			Key_Flag_Time=1;
			if(Key_T_Count>KEY_TIME)
			{
				break;
			}
		}
		goto Break;
	}
	if(Key_S5==0)
	{
		Delay_ms(10);
		if(Key_S5==0)
		{
			Key_Num=2;	
			Key_T_Count=0;
		}	
		while(!Key_S5)
		{
			Key_Flag_Time=1;
			if(Key_T_Count>KEY_TIME)
			{
				break;
			}
		}
		goto Break;
	}
	if(Key_S4==0)
	{
		Delay_ms(10);
		if(Key_S4==0)
		{
			Key_Num=3;
			Key_T_Count=0;	
		}	
		while(!Key_S4)
		{
			Key_Flag_Time=1;
			if(Key_T_Count>KEY_TIME)
			{
				break;
			}
		}
		goto Break;
	}
Break:Key_Flag_Time=0;Key_T_Count=0;
	return  Key_Num;
}
void Key_Time()  //在定时器里调用即可
{
	if(Key_Flag_Time)
		Key_T_Count++;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值