极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14416|回复: 5

大家帮我看看程序是哪里错了

[复制链接]
发表于 2015-5-2 07:25:45 | 显示全部楼层 |阅读模式
这个控制16*16点阵字符滚动的程序哪里错误了?






#include <Arduino.h>

//IO配置
#define LEDARRAY_D 2
#define LEDARRAY_C 3
#define LEDARRAY_B 4
#define LEDARRAY_A 5
#define LEDARRAY_G 6
#define LEDARRAY_DI 7
#define LEDARRAY_CLK 8
#define LEDARRAY_LAT 9

#define led 13


#define Num_Word 1                                //液晶能显示的汉字个数

unsigned char Display_Buffer[2];
unsigned char Display_Swap_Buffer[Num_Word][32]={0};                                        //显示缓冲区
bool Shift_Bit = 0;
bool Flag_Shift = 0;
unsigned char Timer0_Count = 0;
unsigned char temp = 0x80;
unsigned char Shift_Count = 0;
unsigned char Display_Word_Count = 0;

#define Num_Of_Word 6
const unsigned char Word[Num_Of_Word][32] =
{
         

0xFF,0xF8,0x07,0x77,0x74,0x75,0x75,0x75,0x75,0x04,0x75,0x7F,0xFF,0xFF,0xFF,0xFF
0xFF,0x01,0xFB,0xFB,0x1B,0xDB,0xDB,0xDB,0xDB,0x1B,0xDB,0xFB,0xFB,0xDB,0xEB,0xF7,/*"呵",0*/

0xFF,0xF8,0x07,0x77,0x74,0x75,0x75,0x75,0x75,0x04,0x75,0x7F,0xFF,0xFF,0xFF,0xFF
0xFF,0x01,0xFB,0xFB,0x1B,0xDB,0xDB,0xDB,0xDB,0x1B,0xDB,0xFB,0xFB,0xDB,0xEB,0xF7,/*"呵",1*/

0xFF,0xF8,0x07,0x77,0x74,0x75,0x75,0x75,0x75,0x04,0x75,0x7F,0xFF,0xFF,0xFF,0xFF
0xFF,0x01,0xFB,0xFB,0x1B,0xDB,0xDB,0xDB,0xDB,0x1B,0xDB,0xFB,0xFB,0xDB,0xEB,0xF7,/*"呵",2*/

0xFF,0xF8,0x07,0x77,0x74,0x75,0x75,0x75,0x75,0x04,0x75,0x7F,0xFF,0xFF,0xFF,0xFF
0xFF,0x01,0xFB,0xFB,0x1B,0xDB,0xDB,0xDB,0xDB,0x1B,0xDB,0xFB,0xFB,0xDB,0xEB,0xF7,/*"呵",3*/

0xBF,0xDE,0xCE,0xDE,0xFE,0xFE,0x1D,0xDA,0xDE,0xDE,0xDF,0xDF,0xD7,0xCF,0xDC,0xF3,
0xFF,0x0F,0xEF,0xEF,0xEF,0xEF,0xF1,0x07,0xF7,0xF7,0x6F,0x6F,0x9F,0x6F,0xF1,0xFB,/*"设",4*/

0xBF,0xDF,0xCF,0xDF,0xFF,0x0C,0xEF,0xEF,0xEF,0xEF,0xEF,0xED,0xEB,0xE7,0xEF,0xFF,
0xDF,0xDF,0xDF,0xDF,0xDF,0x01,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,/*"计",5*/

};

void setup()
{
        pinMode(LEDARRAY_D, OUTPUT);
        pinMode(LEDARRAY_C, OUTPUT);
        pinMode(LEDARRAY_B, OUTPUT);
        pinMode(LEDARRAY_A, OUTPUT);
        pinMode(LEDARRAY_G, OUTPUT);
        pinMode(LEDARRAY_DI, OUTPUT);
        pinMode(LEDARRAY_CLK, OUTPUT);
        pinMode(LEDARRAY_LAT, OUTPUT);

        Clear_Display();
}

void loop()
{
        unsigned int i;
        for(i = 0 ; i < 30; i ++)                        //移动速度设定
        {
                Display(Display_Swap_Buffer);
        }
        Display_Word_Count = Shift_Count/16;                                //计算当前显示第几个字
        Calc_Shift();
        Shift_Count++;
        if(Shift_Count == (Num_Of_Word+1)*16 )                                //移动次数
        {
                Shift_Count = 0;                               
        }       

}

//************************************************************
//清空缓冲区
//************************************************************
void Clear_Display()
{
        unsigned char i,j;
        for(j = 0 ; j < Num_Word; j++)
        {
                for(i = 0 ; i < 32 ;i++)
                {
                        Display_Swap_Buffer[j] = 0xff;                                //0=显示  1=不显示        
                }
        }
}

//************************************************************
//计算移动数据,存在在缓冲器
//************************************************************
void Calc_Shift()
{
        unsigned char i;

        for(i = 0;i < 16;i++)
        {
                if((Display_Swap_Buffer[0][16+i]&0x80) == 0)                                                                        //前8位        移位
                {
                        Display_Swap_Buffer[0] = (Display_Swap_Buffer[0] << 1)&0xfe;                         //最低位清零       
                }
                else
                {
                        Display_Swap_Buffer[0] = (Display_Swap_Buffer[0] << 1)|0x01;                        //最低位置一        
                }

                if(Shift_Count%16 < 8 && Display_Word_Count < Num_Of_Word)
                {
                        Shift_Bit = Word[Display_Word_Count]&temp;
                }
                else if(Shift_Count%16 < 16 && Display_Word_Count < Num_Of_Word)
                {
                        Shift_Bit = Word[Display_Word_Count][16+i]&temp;
                }
                else
                {
                        Shift_Bit = 1;                                                //把字移出缓冲区
                }

                if( Shift_Bit == 0)                                                                                                                //后8位移位
                {
                        Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)&0xfe;                 //最低位清零
                }
                else
                {
                        Shift_Bit =        1;
                        Display_Swap_Buffer[0][16+i] = (Display_Swap_Buffer[0][16+i] << 1)|0x01;                //最低位置一                        
                }
               
        }
        temp = (temp>>1)&0x7f;
        if(temp == 0x00)
        {
                temp = 0x80;
        }
}
//************************************************************
//num为字数  dat[][32]为字模的名称
//*************************************************************
void Display(unsigned char dat[][32])                                       
{
        unsigned char i;

        for( i = 0 ; i < 16 ; i++ )
        {
                digitalWrite(LEDARRAY_G, HIGH);                //更新数据时候关闭显示。等更新完数据,打开138显示行。防止重影。
               
                Display_Buffer[0] = dat[0];               
                Display_Buffer[1] = dat[0][i+16];

                Send(Display_Buffer[1]);
                Send(Display_Buffer[0]);

                digitalWrite(LEDARRAY_LAT, HIGH);                                        //锁存数据
                delayMicroseconds(1);
       
                digitalWrite(LEDARRAY_LAT, LOW);
                delayMicroseconds(1);

                Scan_Line(i);                                                //选择第i行

                digitalWrite(LEDARRAY_G, LOW);
               
                delayMicroseconds(300);;                //延时一段时间,让LED亮起来。                               
        }       
}

//****************************************************
//扫描某一行
//****************************************************
void Scan_Line( unsigned char m)
{       
        switch(m)
        {
                case 0:                       
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);                                        
                        break;
                case 1:                                       
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                case 2:                                       
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 3:                                       
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                case 4:
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 5:
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                case 6:
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 7:
                        digitalWrite(LEDARRAY_D, LOW);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                case 8:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 9:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);                
                        break;       
                case 10:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 11:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, LOW);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                case 12:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 13:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, LOW);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                case 14:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, LOW);                
                        break;
                case 15:
                        digitalWrite(LEDARRAY_D, HIGH);digitalWrite(LEDARRAY_C, HIGH);digitalWrite(LEDARRAY_B, HIGH);digitalWrite(LEDARRAY_A, HIGH);                
                        break;
                default : break;       
        }
}

//****************************************************
//发送数据
//****************************************************
void Send( unsigned char dat)
{
        unsigned char i;
        digitalWrite(LEDARRAY_CLK, LOW);
        delayMicroseconds(1);;       
        digitalWrite(LEDARRAY_LAT, LOW);
        delayMicroseconds(1);;

        for( i = 0 ; i < 8 ; i++ )
        {
                if( dat&0x01 )
                {
                        digitalWrite(LEDARRAY_DI, HIGH);       
                }
                else
                {
                        digitalWrite(LEDARRAY_DI, LOW);
                }


                digitalWrite(LEDARRAY_CLK, HIGH);                                //上升沿发送数据
                        delayMicroseconds(1);;
                digitalWrite(LEDARRAY_CLK, LOW);
                        delayMicroseconds(1);;               
                dat >>= 1;
                       
        }                       
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-5-2 09:33:47 | 显示全部楼层
              少了;及}
回复 支持 反对

使用道具 举报

发表于 2015-5-2 11:22:26 | 显示全部楼层
参考一下下面的代码吧:
char hexaKeys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
回复 支持 反对

使用道具 举报

发表于 2015-5-2 13:31:35 | 显示全部楼层
少了几个 , 逗号
回复 支持 反对

使用道具 举报

发表于 2015-5-2 18:20:26 | 显示全部楼层
你多了一个逗号 ,
仔细看
0xDF,0xDF,0xDF,/*"计",5*/

在最后面注释之前
回复 支持 反对

使用道具 举报

发表于 2015-5-2 18:22:36 | 显示全部楼层
tsaiwn 发表于 2015-5-2 18:20
你多了一个逗号 ,
仔细看
0xDF,0xDF,0xDF,/*"计",5*/

其他人都乱讲
我说的才对   
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 06:21 , Processed in 0.038110 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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