更多单片机学习笔记:
单片机学习笔记 1. 点亮一个LED灯
单片机学习笔记 2. LED灯闪烁
单片机学习笔记 3. LED灯流水灯
单片机学习笔记 4. 蜂鸣器滴~滴~滴~
单片机学习笔记 5. 数码管静态显示
单片机学习笔记 6. 数码管动态显示
单片机学习笔记 7. 独立键盘
单片机学习笔记 8. 矩阵键盘按键检测
0、实现的功能
8*8点阵模块的使用,实现中文汉字的点阵循环显示
1、Keil工程
1-1 8*8LED点阵屏
LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏、银行窗口屏叫号屏以及停车系统等等
共阳极指的是行线都是接的正极。9给正电,13给负电就点亮了。如果想要同时亮两个灯,也是用动态显示的方法来实现(分时循环显示,让人眼以为是同时显示的)
而16个IO口的点阵,一般用两片74HC595芯片去驱动,只需要3个IO口即可完成
1-2 74HC595芯片工作原理
74HC595芯片是一种串入并出的芯片,在电子显示屏制作当中有广泛的应用。 74HC595是8位串行输入/输出或者并行输出移位寄存器
14脚DS是串行输入,一位一位的串行输入;
9脚Q7是用于级联的输出端,并行输出;
11脚SH_CP是上升沿(0---1)才存入数据,当DS输入时,只有SH_CP为01上升沿时才会把DS输入的数据,存入内部的8位移位寄存器中;所以一般接时钟信号
12脚ST_CP是上升沿(0---1)才并行输出移位寄存器中的数据,同时还会锁存数据,只要寄存器中的数据没有更新,在上电的情况下都不会改变Q0-Q7;
10脚/MR是低电平清零,一般不需要,所以直接接VCC;
13脚/OE是高电平禁止输出(高阻态),一般接GND;
16脚VCC一般2-6V
2、代码实现
2-1 点亮一个点
先点亮一个点。行号上面是高位,列号右边是高位。列号接的是2号74HC595,行号接的是1号,所以先输入列号再行号,这样子输入串行数据时才会把行号挤到2号595上。
用for去输入串行数据
代码实现:
#include<reg52.h>
sbit DIO = P3^4; //串行数据脚
sbit S_CLK = P3^5; //移位寄存器时钟信号
sbit R_CLK = P3^6; //输出锁存器的时钟void main()
{//ROW 0x80, COL 0xfeunsigned char i;dat = 0xfe; //先发列值for(i=0;i<8;i++){S_CLK = 0;R_CLK = 0;if(dat & 0x01) //当串行输入的一位数据为1时DIO=1DIO = 1;elseDIO = 0;S_CLK = 1; //给S_CLK上升沿,将数据送入移位寄存器中dat = dat >> 1; //输入一位后,dat要右移动一位//dat >>= 1;和上面这句一样} //循环8次,将0xfe发出dat = 0x80;for(i=0;i<8;i++){S_CLK = 0;R_CLK = 0;if(dat & 0x01)DIO = 1;elseDIO = 0;S_CLK = 1; //给S_CLK上升沿,将数据送入移位寄存器中dat = dat >> 1; //输入一位后,dat要右移动一位}R_CLK = 1; //给R_CLK一个上升沿,将数据从移位寄存器中输出到Q0-Q15(并行输出) while(1);
}
可以把该函数集成写到一个函数中,方便调用:
#include<reg52.h>
sbit DIO = P3^4; //串行数据脚
sbit S_CLK = P3^5; //移位寄存器时钟信号
sbit R_CLK = P3^6; //输出锁存器的时钟void Send_Byte(unsigned char dat)
{unsigned char i;S_CLK = 0;R_CLK = 0;for(i=0;i<8;i++){if(dat & 0x01)DIO = 1;elseDIO = 0;S_CLK = 1;dat >>= 1;S_CLK = 0; //每次循环完都要把S_CLK拉低,以便下次上升沿触发}
}
void main()
{Send_Byte(0xfe); //发送列值Send_Byte(0x40); //发送行值while(1);
}
实物展示:
2-2 中文显示
下面进行显示中文,要用到动态扫描,分时去显示。显示一个中文行列都要扫描8次,循环显示两个汉字的话就再加个for循环即可,但要加上延时模块
用辅助软件去生成每个汉字的列选数据,行选数据直接8行循环即可
代码实现:
#include<reg52.h>
#include<intrins.h>
sbit DIO = P3^4; //串行数据脚
sbit S_CLK = P3^5; //移位寄存器时钟信号
sbit R_CLK = P3^6; //输出锁存器的时钟unsigned char code table[2][8] = { //[2]表示二维数组
0xE0,0xEE,0x01,0x6D,0x01,0x6D,0x01,0xEF; //电
0xE7,0xF7,0xF7,0xF7,0x81,0xF7,0xFB,0xC3 //子
};
//0xEF,0x01,0x6D,0x01,0x6D,0x01,0xEE,0xE0
void Send_Byte(unsigned char dat)
{unsigned char i;S_CLK = 0;R_CLK = 0;for(i=0;i<8;i++){if(dat & 0x01)DIO = 1;elseDIO = 0;S_CLK = 1;dat >>= 1;S_CLK = 0; //每次循环完都要把S_CLK拉低,以便下次上升沿触发}
}
void main()
{unsigned char j, k, ROW;unsigned int z; //为了字体与字体之间的延时while(1){ for(k=0; k<2; k++) //循环显示两个字{for(z=0; z<1000; z++) //延时显示,加个delay函数也行 {ROW = 0x80; //行号初始值为第一行for(j=0;j<8;j++){Send_Byte(table[k][j]); //发送列号Send_Byte(ROW); //发送行号R_CLK = 1; //R_CLK上升沿,直接输出移位寄存器的数据R_CLK = 0;ROW = _cror_(ROW, 1); //行号循环右移一位}}}}
}
实物展示: