找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1054|回复: 5
收起左侧

51单片机程序怎么让void main()里同时进行?

[复制链接]
ID:923529 发表于 2022-5-26 01:16 | 显示全部楼层 |阅读模式
代码如下,这是一个光立方的程序。第一层亮了有短暂的延迟第二层才亮,然后到第三次第四层,有没有什么办法让四层同时亮。

单片机源程序如下:
#include <reg52.h>
#define uchar unsigned char        
#define uint unsigned int         

sbit SH_CP1 = P1^0;                          //第一层引脚
sbit DS1 = P1^1;
sbit ST_CP1 = P1^2;

sbit SH_CP2 = P1^3;                          
sbit DS2 = P1^4;
sbit ST_CP2 = P1^5;         

sbit SH_CP3 = P1^6;                          //第二层引脚
sbit DS3 = P1^7;
sbit ST_CP3 = P2^0;

sbit SH_CP4 = P2^1;                          
sbit DS4 = P2^2;
sbit ST_CP4 = P2^3;         

sbit SH_CP5 = P2^4;                          //第三层引脚
sbit DS5 = P2^5;
sbit ST_CP5 = P2^6;

sbit SH_CP6 = P2^7;                          
sbit DS6 = P3^0;
sbit ST_CP6 = P3^1;         

sbit SH_CP7 = P3^2;                          //第四层引脚
sbit DS7 = P3^3;
sbit ST_CP7 = P3^4;

sbit SH_CP8 = P3^5;                          
sbit DS8 = P3^6;
sbit ST_CP8 = P3^7;         

uchar a1[] = {0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xff,};   //十六进制转二
uchar a2[] = {0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xff,};  
uchar b1[] = {0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xff,};   
uchar b2[] = {0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0x6f,0xff,};

void delay (uint x)
{
while(x--);
}                                                                 
void in595(uchar temp)
{
uchar i;
for(i = 0;i < 8;i ++)
{
temp <<= 1;

DS1 = CY;                  //第一层
DS2 = CY;
SH_CP1 = 0;
SH_CP2 = 0;
SH_CP1 = 1;
SH_CP2 = 1;
DS3 = CY;                  //第二层
DS4 = CY;
SH_CP3 = 0;
SH_CP4 = 0;
SH_CP3 = 1;
SH_CP4 = 1;
DS5 = CY;                  //第三层
DS6 = CY;
SH_CP5 = 0;
SH_CP6 = 0;
SH_CP5 = 1;
SH_CP6 = 1;
DS7 = CY;                  //第四层
DS8 = CY;
SH_CP7 = 0;
SH_CP8 = 0;
SH_CP7 = 1;
SH_CP8 = 1;
}
}
void out595()
{
ST_CP1 = 0;                                //第一层
ST_CP1 = 1;
ST_CP2 = 0;
ST_CP2 = 1;
ST_CP3 = 0;                                 //第二层
ST_CP3 = 1;
ST_CP4 = 0;        
ST_CP4 = 1;
ST_CP5 = 0;                                 //第三层
ST_CP5 = 1;
ST_CP6 = 0;
ST_CP6 = 1;
ST_CP7 = 0;                                 //第四层
ST_CP7 = 1;
ST_CP8 = 0;
ST_CP8 = 1;
}

void main ()
{
uchar i;
while(1)
{
for(i = 0;i < 8;i ++)
{
in595(~a1[ i]);                                                            //第一层前8个灯
ST_CP1 = 0;
ST_CP1 = 1;
in595(~a2[ i]);                                                      //第一层后8个灯
ST_CP2 = 0;
ST_CP2 = 1;        
in595(~b1[ i]);                                                          //第二层前8个灯                                         
ST_CP3 = 0;
ST_CP3 = 1;
in595(~b2[ i]);                                                     //第二层后8个灯
ST_CP4 = 0;
ST_CP4 = 1;        
in595(~b1[ i]);                                                          //第三层前8个灯        
ST_CP5 = 0;
ST_CP5 = 1;                                 
in595(~b2[ i]);                                                     //第三层后8个灯
ST_CP6 = 0;
ST_CP6 = 1;
in595(~a1[ i]);                                                            //第四层前8个灯
ST_CP7 = 0;
ST_CP7 = 1;
in595(~a2[ i]);                                                      //第四层后8个灯
ST_CP8 = 0;
ST_CP8 = 1;                                                
}
}
}
回复

使用道具 举报

ID:125436 发表于 2022-5-26 08:49 | 显示全部楼层
加个硬件电路电源控制
回复

使用道具 举报

ID:125436 发表于 2022-5-26 08:50 | 显示全部楼层
增加使能控制
回复

使用道具 举报

ID:161164 发表于 2022-5-26 11:09 | 显示全部楼层
既然DS和CP都是同一动作
为啥不直接用两根IO并联8个595各自的DS和CP脚?
回复

使用道具 举报

ID:923529 发表于 2022-5-26 12:52 | 显示全部楼层
lkc8210 发表于 2022-5-26 11:09
既然DS和CP都是同一动作
为啥不直接用两根IO并联8个595各自的DS和CP脚?

后面还有添加别的效果
回复

使用道具 举报

ID:230742 发表于 2022-5-26 14:56 | 显示全部楼层
建议还是换一种思路吧。595是可以级联的。计算好发送数据的顺序就好。
不要质疑595的刷新速度,绝对比眼睛快。
多搜索看看广告牌的驱动电路图。很多用595的。
http://www.51hei.com/bbs/dpj-219890-1.html
参考一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表