如果是16个74ls595那是不是直接输入16个字节就行?大概写了个程序如下 (测试点亮 一个点)
#include "reg51.h" //此文件中定义了
单片机的一些特殊功能寄存器
#include "intrins.h"
#define uchar unsigned char
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
//--定义使用的IO口--//
sbit shineng=P1^0;
sbit Adate=P1^1;
sbit Bdate=P1^2;
sbit SRCLK=P1^3; //输入数据移位时钟
sbit RCLK=P1^4; //储存寄存器的时钟
sbit SER=P1^5;
uchar display_mode=0;
uchar temp;
uchar code DAT[8]={0x55};
//sbit SRCLK=P3^6;
//sbit RCLK=P3^5;
//sbit SER=P3^4;
//定义LED点阵的位选,也就是类似于数码管的位选,因为要对其动态扫描操作
//数组前16位和后16位数据正好是相反的,也就是说先让第3个595输出低电平,然后再让第4个595输出低电平
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4)
* 函数功能 : 通过595发送四个字节的数据
* 输 入 : dat1:第4个595输出数值
* * dat2: 第3个595输出数值
* * dat3:第2个595输出数值
* * dat4:第1个595输出数值
* 输 出 : 无
*******************************************************************************/
void Hc595SendByte(u8 dat1,u8 dat2,u8 dat3,u8 dat4,u8 dat5,u8 dat6,u8 dat7,u8 dat8,
u8 dat9,u8 dat10,u8 dat11,u8 dat12,u8 dat13,u8 dat14,u8 dat15,u8 dat16)
{
u8 a;
SRCLK = 1;
RCLK = 1;
for(a=0;a<8;a++) //发送8位数
{
SER = dat1 >> 7; //从最高位开始发送
dat1 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat2 >> 7; //从最高位开始发送
dat2 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat3 >> 7; //从最高位开始发送
dat3 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat4 >> 7; //从最高位开始发送
dat4 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat5 >> 7; //从最高位开始发送
dat5 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat6 >> 7; //从最高位开始发送
dat6 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat7 >> 7; //从最高位开始发送
dat7 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat8 >> 7; //从最高位开始发送
dat8 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat9 >> 7; //从最高位开始发送
dat9 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat10 >> 7; //从最高位开始发送
dat10 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat11 >> 7; //从最高位开始发送
dat11 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat12 >> 7; //从最高位开始发送
dat12 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat13 >> 7; //从最高位开始发送
dat13 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat14 >> 7; //从最高位开始发送
dat14 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat15 >> 7; //从最高位开始发送
dat15 <<= 1; //发送时序
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
for(a=0;a<8;a++) //发送8位数
{
SER = dat16 >> 7; //从最高位开始发送
dat16 <<= 1;
SRCLK = 0; //发送时序
_nop_();
_nop_();
SRCLK = 1;
}
RCLK = 0;
_nop_();
_nop_();
RCLK = 1;
}
void hangxian(u8 mode)
{
switch(mode)
{
case 0:
Adate=1;
Bdate=1;
break;
case 1:
Adate=0;
Bdate=1;
break;
case 2:
Adate=1;
Bdate=0;
break;
case 3:
Adate=0;
Bdate=0;
break;
default: break;
}
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u8 i;
shineng=1;
Adate=1;
Bdate=1;
while(1)
{
for(i=0;i<4;i++)
{
Hc595SendByte(0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe);
hangxian(i);
delay(1);
}
}
}
-
-
P10 32X 16点阵单元板原理图.pdf
下载积分: 积分 -1 分
765.75 KB, 下载次数: 5, 下载积分: 积分 -1 分
怀疑原理图是这个
一周热门 更多>