单片机
返回首页

89c51控制的16*16LED点阵显示

2018-01-17 来源:eefocus

#include tZqy \_G  
unsigned int zimo,xx=0;    //zimo是字模计数器,xx为分屏显示的时候的字数。 /.<2I  
unsigned char yid,h;        //yid为移动计数器,h为行段计数器 t182&gpd`  

unsigned char code hanzi[];            //汉字字模 Jrm 9,7/  
unsigned char BUFF[18],BUFF2[18];    //左移显示的缓存 jk-e/C  
void qing(void);        void xianshi(void); p`}'-A|@  
void fen(void);        void zuo(void); 6im!v<1Qx  
void in_data(void);                //调整数据 568qdD`PS  
void rxd_data(void);                //左移发送数据 [mJmT->  
void out_rxd(unsigned char *d);        //分屏、上移发送数据 ^;=L|{Xl  
char code sw[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x00}; /*8行段码*/ E3==gYCe*  
/***********主程序******************/ .,$void main(void) g&oAa;~o  
{    unsigned char ee; 1YxG    SCON=0;P1=0;yid=0;zimo=0; BJ,9C.|  
    while(1) eG05}  
    {    fen();                //分屏显示 +dgHl_,i  
        for(ee=30;ee>0;ee--)//清屏幕3秒 swGp{wJ  
        {qing();} IqW4Q1>f  
        zuo();                //左移显示 ! O~:  
        for(ee=30;ee>0;ee--) {#o0vWS>  
        {qing();} pSC\[%K  
    } qM/\,  
} Q 2mTu[tx  
/**********清屏幕*******************/ }8e_  
void qing (void) F).7%YfY  
{  unsigned char zz,xx=0x0ff; rY,zZR+@  
    for (zz=33;zz>0;zz--)  gmW-#.  
    {out_rxd(&xx);} hC D6  
    P1=0xff; P1=0;    //锁存为高,74HC595锁存信号    ZR8%h<  
    P2=0;                //清74LS138的使能端 Q*54!^l+_r  
} Xf%vfAf  
/**********分屏显示***********/ s/\<;g:u^  
void fen(void) UpSa7F:Uw  
{    do{    xianshi();    }while(xx++<=5);    //调用单屏显示 me YSW  
    xx=0; }Dx5W9Ri'  
} $[U:Dk}  
/************单屏显示*************/ Aj{G=AT  
void xianshi(void) sp7#e%R\  
{    unsigned char ii,jj;    unsigned int kk,aa; /}Ct2w&    for (kk=500;kk>0;kk--)        //每屏显示500次 Z5`U+ (  
    {for(ii=1;ii<16;ii+=2)        //每个汉字分8行扫描 ZK`x(h{p)  
        {for (jj=0;jj<8;jj++)    //每次要发送8个汉字的2个字节,发送8次 iUq{c+h  
            {    aa=(xx*8+jj)*32+ii; rU_FRk  
                out_rxd(&hanzi[aa]);    //从串口输出第1个字的第1字节。 M5`wfF,j  
                out_rxd(&hanzi[aa-1]);    //从串口输出第1个字的第1字节。 fO}Y$y\q  
            } 2$O6%0  
            for (jj=0;jj<8;jj++)    //每次要发送8个汉字的2个字节,发送8次 xz){RkVzP  
            {    aa=(xx*8+jj)*32+ii; gx=2]~O1(  
                out_rxd(&hanzi[aa+16]);    //从串口输出第1个字的第17字节。 'FXT8Qxg  
                out_rxd(&hanzi[aa+15]);    //从串口输出第1个字的第18字节 p2j=73$  
            } B'KZ >jO  
            P2=0x0ff; NplkhgSj  
            P1=0xff; P1=0;            //锁存为高,74HC595锁存信号    |^t8ct?x~  
            P2=sw[h];                  //输出行信号 T^.W'  
            h++;                          //行加一 WHv xBd  
            if(h==8)h=0; I~NQt^sg  
        } \7A6+[ `fa  
    } ~U_,z)<`)c  
} ee{8C~  
/***************左移显示************/ x@480r  
void zuo(void) m\?H < o0  
{    unsigned char i,d=5;    //d为移动的时候一个汉字的扫描显示次数 >s+*D=k  
    xianshi();                //调用单屏显示 -% Z?rn2  
    while(zimo<=1450) C'!k`i=Lj  
        {while(yid<16)                    //数据移位。 enJgk(  
            {for(i=0;i                {for(h=0;h<8;h++)              //8行扫描 ~i y]X:U  
                    {    in_data();            //调整数据 Z&E!m   
                        rxd_data();        //串口发送数据 6@[7  
                        P2=sw[h];            //送段码 -*T<^G;rK  
                        P1=0xff;            //锁存为高,595锁存信号 mjtmN0^SR  
                        P1=0; yhpeP  
                    } !ENDQ?1  
                } QwSYjR:K  
                yid++;                        //移动一步 :|tWKA  
            } RU_wr<  
          yid=0;zimo=zimo+32;              //后移一个字, v?=y9lEH@%  
        } y9xvGr[l  
    zimo=0; cFP9b8JG  
} 'C2X9/!,  
/*************分屏显示的数据发送************/ QK`5KB(k'  
void out_rxd(unsigned char *d)      /*从串口发送数据*/ \QvoL  
{    SBUF=*d; while(!TI);          //等待发送完毕 ^kO+NH40  
    TI=0; w5+H9R6  
} NZoNsNu*C.  
/*******左移显示读取数据 并调整**************/ 0;Oe&Y  
void in_data(void) Oo0SDWI`(  
{    char s,w; unsigned int qqq; YT`,f*t  
    for(s=8;s>=0;s--) QIPV'T,S  
    {    w=s+s; n 'bii7h  
        qqq=zimo+h+h+s*32; 2Onp{,'}  
        BUFF[w+1]=hanzi[qqq]; .0Kc|b=w  
        BUFF[w]=hanzi[qqq+1]; @PT([1C  
        BUFF2[w+1]=hanzi[qqq+16]; $        BUFF2[w]=hanzi[qqq+17]; Obf RwZh?q  
    } ]9N&I/-  
} RH.qbPjx  
/**********左移显示的数据调整发送***************/ '451H3LC0  
void rxd_data(void)                    //串行发送数据 ]'&](e6*  
{unsigned char inc,s,tempyid,temp; YF)]B|I  
if(yid<8)    inc=0; v\[+  
else        inc=1; Mf2F LrAh  
for(s=0+inc;s<16+inc;s++)              //发送数据 n)~*BpL3  
    { if(yid<8)    tempyid=yid; ae2Q^yLA  
      else            tempyid=yid-8; ?=ffv]v|  
    temp=(BUFF[s]>>tempyid)|(BUFF[s+1]<<(8-tempyid));    j*5IRzK1%0  
    SBUF=temp;            //把BUFF中的字节从大到小移位相或后发送输出。 sO` oapy  
    while(!TI);TI=0;    //等待发送中断 hJ$9Hb  
    } i84!x%|P  
for(s=0+inc;s<16+inc;s++)              //发送8字节数据 R0}1:1}$Sn  
    {  if(yid<8)    tempyid=yid; VJ=>2'I  
      else        tempyid=yid-8;  ]'`E  
    temp=(BUFF2[s]>>tempyid)|(BUFF2[s+1]<<(8-tempyid));    c7jmzo  
    SBUF=temp;            //把BUFF中的字节从大到小移位相或后发送输出。 '~5cz0 H3v  
    while(!TI);TI=0;    //等待发送中断 ~x^y5[5{  
    } =nGFLH6)  
} >I|8yqbFM  
unsigned char code hanzi[]={/*自己的汉字编码请放在这里*/};


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 基于IC555的可变PWM振荡器电路

  • 优化电路板布局的简单方法

  • 如何使用LED驱动器LM3915制作振动计

  • 电谐波图形均衡器示意图

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章