⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 123.c

📁 点阵移动 可以实现左移功能 扫描频率50HZ 非常稳定 已经实现
💻 C
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
unsigned char word[13][32]={
/*河   CBAD3 */
{0x20,0x00,0x17,0xFE,0x10,0x08,0x00,0x08,0x88,0x08,0x4B,0xC8,0x52,0x48,0x12,0x48,
0x22,0x48,0x23,0xC8,0xE2,0x48,0x20,0x08,0x20,0x08,0x20,0x08,0x20,0x28,0x20,0x10},
/*北   CB1B1 */
{0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x44,0x04,0x4E,0x7C,0x58,0x04,0x60,0x04,0x40,
0x04,0x40,0x04,0x40,0x0C,0x40,0x34,0x42,0xE4,0x42,0x44,0x42,0x04,0x3E,0x00,0x00},
/*理   CC0ED */
{0x00,0x00,0x03,0xFC,0xFA,0x44,0x22,0x44,0x23,0xFC,0x22,0x44,0xFA,0x44,0x23,0xFC,
0x22,0x44,0x20,0x40,0x23,0xFC,0x38,0x40,0xC0,0x40,0x00,0x40,0x0F,0xFE,0x00,0x00},
/*工   CB9A4 */
{0x00,0x00,0x3F,0xFC,0x01,0x00,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},
/*大   CB4F3 */
{0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x02,0x80,
0x02,0x80,0x02,0x40,0x04,0x40,0x04,0x20,0x08,0x10,0x10,0x18,0x20,0x0E,0x40,0x04},
/*学   CD1A7 */
{0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00},
/*轻   CC7E1 */
{0x20,0x00,0x21,0xFC,0xFE,0x08,0x20,0x10,0x50,0x20,0x50,0x50,0x90,0x8C,0xFD,0x04,
0x13,0xFE,0x10,0x20,0x1C,0x20,0xF0,0x20,0x10,0x20,0x10,0x20,0x17,0xFE,0x10,0x00},
/*工   CB9A4 */
{0x00,0x00,0x3F,0xFC,0x01,0x00,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},
/*学   CD1A7 */
{0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,
0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00},
/*院   CD4BA */
{0x00,0x80,0xF8,0x40,0x8F,0xFE,0x94,0x04,0xA0,0x00,0xA3,0xF8,0x90,0x00,0x88,0x00,
0x8F,0xFE,0xA9,0x20,0x91,0x20,0x81,0x20,0x82,0x22,0x82,0x22,0x84,0x22,0x88,0x1E},
/*实   CCAB5 */
{0x01,0x00,0x00,0x80,0x3F,0xFE,0x28,0x04,0x46,0x88,0x04,0x80,0x08,0x80,0x06,0x80,
0x04,0x80,0x7F,0xFE,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x18,0x18,0x60,0x10},
/*验   CD1E9 */
{0x00,0x00,0xF8,0x40,0x08,0x40,0x48,0xA0,0x48,0x90,0x49,0x0E,0x4B,0xF0,0x7C,0x00,
0x04,0x84,0x06,0x44,0x35,0x48,0xC5,0x48,0x04,0x10,0x17,0xFE,0x08,0x00,0x00,0x00},
/*室   CCAD2 */
{0x02,0x00,0x01,0x00,0x3F,0xFE,0x20,0x04,0x40,0x08,0x3F,0xFC,0x04,0x00,0x08,0x20,
0x1F,0xF0,0x01,0x10,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00}
},buffer[16][10];//缓冲区
int row_read,line_read=8,i,j,discount=0,word_number=0,s=0,word_size=13,buffer_move,load_flag,load_i,load_j,ready_temp,ready_temp_2,line_move,row_move,ready_flag_1,ready_flag_2,/*delay_i,delay_j,delay_k,*/left_move_flag=0,read_date_flag=0,display_flag;
/*******延时函数********/
void delay(int m)
{int delay_i,delay_j,delay_k;
 delay_k=0;
 for(delay_i=0;delay_i<m;delay_i++)
  for(delay_j=0;delay_j<10;delay_j++)
      delay_k++;
}
/********读数据函数*******/
void read_date(void)
{
 row_read=0;    //row_read表示读数据的行line_read表示读数据的列
 s=0;
 for(s=0;s<16;s++)//s表示行
 { 
   j=2*s; 
   if(word_number<13)
   {
	while(j<=(2*s+1))
    {
	  buffer[row_read][line_read]=word[word_number][j];//只给第9,10个字节送数
      line_read++;
	  if(line_read==10)//每十个元素换行
      {
	   line_read=8;
	   row_read++;
	  }
    j++;
    }
   }
  }
 word_number++;//换下一字
 ready_flag_1=buffer[0][4]+buffer[0][6]+buffer[0][8]; 
//用最后两个字节是否全为0来判断要不要装如数据,但有可能第八个字节那一列都为0,随机选3个字节,三重保护
}
/******准备函数*******/
void load_ready(void)  //向缓冲区装数准备
{
 ready_flag_2=buffer[0][2]+buffer[0][4]+buffer[0][6];
 ready_temp=0,ready_temp_2=0;
 for(load_i=0;load_i<16;load_i++)
  for(load_j=8;load_j<10;load_j++)//看第五个字是否移完,是,装下一个字
     ready_temp=ready_temp+buffer[load_i][load_j];
 if((ready_temp==0)&&(word_number<word_size)&&(ready_flag_1==ready_flag_2)) //判断最后一个字的每个元素都为0,不是最后一个字,则装入新的字
  {
     read_date_flag=1;//读数据标志位,补占用显示时间,使显示更准确
     left_move_flag=0;//装数补允许移位
  }
 for(load_i=0;load_i<16;load_i++)//看屏幕是否全暗,是开始重新装字
  for(load_j=0;load_j<10;load_j++)
    ready_temp_2=ready_temp_2+buffer[load_i][load_j];
    if(ready_temp_2==0)//如果要显示的字已经装完,则重新显示,word_size为字数。
    {
	 word_number=0;//当前字在数组中的位置
	read_date_flag=1;
	left_move_flag=0;
    }
}
/*******显示程序********/
void display(void)   
{
int n,row,line;
 for(row=0;row<16;row++)
  { 
  for(line=0;line<8;line++)
   { 
	for(n=0;n<8;n++)
    { buffer_move=(buffer[row][line]<<n); //送下一位
     if(buffer_move&0x80)                //是1送0,是0送1 
       {PORTA&=~_BV(PA0);}
     else
       {PORTA|=_BV(PA0);}
     PORTA|=_BV(PA1);   //上升沿送出
     delay(2);
     PORTA&=~_BV(PA1);
     delay(2);
     
    }
   }
    /*行选通*/
    PORTA|=_BV(PA2);  //RCK上升沿            
    delay(2);
    PORTA&=~_BV(PA2);
    delay(2);
    PORTB=row;        //行选通 
    PORTB&=(~_BV(PB7));//消隐 
    load_ready();    //装数
    delay(50);
    PORTB|=_BV(PB7);
   
  } 
}
/***********左移*************/
void left_move(void)
{
 for(row_move=0;row_move<16;row_move++)    //行移动
  for(line_move=0;line_move<10;line_move++)  //列移动
  {
   buffer[row_move][line_move]<<=1;            //左移一位
   if((line_move<9)&&(buffer[row_move][line_move+1]&0x80)) //当不是最后一个字节时最后一位看后一个字节的第一位
   buffer[row_move][line_move]+=1; //后一个字节的第一位为一 则当前字节加一
   if(line_move==9) //当为最后一个字节时最后一位补零
   buffer[row_move][9]+=0;                     
   }
}
SIGNAL(SIG_OVERFLOW0)
{
 TCNT0=105;
 //left_move_flag=1;//允许移位
 //display();//显示缓冲区内容,可以调m的值来改变移动速度,
 display_flag=1;//显示标致位
 }
int main(void)
{
 DDRA=0xff;
 DDRB=0xff;
 TIMSK=1;
 TCNT0=105; //初值
 TCCR0=5;   //1024分频
 read_date();   //向缓冲区送第一个字
 sei();
while(1)//等待产生中断,20ms,产生中断,在此期间可以执行160000条指令。
{
 if(display_flag)//显示
  {
   display();
   display_flag=0;//显示标志位清0
   discount++; //显示速度可调 调discount的值即可
   if(6==discount)
    {
	 discount=0;
	 left_move_flag=1;//移位标志位
	}
  }
 if(read_date_flag)//读数据
 {
  read_date();//读数据函数
  read_date_flag=0;
 }
 if(left_move_flag)//左移
 {
  left_move();      //左移函数
  left_move_flag=0;
 }
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -