📄 12864.c.120724184310
字号:
/*****************************************
*文件名:lcd12864.c
*功能:LCD12864串行方式AVR驱动程序
*日期:2010年7月10日
****************************************/
#include <string.h>
#include "12864.h" //包含头文件
/*****************************************
*函数名:delay_12864
*功能:利用寄存器操作实现延时效果
*参数:延时变量x
*返回值:无
****************************************/
void delay_ms(uint x)
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<1141;i++);
}
void delay_us(uint x)
{
uint i,j;
for(j=0;j<x;j++)
for(i=0;i<40;i++);
}
/*****************************************
*函数名:send_command
*功能:向LCD控制器的寄存器写指令
*参数:指令command_data
*返回值:无
****************************************/
void LCD_init(void)
{
delay_ms(20);
DDRE|=(1<<5);
//DDRE|=(1<<3);
DDRE|=(1<<1);
delay_ms(1);
Write_Command(0x30);//显示地址归位0x02
Write_Command(0x02);//选择基本指令集0x30
Write_Command(0x01);//光标关
Write_Command(0x08);
Write_Command(0x10);
Write_Command(0x38);
Write_Command(0x80);
Write_Command(0x0c);//开显示0x0c
}
//发送命令
void Write_Command(unsigned char CMD)
{
uchar command,i;
command=0xf8;
for(i=0;i<8;i++)//把数据送到线上去
{
if(command&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_CLE;
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
command=command<<1;//高位先发
}
delay_us(90);
command=CMD&0xf0;
for(i=0;i<8;i++)//把数据送到线上去
{
if(command&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_CLE;
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
command=command<<1;//高位先发
}
delay_us(90);
command=CMD<<4;
for(i=0;i<8;i++)//把数据送到线上去
{
if(command&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_CLE;
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
command=command<<1;//高位先发
}
delay_us(90);
}
//发送一个字符
void Write_one_char(unsigned char dat)
{
uchar date,i;
date=0xfa;
for(i=0;i<8;i++)//把数据送到线上去
{
if(date&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_CLE;
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
date=date<<1;//高位先发
}
delay_us(90);
date=dat&0xf0;
for(i=0;i<8;i++)//把数据送到线上去
{
if(date&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_CLE;
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
date=date<<1;//高位先发
}
delay_us(90);
date=dat<<4;
for(i=0;i<8;i++)//把数据送到线上去
{
if(date&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_CLE;
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
date=date<<1;//高位先发
}
delay_us(90);
}
//在指定的位置显示一个字母
void Lcd_putsachar(unsigned char x,unsigned char y,unsigned char dat)
{
switch(x)
{
case 0:
Write_Command(0x80);
Write_Command(0x80+y);
break;
case 1:
Write_Command(0x90);
Write_Command(0x90+y);
break;
case 2:
Write_Command(0x88);
Write_Command(0x88+y);
break;
case 3:
Write_Command(0x98);
Write_Command(0x98+y);
break;
}
Write_one_char(dat);//写数据
}
//从指定的位置开始显示汉字或字符
void Lcd_puts_any(unsigned char x,unsigned char y,unsigned char *p)
{
unsigned char i;
switch(x)
{
case 0:
Write_Command(0x80);
Write_Command(0x80+y);
break;
case 1:
Write_Command(0x90);
Write_Command(0x90+y);
break;
case 2:
Write_Command(0x88);
Write_Command(0x88+y);
break;
case 3:
Write_Command(0x98);
Write_Command(0x98+y);
break;
}
for(i=0;p[i]!='\0';i++)
{
Write_one_char(p[i]);
}
}
void Write_One_Date(unsigned char CMD,unsigned char *p)
{
uchar i=0;
Write_Command(CMD);
for(i=0;p[i]!='\0';i++)
{
Write_one_char(p[i]);
delay_ms(100);
Lcd_putsachar(0,5,'V');
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -