📄 main.c
字号:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#define csl PORTD&=~_BV(PD1) //PD1
#define csh PORTD|=_BV(PD1)
#define restl PORTD&=~_BV(PD0) //PD0
#define resth PORTD|=_BV(PD0)
#define sclkl PORTB&=~_BV(PB7) //PB7
#define sclkh PORTB|=_BV(PB7)
#define sdatal PORTB&=~_BV(PB5) //PB5
#define sdatah PORTB|=_BV(PB5)
#define GLCD_PIXELX 131
#define GLCD_PIXELY 131
#define GLCD_CACHE_SIZE ((GLCD_PIXELX * GLCD_PIXELY) / 8)
#define GLCD_X_END GLCD_PIXELY
#define GLCD_Y_END GLCD_PIXELY
#define GLCD_SER_PORT PORTB
#define GLCD_SER_DDR DDRB
// Colors
#define BLACK 0x00 //黑色
#define WHITE 0xFF //白色
#define RED 0x03 //红色
#define GREEN 0x1C //绿色
#define BLUE 0xE0 //蓝色
#define MAGENTA 0xE3 //洋红
#define YELLOW 0x1F //黄色
#define CYAN 0xFC //青色
#define MEMWRITE 0x5C
#define ADDRX 0x75
#define ADDRY 0x15
typedef struct {
unsigned char X1;
unsigned char Y1;
unsigned char X2;
unsigned char Y2;
} glcdRect_t;
glcdRect_t glcd_Clip;
#define glcdDoSwapCoord(x, y) {unsigned char t = x; x = y; y = t;}
#define glcdDoCheckCoord(x, y) {if (x > y) {glcdDoSwapCoord(x, y)}}
#define glcdSetRect(r,x1,y1,x2,y2) {r.X1 = x1; r.Y1 = y1; r.X2 = x2; r.Y2 = y2;}
unsigned char Color1=0,Color2=0;
unsigned char memAccessCtrl=0,zx=0,zy=0;
unsigned char colora,colorb;
int discode[192]=
{//广[16*16]上下列排
0x00,0x02,0x00,0x0C,0x3F,0xF0,0x20,0x00,
0x20,0x00,0x20,0x00,0x20,0x00,0xA0,0x00,
0x60,0x00,0x20,0x00,0x20,0x00,0x20,0x00,
0x20,0x00,0x60,0x00,0x20,0x00,0x00,0x00,
//东[16*16]上下列排
0x10,0x00,0x10,0x02,0x10,0x84,0x11,0x88,
0x16,0xB0,0x18,0x82,0xF0,0x81,0x17,0xFE,
0x10,0x80,0x10,0xA0,0x10,0x90,0x11,0x8C,
0x10,0x86,0x30,0x00,0x10,0x00,0x00,0x00,
//工[16*16]上下列排
0x00,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
0x20,0x04,0x20,0x04,0x20,0x04,0x3F,0xFC,
0x20,0x04,0x20,0x04,0x20,0x04,0x20,0x04,
0x60,0x04,0x20,0x0C,0x00,0x04,0x00,0x00,
//业[16*16]上下列排
0x00,0x02,0x08,0x02,0x06,0x02,0x01,0xE2,
0x00,0x02,0xFF,0xFE,0x00,0x02,0x00,0x02,
0x00,0x02,0xFF,0xFE,0x00,0x22,0x00,0xC2,
0x03,0x02,0x0C,0x06,0x00,0x02,0x00,0x00,
//大[16*16]上下列排
0x04,0x00,0x04,0x02,0x04,0x02,0x04,0x04,
0x04,0x08,0x04,0x30,0x05,0xC0,0xFE,0x00,
0x05,0x80,0x04,0x60,0x04,0x10,0x04,0x08,
0x04,0x04,0x0C,0x06,0x04,0x04,0x00,0x00,
//学[16*16]上下列排
0x02,0x20,0x0C,0x20,0x88,0x20,0x69,0x20,
0x09,0x20,0x09,0x22,0x89,0x21,0x69,0x7E,
0x09,0x60,0x09,0xA0,0x19,0x20,0x28,0x20,
0xC8,0x20,0x0A,0x60,0x0C,0x20,0x00,0x00};
unsigned int a;
int x=0;
void glcdn_WriteData(unsigned char myData)
{
csl;
sclkl;
sdatah;
sclkh;
sclkl;
SPCR = 0x50;
SPDR = myData;
while(!(SPSR & 0x80));
csh;
SPCR = 0x00;
}
void glcdn_WriteCommand(unsigned char myData)
{
csl;
sclkl;
sdatal;
sclkh;
sclkl;
SPCR = 0x50;
SPDR = myData;
while(!(SPSR & 0x80));
csh;
SPCR = 0x00;
}
void glcdn_SetPageArea(char x1, char x2, char y1, char y2)
{
glcdn_WriteCommand(ADDRX);
glcdn_WriteData(x1+1);
glcdn_WriteData(x2+1);
glcdn_WriteCommand(ADDRY);
glcdn_WriteData(y1+1);
glcdn_WriteData(y2+1);
}
void write()
{
int g;
for(g=0;g<8;g++)
{
if(a&0x80)
{
glcdn_WriteData(colora);
glcdn_WriteData(colora);
}
else
{
glcdn_WriteData(colorb);
glcdn_WriteData(colorb);
}
a<<=1;
}
}
void glcdDoFillRect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
{
if ((x1 > glcd_Clip.X2) | (x2 < glcd_Clip.X1) | (y1 > glcd_Clip.Y2) | (y2 < glcd_Clip.Y1)) {return;}
if (x1 < glcd_Clip.X1) {x1 = glcd_Clip.X1;}
if (y1 < glcd_Clip.Y1) {y1 = glcd_Clip.Y1;}
if (x2 > glcd_Clip.X2) {x2 = glcd_Clip.X2;}
if (y2 > glcd_Clip.Y2) {y2 = glcd_Clip.Y2;}
glcdn_SetPageArea(x1,x2,y1,y2);
glcdn_WriteCommand(MEMWRITE);
}
void glcdRectangle(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
{
glcdDoCheckCoord(x1, x2);
glcdDoCheckCoord(y1, y2);
glcdDoFillRect(x1, y1, x2, y2);
}
void glcdn_ClearLcd()
{
unsigned int i;
glcdn_SetPageArea(0, GLCD_X_END, 0, GLCD_Y_END);
glcdn_WriteCommand(MEMWRITE);
for(i=0; i<(GLCD_PIXELX*GLCD_PIXELY);i++)
{
glcdn_WriteData(Color1);
glcdn_WriteData(Color2);
}
}
void init_lcd()
{
PORTB=0XF9;
GLCD_SER_DDR = 0xA0;
PORTD=0x0F;
DDRD=0x03;
PORTA=0XFF;
DDRA=0X00;
DDRC=0X00;
PORTC=0XFF;
csh;
asm("nop");
csl;
restl;
_delay_ms(1);
resth;
_delay_ms(1);
sclkh;
sdatah;
csh;
_delay_ms(1);
glcdn_WriteCommand(0x82);
glcdn_WriteData(1);
int w;
for(w=0;w<13;w++) glcdn_WriteData(0);
glcdn_WriteCommand(0xD1);
glcdn_WriteCommand(0xCA);
glcdn_WriteData(0x0f);
glcdn_WriteData(0x20);
glcdn_WriteData(0x0f);
glcdn_WriteData(0x01);
glcdn_WriteCommand(0x94);
glcdn_WriteCommand(0xA9);
glcdn_WriteCommand(0x20);
glcdn_WriteData(0x0f);
glcdn_WriteCommand(0x81);
glcdn_WriteData(0x0f);
glcdn_WriteData(0x05);
glcdn_WriteCommand(0xA7);
glcdn_WriteCommand(0xBC);
glcdn_WriteData(0x04);
glcdn_WriteData(0x00);
glcdn_WriteData(0x04);
glcdn_WriteCommand(0xBB);
glcdn_WriteData(0x01);
glcdn_WriteCommand(0xAF);
glcdn_WriteCommand(0xCE);
glcdn_WriteData(0x00);
glcdn_WriteData(0x01);
glcdn_WriteData(0x02);
glcdn_WriteData(0x03);
glcdn_WriteData(0x04);
glcdn_WriteData(0x05);
glcdn_WriteData(0x06);
glcdn_WriteData(0x07);
glcdn_WriteData(0x00);
glcdn_WriteData(0x01);
glcdn_WriteData(0x02);
glcdn_WriteData(0x03);
glcdn_WriteData(0x04);
glcdn_WriteData(0x05);
glcdn_WriteData(0x06);
glcdn_WriteData(0x07);
glcdn_WriteData(0x00);
glcdn_WriteData(0x01);
glcdn_WriteData(0x02);
glcdn_WriteData(0x03);
glcdn_ClearLcd();
}
void RGB2(unsigned char red,unsigned char green,unsigned char blue)
{
Color1=(red&0xf0>>4);
Color2=(green&0xf0)|((blue&0xf0)>>4);
}
int main(void)
{
MCUCR=0x00;
GICR=0x40;
sei();
SPCR = (1<<SPE) | (1<<MSTR) | (1<<CPHA) | (1<<CPOL);
RGB2(255,255,255);
glcdSetRect(glcd_Clip, 0, 0, 130, 130);
init_lcd(); //初始化LCD
RGB2(255,255,255);
glcdn_ClearLcd(); //清屏
while(1)
{
int h;
int b=0,c=32,d=0,e=0,f=15,g=15;
colora=0x00; //黑色
colorb=0xff;
for(h=0;h<6;h++)
{
glcdRectangle(d,e,f,g);
for(b;b<c;b++)
{
a=discode[b];
write();
}
c=c+32;
_delay_ms(500);
d=f+1;
e=g+1;
f=f+16;
g=g+16;
}
RGB2(255,255,255);
glcdn_ClearLcd(); //清屏
}
}
SIGNAL (SIG_INTERRUPT0)
{
MCUCR=0X00;
while(!(PIND&0X04));
_delay_ms(500);
x++;
if(x==1)
{
PORTB|=_BV(PB2);
}
else
{
DDRB&=~_BV(PB2);
PORTB&=~_BV(PB2);
x=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -