电路原理
二极管两端有正向电位差就会发光
加上串口通信的芯片
两个芯片级联在一起,允许输入输出的引脚由共同的io口控制,还有两个清除数据和失效的引脚保持工作的状态,数据从第一个芯片的15脚输入。
代码
#include <reg52.h>
sbit DIO = P3^4; //串行数据口
sbit S_CLK = P3^5;//移位寄存器时钟
sbit R_CLK = P3^6;//输出锁存器时钟
void main()
{
//ROW 0x80 , COL 0xfe
unsigned char i, dat;//i循环次数 dat需要发送的数据
dat = 0xfe;//发送列值
for(i=0; i<8; i++)//循环8次
{
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
if(dat & 0x01)//发送1
DIO = 1;
else //发送0
DIO = 0;
S_CLK = 1;//拉高移位寄存器时钟,数据移位
dat >>= 1;//数据右移
}
dat = 0x80;//发送行值
for(i=0; i<8; i++)//循环8次
{
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
if(dat & 0x01)//发送1
DIO = 1;
else //发送0
DIO = 0;
S_CLK = 1;//拉高移位寄存器时钟,数据移位
dat >>= 1;//数据右移
}
R_CLK = 1;//拉高输出锁存器时钟,并行输出数据
while(1);
}
上面那个芯片对应阴极,下面的对应阳极(点阵模块原理图没给,反推出来的),上面的代码的功能是点亮一个点,然后因为模块内部结构位置,所以不清楚是那个点。
再看一个例子:
#include <reg52.h>
#include <intrins.h> //循环右移头文件
sbit DIO = P3^4; //串行数据口
sbit S_CLK = P3^5;//移位寄存器时钟
sbit R_CLK = P3^6;//输出锁存器时钟
/*点阵字形码*/
unsigned char code tabel[2][8]={
//8次,可以得出每行或列的点亮情况,所以可以覆盖所有情况
0xE0,0xEE,0x01,0x6D,0x01,0x6D,0x01,0xEF,//电
0xE7,0xF7,0xF7,0xF7,0x80,0xF7,0xFB,0xC3//子
};
/*595发送一字节*/
void Send_Byte(unsigned char dat)
{
unsigned char i; //循环次数变量
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
for(i=0; i<8; i++) //循环8次
{
if(dat & 0x01)//发送1
DIO = 1;
else //发送0
DIO = 0;
dat >>= 1;//数据右移
S_CLK = 1;//拉高移位寄存器时钟,数据移位
S_CLK = 0;//拉低移位寄存器时钟
}
}
void main()
{
unsigned char j, k, ROW;//j发送8列和8行字形码,k字符数量,ROW行值
unsigned int z; //动态扫描延时变量
while(1)
{
for(k=0; k<2; k++)//k 需要显示的字符数量
{
for(z=0; z<1000; z++)//z刷新次数,显示1000次”电“再显示”子“
{
ROW = 0x80;//行选初值
for(j=0; j<8; j++) //循环8次发送行和列值
{
Send_Byte(tabel[k][j]);//发送列选值
Send_Byte(ROW); //发送行选值
R_CLK = 1; //拉高输出锁存器,把移位寄存器中数据输出
R_CLK = 0; //拉低输出锁存器
ROW = _cror_(ROW, 1);//右移,选择下一行
}
}
}
}
}