用单片机控制单色显示屏

随着社会文化的不断发展,人们的消费标准不断改变,户外灯箱广告更是扮演着越来越重要的宣传角色,不论是汽车站,火车站,股市交易市场,还是学校都离不开它,然而传统的霓虹灯广告牌不论是在显示效果、耗电量还是可修改性上都无法满足当前社会的需求,传统的霓虹灯广告亟待改进。

由于单片机技术的不断发展和高亮度LED发光管的出现使得大屏幕高亮度LED电子广告屏成为可能,与传统的霓虹灯广告在显示效果以及可修改性上都有着无法比拟的优势,而且单片机的日益平民化以及LED技术的不断创新,使得高亮度高清晰的LED点阵广告牌与传统霓虹灯广告牌的成本日益接近。另外,SMT技术的飞速发展,开关电源的大规模使用,使其无论在体积上还是在可靠性上都比传统的霓虹灯广告有明显的优势,为其在特殊领域的应用奠定了基础。

这种新兴的大屏幕显示技术成为众人目光的焦点。与传统的显示设备相比,首先,LED 显示屏色彩丰富,3基色的发光管的可以显示全彩色,显示显示方式变化多样(文字、图形、动画、视频、电视画面等)、亮度高,是集光电子技术、微电子技术、计算机技术、信息处理技术于一体的高技术产品,可用来显示文字、计算机屏幕同步的图形。其次,LED 显示屏的象素采用LED发光二极管,将多个发光二极管以序列的形式构成LED显示阵列,这种显示屏具有耗电省、成本低、亮度清晰度高、寿命长等优点,而且 LED 显示屏以其受空间限制较小,并可以根据用户要求设计屏的大小,具有全彩色效果,视角大,是信息传播设施划时代的产品。再次,LED 显示屏应用广泛,金融证券、银行利率、商业广告、文化娱乐等方面,显示效果清晰稳定,越来越多的地方开始使用LED电子显示屏,有巨大的社会效益和经济效益。它以其超大画面、超宽视觉、灵活多变的显示方式等独居一格的优势,是目前国际上使用广泛的显示系统。

  1. 设计任务

设计一个室内用32*64点阵LED单色图文显示屏,要求在目测条件下LED显示屏各点亮度均匀,充足,可显示图形和文字,显示图形或文字稳定、清晰无串扰。图形或文字显示有静止和移入移出等显示方式。本文重点介绍了基于单片机系统的单色LED显示屏的控制电路、驱动电路的设计方法,并针对一个32x64屏的显示特点,对其软件实现的算法给出了具体的分析。

  1. 数学模型

对于点阵型LED显示可以采用共阴极或共阳极,本系统采用共阳极,其硬件电路如图1.1所示。当行上有一正选通信号时,列选端四位数据为0的发光二极管便导通点亮。这样只需要将图形或文字的显示编码作为列信号跟对应的行信号进行逐次扫描,就可以逐行点亮点阵。只要扫描速度大于24Hz,由于扫描时间很快,人眼的视觉有暂留效应,就可以看到显示的是完整的图形或文字。

 

图1.1 4*4共阳极LED点阵

例如,若要图中所示16个LED显示一个“口”字的方框,则首先在列1~4上写入列编码信号,接着应将对应的行上加选通信号,即在行、列的信号端分别加上如表1.1所示数据:

 

列1

列2

列3

列4

行1

0

0

0

0

行2

0

1

1

0

行3

0

1

1

0

行4

0

0

0

0

表1.1 在点阵上所加的行信号以及列选择信号

这样,当第一行选通时列信号为0000;第二行选通时列信号为0110;第三行选通时列信号为0110;第四行选通时列信号为0000;再选通第一行送列信号0000……如此循环下去,当刷新频率足够高时(大于24Hz),由于人眼的视觉暂留特性,便可观察到稳定的方框。

  1. 方案论证

从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。32*64的点阵共有2048个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,32*64的点阵需要256个锁存器。这个数字很庞大,而且成本很昂贵,我们仅仅是32*64的8个汉字点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。

动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如8行)的同名列共用一套列驱动器。具体就32*64的点阵来说,把所有同一列的发光管的阴极连在一起,再去驱动这一列LED (共阳接法),每一列先送出对应第1行发光管对应的数据并锁存,再选通第1行使其点亮一定的时间,然后熄灭;再送出第2行的数据并锁存,再选通第2行使其点亮相同的时间,然后熄灭……第8行之后,又重新点亮第1行,反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形了。

采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。显示数据通常存储在单片机的程序存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。从控制电路到列驱动器的数据传输可以采用并行方式或串行方式。采用并行方式时,32*64的LED点阵有8列8*8的点阵,需要8*8=64个列数据输入口,而一个89C51只有32个I/O接口,还要同时驱动行数据,根本不够用;并且从控制电路到列驱动器的线路数量大,相应的硬件数目多,由此可以得出,当列数很多时,并行传输的方案是不可取的。

采用串行传输的方法,控制电路可以只用2根线:数据线、时钟线。将行数据一位一位传往行驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给行驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给显示的时间就太少了,以致影响到LED的亮度。

解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。即在显示本行数据的同时,传送下一行的数据。为了达到重叠处理的目的,列数据的显示驱动电路就需要具有锁存功能。经过上述分析,可以归纳出列驱动器电路应具备的主要功能:对数据准备来说,它应能实现串入并出的移位功能;对数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打人并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。同时为了LED显示的亮度,采用8行扫描,每个汉字上面有2个16列驱动器驱动,列驱动器的位置应该是在第1行跟第9行,即每个16*16的汉字点阵是有4个8*8的点阵组成的阵列,扫描的时候同时扫描显示第1行跟第9行,第二次扫描的时候显示第2行跟第10行,以此类推,最后显示第8行跟第16行,如图1.2所示:

第1行全亮 ● ● ● ● ● ● ● ●|● ● ● ● ● ● ● ●

第2行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第3行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第4行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第5行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第6行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第7行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第8行不亮 ○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第9行全亮 ● ● ● ● ● ● ● ●|● ● ● ● ● ● ● ●

第10行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第11行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第12行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第13行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第14行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第15行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

第16行不亮○ ○ ○ ○ ○ ○ ○ ○|○ ○ ○ ○ ○ ○ ○ ○

图1.2

综合上述可以看出整个点阵显示的实现电路结构应该如图1.3所示:

 

图1.3 显示屏电路框图

硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路以及LED点阵阵列三大部分。

在实际应用中的大屏幕LED点阵显示屏,都是采用很多的显示模块组成,每个模块一般是有32*64个点阵组成,每个模块负责自己那部分LED的显示;有电脑通过统一的协议发送数据到每个控制单片机,行选是统一的;而且控制模块也是分开的,一个控制模块上面有很多的RAM芯片,控制芯片接收从主控电脑发送过来的数据,并将其保存在RAM中,之后不需要电脑控制即可自己循环控制显示。而且一个模块控制几个至几十个32*64的点阵模块。

  1. 电源电路

本设计采用的是电脑开关电源,它的主控芯片是TL494。TL494是一种固定频率脉宽调制电路,它包含了开关电源控制所需的全部功能,广泛应用于单端正激双管式、半桥式、全桥式开关电源。TL494的管脚以及内部电路框图如图2.1所示。其引脚功能如下:

 

图2.1 TL494外部管脚以及内部电路框图

1、2,16、15脚分别为2个误差比较放大器的同相输入端和反相输入端。3脚为控制比较放大器和误差比较放大器的公共输出端,输出时表现为或输出控制特性,也就是就在两个放大器中,输出幅度大者起作用;当3脚的电平变高时,TL494送出的驱动脉冲宽度变窄,当3脚电平低时,驱动脉冲宽度变宽。4脚为死区电平控制端,从4脚加入死区控制电压可对驱动脉冲的最大宽度进行控制,使其不超过180度,这样可以保护开关电源电路中的三极管。5、6脚分别用于外接振荡电阻和电容。7脚为接地端。8、9脚和11、12脚分别为TL494内容末级两个输出三极管的集电极和发射极。12脚为电源供电端。13脚为功能控制端。14脚为内部5V基准电压输出端。我们的设计使用电脑开关电源提供的12V,5V,3.3V 3路电压。

  1. 单片机系统及外围电路

由于LED点阵显示屏由单片机控制部分和显示驱动部分组成,单片机我选择最常见的ATMEL公司的AT89C51单片机。此单片机与MCS-51产品指令系统完全兼容,由4K字节可重擦写Flash闪速存储器,128*8字节内部RAM,32个可编程I/O口线,2个16位定时/计数器和6个中断源。并且该单片机经济实用,使用广泛。

我们使用的是AT89C51的最小系统电路,包括:电源、时钟脉冲、复位电路和程序存储器设定电路,暂时只是显示很少的几十个汉字,不用外接存储扩展。

  1. 时钟脉冲电路

AT89C51单片机的最高时钟脉冲频率已经达到了24MHz ,它内部已经具备了振荡电路,只要在AT89C51的两个引脚(即19、18脚)连接到简单的石英振荡晶体的2个管脚即可,同时晶体的2个管脚也要用30pF的电容耦合到地。

  1. 复位电路

89C51的复位引脚(RESET)是第9脚,当此引脚连接高电平超过2个机器周期,即可产生复位的动作。以24MHz的时钟脉冲为例,每个时钟脉冲为0.5μS,两个机器周期为1µS,因此,在第9脚上连接一个2μS的高电平脉冲,即可产生复位动作。最简单的就是只有一个电阻跟一个电容就可可靠复位的电路,电阻一般选择10K,电容一般选择10µF,如图2.2所示。

 

图2.2 通电瞬间复位电路

  1. 程序及数据存储器设定

因为单片机内部数据存储器只有128 Byte,非常有限,运行大一点的程序就显得捉襟见肘;而且程序存储器空间也只有4K,大一点的程序就存储不下,尤其是在存储汉字点阵信息的时候,每个汉字32Byte,100个汉字就到了3.1KB,程序也只有不到1KB的容量了。 在这时候必须外接存储器来扩展,那单片机怎么知道我们当前使用的是内部程序存储器还是外部程序存储器呢?所以就需要设定单片机是使用外部程序存储器还是内部程序存储器,89C51把31脚设定为此功能,如果把31脚接地,则采用外部程序存储器,如果把31脚接VCC,则默认采用内部程序存储器。我们暂时只是显示几十个汉字研究原理,所以仅仅用内部存储器就足够了,所以把31脚接高电位,就仅仅使用内部的4K程序存储空间。如图2.3所示。但是在现实大屏幕显示应用中,一般要扩展RAM,比如HY62256A(32K*8bit RAM),因为大量的数据是有电脑传送过来的,每个单片机只是负责自己控制的一行字符,这些数据是要随时更新的,采用RAM可以随时更新内容;而且一般的显示程序优化以后的代码4K也够用了。

 

图2.3 89C51的基本外部电路

  1. 列驱动电路
  2. 总体规划及实现电路

每个汉字需要4个8*8的LED点阵,要想实现8行扫描驱动,上下2行必须都有1个74HC595接到LED点阵模块上,而每个汉字是按照16*16取模,所以需要4个74HC595来驱动一个汉字,我的电路设计的是8个汉字,所以需要8*4=32个74HC595来实现8行扫描显示。设计好的列驱动电路的部分如下图2.6所示:

 

图2.4列驱动部分电路图

  1. 串入并出移位寄存器74HC595

列驱动电路由集成电路74HC595构成。它具有一个8位串入并出的移位寄存器和一个8位输出锁存器,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。

 

图2.5 74HC595外形及内部逻辑结构图

74HC595的外形及内部结构如图2.5所示。它的输入端有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI是串行数据的输入端。引脚SCK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK是输出锁存器的打入信号,其上升沿将移位寄存器的输出打入到输出锁存器。引脚G是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则输出端为高阻状态。SCLR信号是移位寄存器的清0输入端,当其为低时移位寄存器的输出全部为0。由于SCK和RCK两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为QA~QH,最高位QH可作为多片74HC595级联应用时向上一级的级联输出。但因QH受输出锁存器打人控制,所以还从输出锁存器前引出了QH’,作为与移位寄存器完全同步的级联输出。

 

图2.6   74HC595在不同的工作电压下的时钟频率

由74HC595在4.5V供电的情况下(25℃),可以达到21MHz以上的时钟频率,而我们采用的89C51的时钟频率只有24MHz,串口方式0的时钟频率只有fosc/12=2MHz,所以74HC595完全胜任;由于74HC595输出高电平时每个管脚的驱动电流只有20mA,而每个LED发光管的驱动电流也是20mA,要是8个发光管同时轮流点亮的时候瞬间电流必定大于20mA,所以我们采用是采用吸收电流的方式直驱LED发光管。

以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin 3.0版环境下均测试通过。

/**********分屏显示***********/

void fen(void)

{  do{ xianshi(); }while(xx++<=5);  //调用单屏显示

   xx=0;

}

/************单屏显示*************/

void xianshi(void)

{  unsigned char ii,jj; unsigned int kk,aa;

   for (kk=500;kk>0;kk--)      //每屏显示500次

   {for(ii=1;ii<16;ii+=2)      //每个汉字分8行扫描

       {for (jj=0;jj<8;jj++)    //每次要发送8个汉字的2个字节,发送8次

          {   aa=(xx*8+jj)*32+ii;

              out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。

              out_rxd(&hanzi[aa-1]);  //从串口输出第1个字的第1字节。

          }

          for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次

          {   aa=(xx*8+jj)*32+ii;

              out_rxd(&hanzi[aa+16]); //从串口输出第1个字的第17字节。

              out_rxd(&hanzi[aa+15]);  //从串口输出第1个字的第18字节

          }

          P2=0x0ff;

          P1=0xff; P1=0;           //锁存为高,74HC595锁存信号

          P2=sw[h];               //输出行信号

          h++;                     //行加一

          if(h==8)h=0;

       }

   }

}

/*************分屏显示的数据发送************/

void out_rxd(unsigned char *d)   /*从串口发送数据*/

{  SBUF=*d; while(!TI);          //等待发送完毕

     TI=0;

 }

  1. 左移显示子程序

void zuo(void)

{  unsigned char i,d=5;

   while(zimo<=1200)

       {   while(yid<16)                   //数据移位。

          {   for(i=0;i<d;i++)            //移动速度

              {for(h=0;h<8;h++)            //8行扫描

                 {   in_data();           //调整数据

                     rxd_data();          //串口发送数据

                     P2=sw[h];            //送段码

                     P1=0xFF;             //锁存为高,595锁存信号

                     P1=0;

}

              }

              yid++;                      //移动一步

          }

          yid=0;

          zimo=zimo+32;                    //后移一个字,

       }

   qing();

   zimo=0;

}

/***********读取数据***********/

void in_data(void)

{char s,w;

unsigned int qqq;

   for(s=8;s>=0;s--)

   {   w=s+s;

       qqq=zimo+h+h+s*32;

       BUFF[w+1]=hanzi[qqq];

       BUFF[w]=hanzi[qqq+1];

       BUFF2[w+1]=hanzi[qqq+16];

       BUFF2[w]=hanzi[qqq+17];

   }

}

/**************调整数据并发送*******************/

void rxd_data(void)                 //串行发送数据

{char s;

unsigned char inc,tempyid,temp;

if(yid<8)

   inc=0;

else

   inc=1;

for(s=0+inc;s<16+inc;s++)             //发送数据

   {

     if(yid<8)

       tempyid=yid;

     else

       tempyid=yid-8;

   temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));   

   SBUF=temp;//把BUFF中的字节从大到小移位相或后发送输出。

   while(!TI);TI=0;     //等待发送中断

   }

for(s=0+inc;s<16+inc;s++)             //发送8字节数据

   { if(yid<8)

       tempyid=yid;

     else

       tempyid=yid-8;

   temp=(BUFF2[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid)); 

   SBUF=temp;//把BUFF中的字节从大到小移位相或后发送输出。

   while(!TI);TI=0;     //等待发送中断

   }

}

整体电路图:

 

整个设计全部源程序:

/*以下是32x64点阵LED电子显示屏的源程序,采用C语言编写,在Keil μVisionV2.38a(C51.Exe V7.06)以及MedWin3.0版环境下均测试通过。*/

#include <AT89x51.H>

unsigned int zimo,xx=0; //zimo是字模计数器,xx为分屏显示的时候的字数。

unsigned char yid,h;    //yid为移动计数器,h为行段计数器

unsigned char code hanzi[];         //汉字字模

unsigned char BUFF[18],BUFF2[18];  //左移显示的缓存

void qing(void);     void xianshi(void);

void fen(void);      void zuo(void);

void in_data(void);            //调整数据

void rxd_data(void);           //左移发送数据

void out_rxd(unsigned char *d);       //分屏、上移发送数据

char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*/

/***********主程序******************/

void main(void)

{  unsigned char ee;

   SCON=0;P1=0;yid=0;zimo=0;

   while(1)

   {   fen();            //分屏显示

       for(ee=30;ee>0;ee--)//清屏幕3秒

       {qing();}

       zuo();            //左移显示

       for(ee=30;ee>0;ee--)

       {qing();}

   }

 }

/**********清屏幕*******************/

void qing (void)

{  unsigned char zz,xx=0x0ff;

   for (zz=33;zz>0;zz--)

   {out_rxd(&xx);}

   P1=0xff; P1=0;    //锁存为高,74HC595锁存信号

   P2=0;             //清74LS138的使能端

}

/**********分屏显示***********/

void fen(void)

{  do{ xianshi(); }while(xx++<=5);  //调用单屏显示

   xx=0;

}

/************单屏显示*************/

void xianshi(void)

{  unsigned char ii,jj; unsigned int kk,aa;

   for (kk=500;kk>0;kk--)      //每屏显示500次

   {for(ii=1;ii<16;ii+=2)      //每个汉字分8行扫描

       {for (jj=0;jj<8;jj++)    //每次要发送8个汉字的2个字节,发送8次

          {   aa=(xx*8+jj)*32+ii;

              out_rxd(&hanzi[aa]); //从串口输出第1个字的第1字节。

              out_rxd(&hanzi[aa-1]);  //从串口输出第1个字的第1字节。

          }

          for (jj=0;jj<8;jj++) //每次要发送8个汉字的2个字节,发送8次

          {   aa=(xx*8+jj)*32+ii;

              out_rxd(&hanzi[aa+16]); //从串口输出第1个字的第17字节。

              out_rxd(&hanzi[aa+15]);  //从串口输出第1个字的第18字节

          }

          P2=0x0ff;

          P1=0xff; P1=0;           //锁存为高,74HC595锁存信号

          P2=sw[h];               //输出行信号

          h++;                     //行加一

          if(h==8)h=0;

       }

   }

}

/***************左移显示************/

void zuo(void)

{  unsigned char i,d=5; //d为移动的时候一个汉字的扫描显示次数

   xianshi();           //调用单屏显示

   while(zimo<=1450)

       {while(yid<16)                  //数据移位。

          {for(i=0;i<d;i++)           //移动速度

              {for(h=0;h<8;h++)        //8行扫描

                 {   in_data();        //调整数据

                     rxd_data();       //串口发送数据

                     P2=sw[h];         //送段码

                     P1=0xff;          //锁存为高,595锁存信号

                      P1=0;

                 }

              }

              yid++;                   //移动一步

          }

          yid=0;zimo=zimo+32;          //后移一个字,

       }

   zimo=0;

}

/*************分屏显示的数据发送************/

void out_rxd(unsigned char *d)   /*从串口发送数据*/

{  SBUF=*d; while(!TI);          //等待发送完毕

     TI=0;

 }

/*******左移显示读取数据 并调整**************/

void in_data(void)

{  char s,w; unsigned int qqq;

   for(s=8;s>=0;s--)

   {   w=s+s;

       qqq=zimo+h+h+s*32;

       BUFF[w+1]=hanzi[qqq];

       BUFF[w]=hanzi[qqq+1];

       BUFF2[w+1]=hanzi[qqq+16];

       BUFF2[w]=hanzi[qqq+17];

   }

}

/**********左移显示的数据调整发送***************/

void rxd_data(void)                 //串行发送数据

{unsigned char inc,s,tempyid,temp;

if(yid<8) inc=0;

else      inc=1;

for(s=0+inc;s<16+inc;s++)             //发送数据

   { if(yid<8)   tempyid=yid;

     else        tempyid=yid-8;

   temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));   

   SBUF=temp;        //把BUFF中的字节从大到小移位相或后发送输出。

   while(!TI);TI=0;  //等待发送中断

   }

for(s=0+inc;s<16+inc;s++)             //发送8字节数据

   {  if(yid<8)  tempyid=yid;

     else        tempyid=yid-8;

   temp=(BUFF2[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid)); 

   SBUF=temp;        //把BUFF中的字节从大到小移位相或后发送输出。

   while(!TI);TI=0;  //等待发送中断

   }

}

/*************汉字编码信息*************/

unsigned char code hanzi[]={/*--  文字:  勤  --*/

0xFB,0xBB,0xFA,0x00,0xFB,0xBB,0xFB,0x83,0xC0,0xEF,0xDB,0x01,0xDB,0x6D,0xDB,0x01,0xDB,0xEF,0xDB,0x01,0xDB,0xEF,0xDB,0x83,0xDD,0xEF,0xDD,0x0F,0xD6,0xE0,0xEF,0x7D,/*--  文字:  奋  --*/

0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFE,0xBF,0xFD,0xDF,0xF3,0xEF,0x8F,0xF3,0xD0,0x04,0xF7,0x77,0xF7,0x77,0xF0,0x07,0xF7,0x77,0xF7,0x77,0xF0,0x07,0xF7,0xF7,/*--  文字:  求  --*/

0xFB,0x7F,0xF7,0x7F,0xF7,0x7F,0xC0,0x01,0xFF,0x7F,0xEF,0x7B,0xF7,0x77,0xFA,0x6F,0xFD,0x7F,0xFB,0x5F,0xF7,0x6F,0x8F,0x77,0xDF,0x79,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,/*--  文字:  实  --*/

0xFF,0x7F,0xFE,0xFF,0x80,0x01,0xDF,0xFD,0xEE,0xEE,0xFE,0xDF,0xFE,0xDF,0xFE,0xF7,0xFE,0xEF,0xFE,0xEF,0xC0,0x01,0xFD,0x7F,0xFB,0xBF,0xF7,0xDF,0xCF,0xE7,0xDF,0xF9,/*--  文字:  献  --*/

0xF7,0xEF,0xF7,0xEF,0xE7,0xEF,0xD6,0x00,0xD7,0xEF,0xF7,0xEF,0x81,0x01,0xF7,0x55,0xF7,0x6D,0xF7,0x01,0xEB,0x6D,0xEB,0x01,0xEB,0x6D,0xDD,0x6D,0xDD,0x4D,0xBE,0xBD,/*--  文字:  身  --*/

0xFF,0x7F,0xFF,0xBF,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,0xB0,0x0F,0xD7,0xEF,0xE7,0xEF,0xF0,0x01,0xF5,0xFF,0xF6,0xFF,0xF7,0x3F,0xF7,0xC7,0xF5,0xF8,0xFB,0xFF,/*--  文字:  开  --*/

0xFF,0xFF,0xC0,0x03,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0x80,0x01,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xEF,0xFB,0xEF,0xFB,0xF7,0xFB,0xFB,/*--  文字:  拓  --*/

0xFF,0xF7,0xFF,0xF7,0x80,0x37,0xFD,0xF7,0xFD,0xC0,0xFE,0xF7,0xFE,0xD7,0xC0,0x67,0xDE,0xB3,0xDE,0xD4,0xDE,0xF7,0xDE,0xF7,0xDE,0xF7,0xC0,0xF7,0xDE,0xF5,0xFF,0xFB,/*--  文字:  桂  --*/

0xFB,0xF7,0xFB,0xF7,0xC0,0x77,0xFB,0xF7,0xFB,0xC0,0xFB,0xF7,0x80,0x33,0xFB,0xE3,0xFB,0xD5,0xFB,0xD5,0xC0,0x76,0xFB,0xF7,0xFB,0xF7,0xFB,0xF7,0x80,0x37,0xFF,0xF7,/*--  文字:  林  --*/

0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xC0,0x81,0xFB,0xEF,0xF9,0xE7,0xF1,0xC7,0xEA,0xAB,0xEA,0xAB,0xDB,0x6D,0xBB,0xAE,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,/*--  文字:  工  --*/

0xFF,0xFF,0xFF,0xFF,0xC0,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0x80,0x00,0xFF,0xFF,0xFF,0xFF,/*--  文字:  学  --*/

0xF7,0xBB,0xF7,0x77,0xFB,0x77,0xFD,0xFF,0x80,0x01,0xDF,0xFD,0xEF,0xFE,0xF8,0x07,0xFD,0xFF,0xFE,0x7F,0x80,0x00,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,/*--  文字:  院  --*/

0xFD,0xFF,0xFB,0xC1,0x80,0x1D,0xBF,0xAD,0xFF,0xED,0xC0,0x75,0xFF,0xED,0xFF,0xED,0x80,0x1D,0xF6,0xDD,0xF6,0xDD,0xF6,0xE9,0xB6,0xF5,0xB7,0x7D,0x8F,0x7D,0xFF,0xBD,/*--  文字:  电  --*/

0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xF0,0x01,0xF7,0xBD,0xF7,0xBD,0xF0,0x01,0xF7,0xBD,0xF7,0xBD,0xF0,0x01,0xF7,0xBD,0xDF,0xBF,0xDF,0xBF,0xDF,0xBF,0xC0,0x7F,/*--  文字:  计  --*/

0xFB,0xFF,0xFB,0xF7,0xFB,0xEF,0xFB,0xEF,0xFB,0xFF,0xFB,0xFF,0x80,0x21,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xFB,0x6F,0xFB,0xAF,0xFB,0xCF,0xFB,0xEF,0xFB,0xFF,/*--  文字:  系  --*/

0xE1,0xFF,0xFE,0x01,0xFF,0xBF,0xFB,0xDF,0xFD,0xEF,0xFE,0x03,0xFF,0x7F,0xFB,0x9F,0xF7,0xEF,0xE0,0x03,0xEF,0x77,0xFF,0x7F,0xF7,0x77,0xEF,0x7B,0xEF,0x5D,0xFF,0xBF, /*--  文字:  电  --*/

0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xF0,0x01,0xF7,0xBD,0xF7,0xBD,0xF0,0x01,0xF7,0xBD,0xF7,0xBD,0xF0,0x01,0xF7,0xBD,0xDF,0xBF,0xDF,0xBF,0xDF,0xBF,0xC0,0x7F,/*--  文字:  信  --*/

0xFE,0xEF,0xFD,0xEF,0xFD,0xEF,0xC0,0x17,0xFF,0xF7,0xFF,0xF3,0xE0,0x35,0xFF,0xF6,0xE0,0x37,0xFF,0xF7,0xE0,0x37,0xEF,0xB7,0xEF,0xB7,0xEF,0xB7,0xE0,0x37,0xEF,0xB7,/*--  文字:  0  --*/

0xFC,0x1F,0xFB,0xEF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFB,0xEF,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*--  文字:  2  --*/

0xFE,0x1F,0xFD,0xEF,0xFB,0xF7,0xFB,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0xFF,0xFF,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xEF,0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*--  文字:  -  --*/

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*--  文字:  3  --*/

0xF0,0x0F,0xFB,0xFF,0xFD,0xFF,0xFE,0xFF,0xFC,0x7F,0xFB,0xFF,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xF7,0xFF,0xFB,0xEF,0xFC,0x1F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*--  文字:  班  --*/

0xFE,0xFF,0xFE,0xFF,0x82,0xC0,0xEE,0xF7,0xEE,0xF7,0xEE,0xB7,0xEE,0xA1,0x82,0xB7,0xEE,0xD7,0xEE,0xF7,0xEE,0xF7,0xEF,0x47,0xEF,0x70,0x81,0xBD,0xFF,0xDF,0xFF,0xE7, /*--  文字:  张  --*/

0xFF,0x7F,0xEF,0x60,0xEF,0x6F,0xF7,0x6F,0xFB,0x6F,0xFD,0x61,0xFF,0x7D,0x80,0x1D,0xFD,0x7D,0xFD,0x61,0xFB,0x6F,0xFB,0x6F,0xF7,0x6F,0x8D,0x6F,0xDE,0x75,0xFF,0x7B,/*--  文字:  涛  --*/

0xFE,0xFF,0xFE,0xFB,0xC0,0x17,0xFE,0xF7,0xE0,0x3E,0xFE,0xFD,0x80,0x0D,0xEF,0x7F,0xEF,0x77,0x80,0x3B,0xEF,0xB8,0xEF,0x5B,0xEE,0xEB,0xEE,0xF3,0xEB,0xFB,0xF7,0xFF,/*--  文字:  制  --*/

0xDF,0xDF,0xDF,0xDB,0xDF,0xDB,0xDA,0x03,0xDB,0xDB,0xDB,0xDD,0xD8,0x00,0xDB,0xDF,0xDB,0xDF,0xDA,0x03,0xDA,0xDB,0xDE,0xDB,0xDE,0x9B,0xDF,0x5B,0xD7,0xDF,0xEF,0xDF,/*--  文字:  作  --*/

0xFF,0x6F,0xFF,0x6F,0xFF,0x6F,0x80,0x77,0xFE,0xB7,0xFE,0xB3,0xFE,0xD5,0xE0,0xE6,0xFE,0xF7,0xFE,0xF7,0xFE,0xF7,0xC0,0xF7,0xFE,0xF7,0xFE,0xF7,0xFE,0xF7,0xFE,0xF7,/*--  文字:  谢  --*/

0xEF,0x7F,0xEF,0xBD,0xEE,0x13,0xEE,0xDB,0x80,0x1F,0xEE,0xDF,0xEC,0x18,0xEA,0xDB,0xEA,0x0B,0xEE,0x7B,0xEE,0xBB,0xEE,0xAB,0xEE,0xD3,0xEE,0xEB,0xEA,0xB7,0xF7,0x7F,/*--  文字:  谢  --*/

0xEF,0x7F,0xEF,0xBD,0xEE,0x13,0xEE,0xDB,0x80,0x1F,0xEE,0xDF,0xEC,0x18,0xEA,0xDB,0xEA,0x0B,0xEE,0x7B,0xEE,0xBB,0xEE,0xAB,0xEE,0xD3,0xEE,0xEB,0xEA,0xB7,0xF7,0x7F,/*--  文字:  各  --*/

0xFF,0xDF,0xFF,0xDF,0xF0,0x1F,0xFB,0xCF,0xFB,0xB7,0xFD,0xB9,0xFE,0x7F,0xF9,0x9F,0x87,0xE7,0xD0,0x08,0xF7,0xEF,0xF7,0xEF,0xF7,0xEF,0xF7,0xEF,0xF0,0x0F,0xFF,0xFF,/*--  文字:  位  --*/

0xFF,0x6F,0xFC,0xCF,0xFD,0xF7,0xC0,0x17,0xFF,0xFB,0xF7,0xD3,0xE7,0xB5,0xF7,0xB5,0xF7,0x76,0xFB,0x77,0xFB,0x77,0xFB,0xF7,0xFD,0xF7,0x80,0x07,0xFF,0xF7,0xFF,0xFF,/*--  文字:  老  --*/

0xFF,0xBF,0xEF,0xBF,0xC0,0x01,0xEF,0xBF,0xF7,0xBF,0xFB,0xBF,0x80,0x00,0xFE,0x7F,0xFF,0xBF,0xF3,0xCF,0xFC,0xD3,0xFF,0x1C,0xDF,0xDF,0xDF,0xDF,0xC0,0x3F,0xFF,0xFF,/*--  文字:  师  --*/

0xFF,0xEF,0x80,0x2F,0xFB,0xED,0xFB,0xED,0x80,0x2D,0xBB,0xAD,0xBB,0xAD,0xBB,0xAD,0xBB,0xAD,0xBB,0xB5,0xAB,0xB5,0xDB,0xB7,0xFB,0xFB,0xFB,0xFD,0xFB,0xFE,0xFB,0xFF,/*--  文字:  !  --*/

0xFE,0x3F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFC,0x1F,0xFE,0x3F,0xFE,0x3F,0xFF,0x7F,0xFF,0xFF,0xFF,0x7F,0xFE,0x3F,0xFE,0x3F,0xFF,

0x7F,0xFF,0xFF};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值