MCU:ATMEGA8515L8PI
串口->并口IC:SN74HC595N*2片
LCM:SSC12A64DLYY(KS0108)
WINAVR20060421
PINB2 数据----------SN74HC595 14#
PINB1 锁存时钟------SN74HC595 12#
PINB0 移位时钟------SN74HC595 11#
第一级595与LCD的控制脚相连
lcd12864_rs 0x01 //QA
lcd12864_rw 0x02 //QB
lcd12864_e 0x04 //QC
lcd12864_cs1 0x08 //QD
lcd12864_cs2 0x10 //QE
lcd12864_rst 0x20 //QF
第二级的595与LCD的数据脚相连
D0------QA
| |
D7 QG
字模程序是PCtoLCD2002
此程序看起来比较乱,但是保证能用,目前只能显示128*64的图片、清屏及全显示三个功能,今天天太晚了,其它功能明天再加。
makefile自己加。
另此程序在编译时有一个警告:
warning: passing arg 1 of `disp_image' discards qualifiers from pointer target type
但不影响执行结果,不知怎样才能没有这个警告,还请高手指点。
程序的全部代码如下:
#include <avr/io.h>
#include <compat/deprecated.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
unsigned char sn74595_buf[2];
const unsigned char first_image[] PROGMEM={
/*-- 宽度x高度=128x64 --*/
0x00,0x00,0x60,0x70,0x78,0x78,0x38,0x38,0xF8,0xFC,0x3C,0x1C,0x1C,0x1C,0x1C,0xB8,
0xF8,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xC0,0xC0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
0xC0,0xF0,0xF8,0xFC,0x7C,0x3E,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x90,0xF8,0x78,0x3C,0x7E,0x7F,0xF5,0xE4,0xE6,0xC6,0xC6,0xC7,0x83,0x03,
0x03,0x01,0xF0,0xF8,0xF8,0xDC,0xCE,0xE6,0xFF,0xFF,0x9F,0xC3,0x40,0xF0,0xF8,0xFC,
0x9E,0x8E,0xF6,0xF8,0xFC,0xFC,0xB4,0xF8,0xFC,0xBE,0xCE,0x46,0x00,0xF8,0xFE,0xFF,
0x8F,0xF7,0xFB,0x7D,0x7C,0xF4,0xF8,0xFC,0x8E,0xC6,0xFE,0x7E,0x7C,0x20,0xF0,0xF8,
0xFC,0xDE,0xEF,0xF7,0xF8,0xFC,0xDE,0xF6,0x7C,0x7E,0x7E,0x20,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x83,
0x80,0x60,0xA0,0xF1,0x59,0xD9,0xC0,0x01,0x41,0xB1,0xE1,0xE0,0x00,0x00,0x01,0x01,
0x01,0x01,0x00,0x01,0x01,0x00,0xF1,0x81,0x81,0x01,0x00,0x00,0x00,0x80,0x81,0x81,
0x81,0x01,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x00,0x80,0x60,0x3C,0xB8,0xD9,
0xC1,0xC1,0xC0,0x80,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
0xE0,0xE0,0xE0,0x40,0x00,0x00,0x00,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0xC0,0x80,0x00,0x00,0xF0,0xE0,0x00,0x00,0xC0,0x80,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x38,0x98,
0x8F,0xCC,0xE6,0x7F,0x52,0x23,0x18,0x04,0x33,0x3B,0xAE,0xEC,0x40,0x00,0x00,0x00,
0x00,0x00,0x02,0x1E,0x3E,0xB3,0xFF,0xD9,0xDF,0x03,0xE0,0xE1,0x73,0x7F,0x7F,0x61,
0x61,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x6F,0xFC,0x7F,0x34,
0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x1C,0xFA,0xFD,
0xDD,0x4E,0x76,0x76,0xEC,0xE6,0x7F,0x87,0x01,0xF1,0x7F,0x0F,0x00,0x00,0x00,0x00,
0x00,0x00,0x38,0x3C,0xFF,0xE7,0x33,0x00,0x00,0xFF,0xFF,0x1C,0x0E,0x07,0x03,0x01,
0x80,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xC1,
0xE1,0x21,0x21,0x26,0x60,0x40,0x08,0x04,0xC4,0xE2,0x23,0x21,0x20,0x60,0x40,0x00,
0x00,0x80,0xC1,0x63,0x23,0x21,0x20,0x60,0x41,0x00,0x80,0xC0,0xE0,0xE0,0x00,0x00,
0x40,0x60,0x20,0x20,0xE0,0xC0,0x00,0x00,0x00,0x80,0xE0,0x61,0xE3,0x83,0x03,0x01,
0x83,0xC7,0x2F,0x23,0x60,0x40,0x00,0x00,0x00,0x80,0xE0,0xE0,0x00,0x00,0x00,0xE1,
0xE0,0x20,0x20,0x62,0xC1,0x80,0x00,0x03,0xE3,0xE1,0x00,0x00,0x00,0x00,0x00,0x60,
0xE0,0x80,0x00,0x00,0x81,0xE3,0x60,0x60,0xE0,0x80,0x01,0x03,0x83,0xE3,0x63,0x03,
0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,
0x63,0x47,0x46,0x4E,0x7C,0x38,0x00,0x00,0x21,0x63,0x47,0x46,0x4E,0x7C,0x38,0x00,
0x00,0x1F,0x3F,0x60,0x40,0x40,0x40,0x60,0x20,0x00,0x01,0x00,0x7F,0x7F,0x00,0x00,
0x60,0x70,0x5C,0x4E,0x47,0x41,0x00,0x60,0x7C,0x1F,0x13,0x10,0x13,0x1F,0x7C,0x60,
0x3F,0x7F,0x42,0x42,0x7E,0x3C,0x00,0x18,0x16,0x11,0x7F,0x7F,0x10,0x00,0x00,0x7F,
0x7F,0x40,0x40,0x60,0x3F,0x1F,0x00,0x00,0x7F,0x7F,0x40,0x40,0x40,0x40,0x00,0x00,
0x00,0x03,0x7F,0x7F,0x03,0x00,0x00,0x00,0x00,0x03,0x7F,0x7F,0x03,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x40,0xC4,0x88,0x00,0xF8,0xE8,0x08,0xF8,0x00,0xF0,0x00,0xFE,0x00,0x00,0x00,0x00,
0x80,0x88,0x98,0x80,0x40,0x40,0x7C,0xC0,0x40,0x20,0x08,0x18,0x00,0x00,0x00,0x00,
0x48,0x28,0xA4,0xFC,0xA2,0xA2,0xFC,0xA4,0xA4,0xA4,0xBC,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xFC,0x08,0x48,0x48,0xAA,0xA4,0x64,0x24,0x04,0x04,0x00,0x00,0x08,0x18,
0x78,0xC8,0x08,0x00,0x00,0x08,0xE8,0x18,0x08,0x00,0x00,0x10,0xF8,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x18,0x08,0x08,0x18,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x10,0x0C,0x43,0x20,0x1F,0x07,0x10,0x2F,0x00,0x27,0x40,0x7F,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0x32,0x32,0x1E,0x11,0x0F,0x18,0x20,0x40,0x78,0x00,0x00,0x00,0x00,
0x06,0x01,0x00,0x7F,0x20,0x20,0x24,0x24,0x3F,0x24,0x24,0x20,0x00,0x00,0x00,0x40,
0x30,0x0F,0x00,0x00,0x01,0x21,0x41,0x7F,0x01,0x01,0x05,0x03,0x00,0x00,0x00,0x00,
0x00,0x03,0x0E,0x38,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x00,0x00,
0x00,0x00,0x10,0x10,0x00,0x00,0x07,0x18,0x10,0x10,0x18,0x07,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/* 定义I/O口*/
#define SN74HC595_PORT PORTB
#define SN74HC595_DATA PINB2 ////数据-------SN74HC595 14#
#define ST PINB1 ////锁存时钟------SN74HC595 12#
#define SH PINB0 ////移位时钟-----SN74HC595 11#
#define lcd12864_data sn74595_buf[1]
/*SN74HC595第一级与LCD12864的连接定义*/
#define lcd12864_rs 0x01 //QA
#define lcd12864_rw 0x02 //QB
#define lcd12864_e 0x04 //QC
#define lcd12864_cs1 0x08 //QD
#define lcd12864_cs2 0x10 //QE
#define lcd12864_rst 0x20 //QF
#define disp_off 0x3e
#define disp_on 0x3f
#define col_add 0x40
#define page_add 0xb8
#define start_line 0xc0
#define set_lcd12864_rs {\
sn74595_buf[0]|=lcd12864_rs;\
out_to_595();\
}
#define clr_lcd12864_rs {\
sn74595_buf[0]&=~lcd12864_rs;\
out_to_595();\
}
#define set_lcd12864_rw {\
sn74595_buf[0]|=lcd12864_rw;\
out_to_595();\
}
#define clr_lcd12864_rw {\
sn74595_buf[0]&=~lcd12864_rw;\
out_to_595();\
}
#define set_lcd12864_e {\
sn74595_buf[0]|=lcd12864_e;\
out_to_595();\
}
#define clr_lcd12864_e {\
sn74595_buf[0]&=~lcd12864_e;\
out_to_595();\
}
#define set_lcd12864_cs1 {\
sn74595_buf[0]|=lcd12864_cs1;\
out_to_595();\
}
#define clr_lcd12864_cs1 {\
sn74595_buf[0]&=~lcd12864_cs1;\
out_to_595();\
}
#define set_lcd12864_cs2 {\
sn74595_buf[0]|=lcd12864_cs2;\
out_to_595();\
}
#define clr_lcd12864_cs2 {\
sn74595_buf[0]&=~lcd12864_cs2;\
out_to_595();\
}
#define set_lcd12864_rst {\
sn74595_buf[0]|=lcd12864_rst;\
out_to_595();\
}
#define clr_lcd12864_rst {\
sn74595_buf[0]&=~lcd12864_rst;\
out_to_595();\
}
//static const unsigned char num[62][8]={};
void delay_us(unsigned int us) /////8M晶震,1us延时
{
while(us--)
{
_delay_us(1);
}
}
void delay_ms(unsigned int ms)
{
while(ms--)
{
_delay_ms(1);
}
}
//送出8位串行数据
void out_to_595(void)
{
unsigned char i;
unsigned char j;
unsigned sn74595_buf_temp[2];
sn74595_buf_temp[0]=sn74595_buf[1];
sn74595_buf_temp[1]=sn74595_buf[0];
cbi(SN74HC595_PORT,ST); ////拉低锁存电平
for(j=0;j<2;j++)
{
for (i=0;i<8;i++)
{
cbi(SN74HC595_PORT,SH); ////拉低移位时钟
if (sn74595_buf_temp[j]&0x80)
{
sbi(SN74HC595_PORT,SN74HC595_DATA);
}
else
{
cbi(SN74HC595_PORT,SN74HC595_DATA);
}
sn74595_buf_temp[j]<<=1;
sbi(SN74HC595_PORT,SH); ////提高移位时钟
}
}
sbi(SN74HC595_PORT,ST); ////提高锁存电平(锁存)
}
void write_lcd12864(unsigned char CMD,unsigned char data)
{
if(1==CMD)
{
clr_lcd12864_rs;
}
else
{
set_lcd12864_rs;
}
clr_lcd12864_rw;
lcd12864_data=data;
//_delay_us(1);
set_lcd12864_e;
//_delay_us(1);
clr_lcd12864_e;
}
void disp_image(unsigned char *image,unsigned char fan)
{
unsigned char j,k;
for(k=0;k<8;k++)
{
set_lcd12864_cs1;
clr_lcd12864_cs2;
_delay_us(100);
write_lcd12864(1,page_add+k);
write_lcd12864(1,col_add+0);
for(j=0;j<64;j++)
{
if(1==fan)
{
write_lcd12864(0,~pgm_read_byte(image+(k*128+j)));
}
else
{
write_lcd12864(0,pgm_read_byte(image+(k*128+j)));
}
}
set_lcd12864_cs2;
clr_lcd12864_cs1;
_delay_us(100);
write_lcd12864(1,page_add+k);
write_lcd12864(1,col_add+0);
for(j=64;j<128;j++)
{
if(1==fan)
{
write_lcd12864(0,~pgm_read_byte(image+(k*128+j)));
}
else
{
write_lcd12864(0,pgm_read_byte(image+(k*128+j)));
}
}
}
}
void lcd_init(void)
{
sn74595_buf[0]=0x00;
sn74595_buf[1]=0x00;
clr_lcd12864_rst;
//delay_ms(1);
set_lcd12864_rst;
delay_ms(1);
set_lcd12864_cs1;
set_lcd12864_cs2;
write_lcd12864(1,disp_off);
write_lcd12864(1,page_add+0);
write_lcd12864(1,start_line+0);
write_lcd12864(1,col_add+0);
write_lcd12864(1,disp_on);
}
void full(void)
{
unsigned char i,j;
set_lcd12864_cs1;
set_lcd12864_cs2;
for(i=0;i<8;i++)
{
write_lcd12864(1,page_add+i);
for(j=0;j<64;j++)
{
write_lcd12864(0,0xff);
}
}
}
void cls(void)
{
unsigned char i,j;
set_lcd12864_cs1;
set_lcd12864_cs2;
for(i=0;i<8;i++)
{
write_lcd12864(1,page_add+i);
for(j=0;j<64;j++)
{
write_lcd12864(0,0x00);
}
}
}
int main(void)
{
DDRB|=0x07;
lcd_init();
while(1)
{
full();
delay_ms(500);
cls();
delay_ms(500);
disp_image(first_image,0);
delay_ms(5000);
disp_image(first_image,1);
delay_ms(5000);
cls();
delay_ms(500);
}
} |