📄 12864.c.120724153604
字号:
/*****************************************
*文件名:lcd12864.c
*功能:LCD12864串行方式AVR驱动程序
*日期:2010年7月10日
****************************************/
#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++);
}
//清屏
void CLE_Screen(void)
{
Write_Command(CLR_SCREEN);
delay_ms(7);
}
/*****************************************
*函数名:send_command
*功能:向LCD控制器的寄存器写指令
*参数:指令command_data
*返回值:无
****************************************/
void LCD_init(void)
{
delay_ms(100);
DDRE|=(1<<5);
DDRE|=(1<<3);
DDRE|=(1<<1);
delay_ms(1);
CLE_Screen();
Write_Command(RE_ADDR);//显示地址归位0x02
Write_Command(BASIC);//选择基本指令集0x30
Write_Command(CURSOR_OFF);//光标关
Write_Command(0x08);
Write_Command(0x10);
Write_Command(0x38);
Write_Command(0x80);
Write_Command(DISPLYAY_ON);//开显示0x0c
}
//向12864发送一个字节的数据
void Write_One_Date(unsigned char date)
{
unsigned char i;
SCLK_CLE;//时钟总线拉低
delay_us(1);
for(i=0;i<8;i++)//把数据送到线上去
{
if(date&0x80)
{SID_SET;}
else
{SID_CLE;}
delay_us(1);
SCLK_SET;//时钟总线拉高,数据传送给显示屏
delay_us(1);
SCLK_CLE;
delay_us(1);
date=date<<1;//高位先发
}
}
//发送命令
void Write_Command(unsigned char CMD)
{
CS_SET;
Write_One_Date(0xf8);//命令控制字
Write_One_Date(CMD&0xf0);
Write_One_Date(CMD&0x0f);//低位转高
CS_CLE;
delay_us(40);
}
//发送一个字符
void Write_one_char(unsigned char dat)
{
CS_SET;
Write_One_Date(0xfa);
Write_One_Date(dat&0xf0);
Write_One_Date(dat&0X0f);
CS_CLE;
delay_us(40);
}
//在指定的位置显示一个字母
void Lcd_putsachar(unsigned char x,unsigned char y,char dat)
{
char addr;
switch(x)//计算显示的位置
{
case 0:
{addr=y+0x80;
break;
}
case 1:
{
addr=y+0x90;
break;
}
case 2:
{
addr=y+0x88;
break;
}
case 3:
{
addr=y+0x98;
break;
}
}
Write_Command(addr);//写地址到显示屏
Write_one_char(dat);//写数据
}
//从指定的位置开始显示汉字或字符
void Lcd_puts_any(unsigned char x,unsigned char y, char *p)
{
char addr,i;
switch(x)
{
case 0:
{addr=y+0x80;
break;
}
case 1:
{
addr=y+0x90;
break;
}
case 2:
{
addr=y+0x88;
break;
}
case 3:
{
addr=y+0x98;
break;
}
}
Write_Command(addr);
while(*p!='\0')//'\0'字符串结束标志
{
Write_one_char(*p);
p++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -