微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第18节:把74HC595驱动程序翻译成类似单片机IO口直接驱动的方

第18节:把74HC595驱动程序翻译成类似单片机IO口直接驱动的方

时间:11-22 来源:互联网 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top