📄 123.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 + -