📄 单片机点阵led中文显示.c
字号:
/*单片机16*16点阵LED中文显示这是一个占用系统资源非常少的程序,没有使用任何“显存”形式RAM占用。
使用更好的算法实时获取显示数据。这个程序还有一个修改版本,可以实现文字从平屏幕右侧进入,流动显示,从左侧消失。
但是两个程序最多只能显示253个文字的字符串,并可以调节流动速度。
希望各位高手指点。*/
/*下面是资源占用情况:
TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------
* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
DATA 0008H 000DH UNIT _DATA_GROUP_
IDATA 0015H 0001H UNIT ?STACK
* * * * * * * C O D E M E M O R Y * * * * * * *
CODE 0000H 0003H ABSOLUTE
CODE 0003H 0115H UNIT ?PR?_DISNFONT?LED謃文流__
CODE 0118H 00A0H UNIT ?CO?LED謃文流__
CODE 01B8H 004EH UNIT ?PR?_DISONEFONT?LED謃文流__
CODE 0206H 0046H UNIT ?C?LIB_CODE
CODE 024CH 001BH UNIT ?PR?MAIN?LED謃文流__
CODE 0267H 000EH UNIT ?PR?_DELAY_50US?LED謃文流__
CODE 0275H 000CH UNIT ?C_C51STARTUP
下面是源代码:
*/
//--------------------------------
//
// 文件名: LED中文流动1.c
// 作者: 张子墨
// 版本: 0.9
//最后更新: 2006/12/01
//测试硬件: at89s51 + 16*16点阵LED
//--------------------------------
//--------------------------------
//
// 16*16点阵LED显示中文程序
// 本程序逐个显示中文,从右至左流动显示
// 使用横向,流动只有字节间操作
// 字模数据:文字下侧存储为数组中奇数
// 文字上侧存储为数组中偶数
//
//--------------------------------
#include <at89s53.h>
#define SEL P3 //行选线,P3 低四位
#define UP8 P0 //点阵文字上8行IO
#define DOWN8 P2 //点阵文字下8行IO
unsigned char code FontData [5][32] = {
/*-- 文字: 张 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
{0x01,0x02,0x03,0xF2,0x41,0x12,0x81,0x12,0x7F,0x1E,0x00,0x00,0x00,0x80,0x40,0x80,
0xFF,0xFF,0x40,0xA0,0x23,0x90,0x0C,0x88,0x10,0x86,0x60,0x84,0x20,0x80,0x00,0x00},
/*-- 文字: 子 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
{0x01,0x00,0x01,0x00,0x01,0x02,0x01,0x02,0x01,0x02,0x41,0x02,0x81,0x02,0x7F,0xE2,
0x01,0x12,0x01,0x0A,0x01,0x06,0x01,0x02,0x01,0x00,0x01,0x80,0x01,0x00,0x00,0x00},
/*-- 文字: 墨 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
{0x40,0x80,0x44,0x80,0x43,0xAF,0x50,0xA9,0x51,0xAB,0x56,0xAD,0x52,0xA9,0x78,0xFF,
0x51,0xA9,0x56,0xAD,0x52,0xAB,0x50,0xA9,0x51,0xAF,0x46,0xA0,0x42,0x80,0x00,0x00},
/*-- 文字: 制 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
{0x00,0x00,0x00,0x50,0x3F,0x4F,0x01,0x4A,0x01,0x48,0xFF,0xFF,0x21,0x48,0x61,0x48,
0x3F,0x48,0x00,0x00,0x0F,0xFC,0x40,0x00,0x80,0x00,0x7F,0xFF,0x00,0x00,0x00,0x00},
/*-- 文字: 作 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
{0x00,0x80,0x00,0x40,0x00,0x20,0xFF,0xF8,0x00,0x07,0x00,0x22,0x00,0x18,0x00,0x0C,
0xFF,0xFB,0x04,0x48,0x04,0x48,0x04,0x48,0x04,0x68,0x06,0x48,0x04,0x08,0x00,0x00}
};
void Delay_50us(unsigned char t) //50us延时程序
{
unsigned char j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
void DisNFont (unsigned char *FontBufferStart,unsigned char N,unsigned char Time) //流动显示N个汉字
{ //参数三个:字符串字模首地址、字数、显示流动速度
unsigned char FontNum,i,j,row; //循环变量,字数计数、16次流动、16列扫描
for(FontNum=0;FontNum<N-1;FontNum++)
{
for(i=0;i<16;i++) //字到字流动 16次左移才能完成
{
for(j=0;j<Time;j++) //显示延迟,决定流动速度
{
for(row=0;row<16;row++) //显示16*16屏幕一次
{
SEL = row; //选通显示列
UP8 = *(FontBufferStart+FontNum*32+(i+row)*2+1); //获取显示数据 循环显示关键算法
DOWN8 = *(FontBufferStart+FontNum*32+(i+row)*2); //以移动偏移为基础获取新数据
Delay_50us (15); //适当延时
UP8 = 0x00; //关闭显示
DOWN8 = 0x00; //关闭显示 防止花屏
}
}
}
}
}
void main (void)
{
while(1)
{
DisNFont (FontData[0],5,20);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -