#include<iom16v.h>
#include<macros.h>
#define RS_CLR PORTC&=~(1 << 5) //RS置低//片选信号
#define RS_SET PORTC|=(1 <<5) //RS置高
#define RW_CLR PORTC&=~(1 << 6) //RW置低//数据信号
#define RW_SET PORTC|=(1 <<6) //RW置高
#define EN_CLR PORTC&=~(1 << 7) //E置低//时钟信号
#define EN_SET PORTC|=(1 << 7) //E置高
#define PSB_CLR PORTC&=~(1 <<0) //PSB置低,串口方式//并行、串行选择信号
#define PSB_SET PORTC|=(1 << 0) //PSB置高,并口方式
#define RST_CLR PORTC&=~(1 << 1) //RST置低 //复位信号
#define RST_SET PORTC|=(1 << 1) //RST置高
/************************************************************
延时函数
************************************************************/
void delay_us(unsigned int us)
{
unsigned int i;
for(i=0;i<us;i++)
asm("nop");
}
void delay_ms(unsigned int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<1141;j++);
}
/*************************************************************
初始化程序
************************************************************/
void Port_Init(void)
{
PORTC==0X00;
DDRC==0XFF;
PSB_CLR; //液晶串口方式
RST_SET; //复位脚RST置高
TIMSK = 0x00;
MCUCR = 0x00;
GICR = 0x00;
}
/********************************************************************
* 名称 : sendbyte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : data
* 输出 : 无
***********************************************************************/
void sendbyte(unsigned char data)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((data<<i)&(0X80))
{
RW_SET;
}
else
{
RW_CLR;
}
delay_us(1);
//EN_CLR;
//delay_us(1);
//EN_SET;
//delay_us(1);
}
}
/********************************************************************
* 名称 : write_com()
* 功能 : 写串口指令,分三个字节写完
* 输入 : cmdcode
* 输出 : 无
***********************************************************************/
void write_com(unsigned char cmdcode)
{
RS_SET;
sendbyte(0XF8);
sendbyte(cmdcode&(0XF0));
sendbyte((cmdcode<<4)&0XF0);
RS_CLR;
}
/********************************************************************
* 名称 : write_data()
* 功能 : 写串口指令
* 输入 : data
* 输出 : 无
***********************************************************************/
void write_data(unsigned char data)
{
RS_SET;
sendbyte(0XFA);
sendbyte(data & 0XF0);
sendbyte((data << 4) & 0XF0);
RS_CLR;
}
/********************************************************************
* 显示屏初始化函数
********************************************************************/
void lcd_init(void)
{
RST_CLR;
delay_ms(100);
RST_SET;
delay_ms(20);
write_com(0X30);
delay_ms(5);
write_com(0X0D);
delay_ms(5);
write_com(0X06);
delay_ms(5);
write_com(0X80);
delay_ms(5);
write_com(0X0C);
delay_ms(50);
}
void LCD_clear(void)
{
write_com(0X01);
delay_ms(50);
}
void show(unsigned char *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay_ms(50);
}
}
void Test(void)
{
//write_com(0x03);//
//delay_ms(50);
write_com(0X80);//写资料到RAM
delay_ms(100);
show("HAN");
delay_ms(100);
write_com(0X90);
delay_ms(100);
show("哈哈");
delay_ms(100);
write_com(0X89);
delay_ms(100);
show(" ");
delay_ms(100);
write_com(0X98);
delay_ms(100);
show(" 搞定");
delay_ms(100);
}
void main(void)
{
Port_Init(); //系统初始化,设置IO口属性
delay_ms(100); //延时100ms
lcd_init(); //液晶参数初始化设置
LCD_clear(); //清屏
Test(); //显示汉字
} |