LED点阵基础讲解及字符显示
51单片机重新学习之LED点阵:
1.LED点阵简介
1.1什么是点阵液晶?
(1)外观
(2)作用:显示器件。类似于数码管,只不过内部的LED都是圆点 的,而数码管做成了长条与点。
(3)内部构造:点阵的优势:可以8+8个IO口独立控制8*8个LED亮灭。
(4)如何工作:内部LED的亮与灭。多个LED的亮灭配合组成想显示的内容。
1.2如何驱动LED点阵液晶?
(1)单片机端口直接驱动(费IO端口)
(2)使用串转并移位锁存器进行驱动(74HC595)
串转并:一列输入,一排输出的操作
移位:数据一位一位的移动,放进去的操作。
锁存:把串行放入芯片中的数据给芯片某个指令放到并行输出口的并更新寄存器中的值的的那个操作。
1.3HC595的连接
1.4时序的引入
(1) 时序就是芯片之间通信引脚上电平变化以时间轴为参考的变化顺序。
(2)学会看时序,学会时序的调整与转化。
(3)HC595芯片:SCLK 和 RCLK 。SCLK是移位时钟,每一个SCLK上升沿会对SER引脚进行采样,就向595内部输入了一位,如此循环8次就发送一个字节。RCLK是锁存时钟,QA-QH的8位并行输出信号在RCLK上升沿时就进行一次锁存。
(4)C51位定义 ,关键件sbit sbit SER = P3^4;
1.5实战
#include <reg51.h>//点亮点阵
//接线:
/*
//P3^4 SER P3^5 RCLK 上升沿时移位寄存器的数据进入存储寄存器 下降沿时存储寄存器的数据保持不变P3^6 SCLK 上升沿时数据寄存器的数据移位 */
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;#define uchar unsigned char
void main(void)
{uchar i = 0;uchar d1 = 0;uchar d2 = 0;uchar d3 = 0xff;uchar d4 = 0xff;SCLK = 0;RCLK = 0; //都初始化为低for(i=0; i<8; i++){//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。//最后一次发送的是最低位。SER = d1 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d1 = d1 << 1; }for(i=0; i<8; i++){//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。//最后一次发送的是最低位。SER = d2 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d2 = d2 << 1; }for(i=0; i<8; i++){//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。//最后一次发送的是最低位。SER = d3 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d3 = d3 << 1; }for(i=0; i<8; i++){//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。//最后一次发送的是最低位。SER = d4 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d4 = d4 << 1; }//至此,32bit数据已经 移位过去了,现在就是要锁存了。RCLK = 0;RCLK = 1;while(1);
}
1.6实战:进行函数封装,提高阅读性。
#include <reg51.h>//点亮点阵
//接线:
/*
//P3^4 SER P3^5 RCLK 上升沿时移位寄存器的数据进入存储寄存器 下降沿时存储寄存器的数据保持不变P3^6 SCLK 上升沿时数据寄存器的数据移位 */
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;#define uchar unsigned charvoid SendData(unsigned char d);
void main(void)
{uchar i = 0;uchar d1 = 0;uchar d2 = 0;uchar d3 = 0xfe;uchar d4 = 0xfe;SCLK = 0;RCLK = 0; //都初始化为低SendData(d1);SendData(d2);SendData(d3);SendData(d4);RCLK = 0;RCLK = 1;while(1);}void SendData(unsigned char d)
{unsigned char i = 0;for(i=0; i<8; i++){SER = d >> 7; SCLK = 0;SCLK = 1; d = d << 1;}}
1.7字模引入。
(1)字模简单的说就是在屏幕上要显示的字的模型。
(2)表现形式:放在点阵上就是一些LED点亮,而另一些LED点灭,这种亮灭组合最后显示出来的是一个字。
(3)字模的大小:以16 * 16的点阵来说,16 * 16的点阵有256个点,256个点用256个二进制位表示,那么就有256/8 = 32个字节。所有这种情况下字模的大小就是32个unsigned char型的数据。
(4)字模的获取:字模提取软件。
(5)字模的提取不是唯一的,与自己提取字模的方法有关,也是可以变的。
(6)字模软件的使用:最终是为了得到字模数组。
(7)利用显示代码显示时,需要对取模软件得到的字模数组进行调整。比如:我们显示的是在阴极上,但是取模软件上取得是1表示亮0表示灭,正好与我们的想反,所以我们需要按位取反。
#include <reg51.h>//点亮点阵
//接线:
/*
//P3^4 SER P3^5 RCLK 上升沿时移位寄存器的数据进入存储寄存器 下降沿时存储寄存器的数据保持不变P3^6 SCLK 上升沿时数据寄存器的数据移位 */
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;#define uchar unsigned charvoid SendData(uchar d1, uchar d2, uchar d3, uchar d4);
void display(uchar varry[32],uchar hang[32]);#define uchar unsigned char
//取模方式:阴码,逐行式,顺向(高位在前)
//uchar yang[32] =
//{0x08,0x00,0x88,0x1F,0x08,0x08,0x08,0x04,0x3F,0x02,0x08,0x01,0x8C,0x7F,0x1C,0x49,
//0x2A,0x49,0x2A,0x49,0x89,0x48,0x88,0x44,0x48,0x44,0x28,0x42,0x08,0x29,0x88,0x10};/*"杨",0*///uchar yang1[32] =
//{0x00,0x00,0x3E,0x00,0xA2,0x3F,0x92,0x20,0x92,0x20,0x8A,0x20,0x92,0x20,0x92,0x20,
//0xA2,0x3F,0xA2,0x20,0xA2,0x20,0x96,0x20,0x8A,0x20,0x82,0x20,0x82,0x3F,0x82,0x20};/*"阳",0*/uchar rui[32] =
{0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x08,0x20,0x01,0x00,0x24,0x88,0x24,0x24,
0x43,0xE4,0x00,0x00,0x24,0x24,0x12,0x12,0xA0,0xA0,0xA4,0xA4,0x1C,0x1C,0x00,0x00};/*"蕊",0*/uchar hang[] =
{0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,
0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
};void main(void)
{ /*
SendData(~0x00,~0x08,0x00,0x01); //显示第一行
SendData(~0x1F,~0x88,0x00,0x02); //显示第二行
SendData(~0x08,~0x08,0x00,0x04); //显示第三行
SendData(~0x04,~0x08,0x00,0x08); //显示第四行
SendData(~0x02,~0x3F,0x00,0x10); //显示第五行
SendData(~0x01,~0x08,0x00,0x20); //显示第六行
SendData(~0x7F,~0x8C,0x00,0x40); //显示第七行
SendData(~0x49,~0x1C,0x00,0x80); //显示第八行*/display(rui,hang);
//while(1);
}//发送数据函数
/*
d1 表示列 d2 表示列 d3 表示行(9-16) d4 表示行(1-8)
*/
void SendData(uchar d1, uchar d2, uchar d3, uchar d4)
{
uchar i = 0;
SCLK = 0;
RCLK = 0; //都初始化为低
for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。SER = d1 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d1 = d1 << 1;
}for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。SER = d2 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d2 = d2 << 1;
}for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。SER = d3 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d3 = d3 << 1;
}for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。SER = d4 >> 7; //d1右移7位,就是把d1字节中的最高位取出来了。SCLK = 0;SCLK = 1; //制造上升沿,为数据移位做准备d4 = d4 << 1;
}
//至此,32bit数据已经 移位过去了,现在就是要锁存了。
RCLK = 0;
RCLK = 1;
}void display(uchar varry[32],uchar hang[32])
{
uchar i = 0;
for(i=0; i<16; i++)
{SendData(~varry[2*i],~varry[2*i+1],hang[2*i],hang[2*i+1]);
}
}
总结:LED 点阵基本完结。也基本没啥问题吧。需要自己注意的几点,可能也是之前不懂的部分。
(1)
for(i=0; i<8; i++){SER = d2 >> 7; 。SCLK = 0;SCLK = 1; d2 = d2 << 1; //***此句话的作用*** //发送移位的作用,因为把d2移位到最低位了。//最低位有值了,下一个值是需要放到次低位的。//这个移位是从最低位移到次高位。 }
(2)字模的大小:以16 * 16的点阵来说,16 * 16的点阵有256个点,256个点用256个二进制位表示,那么就有256/8 = 32个字节。所有这种情况下字模的大小就是32个unsigned char型的数据。
(3)时序的解读。
(4)点阵的内部构成与显示原理
(5)函数的封装
(6)多思考!
LED点阵基础讲解及字符显示相关推荐
- 【电子电路基础实验】LED点阵(上--硬件部分)
文章目录 背景 主题活动 一. 74HC595和LED点阵之间的电气与数字接口 电气接口 数字接口 记录一段旅程–使用74HC595串转并8位移位寄存器来控制LED点阵. 背景 点亮了一颗led,就会 ...
- LED点阵-第1季第8部分-朱有鹏-专题视频课程
LED点阵-第1季第8部分-1818人已学习 课程介绍 本课程是<朱有鹏老师单片机完全学习系列课程>第1季第8个课程,讲解了16*16LED点阵的驱动方式和文字显示.本课程 ...
- LED背光学习_标准和白光LED的基础知识与驱动
标准和白光LED的基础知识与驱动 标准和白光LED的基础知识与驱动.pdf 很多年来,发光二极管(LED)广泛的应用于状态显示与点阵显示板.现在,不仅可以选择近期刚刚研发出来的蓝光和白光产品(普遍用于 ...
- 基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231
基于ArduinoNano的LED点阵时钟探索(1)四合一MAX7219+DS3231 这篇文章是自己打算做一个LED点阵时钟记录学习进度的,刚完成第一次点亮MAX7219四合一模块,所以先做好学习记 ...
- 【51单片机】MAX7219 LED点阵GUI设计
文章目录 一.主要功能 二.硬件资源 1.硬件准备 2.硬件连接 三.软件设计 1.软件结构 2.主要代码 四.实验现象 联系作者 一.主要功能 LED点阵显示初始信息,可通过K3键切换显示模式,可实 ...
- LED显示屏基础知识
一. LED显示屏概述 什么是LED? 在某些半导体材料的 PN 结中, 注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能. PN ...
- 51单片机开发:通过74HC595控制LED点阵
1.LED点阵介绍 (1)LED点阵就是多个LED发光二极管的集合,在单个LED的发光原理上没有任何区别: (2)上面是16x16的LED点阵,总共有16x16=256个LED灯,由32个引脚来控制, ...
- 和12岁小同志搞创客开发:如何驱动LED点阵模块?
机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html ...
- led动态显示 c语言,单片机LED点阵的纵向移动(动态显示)
点阵的动画显示,说到底就是对多张图片分别进行取模,使用程序算法巧妙的切换图片,多张图片组合起来就成了一段动画了,我们所看到的动画片.游戏等等,它们的基本原理也都是这样的. 上一节我们学了如何在点阵上画 ...
- 基于FPGA的LED点阵系统开发
LED点阵显示屏被用到很多领域,随着电子技术的发展,LED点阵书写显示屏的广泛应用是一种趋势.传统的LED点阵显示是由微处理器实现的,但是以FPGA做控制器将成为发展趋势.FPGA的结构灵活,其逻辑单 ...
最新文章
- Linux下DNS轮询与Squid反向代理结合
- python http接口_python处理http接口请求
- “外部质量”还是“内部质量”
- 只等你来!OpenAtom XuperChain 开发者夏季论坛来啦
- STL - bitset
- 英语中的介词详细解释
- js 短信验证码 6位数字
- Java RandomAccessFile writeLong()方法与示例
- ffmpeg rtp传输使用
- 构建一个自定义CentOS7内核
- azure机器学习_使用Azure ML Studio的Azure机器学习简介
- c++ 输出格式控制
- GRE红宝书使用方法介绍
- 【软件工程】结构图(SC)——期末复习用
- Pos应用与扫盲一路通
- MATLAB将csv文件转换成mat文件
- 不想用百度云,那就教你自建属于自己的云盘!
- LiveQing流媒体RTMP推流服务-如何获直播流地址 HLS/HTTP-FLV/WS-FLV/WebRTC/RTMP视频流地址
- 搜狗浏览器与IE9评测比较
- Facebook产品的开发流程