找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2222|回复: 2
打印 上一主题 下一主题
收起左侧

求助,滚屏点阵的程序代码不会啊

[复制链接]
跳转到指定楼层
楼主
我原理图都画出来了,就是C语言没学好,代码不会写,写的程序一直用不了,求哪位大神无聊时帮我写写,原理图,程序都打包上传了,我的那个不成功,求大神啊,或者可以加我QQ交流交流:1204106723





这个是程序:(老是感觉不对)
#include <reg51.h>
#include <intrins.h>
#define  DATAOUT P2    //P2 use as data,  you can change
#define  SPEED  13

void ymove(char dir,unsigned char *ptr,char speed);
void xmove(char dir,unsigned char *ptr,char n,char speed);
void delay(unsigned int a);
void display();
void displaytime(char time);
void init164();

sbit  ADATA= DATAOUT^0;
sbit  ASCK=  DATAOUT^1;
sbit  LATCH= DATAOUT^2;
sbit  BDATA= DATAOUT^3;
sbit  BCLK=  DATAOUT^4;

code unsigned char hu[32]={
/*--  文字:  湖  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x00,0x84,0x78,0x88,0x48,0xE8,0x4B,0x81,0x48,0x82,0x78,0x82,0x48,0xE8,0x4B,
0x28,0x4A,0x24,0x7A,0x27,0x4A,0xE4,0x4B,0x24,0x4A,0x04,0x44,0x04,0x54,0x00,0x22
}

code unsigned char nan[32]={  
/*--  文字:  南  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x80,0x00,0x80,0x00,0xFF,0x7F,0x80,0x00,0x80,0x00,0xFE,0x3F,0x12,0x24,0x22,0x22,
0xF2,0x27,0x82,0x20,0x82,0x20,0xFA,0x2F,0x82,0x20,0x82,0x20,0x82,0x28,0x02,0x10
}
       
code unsigned char xin[32]={
/*--  文字:  信  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x02,0x10,0x04,0xD0,0x7F,0x08,0x00,0x08,0x00,0x8C,0x3F,0x0C,0x00,0x0A,0x00,
0x89,0x3F,0x08,0x00,0x08,0x00,0x88,0x3F,0x88,0x20,0x88,0x20,0x88,0x3F,0x88,0x20
}

code unsigned char xi[32]={           
/*--  文字:  息  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x02,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,
0x1F,0xF0,0x10,0x10,0x01,0x00,0x08,0x84,0x48,0x92,0x48,0x12,0x87,0xF0,0x00,0x00
}

code unsigned char zhi[32]={                                        
/*--  文字:  职  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFF,0x00,0x24,0xFC,0x24,0x84,0x3C,0x84,0x24,0x84,0x24,0x84,0x3C,0x84,
0x24,0xFC,0x24,0x84,0x2E,0x00,0xF4,0x48,0x44,0x44,0x04,0x84,0x04,0x82,0x05,0x02
}

code unsigned char ye[32]={
/*--  文字:  业  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x44,0x44,0x24,0x44,0x24,0x48,0x14,0x48,
0x14,0x50,0x14,0x60,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0xFF,0xFE,0x00,0x00
}

code unsigned char ji[32]={
/*--  文字:  技  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x20,0x10,0x20,0x10,0x20,0x13,0xFE,0xFC,0x20,0x10,0x20,0x10,0x20,0x15,0xFC,
0x18,0x84,0x30,0x88,0xD0,0x48,0x10,0x50,0x10,0x20,0x10,0x50,0x51,0x88,0x26,0x06
}

code unsigned char shu[32]={
/*--  文字:  术  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x01,0x20,0x01,0x10,0x01,0x10,0x7F,0xFC,0x03,0x80,0x05,0x40,0x05,0x40,
0x09,0x20,0x11,0x10,0x21,0x08,0x41,0x04,0x81,0x02,0x01,0x00,0x01,0x00,0x01,0x00
}

code unsigned char xue[32]={
/*--  文字:  学  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00
}

code unsigned char yuan[32]={
/*--  文字:  院  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x40,0x78,0x20,0x4B,0xFE,0x52,0x02,0x54,0x04,0x61,0xF8,0x50,0x00,0x48,0x00,
0x4B,0xFE,0x48,0x90,0x68,0x90,0x50,0x90,0x41,0x12,0x41,0x12,0x42,0x0E,0x44,0x00
}


code unsigned char xing[32]={
/*--  文字:  信  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x40,0x08,0x20,0x0B,0xFE,0x10,0x00,0x10,0x00,0x31,0xFC,0x30,0x00,0x50,0x00,
0x91,0xFC,0x10,0x00,0x10,0x00,0x11,0xFC,0x11,0x04,0x11,0x04,0x11,0xFC,0x11,0x04
}

code unsigned char xii[32]={
/*--  文字:  息  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x02,0x00,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x10,
0x1F,0xF0,0x10,0x10,0x01,0x00,0x08,0x84,0x48,0x92,0x48,0x12,0x87,0xF0,0x00,0x00
}

code unsigned char gong[32]={
/*--  文字:  工  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00
}

code unsigned char cheng[32]={
/*--  文字:  程  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x08,0x00,0x1D,0xFC,0xF1,0x04,0x11,0x04,0x11,0x04,0xFD,0xFC,0x10,0x00,0x30,0x00,
0x39,0xFE,0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00
}

code unsigned char xix[32]={
/*--  文字:  系  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xF8,0x3F,0x00,0x04,0x00,0x08,0x20,0x10,0x40,0x3F,0x80,0x01,0x00,0x06,0x10,
0x18,0x08,0x7F,0xFC,0x01,0x04,0x09,0x20,0x11,0x10,0x21,0x08,0x45,0x04,0x02,0x00
}


code unsigned char aa[32]={
/*--  文字:4  --*/
/*--  宽度x高度=16x16  --*/
0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xC0,0x01,0xC0,0x03,0xC0,0x06,0xC0,0x0C,0xC0,
0x18,0xC0,0x3F,0xF0,0x3F,0xF0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0x00
}

code unsigned char bb[32]={
/*--  文字:0  --*/
/*--  宽度x高度=16x16  --*/
0x00,0x00,0x00,0x00,0x0F,0xF0,0x0F,0xF0,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,
0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0F,0xF0,0x0F,0xF0,0x00,0x00,0x00,0x00
}

code unsigned char cc[32]={
/*--  文字:3  --*/
/*--  宽度x高度=16x16  --*/
0x00,0x00,0x00,0x00,0x07,0xF8,0x07,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x03,0xF8,
0x03,0xF8,0x00,0x18,0x00,0x18,0x00,0x18,0x07,0xF8,0x07,0xF8,0x00,0x00,0x00,0x00
}

code unsigned char xiang[32]={
/*--  文字:  项  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x01,0xFE,0x00,0x20,0xFC,0x40,0x11,0xFC,0x11,0x04,0x11,0x24,0x11,0x24,
0x11,0x24,0x11,0x24,0x11,0x24,0x1D,0x44,0xE0,0x50,0x40,0x88,0x01,0x04,0x02,0x02
}

code unsigned char mu[32]={
/*--  文字:  目  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,0x20,0x08,
0x20,0x08,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08
}

code unsigned char xiao[32]={
/*--  文字:  小  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x11,0x10,0x11,0x08,0x11,0x04,
0x21,0x04,0x21,0x02,0x41,0x02,0x81,0x02,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00
}

code unsigned char zu[32]={
/*--  文字:  组  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x00,0x11,0xF8,0x21,0x08,0x21,0x08,0x49,0x08,0xF9,0xF8,0x11,0x08,0x21,0x08,
0x41,0x08,0xF9,0xF8,0x41,0x08,0x01,0x08,0x19,0x08,0xE1,0x08,0x47,0xFE,0x00,0x00
}

unsigned  char idata buffer[32];

void main(void)
{
        unsigned char i;
        init164();
        while(1)
        {       
                for(i=0;i<32;i++)
                        buffer=hu;
                        buffer=nan;
                        buffer=xin;
                        buffer=xi;
                        buffer=zhi;
                        buffer=ye;
                        buffer=ji;
                        buffer=shu;
                        buffer=xue;
                        buffer=yuan;


                displaytime(1);


                xmove(1,0,SPEED);
                xmove(1,hu,3,SPEED);
                xmove(1,nan,3,SPEED);
                xmove(1,xin,3,SPEED);
                xmove(1,xi,3,SPEED);
                xmove(1,zhi,3,SPEED);
                xmove(1,ye,3,SPEED);
                xmove(1,ji,3,SPEED);
                xmove(1,shu,3,SPEED);
                xmove(1,xue,3,SPEED);
                xmove(1,yuan,3,SPEED);
                xmove(1,0,SPEED);


                displaytime(1);


                ymove(1,0,SPEED);
                ymove(1,xing,3,SPEED);
                ymove(1,xii,3,SPEED);
                ymove(1,gong,3,SPEED);
                ymove(1,cheng,3,SPEED);
                ymove(1,xix,3,SPEED);
                ymove(1,aa,3,SPEED);
                ymove(1,bb,3,SPEED);
                ymove(1,cc,3,SPEED);
                ymove(1,xiang,3,SPEED);
                ymove(1,mu,3,SPEED);
                ymove(1,xiao,3,SPEED);
                ymove(1,zu,3,SPEED);
                ymove(0,0,SPEED);

                displaytime(1);


                xmove(1,hu,1,SPEED);
                xmove(1,nan,1,SPEED);
                xmove(1,xin,1,SPEED);
                xmove(1,xi,1,SPEED);
                xmove(1,zhi,1,SPEED);
                xmove(1,ye,1,SPEED);
                xmove(1,ji,1,SPEED);
                xmove(1,shu,1,SPEED);
                xmove(1,xue,1,SPEED);
                xmove(1,yuan,1,SPEED);
        }
}
/*************  子函数   ******************/
void delay(unsigned int a)
{
        while(a--);
}

void display()
{
        unsigned char hang,ib,k,tmp;

    DATAOUT= 0x0;
        BDATA = 0;
        for(hang=0;hang<16;hang++)
        {
                ASCK =0;               
                LATCH=0;
                BCLK =0;
                for(ib=0;ib<2;ib++)
                {
                        tmp = buffer[hang*2+ib];
                        for(k=0;k<8;k++)
                        {
                                tmp <<=1;
                                ASCK  =0;
                                ADATA =CY;
                                ASCK  =1;
                        }
                }
                DATAOUT|=0x14;
                //LATCH=1;
                //BCLK=1;
                BDATA=1;
        }
        delay(64);
        ASCK =0;
        ASCK =1;
}

void displaytime(char time)
{
        unsigned char i;
        while(time--)
        {
                i=130;
                while(i--)
                         display();
        }
}

void init164()
{
        char i;
        BDATA=1;
        for(i=0;i<16;i++)
        {
                BCLK =0;
                BCLK =1;
        }
}

void xmove(char dir,unsigned char *ptr,char n,char speed)                                                                                                                                       
{      /*       方向                    n是要移动的汉字个数        移动速度*/         
        unsigned char  i=0,  ib=0;
        unsigned int   tmp=0, speedm=0;
        unsigned char  buffer2[16];         //半个汉字的缓存

        n*=20;     //左半字和右半字,所以要x2             
        for(i=0;i<16;i++)   //清零
                buffer2=0;

        if(dir == 1)     
        {
/****     向左移动    ****/
                for(n;n>0;n--)   
                {               
                        if(ptr != 0)
                        {
                                tmp = n%2;        //判断是左半字还是右半字
                                for(i=0;i<16;i++)
                                        buffer2=ptr[i*2+tmp];
       
                                if(tmp)                //tmp为1时,将地址指向下一个汉字
                                        ptr+=32;
                        }
                         
                        for(tmp=8;tmp>0;tmp--)  //要移动8列       
                        {                                  
                                ib=0;       
                                for(i=0;i<16;i++)
                                {                //要移16行,共16个字节
                      
                                        buffer[ib] <<=1; //移第一个半字
                                        if(buffer[ib+1] & 0x80)       
                                                buffer[ib]++;
                                        ib++;                       
       
                                        buffer[ib]<<=1;                //移后半字
                                        if(buffer2 & 0x80)          
                                                buffer[ib]++;
                                        ib++;
       
                                        buffer2<<=1;                //缓冲左半字向左移一位
                                }
                               
                                speedm=speed;        //更新点阵
                                while(speedm--)
                                        display();
                        }
                }
        }
//--------------------------------------------------//
        else        
        {
   /******  向右移动   ******/
                for(n;n>0;n--)
                {               
                        if(ptr != 0)
                        {
                                tmp = (n+1) % 2  ;        //判断左半字还是右半字
                                for(i=0;i<16;i++)
                                        buffer2=ptr[i*2+tmp];
                                                               
                                if(tmp == 0)                //tmp为0时,将地址指向下一个汉字
                                        ptr+=32;
                        }
                         
                        for(tmp=8;tmp>0;tmp--)  //要移动8列       
                        {                                  
                                ib=0;       
                                for(i=0;i<16;i++)
                                {                //要移16行,共16个字节
                      
                                        buffer[ib+1] >>= 1;             //移右半字
                                        if(buffer[ib] & 0x01)       
                                                buffer[ib+1] |=0x80 ;                       
       
                                        buffer[ib] >>= 1;            //移左半字
                                        if(buffer2 & 0x01)          
                                                buffer[ib] |= 0x80;
                                        ib+=2;
       
                                        buffer2 >>=1;                //下个汉字的右半字向右移一位
                                }
                               
                                speedm=speed;       
                                while(speedm--)  //更新点阵
                                        display();
                        }
               
                }
        }

}
void ymove(char dir,unsigned char *ptr, char speed)
{                   //dir=1上移动,dir=0为下移动
        char i=0, j=0, ib=0;
        unsigned int  tmp=0, speedm=0;

        if(dir==0)      
        {       
   /****  向下移  ****/
                ib=31;               
                for(i=16;i>0;i--)   //下移16行
                {               
                        for(j=29;j>-1;j--)
                                buffer[j+2]=buffer[j];        //将上一行的内容复制到下一行
       
                        if(ptr==0)
                        {                                //移空时,buffer的首行用0移入
                                buffer[0]=0;
                                buffer[1]=0;
                        }
                        else
                        {                                //否则,处理buffer的首行元素               
                            buffer[1]=ptr[ib];
                                buffer[0]=ptr[ib-1];
                                ib=ib-2;
                        }
                        speedm=speed;       
                        while(speedm--)          //更新点阵
                                display();
                }
        }

/****** 向上移 *******/
        else
        {                       
                ib=0;          //数组元素序号
                for(i=0;i<16;i++)    //上移16行
                {       
                        for(j=0;j<30;j++)           //将下一行的内容复制到上一行
                                buffer[j]=buffer[j+2];

                        if(ptr==0)        //移入为空,buffer的末行用0移入
                        {                       
                                buffer[30]=0;
                                buffer[31]=0;
                        }
                        else
                        {                        //否则,处理buffer的末行元素
                                buffer[30]=ptr[ib];
                                buffer[31]=ptr[ib+1];
                                ib=ib+2;                          
                        }
                        speedm=speed;        //更新点阵
                        while(speedm--)
                                display();
                   }
           }
                       
}

QQ截图20151118212401.png (44.38 KB, 下载次数: 75)

这个是仿真图

这个是仿真图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:92462 发表于 2015-11-18 21:26 | 只看该作者
由10个74ls595,两个74ls164,和单片机控制的
回复

使用道具 举报

板凳
ID:92462 发表于 2015-11-18 21:30 | 只看该作者
求大神来指教,或者加我QQ指教也行
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表