
40个LED其实可以把LED做成矩阵方式连接,就没必要用5片595驱动了啊,你这样感觉硬件电路有点累赘。不过呢你这样做呢程序简单点,是吧。
手上只有2片联级使用的,给你个参考吧,有问题再说
//
//写595两个字节
行数据
//data_A为高字节,data_B是低字节
void
WRITER_595A(data_A,data_B)
{
uint
i,n;
//
data1=datt;
//赋值显示数据
for(i=0;i<8;i++)
//写入第一字节
{
n=data_A
&
0x80;
if(n==0x80)
LS595_DATA_A=1;
else
LS595_DATA_A=0;
LS595_CLOK_A=0;
LS595_CLOK_A=1;
data_A=data_A<<1;
}
for(i=0;i<8;i++)
//写入第二字节
{
n=data_B
&
0x80;
if(n==0x80)
LS595_DATA_A=1;
else
LS595_DATA_A=0;
LS595_CLOK_A=0;
LS595_CLOK_A=1;
data_B=data_B<<1;
}
LS595_SCLK_A=0;
LS595_SCLK_A=1;
LS595_SCLK_A=0;
}
sbit _LCLK = LCLK;
sbit _SCLK = SCLK;
sbit _DATA = DATA;
/
函数功能:向一片595发送数据
输入参数:数据的地址
输出参数:无
/
void Send595(UCHAR pdat)
{
unsigned char i,j;
j=0x80;
for (i=0;i<8;i++)
{
if((pdat)&j) _DATA = 1;
else _DATA = 0;
_SCLK = 0;
_SCLK = 1;
j>>=1;
}
}
/
函数功能:串行静态显示函数
输入参数:显存的地址
输出参数:无
/
code UCHAR DisplayHex[]={0xC0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
};
void DisplayBy595(UCHAR pdat)
{
UCHAR i;
for(i=0;i<4;i++)
{
Send595(&DisplayHex[(pdat+i)]);
}
_LCLK=0;
_LCLK=1;
}
//
/数字电子钟/
//
#include<reg51h>
#define uchar unsigned char
#define uint unsigned int
sbit qingling=P1^0; //清零
sbit tiaofen=P1^1; //调分
sbit tiaoshi=P1^2; //调时
sbit sounder=P1^7; //naozhong
sbit ds = P3^5; // 595
sbit st_cp = P3^7;
sbit sh_cp = P3^4;
uint a,b;
uchar hour,minu,sec, //时钟
hour0,minu0,sec0, //秒表
hour1,minu1,sec1;
h1,h2,m1,m2,s1,s2,//显示位
k,s; //状态转换标志
uchar j,datah,datal;
uchar code select[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/函数声明/
void keyscan();
void init();
void delay(uchar z);
void display(uchar,uchar,uchar);
void sounde();
void disp595();
/主函数/
void main()
{
init();
while(1)
{
while(TR1)
{
keyscan(); //扫描函数
while(s==1) //s是状态标志,当s=0时,闹钟取消。s=1时,设定闹钟时间
{ //s=2时,闹钟工作,时间与设定时刻一致时,闹钟响
keyscan(); //s状态切换(0-》1-》2-》0)通过外部中断1实现。
display(hour1,minu1,sec1); //闹钟时刻显示
}
display(hour0,minu0,sec0);//时钟表显示
while(k) /k是秒表状态(0-》1-》2-》0)通过外部中断0实现。/
{
display(hour,minu,sec); //秒表显示
}
}
}
}
/初始化函数/
void init()
{
a=0;
b=0;
k=0;
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=0;
sec=0;
hour1=0;
minu1=0;
sec1=0;
TMOD=0x11; //定时器0,1工作于方式1;赋初值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
EX0=1; //秒表中断
EX1=1; //闹钟设定中断
ET0=1;
ET1=1;
IT0=1; //边沿触发方式
IT1=1;
PX0=1;
PX1=1;
TR0=0; //初始,秒表不工作
TR1=1; //时钟一开始工作
}
/定时器0中断/
void timer0_int() interrupt 1 //秒表
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
a++;
if(a==2)
{
a=0;
sec++;
if(sec==100)
{
sec=0; //毫秒级
minu++;
if(minu==60)
{
minu=0; //秒
hour++;
if(hour==60) //分
{
hour=0;
}
}
}
}
}
/外部中断0中断函数/
void ex0_int() interrupt 0
{
k++;
if(k==3)
k=0;
if(k==1)
{
TR0=~TR0;
if(TR0==1)
{
hour=0;
minu=0;
sec=0;
}
}
if(k==2)
{
TR0=~TR0;
}
}
/外部中断1中断函数/
void ex1_int() interrupt 2
{
s++;
if(s==3)
s=0;
}
/定时器1中断/
void timer1_int() interrupt 3 //控制时钟工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0 && minu0==minu1)
sounde();
}
b++;
if(b==20)
{
b=0;
sec0++;
if(sec0==60)
{
sec0=0;
minu0++;
if(minu0==60)
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/键盘扫描/
void keyscan()
{
if(s==1)
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec1=0;
minu1=0;
hour1=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu1++;
if(minu1==60)
{
minu1=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour1++;
if(hour1==24)
{
hour1=0;
}
while(!tiaoshi);
}
}
else //调整时钟时间
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec0=0;
minu0=0;
hour0=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu0++;
if(minu0==60)
{
minu0=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
}
while(!tiaoshi);
}
}
}
/显示函数/
void display(uchar hour,uchar minu,uchar sec)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=sec%10;
datah=table[h1];
datal=select[7];
disp595();
delay(5);
datah=table[h2];
datal=select[6];
disp595();
delay(5);
datah=0x40;
datal=select[5];
disp595();
delay(5);
datah=table[m1];
datal=select[4];
disp595();
delay(5);
datah=table[m2];
datal=select[3];
disp595();
delay(5);
datah=0x40;
datal=select[2];
disp595();
delay(5);
datah=table[s1];
datal=select[1];
disp595();
delay(5);
datah=table[s2];
datal=select[0];
disp595();
delay(5);
}
/disp595()函数/
void disp595()
{
for(j=0;j<8;j++)
{
sh_cp=0;
datal<<=1;
ds=CY;
sh_cp=1;//sh_cp上升沿 移位
}
for(j=0;j<8;j++)
{
sh_cp=0;
datah<<=1;
ds=CY;
sh_cp=1;//sh_cp上升沿 移位
}
st_cp=0;
st_cp=1;//st_cp上升沿 存储
}
/闹钟函数/
void sounde()
{
sounder=~sounder;
}
/延时函数/
void delay(uchar z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
以上就是关于求一个C语言程序,5个74hc595级联驱动40个LED跑马灯的简易程序全部的内容,包括:求一个C语言程序,5个74hc595级联驱动40个LED跑马灯的简易程序、74HC595咋编程控制、急求一个用AT89C52控制,2个4位数码管(用74HC595驱动)显示的简易时分秒的电子钟。需要c语言程序。附图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)