单片机驱动74HC595做行控制,74HC154做列控制。
74HC595说明:一个串行输入,并行输出的芯片
引脚12:寄存器时钟 RCK (REGISTER CLOCK)
引脚14:数据串行输入引脚DS (DATA SERIAL)
引脚11:数据输入时钟,在上升沿给数据到14引脚(SERIAL CLOCK)。
例如送一个八位的数据,00110011 ,先送高位,后送低位。
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
11↑ | 0 | 11↑ | 0 | 11↑ | 0 | 11↑ | 0 |
| 0 | 0 | 0 | ||||
|
| 1 | 1 | ||||
|
|
| 1 | ||||
|
|
|
| ||||
|
|
|
| ||||
|
|
|
| ||||
|
|
|
|
11↑ | 0 | 11↑ | 0 | 11↑ | 0 | 11↑ | 0 |
0 | 0 | 0 | 0 | ||||
1 | 1 | 1 | 1 | ||||
1 | 1 | 1 | 1 | ||||
0 | 0 | 0 | 0 | ||||
| 0 | 0 | 0 | ||||
|
| 1 | 1 | ||||
|
|
| 1 |
这个时候,数据已经在数据寄存器中安顿好了,这个时候根据74HC595特性,在寄存器时钟引脚进行下降沿将其并行送出。
14↓
这个时候就把数据从并行口送出了,并行口就有数据了(Q7高位 Q0低位)。
此时A0 – A7 就有数据了 00110011输出。
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
但是如果想级联呢?
将第一个的Q7’引脚接下一个级联的DS 串行数据输入引脚。
如果说我们在上面描述的00110011 在传送一个 11001100 呢?
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
第二个74HC595 | 11↑ | 11↑ | 11↑ | 11↑ | 11↑ | 11↑ | 11↑ | 11↑ | 0 | |||||||
0 | 0 | |||||||||||||||
0 | 0 | 1 | ||||||||||||||
0 | 0 | 1 | 1 | |||||||||||||
0 | 0 | 1 | 1 | 0 | ||||||||||||
0 | 0 | 1 | 1 | 0 | 0 | |||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 1 | ||||||||||
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | |||||||||
Q7'---DS | ||||||||||||||||
第一个74HC595 | 11↑ | 0 | 11↑ | 1 | 11↑ | 1 | 11↑ | 0 | 11↑ | 0 | 11↑ | 1 | 11↑ | 1 | 11↑ | 1 |
1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | |||||||||
1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | |||||||||
0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | |||||||||
0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | |||||||||
1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | |||||||||
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | |||||||||
1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | |||||||||
DS(数据串行输入引脚) |
此时所有数据已经就位,在在寄存器时钟上来一个下降沿,这16位数据就被送出去了。
如果在级联一个74HC595呢?电路上Q7’连接下一个595的DS数据继续串行输入,直到你的数据给级联的74HC595都吃饱了在进行14引脚的下降沿,将吃进去的数据并行吐出来。
A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
点阵的行列连接方式
级联了4个 16*16
列驱动选择的74HC154,相当于4-16译码器,它在电路中的主要作用就是从Y0-Y15 ,不停的挨个给每个16*16同时一个列低电平,速度加快,因为行已经把数据送到位了,就看到了整体的一个字了。
74HC154 逻辑图
154电路图
电路整体如下图
字模软件,可以自己研究一下取模,研究多了就有经验了~
程序如下:
#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit si=P3^0; //数据线 74hc595的14管脚
sbit rck=P3^2; //输出储存器锁存时钟线 74hc595的12管脚
sbit sck=P3^1; //数据输入时钟线 74hc595的11管脚
unsigned char code tt1[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x08,0x40,0x44,0x22,0x82,0x14,0x41,0x08,0x3F,0xF4,0x80,0x02,0x43,0xC8,0x32,0x48,
0x0F,0xFF,0x02,0x48,0x02,0x48,0xFF,0xFF,0x12,0x48,0x22,0x78,0x1E,0x00,0x00,0x00,/*" ",2*/
0x08,0x40,0x44,0x22,0x82,0x14,0x41,0x08,0x3F,0xF4,0x80,0x02,0x43,0xC8,0x32,0x48,
0x0F,0xFF,0x02,0x48,0x02,0x48,0xFF,0xFF,0x12,0x48,0x22,0x78,0x1E,0x00,0x00,0x00,/*" ",3*/
0x80,0x00,0x60,0x02,0x1F,0xC2,0x00,0x4A,0x00,0x52,0x00,0x42,0x00,0x7E,0x00,0x42,
0x00,0x42,0x00,0x7E,0x00,0x42,0x00,0x52,0x00,0x4A,0x00,0x42,0x00,0x40,0x00,0x00,/*" ",4*/
0x80,0x00,0x60,0x02,0x1F,0xC2,0x00,0x4A,0x00,0x52,0x00,0x42,0x00,0x7E,0x00,0x42,
0x00,0x42,0x00,0x7E,0x00,0x42,0x00,0x52,0x00,0x4A,0x00,0x42,0x00,0x40,0x00,0x00,/*" ",5*/
0x00,0x80,0x41,0x64,0x21,0x2C,0x91,0x34,0x89,0x24,0x87,0x24,0x4D,0xEC,0x55,0x32,
0x25,0x22,0x25,0x22,0x55,0x32,0x4D,0x2E,0x81,0x23,0x80,0xA2,0x80,0x60,0x00,0x00,/*" ",6*/
0x00,0x00,0x0F,0xFC,0x04,0x04,0x04,0x04,0x0F,0xFC,0x00,0x20,0x30,0x10,0x48,0x4C,
0x44,0x4B,0x42,0x48,0x42,0x48,0x41,0x48,0x40,0xC8,0x40,0x08,0x70,0x08,0x00,0x00,/*" ",7*/
0x80,0x00,0x81,0x00,0x40,0xC0,0x20,0x38,0x10,0x00,0x0C,0x00,0x03,0x00,0x00,0xFF,
0x03,0x00,0x0C,0x00,0x10,0x40,0x20,0x20,0x40,0x18,0x80,0x00,0x80,0x00,0x00,0x00,/*" ",8*/
0x80,0x10,0x40,0x10,0x20,0x10,0x18,0x10,0x06,0x10,0x41,0xFF,0x20,0x10,0x10,0x10,
0x3F,0xF0,0x44,0x10,0x42,0x11,0x41,0x16,0x40,0xD0,0x40,0x10,0x78,0x10,0x00,0x00,/*" ",9*/
0x44,0x00,0x44,0x00,0x24,0x00,0x25,0xFE,0x14,0x92,0x0C,0x92,0x04,0x92,0xFF,0xFE,
0x04,0x92,0x0C,0x92,0x14,0x92,0x25,0xFE,0x24,0x00,0x44,0x00,0x44,0x00,0x00,0x00,/*" ",10*/
0x00,0x00,0x00,0x00,0x58,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*",",11*/
0x02,0x10,0x42,0x10,0x81,0x10,0x7F,0xFF,0x00,0x90,0x40,0x40,0x40,0x10,0x41,0x90,
0x5E,0x10,0x40,0x11,0x40,0x16,0x70,0x10,0x4E,0x10,0x41,0xD0,0x40,0x10,0x00,0x00,/*" ",12*/
0x22,0x20,0x67,0x30,0x22,0xAC,0x12,0x63,0x12,0x20,0x12,0x18,0x40,0x00,0x40,0x04,
0x40,0x04,0x40,0x04,0x7F,0xFC,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x00,0x00,0x00,/*" ",13*/
0x00,0x20,0x00,0x10,0x3F,0xE8,0x42,0x24,0x42,0x27,0x42,0x24,0x42,0x24,0x43,0xE4,
0x42,0x24,0x42,0x34,0x42,0x2C,0x42,0x20,0x43,0xE0,0x40,0x00,0x78,0x00,0x00,0x00,/*" ",14*/
0x00,0x00,0x7F,0xF8,0x21,0x0C,0x21,0x0B,0x21,0x08,0x21,0x08,0x7F,0xF8,0x00,0x40,
0x00,0x30,0x00,0x8F,0x43,0x08,0x80,0x08,0x40,0x08,0x3F,0xF8,0x00,0x00,0x00,0x00,/*" ",15*/
0x00,0x80,0x00,0x60,0xFF,0xF8,0x00,0x07,0x80,0x00,0x83,0xFA,0x46,0x4A,0x2A,0x4A,
0x12,0x4A,0x2F,0xFE,0x42,0x4A,0x42,0x4A,0x82,0x4A,0x83,0xFA,0x80,0x02,0x00,0x00,/*" ",16*/
0x00,0x80,0x00,0x60,0xFF,0xF8,0x00,0x07,0x80,0x00,0x83,0xFA,0x46,0x4A,0x2A,0x4A,
0x12,0x4A,0x2F,0xFE,0x42,0x4A,0x42,0x4A,0x82,0x4A,0x83,0xFA,0x80,0x02,0x00,0x00,/*" ",17*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",18*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",19*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",1*/
};
unsigned char code taba[16]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,};//列扫描显示编码
void delay(unsigned int p)
{
unsigned char i;
while(p--)
{
for(i=110;i>0;i--);
}
}
void sendHC595Byte(uchar pp)
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
if(pp&0x80)
{
si=1;
}
else
{
si=0;
}
sck=1;
pp<<=1;
}
}
void sendHC154(uint i)
{
P1 = i;
}
void main()
{
uchar i;
uint k,m,n;
char j;
m = sizeof(tt1);
while(1)
{
for(k=0;k<m;k=k+2) // 动态选择控制数据
{
for(n=0;n<1;n++) // 控制速度
{
for(i=0;i<16;i++) // 一次出16个数据
{
for(j=3;j>=0;j--) // 多少个16*16点阵块
{
sendHC595Byte(tt1[(32*j+2*i+k)%m]);
sendHC595Byte(tt1[(32*j+2*i+k+1)%m]);
}
sendHC154(taba[i]);
rck=1;
_nop_();
rck=0;
}
}
}
}
}