// =======================================================================================
// 文件名称:main.c
// 芯片类型: Atmega128
// 开发软件: Winavr+AVR studio
// 开发时间:2009年07月2日
// 程序功能:串行驱动12864液晶,液晶驱动器为st7920,带中文字库
// author:freedomxura
// 液晶硬件连接:
// PIN1 --- GND ---->GND
// PIN2 --- VCC ---->5v
// PIN3 --- V0 ---->3.2v
// PIN4 --- CS ---->PORTD.4
// PIN5 --- SID ---->PORTD.5
// PIN6 --- SCLK ---->PORTD.6
// PIN7 --- NC
// PIN8 --- NC
// PIN9 --- NC
// PIN10 --- NC
// PIN11 --- NC
// PIN12 --- NC
// PIN13 --- NC
// PIN14 --- NC
// PIN15 --- PSB ---->GND,串行
// PIN16 --- NC
// PIN17 --- RST ---->5v,no reset
// PIN18 --- NC
// PIN19 --- VCC ---->5v
// PIN20 --- GND ---->GND
//=============================================================================================
#include <avr/io.h>
#define uchar unsigned char
#define uint unsigned int
#define DIT(x) (1<<x)
uchar cs=4 ; //PORTB.4
uchar sid=5 ; //PORTB.5
uchar sclk=6 ; //PORTB.6
uchar psb=3 ; //PORTB.3
uchar rst=5 ; //PORTB.5
const uchar aa[]={"〓香港昆仑科技〓"};
const uchar bb[]={"★西骏科技★"};
const uchar cc[]={"◆欢迎光临◆"};
const uchar dd[]={"www.koontech.com"};
//const uchar ee[]={"WELCOME"};
//const uchar ff[]={"WELCOME"};
void LcdIni(void) ;
void WrOp(uchar dat) ;
void WrDat(uchar dat) ;
void SndByte(uchar dat) ;
void delay(void) ;
void delay_us(uchar i) ;
void LCD_WriteStr(uchar dis_addr_x,uchar dis_addr_y,uchar* str) ;
void LCD_WriteStr(uchar dis_addr_x,uchar dis_addr_y,uchar* str) ;
//==================================主函数=====================================
void main()
{
LcdIni() ;
WrOp(0x80) ;
LCD_WriteStr(1,1,aa);
LCD_WriteStr(2,2,bb);
LCD_WriteStr(3,3,cc);
LCD_WriteStr(1,4,dd);
// LCD_WriteStr(1,5,ee);
//LCD_WriteStr(1,7,ff);
while(1) ;
}
//=============================================================================
//函 数 名: LcdIni()
//功 能:液晶初始化
//入口参数:无
//出口参数:无
//返 回 值:无
//=============================================================================
void LcdIni(void)
{
DDRD=0XFF ;
PORTD=0XFF ; //PORTd输出全部为1
PORTD |=DIT(cs) ; //片选有效
PORTD &=~DIT(rst) ;
delay() ; //延时以复位
PORTD |=DIT(rst) ;
PORTD &=~DIT(cs) ; //片选无效
WrOp(0x20) ;
WrOp(0x01) ;
WrOp(0x06) ;
WrOp(0x0c) ;
}
//=============================================================================
//函 数 名: WrOp()
//功 能:写命令
//入口参数:uchar dat
//出口参数:无
//返 回 值:无
//=============================================================================
void WrOp(uchar dat)
{
PORTD |=DIT(cs) ;
SndByte(0xf8) ; //命令字1111 1000
SndByte(dat & 0xf0) ; //高四位为:high = dat & 0xf0;作为第一个字节发送
SndByte(dat<<4) ; //低四位为:low = dat << 4; 作为第二个字节发送
PORTD &=~DIT(cs) ;
delay() ;
}
//=============================================================================
//函 数 名: WrDat()
//功 能:写数据
//入口参数:uchar dat
//出口参数:无
//返 回 值:无
//=============================================================================
void WrDat(uchar dat)
{
PORTD |=DIT(cs) ;
SndByte(0xfa) ; //命令字1111 1010
SndByte(dat & 0xf0) ; //高四位为:high = dat & 0xf0;作为第一个字节发送
SndByte(dat<<4) ; //低四位为:low = dat << 4; 作为第二个字节发送
PORTD &=~DIT(cs) ;
delay() ;
}
//=============================================================================
//函 数 名: SndByte()
//功 能:发送字节数据
//入口参数:uchar dat
//出口参数:无
//返 回 值:无
//=============================================================================
void SndByte(uchar dat)
{
uchar i ;
for(i=8 ;i>0 ;i--)
{
if(dat & DIT(i-1)) PORTD |=DIT(sid) ; //置1
else PORTD &=~DIT(sid) ; //置0
PORTD |=DIT(sclk) ;
delay_us(2) ;
PORTD &=~DIT(sclk) ;
}
}
//=============================================================================
//函 数 名: delay()
//功 能:延时
//入口参数:无
//出口参数:无
//返 回 值:无
//=============================================================================
void delay(void)
{
uchar i,j ;
for(i=0 ;i<100 ;i++)
for(j=0 ;j<100 ;j++) ;
}
void delay_us(uchar i)
{
while(i--);
}
//=============================================================================
//函 数 名: LCD_setxy()
//功 能:设置显示位置X(1~16),Y(1~4)
//入口参数:uchar x,uchar y
//出口参数:无
//返 回 值:无
//=============================================================================
void LCD_setxy(uchar x,uchar y)
{
switch(y)
{
case 1:
WrOp(0X7F+x);break;
case 2:
WrOp(0X8F+x);break;
case 3:
WrOp(0X87+x);break;
case 4:
WrOp(0X97+x);break;
default:break;
}
}
//=============================================================================
//函 数 名: LCD_WriteStr()
//功 能:在指定位置显示字符串
//入口参数:uchar dis_addr_x,uchar dis_addr_y,uchar* str
//出口参数:无
//返 回 值:无
//=============================================================================
void LCD_WriteStr(uchar dis_addr_x,uchar dis_addr_y,uchar* str)
{
unsigned char LCD_temp;
LCD_setxy(dis_addr_x,dis_addr_y);
LCD_temp=*str;
while(LCD_temp != 0x00)
{
WrDat(LCD_temp);
LCD_temp=*(++str);
}
}