找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2455|回复: 7
收起左侧

单片机LED点阵屏左移的程序16*32,用的138和595 多余5个字就没显示 求帮助

[复制链接]
ID:493146 发表于 2019-6-11 20:38 | 显示全部楼层 |阅读模式
最近学着写了一个LED点阵屏左移的程序16*32,用的138和595,可是在定义字模数组的时候只能定义5个字,多于5个字就没有显示,五个字以内就正常,请
大神们给予指点,
以下是源程序
#include<STC12C5A60S2.h>            
#include <intrins.h>
typedef unsigned char         uchar;
typedef unsigned int          uint;
sbit SDA_G =P4^1; //                                      
sbit SDA_R =P4^5;//串行数据输入
sbit SHCP =P0^6; //移位时钟脉冲
sbit STCP =P4^6; //输出锁存器控制脉冲
sbit IA=P2^0;//
sbit IB=P2^1;  //  
sbit IC=P2^2; //
sbit ID=P2^3;//      
sbit OE=P4^4; //               
//uint   uiAllData;
uchar  Move,line,Speed;
uint   zimuo;                                 
uchar  BUFF[20];                                   //缓存
void   DelayMs(void);              // 延时
void   in_data();                                   // 调整移动数据
void   rxd_data();                                   // 发送移动数据

uchar code hanzi[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x01,0x00,0x01,0x3F,0x01,0x20,0x3F,0xA0,0x20,0x92,0x10,0x54,0x02,0x28,0x02,
0x08,0x02,0x14,0x05,0x24,0x05,0xA2,0x08,0x81,0x08,0x40,0x10,0x20,0x20,0x10,0x40,/*"欢",0*/
0x00,0x00,0x04,0x01,0xC8,0x3C,0x48,0x24,0x40,0x24,0x40,0x24,0x4F,0x24,0x48,0x24,
0x48,0x24,0x48,0x2D,0xC8,0x14,0x48,0x04,0x08,0x04,0x14,0x04,0xE2,0x7F,0x00,0x00,/*"迎",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",3*/

};
/******************************************************/
/*****不影响其他端口的扫描*************************/
void scan(uchar Value)
{
        switch(Value)
        {case  0: {IA=0;IB=0;IC=0;ID=0;};break;
                  case  1:{IA=1;IB=0;IC=0;ID=0;};break;
                   case  2:{IA=0;IB=1;IC=0;ID=0;};break;            
                    case  3: {IA=1;IB=1;IC=0;ID=0;};break;
             case  4: {IA=0;IB=0;IC=1;ID=0;};break;
                      case  5: {IA=1;IB=0;IC=1;ID=0;};break;
                       case  6: {IA=0;IB=1;IC=1;ID=0;};break;
                        case  7:{IA=1;IB=1;IC=1;ID=0;};break;
                 case  8: {IA=0;IB=0;IC=0;ID=1;};break;
                       case  9:  {IA=1;IB=0;IC=0;ID=1;};break;
                      case 10:{IA=0;IB=1;IC=0;ID=1;};break;
                     case 11: {IA=1;IB=1;IC=0;ID=1;};break;
            case 12: {IA=0;IB=0;IC=1;ID=1;};break;
                  case 13:{IA=1;IB=0;IC=1;ID=1;};break;
                 case 14:{IA=0;IB=1;IC=1;ID=1;};break;
            case 15:{IA=1;IB=1;IC=1;ID=1;};break;
           default:break;
        }
}
/**************************延时***********************/

void DelayMs(void)
{
unsigned char i, j;

        _nop_();
        i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);
         }
void Timer0Init(void)                //1毫秒@22.1184MHz
{
    AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD |= 0x01;                //设置定时器模式
        TL0 = 0xCD;                //设置定时初值
        TH0 = 0xF8;                //设置定时初值
        TR0 = 1;                //定时器0开始计时
        EA=1;
        ET0=1;

}


/********************************************/

/*主函数*/
void main()
{   P4SW=0x70;
    P2M1=0x00;P2M0=0x0f;
        P4M1=0x00;P4M0=0xff;      
        P3M1=0x00;P3M0=0x80;
        zimuo=0;
    Move=0;
        SHCP=0;
        STCP=0;
        Timer0Init();
        line=0;      
   while(1)  
  {


         while(zimuo<128)
    {
           while(Move<16)      
     {
             for(Speed=0;Speed<15;Speed++)
             {      

                    for(line=0;line<16;line++)
                          {
                                in_data();        //
                                rxd_data(); //
                                scan(line); //   
                                OE=1;//
                                DelayMs();               
                                OE=0;

                  }
                 }
         Move++;                                             
             }
      Move=0;
         zimuo=zimuo+32;
    }      
     zimuo=0;
    }         
}      


/********************************************************         */

void in_data(void)                                      
{
uchar s;
        for(s=0;s<8;s++)                                            
        {
                 BUFF[2*s]=hanzi[zimuo+32*s+2*line];      
                 BUFF[2*s+1]=hanzi[zimuo+1+32*s+2*line];         
        }
}


/***********************发送移动的数据************************  */
void rxd_data(void)                           
{
uchar h;
uchar inc,tempyid,temp,k;

if(Move<8)
   inc=0;
  else
    inc=1;
  for(h=0+inc;h<4+inc;h++)                  
        {
         if(Move<8)
       tempyid=Move;
     else
     tempyid=Move-8;
         temp=(BUFF[h]>>tempyid)|(BUFF[h+1]<<(8-tempyid));
         temp=~temp;
             for(k=0;k<8;k++)
               {  
                                SHCP=0;      
                           if(temp&0x01==0x01)                          
                            {
                                  SDA_G=1;
                                }
                           else
                           {
                                    SDA_G=0;
                           }

                          // SDA_G=(bit)(temp&0x01);
                          temp=temp>>1;   
                          SHCP=1;         
                            _nop_();                                                                                 
                  _nop_();                     


    }
    STCP=1;
        STCP=0;   
   }
   }


回复

使用道具 举报

ID:123289 发表于 2019-6-12 08:29 | 显示全部楼层
显示的方案不巧妙。
回复

使用道具 举报

ID:560599 发表于 2019-6-12 09:32 | 显示全部楼层
代码里面有点问题,具体可以问我
回复

使用道具 举报

ID:424598 发表于 2019-6-12 17:11 来自手机 | 显示全部楼层
while(zimuo<128)    128/32=4,改大128,必须是32的倍数
回复

使用道具 举报

ID:493146 发表于 2019-6-12 22:22 | 显示全部楼层
zhd666 发表于 2019-6-12 09:32
代码里面有点问题,具体可以问我

你好,请老师指点一下,感激不尽!初学者要学习的还很多
回复

使用道具 举报

ID:493146 发表于 2019-6-12 22:23 | 显示全部楼层
yzwzfyz 发表于 2019-6-12 08:29
显示的方案不巧妙。

老师,能指点一二吗?我是一个初学者,
回复

使用道具 举报

ID:493146 发表于 2019-6-12 22:54 | 显示全部楼层

六个字改成192也不行,没有显示,
回复

使用道具 举报

ID:424598 发表于 2019-6-13 09:14 来自手机 | 显示全部楼层
zcwjzwd 发表于 2019-6-12 22:54
六个字改成192也不行,没有显示,

你可以参考我的贴,我有一个16x16扩展成16x32的教学贴。有仿真。代码有备注
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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