38译码器的驱动设计
1. 头文件
#ifndef __ENABLE_138_H_
#define __ENABLE_138_H_
#include"main.h"
extern void Enable_74HC138(uchar ch);
#endif
2. 源文件
#include"Enable_138.h"
void Enable_74HC138(uchar ch)
{
GPIO_74HC138=(GPIO_74HC138&0x1f)|(ch<<5);
_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 *p);
extern void Display_ChooseMode(uchar Dis_Mode,uchar Start_Addr,uchar Finishi_Addr);
#endif
2. 源文件
#include"Led_7seg.h"
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff,
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
};
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 *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. 源文件
#include"LED_SET.h"
static uchar led_fif=0xff;
uint LED_SETTime=100;
uchar Mode_Switch=1;
uchar PWM_Grade=40;
uchar LED_PWM_Grade_Max=49;
void Led_Set(uchar ch,uchar Mode)
{
if(Mode==0)
{
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)
{
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)
{
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)
{
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)
{
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++)
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. 源文件
#include"Key_Duli_time.h"
uint xdata Key_T_Count=0;
bit Key_Flag_Time=0;
#define KEY_TIME 500
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++;
}