第18节:把74HC595驱动程序翻译成类似单片机IO口直接驱动的方
ucLedStatus16_09=ucLedStatus16_09|0x04;
}
else
{
ucLedStatus16_09=ucLedStatus16_09&0xfb;
}
if(ucLed_dr12==1)
{
ucLedStatus16_09=ucLedStatus16_09|0x08;
}
else
{
ucLedStatus16_09=ucLedStatus16_09&0xf7;
}
if(ucLed_dr13==1)
{
ucLedStatus16_09=ucLedStatus16_09|0x10;
}
else
{
ucLedStatus16_09=ucLedStatus16_09&0xef;
}
if(ucLed_dr14==1)
{
ucLedStatus16_09=ucLedStatus16_09|0x20;
}
else
{
ucLedStatus16_09=ucLedStatus16_09&0xdf;
}
if(ucLed_dr15==1)
{
ucLedStatus16_09=ucLedStatus16_09|0x40;
}
else
{
ucLedStatus16_09=ucLedStatus16_09&0xbf;
}
if(ucLed_dr16==1)
{
ucLedStatus16_09=ucLedStatus16_09|0x80;
}
else
{
ucLedStatus16_09=ucLedStatus16_09&0x7f;
}
hc595_drive(ucLedStatus16_09,ucLedStatus08_01); //74HC595底层驱动函数
}
}
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
{
unsigned char i;
unsigned char ucTempData;
hc595_sh_dr=0;
hc595_st_dr=0;
ucTempData=ucLedStatusTemp16_09; //先送高8位
for(i=0;i<8;i++)
{
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(15);
hc595_sh_dr=1;
delay_short(15);
ucTempData=ucTempData<1;
}
ucTempData=ucLedStatusTemp08_01; //再先送低8位
for(i=0;i<8;i++)
{
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(15);
hc595_sh_dr=1;
delay_short(15);
ucTempData=ucTempData<1;
}
hc595_st_dr=0; //ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
delay_short(15);
hc595_st_dr=1;
delay_short(15);
hc595_sh_dr=0; //拉低,抗干扰就增强
hc595_st_dr=0;
hc595_ds_dr=0;
}
void led_flicker() ////第三区 LED闪烁应用程序
{
switch(ucLedStep)
{
case 0:
if(uiTimeCnt>=const_time_level) //时间到
{
uiTimeCnt=0; //时间计数器清零
ucLed_dr1=1; //每个变量都代表一个LED灯的状态
ucLed_dr2=0;
ucLed_dr3=1;
ucLed_dr4=0;
ucLed_dr5=1;
ucLed_dr6=0;
ucLed_dr7=1;
ucLed_dr8=0;
ucLed_dr9=1;
ucLed_dr10=0;
ucLed_dr11=1;
ucLed_dr12=0;
ucLed_dr13=1;
ucLed_dr14=0;
ucLed_dr15=1;
ucLed_dr16=0;
ucLed_update=1; //更新显示
ucLedStep=1; //切换到下一个步骤
}
break;
case 1:
if(uiTimeCnt>=const_time_level) //时间到
{
uiTimeCnt=0; //时间计数器清零
ucLed_dr1=0; //每个变量都代表一个LED灯的状态
ucLed_dr2=1;
ucLed_dr3=0;
ucLed_dr4=1;
ucLed_dr5=0;
ucLed_dr6=1;
ucLed_dr7=0;
ucLed_dr8=1;
ucLed_dr9=0;
ucLed_dr10=1;
ucLed_dr11=0;
ucLed_dr12=1;
ucLed_dr13=0;
ucLed_dr14=1;
ucLed_dr15=0;
ucLed_dr16=1;
ucLed_update=1; //更新显示
ucLedStep=0; //返回到上一个步骤
}
break;
}
}
void T0_time() interrupt 1
{
TF0=0; //清除中断标志
TR0=0; //关中断
if(uiTimeCnt<0xffff) //设定这个条件,防止uiTimeCnt超范围。
{
uiTimeCnt++; //累加定时中断的次数,
}
TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1; //开中断
}
void delay_short(unsigned int uiDelayShort)
{
unsigned int i;
for(i=0;i { ; //一个分号相当于执行一条空语句 } } void delay_long(unsigned int uiDelayLong) { unsigned int i; unsigned int j; for(i=0;i { for(j=0;j<500;j++) //内嵌循环的空指令数量 { ; //一个分号相当于执行一条空语句 } } } void initial_myself() //第一区 初始化单片机 { TMOD=0x01; //设置定时器0为工作方式1 TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f TL0=0x2f; } void initial_peripheral() //第二区 初始化外围 { EA=1; //开总中断 ET0=1; //允许定时中断 T
74HC595驱动程序单片机IO口直接驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)