您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

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

[日期:2008-03-02 ] [来源:东哥开发网(www.picavr.com) 作者:佚名] [字体: (投递新闻)
#include <AT89x51.H> 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*  
/***********主程序******************/ .,$<waGD  
void main(void) g&oAa;~o  
{    unsigned char ee; 1YxG<K]  
    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  
    } q<Sb>M/\,  
} 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&<k  
    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<d;i++)                //移动速度 27-GfC=7*  
                {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]; $<QrV,T  
        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[]={/*自己的汉字编码请放在这里*/};
阅读:
录入:petta

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告