目录
1.实现功能
1.在8*8点阵屏显示数字
2.在16*16点阵屏显示数字,汉字,图案
2.实现原理

行接GND,列接VCC
左到右,左是高位,右是低位
上到下,上是高位,下是低位
例如当我要显示数字9的时候,一行一行的去看,每一行哪几颗灯亮了,然后这一行亮的几个灯用行列怎么表示
例如第一行亮了3个灯
只显示第一行0111 1111表示0x7F
这三个灯列则是,0001 1100 表示0x1C
第二行亮了2个灯
只显示第二行 1011 1111表示0XBF
列 0010 0100 表示0x24
第三行亮了2个灯
只显示第三行1101 1111 表示0xDF
列 0010 0100 表示0x24
第四行亮3个灯
值显示第四行 1110 1111 表示EF
列 0001 1100 表示0X1C
后面5,6,7,8都是一样都亮一个灯,位置也一样
行分别表示 1111 0111,1111 1011, 1111 1101, 1111 1110对应0XF7, 0XFB, 0XFD, 0XFE
列 0000 0100 表示0x04
3.8*8点阵显示数字代码
显示数字9
c
#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit DS = P3^4;
sbit SH_CP = P3^6; //输入时钟脉冲
sbit ST_CP = P3^5; //输出
#define LEDDZ_ROW_POST P0
u8 gled_row[8] = {0x7F, 0XBF, 0XDF, 0XEF, 0XF7, 0XFB, 0XFD, 0XFE};
u8 gled_col[8] = {0x1C,0x24,0x24,0x1C,0x04,0x04,0x04,0x04};
void delay_50us(u16 us) {
while(us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void hc595_write_data(u8 dat) {
u8 i = 0;
for (i = 0; i < 8; i++) {
DS = dat >> 7;
dat <<= 1;
SH_CP = 0;
delay_50us(1);
SH_CP = 1;
delay_50us(1);
}
ST_CP = 0;
delay_50us(1);
ST_CP = 1;
}
void main() {
u8 i = 0;
while(1) {
for (i = 0; i < 8; i++) {
LEDDZ_ROW_POST = gled_row[i];
hc595_write_data(gled_col[i]);
delay_50us(100);
hc595_write_data(0x00);
}
}
}
4.8*8点阵电路图

5.16*16点阵显示数字代码
显示数字10
c
#include <reg51.h>
#include <intrins.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit DS = P3^4;
sbit SH_CP = P3^6; //输入时钟脉冲
sbit ST_CP = P3^5; //输出
//行数据
u8 gled_row[32] = {0XFE, 0XFF, 0XFD, 0XFF, 0XFB, 0XFF, 0XF7, 0XFF, 0XEF, 0XFF, 0XDF, 0XFF, 0XBF, 0XFF, 0X7F, 0XFF,
0XFF, 0XFE, 0XFF, 0XFD, 0XFF, 0XFB, 0XFF, 0XF7, 0XFF, 0XEF, 0XFF, 0XDF, 0XFF, 0XBF, 0XFF, 0X7F};
//列数据
u8 gled_col[32] = {
/*0x00,0x00,0x00,0x00,0x30,0x1C,0x38,0x22,0x20,0x41,0x20,0x41,0x20,0x41,0x20,0x41,
0x20,0x41,0x20,0x41,0x20,0x41,0x20,0x22,0x20,0x1C,0x00,0x00,0x00,0x00,0x00,0x00 */ //数字0
//汉字 国
/*0x00,0x00,0xFE,0x3F,0x02,0x20,0x02,0x20,0xFA,0x2F,0x82,0x20,0x82,0x20,0xF2,0x27,
0x82,0x20,0x82,0x22,0x82,0x24,0xFA,0x2F,0x02,0x20,0x02,0x20,0xFE,0x3F,0x02,0x20*/
//在16*16点阵上可以划分4个8*8点阵,在划分出来的其中一个8*8显示图案
0x24, 0X00, 0x7E, 0X00, 0xFF,0X00, 0xFF, 0X00, 0xFF, 0X00, 0x7E,0X00, 0x3C, 0X00, 0x18, 0X00,
0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00
};
void delay_10us(u16 us) {
while(us--);
}
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void hc595_write_data(u8 dat1, u8 dat2, u8 dat3, u8 dat4) {
u8 i = 0;
for (i = 0; i < 8; i++) {
DS = dat4 >> 7;
dat4 <<= 1;
SH_CP = 0;
_nop_();
SH_CP = 1;
_nop_();
}
for (i = 0; i < 8; i++) {
DS = dat3 >> 7;
dat3 <<= 1;
SH_CP = 0;
_nop_();
SH_CP = 1;
_nop_();
}
for (i = 0; i < 8; i++) {
DS = dat2 >> 7;
dat2 <<= 1;
SH_CP = 0;
_nop_();
SH_CP = 1;
_nop_();
}
for (i = 0; i < 8; i++) {
DS = dat1 >> 7;
dat1 <<= 1;
SH_CP = 0;
_nop_();
SH_CP = 1;
_nop_();
}
ST_CP = 0;
_nop_();
ST_CP = 1;
}
void main() {
u8 i = 0;
while(1) {
for(i = 0; i < 16; i++) {
hc595_write_data(gled_row[2*i], gled_row[2*i+1], gled_col[2*i], gled_col[2*i+1]);
delay_10us(10);
hc595_write_data(0XFF, 0XFF, 0X00, 0X00);
}
}
}
6.16*16点阵电路图


