设计实现用一个16*16点阵显示一个字符“田”?
16*16点阵显示
单片机自20世纪70年代问世以来,以极其高的性能价格比受到人们的重视和关注,所以应用很广,发展很快。单片机的特点是体积小、集成度高、重量轻、抗干扰能力强,对环境要求不高,价格低廉,可靠性高,灵活性好,开发较为容易。正因为单片机有如此多的优点,因此其应用领域之广,几乎到了无孔不入的地步。在我国,单片机已被广泛地应用在工业自动化控制、自动检测、智能仪表、智能化家用电器、航空航天系统和和国防军事、尖端武器等各个方面。我们可以开发利用单片机系统以获得很高的经济效益。更重要的意义是单片机的应用改变了控制系统传统的设计思想和方法。以前采用硬件电路实现的大部分控制功能,正在用单片机通过软件方法来实现。这种以软件结合硬件或取代硬件并能提高系统性能的控制技术称为微控制技术。例如,本文所要论述的通过单片机来控制LED点阵显示。
LED是发光二极管英文Light Emitting Diode 的简称,是六十年代末发展起来的一种半导体显示器件,七十年代,随着半导体材料合成技术、单晶制造技术和P-N结形成技术的研究进展,发光二极管在发光颜色、亮度等性能得以提高并迅速进入批量化和实用化。进入八十年代后,LED在发光波长范围和性能方面大大提高,并开始形成平板显示产品即LED显示屏。
LED电子显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。它是集微电子技术、光电子技术、计算机技术、信息处理技术于一体的显示系统,是目前国际上极为先进的显示媒体。由于它具有发光效率高、使用寿命长、组态灵活、色彩丰富、工作性能稳定以及对室内室外环境适应能力强等优点而日渐成为显示媒体中的佼佼者。在我国改革开放之后,特别是进入90年代国民经济高速增长,对公众场合发布信息的需求日益强烈,LED显示屏的出现正好适应了这一市场形势,因而在LED显示屏的设计制造技术与应用水平上都得到了迅速的提高,生产也得到了迅速的发展,并逐步形成产业,成为光电子行业的新兴产业领域。LED显示屏经历了从单色、双色图文显示屏,到图像显示屏的发展过程。
随着信息产业的高速发展,LED显示屏作为信息传播的一种重要手段成为现代信息化社会的一个闪亮标志。近年LED显示屏已广泛应用于室内、外需要进行服务内容和服务宗旨宣传的公众场所如银行、营业部、车站、机场、港口、体育场馆等信息的发布,政府机关政策、政令,各类市场行情信息的发部和宣传等。目前,对于那些需要显示的信息量不是很大,分辨率不是很高,又需要制造成本相对比较低的场合,使用大、小屏幕LED点阵显示器是比较经济适用的,它可以用单片机控制实现显示字符、数字、汉字和简单图形,可以根据需要使用不同字号、字型。
汉字显示方式是先根据所需要的汉字提取汉字点阵(如16×16点阵),将点阵文件存入ROM,形成新的汉字编码。而在使用时则需要先根据新的汉字编码组成语言,再由MCU根据新编码提取相应的点阵进行汉字显示。具体显示技术和原理将会在正文中得到详细论述。
第二章
系统整体设计方案
2.1
需要实现的功能
设计一个室内用16×16点阵LED图文显示屏,要求在目测条件下LED显示屏各点亮度均匀、充足,可显示图形和文字,显示图形或文字应稳定、清晰无串扰。图形或文字显示有静止、移入移出等显示方式。
2.2
LED显示特点
LED发光灯可以分为单色发光灯、双色发光灯、三色发光灯、面发光灯、闪烁发光灯、电压型发光灯等多种类型。按照发光灯强度又可以分为普通亮度发光灯、高亮度发光灯、超高亮度发光灯等。这种单个的发光灯适宜用做指示灯,如电源指示、电路状态指示灯,进而对能够转变成电信号的各种物理量进行指示。也可以用多个LED发光灯组成固定的字符或图形进行显示,如大型剧场会堂的出入口及洗手间的显示。和很多应用术语一样,LED图文显示屏并没有一个公认的严格的定义,一般把显示图形和/或文字的LED显示屏称为图文屏。这里所说的图形,是指由单一亮度线条组成的任意图形,以便于不同亮度(灰度)点阵组成的图像相区别。图文显示屏的主要特征是只控制LED点阵中各发光器件的通断(发光或熄灭),而不控制LED的发光强弱。LED图文显示屏的外观可以做成条形,叫做条形图文显示屏(简称条屏),也可以按一定高度比例做成矩形的平面图文显示屏。其实条屏只不过是其宽度远大于高度的平面显示屏,在显示与控制的原理上并无区别。
从理论上说,不论显示图形还是文字,都是控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光。通常事先把需要显示的图形文字转换成点阵图形,再按照显示控制的要求以一定的格式形成显示数据。对于只控制通断的图文显示屏来说,每个LED发光器件占据数据中的1位(1bit),在需要该LED器件发光的数据中相应的位填1,否则填0。当然,根据控制电路的安排,相反的定义同样是可行的。这样依照所需显示的图形文字,按显示屏的各行各列逐点填写显示数据,就可以构成一个显示数据文件。显示图形的数据文件,其格式相对自由,只要能够满足显示控制的要求即可。文字的点阵格式比较规范,可以采用现行计算机通用的字库字模。组成一个字的点阵,其大小也可以有16×16、24×24、32×32、48×48等不同规格。汉字的点阵结构相应的显示数据是用16进制格式以字节为单位表示的。
用点阵方式构成图形或文字,是非常灵活的,可以根据需要任意组合和变化,只要设计好合适的数据文件,就可以得到满意的显示效果。因而采用点阵式图文显示屏显示经常需要变化的信息,是非常有效的。
/*
24MHZ的晶振,点线扫描地址为:0xFFFF
*/
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#include <ABSACC.h>
#define uchar unsigned char
#define uint unsigned int
#define SPEED 6
uchar col, disrow;
uint word;
uchar code HZ[];
uchar BUFF[6];
void loadoneline(void); //装载某行一线点阵数据
void sendoneline(void); //串行发送一行线点阵数据
/****************************主函数***************************/
void main(void)
{
uchar i;
col = 0;
word = 0;
while(1)
{
while(col <16) // 循环16次,点亮并移动一个汉字
{
for(i=0; i <SPEED; i++) //汉字在屏幕上的停留时间(即移动速度快慢)
{
for(disrow=0;disrow <16;disrow++)//扫描16行
{
loadoneline(); //装载一线点阵数据
sendoneline(); //发送一线点阵数据
XBYTE[0xFFFF]= 0x10 + disrow; // 点亮屏幕
XBYTE[0xFFFF] = 0x20 + disrow; //锁住74LS595
}
}
col++; //列指针递增
}
col = 0;
word= word + 32; // 一个汉字移动后,指向下一个汉字
if(word >= 1600)
word = 0; // 移动50个汉字后,重新开始
}
}
/****************用"字模"等软件提出要显示的字符汉字点阵码*************************/
uchar code HZ[]=
{
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,
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,
//0x08,0x20,0x06,0x30,0x04,0x40,0x3F,0xF8,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,
0x3F,0xF8,0x21,0x08,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,/*"单",0*/
0x00,0x40,0x10,0x40,0x10,0x40,0x10,0x44,0x1F,0xFE,0x10,0x00,0x10,0x00,0x10,0x00,
0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x20,0x10,0x20,0x10,0x40,0x10,0x80,0x10,/*"片",1*/
0x10,0x00,0x10,0xF8,0x10,0x88,0xFE,0x88,0x10,0x88,0x10,0x88,0x38,0x88,0x34,0x88,
0x54,0x88,0x50,0x88,0x91,0x08,0x11,0x0A,0x12,0x0A,0x12,0x0A,0x14,0x06,0x10,0x00,/*"机",2*/
0x00,0x00,0x0F,0xF0,0x08,0x10,0x0F,0xF0,0x08,0x10,0x0F,0xF0,0x08,0x10,0x0F,0xF0,
0x
}
单片机显示16*16汉字
单片机显示16*16汉字代码:
#include <reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit acon=P1^0;//上8位地址线
sbit bcon=P1^1;
sbit ccon=P1^2;
sbit acon1=P1^3;//下8位地址线
sbit bcon1=P1^4;
sbit ccon1=P1^5;
sbit en=P1^6;//38译码器使能
sbit en1=P1^7;
uint8 j=0,k=0;
code uint8 ledcode[]={0xDC,0x07,0xDD,0xF7,0xDD,0xF7,0xDC,0x07,0x07,0xFF,0xD8,0x43,0xDB,0x5B,0xD3,0x5B,
0xC8,0x43,0x1F,0xBF,0xD0,0x01,0xDE,0x9F,0xDD,0xAF,0xDB,0xB7,0x47,0xB9,0xBF,0xBF}; //“操”
void timer0_init() //timer0初始化
{
TMOD|=0x01;
TMOD&=0xfd;
TH0=0xfc; //1ms
TL0=0x66;
TR0=1;
}
void inter_init()
{
ET0=1;
EA=1;
}
void frush()
{
switch(j) //扫描
{
case 0:en=1;en1=0;acon=0;bcon=0;ccon=0;break;
case 1:en=1;en1=0;acon=1;bcon=0;ccon=0;break;
case 2:en=1;en1=0;acon=0;bcon=1;ccon=0;break;
case 3:en=1;en1=0;acon=1;bcon=1;ccon=0;break;
case 4:en=1;en1=0;acon=0;bcon=0;ccon=1;break;
case 5:en=1;en1=0;acon=1;bcon=0;ccon=1;break;
case 6:en=1;en1=0;acon=0;bcon=1;ccon=1;break;
case 7:en=1;en1=0;acon=1;bcon=1;ccon=1;break;
case 8:en1=1;en=0;acon1=0;bcon1=0;ccon1=0;break;
case 9:en1=1;en=0;acon1=1;bcon1=0;ccon1=0;break;
case 10:en1=1;en=0;acon1=0;bcon1=1;ccon1=0;break;
case 11:en1=1;en=0;acon1=1;bcon1=1;ccon1=0;break;
case 12:en1=1;en=0;acon1=0;bcon1=0;ccon1=1;break;
case 13:en1=1;en=0;acon1=1;bcon1=0;ccon1=1;break;
case 14:en1=1;en=0;acon1=0;bcon1=1;ccon1=1;break;
case 15:en1=1;en=0;acon1=1;bcon1=1;ccon1=1;break;
}
P2=ledcode[k+1];
P3=ledcode[k];
if(j==15)j=0;
if(k==30)k=0;
j++;
k+=2;
}
main()
{
timer0_init();
inter_init();
en=1;
en1=1;
while(1);
}
void timer0_interrupt() interrupt 1
{
TH0=0xfc;
TL0=0x66;
frush();
}
设计一个16*16的点阵的代码,c语言的
很简单啊
#include<stdio.h>
void main()
{
int i,j;
for(i=0;i<16;i++)
{ for(j=0;j<16;j++)
printf(" * ");
printf("\n");
}
}
求16*16LED点阵显示汉字程序
我也不怎么会,还在学习中
下面有一个16*16的C程序
参考一下。。。
字模软件你要的话我可以给你
共同学习。。。
#include<reg51.h>
sbit P20=P2^0;
sbit P22=P2^2;
unsigned char code text[]={
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,
0x00,0x80,0x00,0x80,0xFC,0x80,0x05,0xFE,0x85,0x04,0x4A,0x48,0x28,0x40,0x10,0x40,
0x18,0x40,0x18,0x60,0x24,0xA0,0x24,0x90,0x41,0x18,0x86,0x0E,0x38,0x04,0x00,0x00,/*"欢",0*/
0x40,0x00,0x21,0x80,0x36,0x7C,0x24,0x44,0x04,0x44,0x04,0x44,0xE4,0x44,0x24,0x44,
0x25,0x44,0x26,0x54,0x24,0x48,0x20,0x40,0x20,0x40,0x50,0x00,0x8F,0xFE,0x00,0x00,/*"迎",1*/
0x01,0x00,0x21,0x10,0x19,0x18,0x0D,0x10,0x09,0x20,0x01,0x04,0x7F,0xFE,0x04,0x40,
0x04,0x40,0x04,0x40,0x04,0x40,0x08,0x42,0x08,0x42,0x10,0x42,0x20,0x3E,0x40,0x00,/*"光",2*/
0x01,0x00,0x09,0x80,0x09,0x00,0x49,0xFE,0x4A,0x20,0x4A,0x10,0x4C,0x10,0x49,0x04,
0x49,0xFE,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x09,0xFC,0x09,0x04,0x00,0x00,/*"临",3*/
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,
};
void Delay(unsigned char i)
{
unsigned char j;
for(;i>0;i--)
for(j=0;j<80;j++)
{;}
}
void main()
{
unsigned int a,e;
unsigned char b,c,d=0;
SCON=0;
while(1)
{
for(e=0;e<160;e=e+32)
{
for(a=0;a<8;a++)
{
for(b=0;b<8;b++)
{
for(c=0;c<32;c++)
{
SBUF=~(text[e+c+32]>>(8-a)|text[e+c+1]<<a);
while(TI==0);
TI=0;
SBUF=~(text[e+c+1]>>(8-a)|text[e+c]<<a);
while(TI==0);
TI=0;
c++;
P20=1;
P1=d;
P22=0;
Delay(3);
P20=0;
P22=1;
d++;
if(d==16)d=0;
}
}
}
for(a=0;a<8;a++)
{
for(b=0;b<8;b++)
{
for(c=0;c<32;c++)
{
SBUF=~(text[e+c+1+32]>>(8-a)|text[e+c+32]<<a);
while(TI==0);
TI=0;
SBUF=~(text[e+c+32]>>(8-a)|text[e+c+1]<<a);
while(TI==0);
TI=0;
c++;
P20=1;
P1=d;
P22=0;
Delay(3);
P20=0;
P22=1;
d++;
if(d==16)d=0;
}
}
}
}
for(a=0;a<160;a=a+2)
{
for(b=0;b<8;b++)
{
for(c=1;c<32;c++)
{
if(a+c<160){
SBUF=~text[a+c];
while(TI==0);
TI=0;
SBUF=~text[a+c-1];
while(TI==0);
TI=0;}
else {
SBUF=~text[a+c-160];
while(TI==0);
TI=0;
SBUF=~text[a+c-1-160];
while(TI==0);
TI=0;}
P1=c/2;
c++;
P20=1;
P22=0;
Delay(3);
P22=1;
P20=0;
}
}
}
}
}