8X8 LED阵列的驱动方法
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8X8 LED 阵列的驱动方法
驱动方法概述: 采用两片 HC595(串并转换器) ,一片控制 LED 阵列的行,一片控制 LED 阵列的列。 使用单片机的定时器中断机制对 LED 阵列进行动态扫描驱动。配以相应的字模,实现字符 的显示。由于 8X8 点阵数不足,因此不能显示汉字。
以上图示为 LED 阵列的 IO 定义。行控制为高电平使能,列控制为低电平使能,确定了 要点亮的位置(X,Y) ,则需要将行控制上的第 Y 位置高,列控制上的第 X 位置低。如果要 将某一行上的两个点(X1,Y) (X2,Y)同时点亮,需要让行控制上的第 Y 位置高,列控制上的 每 X1,X2 位都置低。在编程上置高或置低某一个位,可以使用位的与或操作。
//输出使能关闭 //数据时钟端置高 //8 位串行输出
SC_1=1; } LC_1=1; LC_1=0; LC_1=1; OE_1=0; }
//时钟信号控制移位寄存器移位
//锁存时钟沿信号,数据被锁住 //输出使能打开
点亮(X,Y)位置的一个点: 点亮一个点的方法上面已有介绍,只要向两片 HC595 写入根据点亮位置编码后的字节就可 以了。以下列出点亮的函数: void SetLED_XY(unsigned char x,unsigned char y) { SetValue_595_1((0x01<<y)); SetValue_595_2(~(0x01<<x)); }
GoIt(0,1,RIGHT,6,20000); GoIt(6,0,DOWN,5,20000); GoIt(6,6,LEFT,5,20000); GoIt(1,6,UP,4,20000);
GoIt(1,2,RIGHT,4,20000); GoIt(5,2,DOWN,3,20000); GoIt(5,5,LEFT,3,20000); GoIt(2,5,UP,2,20000);
在 LED 阵列的驱动中主要使用到了以上介绍到的几个端口。
单片机向 HC595 写字节的程序: 以下为一片 HC595 的驱动代码,驱动中有两片 HC595,另一片同理。 void Reset_595_1() //复位 HC595,QA~QH 为 00000000 { RESET_1=0; RESET_1=1; OE_1=0; }
{0xFF,0x03,0x03,0x7F,0xC0,0xC0,0xC3,0x7E},/*"5",0*/ {0x78,0x0C,0x06,0x7F,0xC3,0xC3,0xC3,0x7E},/*"6",0*/ {0xFF,0xC0,0xC0,0x60,0x30,0x18,0x0C,0x0C},/*"7",0*/ {0x7E,0xC3,0xC3,0x7E,0xC3,0xC3,0xC3,0x7E},/*"8",0*/ {0x7E,0xC3,0xC3,0xC3,0xFE,0x60,0x30,0x1E},/*"9",0*/ {0x00,0x00,0x0C,0x0C,0x00,0x00,0x0C,0x0C},/*":",0*/ {0x00,0x00,0x0C,0x0C,0x00,0x00,0x0C,0x0C},/*";",0*/ {0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30},/*"<",0*/ {0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00},/*"=",0*/ {0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C},/*">",0*/ {0x7E,0xC3,0xC0,0x70,0x18,0x18,0x00,0x18},/*"?",0*/ {0x7E,0x81,0xF1,0xD9,0xD9,0xF1,0x01,0x7E},/*"@",0*/ {0x3C,0x66,0xC3,0xC3,0xFF,0xC3,0xC3,0xC3},/*"A",0*/ {0x3F,0x63,0x63,0x3F,0x63,0xC3,0xC3,0x7F},/*"B",0*/ {0x7C,0xC6,0x03,0x03,0x03,0x03,0xC6,0x7C},/*"C",0*/ {0x3F,0x63,0xC3,0xC3,0xC3,0xC3,0x63,0x3F},/*"D",0*/ {0xFE,0x06,0x06,0x7E,0x06,0x06,0x06,0xFE},/*"E",0*/ {0xFE,0x06,0x06,0x7E,0x06,0x06,0x06,0x06},/*"F",0*/ {0x7C,0xC6,0x03,0x03,0xE3,0xC3,0xC6,0xBC},/*"G",0*/ {0xC3,0xC3,0xC3,0xFF,0xC3,0xC3,0xC3,0xC3},/*"H",0*/ {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x7E},/*"I",0*/ {0x60,0x60,0x60,0x60,0x63,0x63,0x63,0x3E},/*"J",0*/ {0xC3,0x63,0x33,0x1B,0x1F,0x33,0x63,0xC3},/*"K",0*/ {0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFE},/*"L",0*/ {0x01,0x83,0xC7,0xAB,0x93,0x93,0x83,0x83},/*"M",0*/ {0xC7,0xC7,0xCB,0xDB,0xD3,0xE3,0xC3,0xC3},/*"N",0*/ {0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0x66,0x3C},/*"O",0*/ {0x7F,0xC3,0xC3,0xC3,0x7F,0x03,0x03,0x03},/*"P",0*/ {0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xD6,0x7C},/*"Q",0*/ {0x7F,0xC3,0xC3,0x63,0x3F,0x63,0xC3,0xC3},/*"R",0*/
//RESET 端的沿信号 //输出使能打开
void SetValue_595_1(unsigned char x) //向 HC595 写入一个字节,QH~QA 为写入的字节 { unsigned char i; OE_1=1; SC_1=1; for(i=0;i<8;i++) { A_1=((x<<i)&0x80); SC_1=0;
5、取第二行,对应字模数据中的第二个数 0X1E,取反,写入,使能第二行,依以过程, 八次后,就将字模写在 LED 阵列上。
在用单片机进行实现的时候,使用定时器中断,定时对 LED 阵列进行扫描,定时时间很短 到,以使眼睛察觉不到扫描的过程,于是一个字符就出现在了 LED 阵列上。
具体的实现如下: unsigned char code zimo[][8]= { {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ {0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x18},/*"!",0*/ {0x66,0x66,0x44,0x00,0x00,0x00,0x00,0x00},/*""",0*/ {0x44,0x44,0xFF,0x44,0x44,0xFF,0x44,0x44},/*"#",0*/ {0x83,0xC6,0x7C,0xC6,0xC6,0x7C,0xC6,0x83},/*"$",0*/ {0x86,0xC9,0x66,0x30,0x18,0xCC,0x26,0xC3},/*"%",0*/ {0x3C,0x66,0x66,0x2C,0xDA,0x73,0x63,0xBE},/*"&",0*/ {0x18,0x18,0x10,0x00,0x00,0x00,0x00,0x00},/*"'",0*/ {0x60,0x30,0x10,0x10,0x10,0x10,0x10,0x30},/*"(",0*/ {0x06,0x0C,0x08,0x08,0x08,0x08,0x08,0x0C},/*")",0*/ {0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00},/*"*",0*/ {0x00,0x00,0x18,0x18,0xFF,0x18,0x18,0x00},/*"+",0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C},/*",",0*/ {0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},/*"",0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C},/*".",0*/ {0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03},/*"/",0*/ {0x7E,0xC3,0xE3,0xD3,0xCB,0xC7,0xC3,0x7E},/*"0",0*/ {0x18,0x1E,0x18,0x18,0x18,0x18,0x18,0xFF},/*"1",0*/ {0x7E,0xC3,0xC0,0x70,0x18,0x0E,0x03,0xFF},/*"2",0*/ {0x7E,0xC3,0xC0,0x78,0xC0,0xC0,0xC3,0x7E},/*"3",0*/ {0x70,0x78,0x6C,0x66,0x63,0xFF,0x60,0x60},/*"4",0*/
SetLED_XY(x,y); delay(delay1); } } void show_LED_Matrix_2() { unsigned char i; Reset_595_1(); Reset_595_2();
GoIt(0,0,RIGHT,7,20000); GoIt(7,0,DOWN,7,20000); GoIt(7,7,LEFT,7,20000); GoIt(0,7,UP,6,20000);
演示视频见 LED 阵列实验 8
字符的显示: 字符显示的原理: 我们以字符‘1’举例说明: '1'的 8x8 点阵图为:
逐行取模: {0x18,0x1E,0x18,0x18,0x18,0x18,0x18,0xFF},/*"1",0*/ 取模方向从右向左,左边为最低位。
采用动态扫描的方法把字模显示在 LED 阵列上。过程如下: 1、取第一行,对应于字模数据中的第一个数 0X18。 2、对 0X18 取反(因为列控制为低电平有效) 。 3、将 0X18 写到列控制 HC595 中。 4、将第一行,通过行控制 HC595 置为有效,即将 0X01 写入。
HC595 的驱动方法:
上图为 HC595 的 IO 定义。 VCC 与 GND 为电源与地,QA~QH 为 8 位并行数据输出, A 为串行数据输入, OE 为 输出使能,LC 为锁存时钟,SC 为数据串入时钟,RESET 为复位,SDO 是串行数据输出。
详解: VCC 与 GND:略
QA~QH:为芯片内 8 位移位寄存器的输出。
高位先输出,串行输入的一个位写入 QA,CLOCK 的沿信号使移位寄存器左移一位, 8 个 时钟后,一个字节就输入进去了。QA 为输入字节的最低位,QH 为输入字节的最高位。 A:芯片移位寄存器的串行输入端。 串行输入时,配合以时钟信号 SC,同步串行方式写入一个字节。 OE:数据输出使能 低电平有效。 LC:数据锁存时钟,下降沿数据被锁存。
/将 y 位置高,其它为高 //列控制上将 x 位置低,其它为低
SetLED_XY 函数的演示: LED 阵列逐行扫描:
void show_LED_Matrix_1() { unsigned char i,j; Reset_595_1(); Reset_595_2(); for(i=0;i<8;i++) { for(j=0;j<8;j++) { SetLED_XY(j,i);
GoIt(2,3,RIGHT,2,20000); GoIt(4,3,DOWN,1,20000); GoIt(4,4,LEFT,1,20000); GoIt(3,4,UP,0,20000);
for(i=0;i<4;i++) { GoIt(3,4,UP,1,20000); GoIt(3,3,RIGHT,1,20000); GoIt(4,3,DOWN,1,20000); GoIt(4,4,LEFT,1,20000); } }
delay(10000); } } }
演示视频见 LED 阵列实验 1
LED 阵列实验 2
低速扫描 高速扫描
动画演示: void GoIt(unsigned char x,unsigned char y,unsigned char direct,unsigned char steps,unsigned int delay1) { unsigned char i; SetLED_XY(x,y); for(i=0;i<steps;i++) { switch(direct) { case 0: x; break; case 1: y; break; case 2: x++; break; case 3: y++; break; }
驱动方法概述: 采用两片 HC595(串并转换器) ,一片控制 LED 阵列的行,一片控制 LED 阵列的列。 使用单片机的定时器中断机制对 LED 阵列进行动态扫描驱动。配以相应的字模,实现字符 的显示。由于 8X8 点阵数不足,因此不能显示汉字。
以上图示为 LED 阵列的 IO 定义。行控制为高电平使能,列控制为低电平使能,确定了 要点亮的位置(X,Y) ,则需要将行控制上的第 Y 位置高,列控制上的第 X 位置低。如果要 将某一行上的两个点(X1,Y) (X2,Y)同时点亮,需要让行控制上的第 Y 位置高,列控制上的 每 X1,X2 位都置低。在编程上置高或置低某一个位,可以使用位的与或操作。
//输出使能关闭 //数据时钟端置高 //8 位串行输出
SC_1=1; } LC_1=1; LC_1=0; LC_1=1; OE_1=0; }
//时钟信号控制移位寄存器移位
//锁存时钟沿信号,数据被锁住 //输出使能打开
点亮(X,Y)位置的一个点: 点亮一个点的方法上面已有介绍,只要向两片 HC595 写入根据点亮位置编码后的字节就可 以了。以下列出点亮的函数: void SetLED_XY(unsigned char x,unsigned char y) { SetValue_595_1((0x01<<y)); SetValue_595_2(~(0x01<<x)); }
GoIt(0,1,RIGHT,6,20000); GoIt(6,0,DOWN,5,20000); GoIt(6,6,LEFT,5,20000); GoIt(1,6,UP,4,20000);
GoIt(1,2,RIGHT,4,20000); GoIt(5,2,DOWN,3,20000); GoIt(5,5,LEFT,3,20000); GoIt(2,5,UP,2,20000);
在 LED 阵列的驱动中主要使用到了以上介绍到的几个端口。
单片机向 HC595 写字节的程序: 以下为一片 HC595 的驱动代码,驱动中有两片 HC595,另一片同理。 void Reset_595_1() //复位 HC595,QA~QH 为 00000000 { RESET_1=0; RESET_1=1; OE_1=0; }
{0xFF,0x03,0x03,0x7F,0xC0,0xC0,0xC3,0x7E},/*"5",0*/ {0x78,0x0C,0x06,0x7F,0xC3,0xC3,0xC3,0x7E},/*"6",0*/ {0xFF,0xC0,0xC0,0x60,0x30,0x18,0x0C,0x0C},/*"7",0*/ {0x7E,0xC3,0xC3,0x7E,0xC3,0xC3,0xC3,0x7E},/*"8",0*/ {0x7E,0xC3,0xC3,0xC3,0xFE,0x60,0x30,0x1E},/*"9",0*/ {0x00,0x00,0x0C,0x0C,0x00,0x00,0x0C,0x0C},/*":",0*/ {0x00,0x00,0x0C,0x0C,0x00,0x00,0x0C,0x0C},/*";",0*/ {0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30},/*"<",0*/ {0x00,0x00,0x00,0xFF,0x00,0xFF,0x00,0x00},/*"=",0*/ {0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C},/*">",0*/ {0x7E,0xC3,0xC0,0x70,0x18,0x18,0x00,0x18},/*"?",0*/ {0x7E,0x81,0xF1,0xD9,0xD9,0xF1,0x01,0x7E},/*"@",0*/ {0x3C,0x66,0xC3,0xC3,0xFF,0xC3,0xC3,0xC3},/*"A",0*/ {0x3F,0x63,0x63,0x3F,0x63,0xC3,0xC3,0x7F},/*"B",0*/ {0x7C,0xC6,0x03,0x03,0x03,0x03,0xC6,0x7C},/*"C",0*/ {0x3F,0x63,0xC3,0xC3,0xC3,0xC3,0x63,0x3F},/*"D",0*/ {0xFE,0x06,0x06,0x7E,0x06,0x06,0x06,0xFE},/*"E",0*/ {0xFE,0x06,0x06,0x7E,0x06,0x06,0x06,0x06},/*"F",0*/ {0x7C,0xC6,0x03,0x03,0xE3,0xC3,0xC6,0xBC},/*"G",0*/ {0xC3,0xC3,0xC3,0xFF,0xC3,0xC3,0xC3,0xC3},/*"H",0*/ {0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x7E},/*"I",0*/ {0x60,0x60,0x60,0x60,0x63,0x63,0x63,0x3E},/*"J",0*/ {0xC3,0x63,0x33,0x1B,0x1F,0x33,0x63,0xC3},/*"K",0*/ {0x06,0x06,0x06,0x06,0x06,0x06,0x06,0xFE},/*"L",0*/ {0x01,0x83,0xC7,0xAB,0x93,0x93,0x83,0x83},/*"M",0*/ {0xC7,0xC7,0xCB,0xDB,0xD3,0xE3,0xC3,0xC3},/*"N",0*/ {0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0x66,0x3C},/*"O",0*/ {0x7F,0xC3,0xC3,0xC3,0x7F,0x03,0x03,0x03},/*"P",0*/ {0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xD6,0x7C},/*"Q",0*/ {0x7F,0xC3,0xC3,0x63,0x3F,0x63,0xC3,0xC3},/*"R",0*/
//RESET 端的沿信号 //输出使能打开
void SetValue_595_1(unsigned char x) //向 HC595 写入一个字节,QH~QA 为写入的字节 { unsigned char i; OE_1=1; SC_1=1; for(i=0;i<8;i++) { A_1=((x<<i)&0x80); SC_1=0;
5、取第二行,对应字模数据中的第二个数 0X1E,取反,写入,使能第二行,依以过程, 八次后,就将字模写在 LED 阵列上。
在用单片机进行实现的时候,使用定时器中断,定时对 LED 阵列进行扫描,定时时间很短 到,以使眼睛察觉不到扫描的过程,于是一个字符就出现在了 LED 阵列上。
具体的实现如下: unsigned char code zimo[][8]= { {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ {0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x18},/*"!",0*/ {0x66,0x66,0x44,0x00,0x00,0x00,0x00,0x00},/*""",0*/ {0x44,0x44,0xFF,0x44,0x44,0xFF,0x44,0x44},/*"#",0*/ {0x83,0xC6,0x7C,0xC6,0xC6,0x7C,0xC6,0x83},/*"$",0*/ {0x86,0xC9,0x66,0x30,0x18,0xCC,0x26,0xC3},/*"%",0*/ {0x3C,0x66,0x66,0x2C,0xDA,0x73,0x63,0xBE},/*"&",0*/ {0x18,0x18,0x10,0x00,0x00,0x00,0x00,0x00},/*"'",0*/ {0x60,0x30,0x10,0x10,0x10,0x10,0x10,0x30},/*"(",0*/ {0x06,0x0C,0x08,0x08,0x08,0x08,0x08,0x0C},/*")",0*/ {0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00},/*"*",0*/ {0x00,0x00,0x18,0x18,0xFF,0x18,0x18,0x00},/*"+",0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C},/*",",0*/ {0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00},/*"",0*/ {0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C},/*".",0*/ {0x80,0xC0,0x60,0x30,0x18,0x0C,0x06,0x03},/*"/",0*/ {0x7E,0xC3,0xE3,0xD3,0xCB,0xC7,0xC3,0x7E},/*"0",0*/ {0x18,0x1E,0x18,0x18,0x18,0x18,0x18,0xFF},/*"1",0*/ {0x7E,0xC3,0xC0,0x70,0x18,0x0E,0x03,0xFF},/*"2",0*/ {0x7E,0xC3,0xC0,0x78,0xC0,0xC0,0xC3,0x7E},/*"3",0*/ {0x70,0x78,0x6C,0x66,0x63,0xFF,0x60,0x60},/*"4",0*/
SetLED_XY(x,y); delay(delay1); } } void show_LED_Matrix_2() { unsigned char i; Reset_595_1(); Reset_595_2();
GoIt(0,0,RIGHT,7,20000); GoIt(7,0,DOWN,7,20000); GoIt(7,7,LEFT,7,20000); GoIt(0,7,UP,6,20000);
演示视频见 LED 阵列实验 8
字符的显示: 字符显示的原理: 我们以字符‘1’举例说明: '1'的 8x8 点阵图为:
逐行取模: {0x18,0x1E,0x18,0x18,0x18,0x18,0x18,0xFF},/*"1",0*/ 取模方向从右向左,左边为最低位。
采用动态扫描的方法把字模显示在 LED 阵列上。过程如下: 1、取第一行,对应于字模数据中的第一个数 0X18。 2、对 0X18 取反(因为列控制为低电平有效) 。 3、将 0X18 写到列控制 HC595 中。 4、将第一行,通过行控制 HC595 置为有效,即将 0X01 写入。
HC595 的驱动方法:
上图为 HC595 的 IO 定义。 VCC 与 GND 为电源与地,QA~QH 为 8 位并行数据输出, A 为串行数据输入, OE 为 输出使能,LC 为锁存时钟,SC 为数据串入时钟,RESET 为复位,SDO 是串行数据输出。
详解: VCC 与 GND:略
QA~QH:为芯片内 8 位移位寄存器的输出。
高位先输出,串行输入的一个位写入 QA,CLOCK 的沿信号使移位寄存器左移一位, 8 个 时钟后,一个字节就输入进去了。QA 为输入字节的最低位,QH 为输入字节的最高位。 A:芯片移位寄存器的串行输入端。 串行输入时,配合以时钟信号 SC,同步串行方式写入一个字节。 OE:数据输出使能 低电平有效。 LC:数据锁存时钟,下降沿数据被锁存。
/将 y 位置高,其它为高 //列控制上将 x 位置低,其它为低
SetLED_XY 函数的演示: LED 阵列逐行扫描:
void show_LED_Matrix_1() { unsigned char i,j; Reset_595_1(); Reset_595_2(); for(i=0;i<8;i++) { for(j=0;j<8;j++) { SetLED_XY(j,i);
GoIt(2,3,RIGHT,2,20000); GoIt(4,3,DOWN,1,20000); GoIt(4,4,LEFT,1,20000); GoIt(3,4,UP,0,20000);
for(i=0;i<4;i++) { GoIt(3,4,UP,1,20000); GoIt(3,3,RIGHT,1,20000); GoIt(4,3,DOWN,1,20000); GoIt(4,4,LEFT,1,20000); } }
delay(10000); } } }
演示视频见 LED 阵列实验 1
LED 阵列实验 2
低速扫描 高速扫描
动画演示: void GoIt(unsigned char x,unsigned char y,unsigned char direct,unsigned char steps,unsigned int delay1) { unsigned char i; SetLED_XY(x,y); for(i=0;i<steps;i++) { switch(direct) { case 0: x; break; case 1: y; break; case 2: x++; break; case 3: y++; break; }