使用51单片机实现点阵汉字平滑滚动显示

#说明:采用的芯片是89C51,LED点阵屏的规格是16*16,同时使用了两个74HC595芯片,字模生成软件在文末有网盘链接。

1 连接原理图

整体的电路连接如上图所示,单片机只需要使用三个IO接口,就可以实现对点阵屏的控制。当然对于不同的单片机而言连线是不同的,但是使用74HC595扩展的原理是相同的,在这里不再对于其IO扩展原理进行探究。

2 实现的功能

在51单片机以及C语言的环境下,实现LED点阵屏幕上汉字的平滑滚动,就像是公交车上显示“前方到站第二医院,下车乘客请提前做好准备”一样。我们最后显示的是“计算机测控技术”几个字,当然显示的汉字内容是自定义的。同时,设置一个按钮能够让平滑滚动的汉字可以随时停下来。

这里有两点细节需要注意一下:

1、汉字循环到最后一个时,要继续滚动出第一个汉字,而不是跳变到开头重新循环。

2、汉字滚动的时候按下按钮停止,滚动停止的时候按下按钮继续滚动,使用同一个按钮。

3 C语言程序实现

3.1 定义变量

在这里我们定义芯片P3.4、P3.5、P3.6 三个接口为输出IO接口,P2.7为接开关控制的IO接口。同时定义一个大数组储存所有汉字对应的取模16进制码,一个小数组用于表示现在屏幕上所需显示的汉字。

#include

#include

typedef unsigned int u16;//常规无符号字符串和整数定义

typedef unsigned char u8;

//将595的三个内置接口赋给新的名字

sbit SRCLK = P3 ^ 6;// 数据输入口(串)

sbit RCLK = P3 ^ 5;// 移位寄存器时钟

sbit SER = P3 ^ 4;// 存储寄存器时钟

sbit stopscreen = P2^7; //暂停与开始开关定义引脚

/*定义一个数组存储所有需要平滑滚动的文字的16进制码,由取模软件自动生成,

每个字由32个16进制数字组合而成,现在数组中存储的是“计算机测控技术”*/

u8 code word[] = {

/*-- 文字: 计 --*/

0x00, 0x02, 0x04, 0x02, 0x08, 0x02, 0x08, 0x02, 0x00, 0x02, 0x00, 0x02, 0xEF, 0x7F, 0x08, 0x02,

0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x08, 0x02, 0x28, 0x02, 0x18, 0x02, 0x08, 0x02, 0x00, 0x02,

/*-- 文字: 算 --*/

0x04, 0x02, 0x7C, 0x7E, 0x12, 0x09, 0x01, 0x00, 0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x04, 0x10,

0xFC, 0x1F, 0x04, 0x10, 0xFC, 0x1F, 0x10, 0x04, 0xFF, 0x7F, 0x10, 0x04, 0x08, 0x04, 0x04, 0x04,

/*-- 文字: 机 --*/

0x08, 0x00, 0x88, 0x0F, 0x88, 0x08, 0x88, 0x08, 0xBF, 0x08, 0x88, 0x08, 0x8C, 0x08, 0x9C, 0x08,

0xAA, 0x08, 0xAA, 0x08, 0x89, 0x08, 0x88, 0x48, 0x88, 0x48, 0x48, 0x48, 0x48, 0x70, 0x28, 0x00,

/*-- 文字: 测 --*/

0x00, 0x20, 0xE4, 0x23, 0x28, 0x22, 0x28, 0x2A, 0xA1, 0x2A, 0xA2, 0x2A, 0xA2, 0x2A, 0xA8, 0x2A,

0xA8, 0x2A, 0xA4, 0x2A, 0xA7, 0x2A, 0x84, 0x20, 0x44, 0x21, 0x44, 0x22, 0x24, 0x28, 0x10, 0x10,

/*-- 文字: 控 --*/

0x08, 0x02, 0x08, 0x04, 0x08, 0x04, 0xC8, 0x7F, 0x5F, 0x40, 0x28, 0x29, 0x88, 0x10, 0x58, 0x20,

0x0C, 0x00, 0x8B, 0x3F, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0xEA, 0x7F, 0x04, 0x00,

/*-- 文字: 技 --*/

0x08, 0x04, 0x08, 0x04, 0x08, 0x04, 0xC8, 0x7F, 0x3F, 0x04, 0x08, 0x04, 0x08, 0x04, 0xA8, 0x3F,

0x18, 0x21, 0x0C, 0x11, 0x0B, 0x12, 0x08, 0x0A, 0x08, 0x04, 0x08, 0x0A, 0x8A, 0x11, 0x64, 0x60,

/*-- 文字: 术 --*/

0x80, 0x00, 0x80, 0x04, 0x80, 0x08, 0x80, 0x08, 0xFE, 0x3F, 0xC0, 0x01, 0xA0, 0x02, 0xA0, 0x02,

0x90, 0x04, 0x88, 0x08, 0x84, 0x10, 0x82, 0x20, 0x81, 0x40, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00};

//下面一个用于存储每一时刻点阵屏显示内容的数字,随着时间会不断重新赋值与变化

u8 now[32] = {

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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

3.2 点阵显示函数

由于使用595进行了接口扩展,首先编写行显示函数LED_line,接着再编写汉字显示函数LED_array,>>和

{

while (i--);

}

//行显示函数: LED_line (字节1 1 ,字节2 2 ,行号)

void LED_line(u8 ledata1, u8 ledata2, u8 line_num)

{

u8 b_num, i;

u8 REG595[4]; // 发送到595的四个字节。

REG595[0] = ledata2; REG595[1] = ledata1;

if (line_num<8) {

REG595[2] = 0;

REG595[3] = 0x01 << line_num;

}

else {

REG595[2] = 0x01 << (line_num - 8);

REG595[3] = 0;

}

SRCLK = 1; // 移位准备

RCLK = 1; //输出准备

for (b_num = 0; b_num<4; b_num++) { // 向595发送四个字节

for (i = 0; i<8; i++) { //发送8位数

SER = REG595[b_num] >> 7; //从最高位开始发送

REG595[b_num] <<= 1;

SRCLK = 0;

SRCLK = 1; //移位寄存器时序,低电平准备,高电平有效

}

}

RCLK = 0; // 存储寄存器时序,低电平准备,高电平有效,四个字节同时发出

RCLK = 1;

}

void LED_array(u8 word[], u16 t_delay)//汉字显示函数

{

u8 i;

while (t_delay--) {

for (i = 0; i<16; i++) { // 逐行显示

LED_line(~word[i * 2], ~word[i * 2 + 1], i);

}

}

}

3.3 平滑滚动

通过上面的内容,我们只要调用LED_array函数,正确传参后就可以在LED点阵屏上显示我们想要显示的内容了。实现平滑滚动才是本文的关键,主函数的算法流程图如下所示:

总的来说,就是使用小数组(now)在大数组(word)中一步步移动的方法,在算法与数据结构里,我们往往把这种方法叫做滑动窗口法。在汉字取模软件中生成的16进制数,每两个一组代表LED点阵上的一行灯的亮灭。这也不难理解,因为一行是16个LED灯,一个两位16进制数刚好可以表示8个2进制数,所以两个两位16进制数控制一行。因此,我们滑动窗口每次移动2个两位16进制数。

void main() //主函数

{

u16 i, j;

for(j=0;;j++){ //在这里不使用while循环是因为while循环显示输出不稳定

//每次赋给now的值都后移两位,显示出来就是点阵一行行地变化

for (i=0;i<32;i++){//对now中32个位置,每个位置都赋值

/*将需要实时显示的内容放到实时数组now中去,同时使用对数组最大数224取余实现循环平滑滚动*/

now[i] = word[(i+(2*j))%224];

}

LED_array(now, 10);//调用汉字显示函数,依次显示now中内容

delay(300); //延迟后进行下一循环

if(stopscreen==0){//按键防抖设计

delay(50);

if(stopscreen==0){

while(1){//按第一下开关停止平滑滚动

LED_array(now, 10);

if(stopscreen==0){ //按键防抖设计

delay(50);

if(stopscreen==0){

break; //按第二下开关继续平滑滚动

}

}

}

}

}

}

}

4 总结

清楚了LED点阵屏显示的原理,我们可以设计LED点阵屏的多种显示方式,甚至可以做出动画片、游戏等。

字模生成软件百度云:链接:https://pan.baidu.com/s/1OwK_L_aDjWas5LF_MuULmQ

提取码:idov

51单片机实现c语言字母滚动,使用51单片机实现点阵汉字平滑滚动显示相关推荐

  1. 51单片机直流电机c语言基础知识要点,完结单片机基础知识的总结(制作作品)...

    完结单片机基础知识的总结(制作作品) 一个暑假过去了,也许没有达到学长和老师的期望,可是只有我知道我自己是突破了自己的,从未如此认真的一一天学习,度过三分之二个充实的暑假.现在将一腔想表达的,想解惑的 ...

  2. 单片机学c语言还是python好_单片机开发用哪种语言最好?

    在过去的几十年中,单片机的规格变化不大,但是语言和支持软件的扩展为应用程序开发开辟了许多途径.多年来,对单片机进行编程涉及到两种语言的选择:C语言和汇编语言.但是随着现在可用于微处理器的新语言,用户在 ...

  3. 单片机的c语言ppt,第9章-单片机的C语言编程.ppt

    第9章-单片机的C语言编程.ppt 第9章单片机的C语言编程 9 1C51编程语言简介9 2C51的数据类型9 3数据的存储器类型和存储器模式9 4SFR 位变量 存储器和I O接口的定义9 5C51 ...

  4. 单片机中用c语言编写 逻辑按位,.单片机的C语言中位操作用法.pdf

    .单片机的C语言中位操作用法 风行下载2012 正式版官方下载:/ C C 单片机的CC语言中位操作用法 作者:郭天祥 来源:转自 更新时间:2008-12-421:50:22 在对单处机进行编程的过 ...

  5. 触摸屏与单片机通讯c语言程序设计,讲述如何实现单片机与触摸屏的通信

    随着触摸屏的应用和产量的增加,价格下降.因而有可能使用触摸屏作为单片机控制设备的键盘和显示装置,提高单片机控制设备的档次.触摸屏与PLC联合使用时,触摸屏的主要功能是: ①显示PLC输入,输出端13或 ...

  6. html鼠标平滑滚动效果,JS特效代码 JS动态平滑滚动菜单效果

    JS特效代码 JS动态平滑滚动菜单效果 www.css5.net body {cursor:crosshair; background:#111; margin:0; padding:0; posit ...

  7. 51单片机实现c语言字母滚动,基于51单片机的led点阵滚动显示上下左右c语言程序.docx...

    *********** * * *LED点阵实验(左右上下流动显示) ***************************************************************** ...

  8. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...

    关于51系列单片机中断嵌套 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套.现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了. 在说到 ...

  9. 单片机红外线c语言,自己写的51单片机的红外线遥控接收程序(C语言)

    自己写的51单片机的红外线遥控接收程序(C语言) (6页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 11.90 积分 //51单片机做的红外遥控实验(C ...

最新文章

  1. JavaScript之充实文档的内容
  2. 802.1x认证EAP包结构
  3. 不四:产品工程师的修炼之路
  4. C#使用Ado.net读取Excel表的代码
  5. jzoj4598. 【NOIP2016模拟7.9】准备食物
  6. C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性
  7. 【POJ2826】An Easy Problem?!(线段相交+分情况讨论+精度)
  8. 数理统计学:世纪末的回顾与展望(陈希孺)
  9. MongoDB可视化工具MongoChef永久有效
  10. php多人聊天室系统,PHP打造多人在线聊天室[一]
  11. linux超进程,linux下查看超线程
  12. iOS常用RGB颜色的色值一览表
  13. 疫情期间再读三体(3)——黑暗森林到底怎么个黑法
  14. 孟庆国:未来政府数字化转型——从“技术釆纳”到“价值赋能”
  15. 红绿灯记忆游戏-第13届蓝桥杯Scratch选拔赛真题精选
  16. 语义分割如何走下去?| 文末送书
  17. js动态添加带圆圈序号列表
  18. linux绝育玩客云_绝育老母鸡(玩客云)PT下载补充。如何过新手考核
  19. 初学Python--微信自动回复信息以及防撤回
  20. 如何将一个向量投影到一个平面上_线性代数笔记(15-16)投影、投影矩阵和最小二乘...

热门文章

  1. 四、Jetson Xavier Nx内置16G emmc刷机、CUDA、SSD启动
  2. 广外计算机语言学bbs,2020年广外英语语言文学(外语语言学及应用语言学)高分学姐经验分享...
  3. 电脑wifi连接受限
  4. CGRidCtrl控件 学习心得
  5. 会员管理小程序实战开发11-获取会员手机号
  6. 酷狗音乐推出酷狗小程序开放平台
  7. Promethus-day2-普罗米修斯容器化与PromQL
  8. [新闻]中国移动明年卖黑莓
  9. unity创建项目不添加包_使用精选的资产捆绑包和Unity Learn Premium可以更高效地创建项目
  10. Java的reactor模式_Reactor模式详解+源码实现