📄 main.c
字号:
//*************头文件***************************
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
//*************宏定义************************
#define clr 0
#define en_ 1
#define refresh_ 2
#define c_595 PORTB
#define c_154 PORTA
#define num_words 1 //修改字数
//*************全局变量声明******************
//-------------------------------------------
// 数组初始化,直接复制过来,【行】, 【列】
//-------------------------------------------
const unsigned char word_1[num_words][32*4]=
{
/*-- 调入了一幅图像:D:\Download\1.bmp --*/
/*-- 宽度x高度=32x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x30,0x0F,0xFF,0xFF,0xF8,
0x0F,0xFF,0xFF,0xF8,0x0E,0x1E,0x00,0x78,0x0E,0x1C,0x18,0x78,0x0E,0x1F,0xFC,0x78,
0x0E,0x3F,0xFE,0x78,0x0E,0x3C,0x38,0x78,0x0E,0x7E,0x78,0x78,0x0E,0xE6,0xF0,0x78,
0x0E,0xC7,0xE0,0x78,0x0F,0x83,0xC0,0x78,0x0F,0x87,0xC0,0x78,0x0E,0x0F,0xE0,0x78,
0x0E,0x1C,0x78,0x78,0x0E,0x78,0x3F,0xF8,0x0E,0xE7,0x8F,0xF8,0x0F,0x83,0xE0,0x78,
0x0E,0x00,0xF0,0x78,0x0E,0x00,0x70,0x78,0x0E,0x38,0x00,0x78,0x0E,0x1F,0xE0,0x78,
0x0E,0x03,0xF8,0x78,0x0E,0x00,0x78,0x78,0x0E,0x00,0x38,0x78,0x0E,0x00,0x00,0x78,
0x0F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF8,0x0E,0x00,0x00,0x70,0x00,0x00,0x00,0x00,
};
//*************函数声明**********************
void Delay(unsigned int x);
void init(void);
void Byte_out(unsigned char);
//*************主程序************************
void main (void)
{
/////////////////
init();
Delay(50);
/////////////////
while(1)
{
}
}
//***初始化*****************************
void init(void)
{
//***关中断***
cli();
DDRA = 0xff; PORTA = 0xff;//A口输出
DDRB = 0xff; PORTB = 0xff;//B口输出
DDRC = 0xff; PORTC = 0xff;
DDRD = 0xff; PORTD = 0xff;
TCNT1H = 0xfa; TCNT1L = 0x24; //8Mhz,1.5ms
//***控制寄存器***
TCCR1A = 0x00;
TCCR1B = 0x02;//8分频
//T1溢出中断使能
TIMSK |= _BV(TOIE1);
//***禁止JTAG***
MCUCSR |= _BV(JTD);
MCUCSR |= _BV(JTD);
MCUCSR |= _BV(JTD);
MCUCSR |= _BV(JTD);
/*初始化SPI*/
/*配置输入输出*/
SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR);/*使能,主机,分频4*/
SPSR = (1<<SPI2X);//倍频 8Mhz
//***开中断***
sei();
c_595 &=~ _BV(en_);//使能,一直有效
}
/******************************************************************/
/* 函数名:定时器中断
/* 参 数:无
/* 功 能:用于时间的刷新,日期的维护
/******************************************************************/
SIGNAL (SIG_OVERFLOW1 )
{
static unsigned char time_add;
static unsigned int j=0;
static unsigned char i=0;
unsigned char k;
unsigned char dis_[num_words*4];
TCNT1H = 0xfa; TCNT1L = 0x24; //8Mhz,1.5ms
time_add++;
//-------------------------------------------------------------
// 显示缓存的概念:
//
// 在每次输出前,维护显存,就可以实现字符的移动。
//-------------------------------------------------------------
i++; //位置很重要
if(i>=32){i=0;}
dis_[0]=word_1[0][(i)*4+0];//先发1,[0]
dis_[1]=word_1[0][(i)*4+1];
dis_[2]=word_1[0][(i)*4+2];
dis_[3]=word_1[0][(i)*4+3];
if (time_add == 25)//移动的速度
{
time_add = 0;
j++;
}
c_595 &=~ _BV(clr);//寄存器清零
c_595 |= _BV(clr);
for(k=0; k<num_words*4; k++)
{
Byte_out(dis_[k]);
//Byte_out(i);
}
c_154= i;//一定要在刷新之前
c_595 &=~ _BV(refresh_);//数据更新
c_595 |= _BV(refresh_);
}
//-------------------------------------------------------------------------------------------------------
// 函数名称:Byte_out()
// 输入参数:byte,需要从74LS164并行口输出的数据
// 输出参数:无
// 功能说明:发送八位串行数据至并口
//--------------------------------------------------------------------------------------------------------
void Byte_out(unsigned char byte)
{
unsigned char i;
SPDR=byte;
while(!(SPSR & (1<<SPIF)));// 等待SPIF置位,即等待数据发送完毕
}
/******************************************************************/
/* 函数名:Delay(unsigned int x)
/* 参 数:int型延时参数
/* 功 能:延时
/******************************************************************/
void Delay(unsigned int x)
{
unsigned int j;
while(x--)
{
for (j=0;j<200;j++){;}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -