📄 lcm12864.h
字号:
//*******************************************************************************
//*文件:lcm12864.h *
//*说明:lcm12864液晶(带字库)驱动函数库 7920控制器 8位并口方式驱动 *
//*平台:AVR *
//*作者:陈崇 *
//*建立:2006-12-20 *
//*修改:2007-5-26 *
//*******************************************************************************
#ifndef _LCM12864_DRIVER_
#define _LCM12864_DRIVER_
#define LCD_DB_OUT PORTC // LCD数据端口
#define LCD_DB_SET_OUT DDRC=0xFF // 设置数据端口为输出
#define LCD_DB_SET_IN DDRC=0x00 // 设置数据端口为输入
#define LCD_RST_SBI PORTD|=_BV(PD1) // RST置位
#define LCD_RST_CBI PORTD&=~_BV(PD1) // RST清零9
#define LCD_PSB_SBI PORTD|=_BV(PD7) // PSB置位
#define LCD_PSB_CBI PORTD&=~_BV(PD7) // PSB清零
#define LCD_E_SBI PORTA|=_BV(PA5) // E置位
#define LCD_E_CBI PORTA&=~_BV(PA5) // E清零
#define LCD_RW_SBI PORTA|=_BV(PA6) // RW置位
#define LCD_RW_CBI PORTA&=~_BV(PA6) // RW清零
#define LCD_RS_SBI PORTA|=_BV(PA7) // RS置位
#define LCD_RS_CBI PORTA&=~_BV(PA7) // RS清零
#define LCD_BF PINC&_BV(PINC7) // 忙碌标志位
//***********************************************************************
//*名称: void delay_nms(unsigned int nms) *
//*功能: 延时nms *
//*参数: 无 *
//*返回: 无 *
//***********************************************************************
void delay_nms(unsigned int nms)
{
for(;nms>0;nms--)
{
_delay_loop_2(2000);
}
}
//***********************************************************************
//*名称: void lcm12864_check_busy(void) *
//*功能: 检查lcm12864忙碌子程序 *
//*参数: 无 *
//*返回: 无 *
//***********************************************************************
void lcm12864_check_busy(void)
{
LCD_DB_SET_IN;
LCD_DB_OUT=0xFF;
LCD_RS_CBI; // 显示指令
LCD_RW_SBI; // 读数据
LCD_E_SBI; // 读写使能
while(LCD_BF); // 判断忙碌标志位
LCD_E_CBI; // 读写使能关闭
LCD_DB_SET_OUT;
}
//***********************************************************************
//*名称: void lcm12864_wirte_cmd(unsigned char command) *
//*功能: 往lcm12864写指令子程序 *
//*参数: command 字符型 指令代码 *
//*返回: 无 *
//***********************************************************************
void lcm12864_wirte_cmd(unsigned char command)
{
lcm12864_check_busy(); // 检查LCD是否忙碌
LCD_DB_SET_OUT;
LCD_RS_CBI; // 显示指令
LCD_RW_CBI; // 写数据
LCD_DB_OUT=command;
LCD_E_SBI;
asm("nop"::);
LCD_E_CBI;
}
//***********************************************************************************
//*名称: unsigned char lcm12864_read_data(void) *
//*功能: 从lcm12864读数据子程序 *
//*参数: 无 *
//*返回: lcm12864_data 字符型 读取数据 *
//***********************************************************************************
unsigned char lcm12864_read_data(void)
{
unsigned char rev_data;
lcm12864_check_busy();
LCD_RS_SBI; //显示数据
LCD_RW_SBI; //读数据
LCD_E_SBI;
rev_data=LCD_DB_OUT;
LCD_E_CBI;
return rev_data;
}
//***********************************************************************************
//*名称: lcm12864_wirte_data(unsigned char data_byte) *
//*功能: 往lcm12864写数据 *
//*参数: lcm12864_data 要写入的数 *
//*返回: 无 *
//***********************************************************************************
void lcm12864_wirte_data(unsigned char data_byte)
{
lcm12864_check_busy(); // 检查LCD是否忙碌
LCD_DB_SET_OUT;
LCD_RS_SBI; //显示数据
LCD_RW_CBI; //写数据
LCD_DB_OUT=data_byte;
LCD_E_SBI; // 读写使能
asm("nop"::);
LCD_E_CBI;
}
//***********************************************************************************
//*名称: lcm12864_clear(void) *
//*功能: lcm12864DDRAM清屏 *
//*参数: 无 *
//*返回: 无 *
//***********************************************************************************
void lcm12864_clear(void)
{
lcm12864_wirte_cmd(0x01);
}
//***********************************************************************************
//*名称: lcm12864_init(void) *
//*功能: lcm12864初始化 *
//*参数: 无 *
//*返回: 无 *
//***********************************************************************************
void lcm12864_init(void)
{
LCD_PSB_SBI; //8位并口方式
LCD_RST_CBI; //lcm12864复位
delay_nms(5);
LCD_RST_SBI;
lcm12864_wirte_cmd(0x30); //基本指令
lcm12864_wirte_cmd(0x01); //清除显示
lcm12864_wirte_cmd(0x0C); //显示开,关光标不闪烁
lcm12864_wirte_cmd(0x06); //设置输入模式
}
//***************************************************************************************
//*名称: void lcm12864_char_locate(unsigned char x, unsigned char y ) *
//*功能: 字符显示定位(汉字和ASCII) *
//*参数: x水平列地址(0-7) y垂直行地址(0-3) *
//*返回: 无 *
//***************************************************************************************
void lcm12864_char_locate(unsigned char x, unsigned char y )
{
unsigned char dx=0; // DDRAM中的水平和垂直坐标
switch(y)
{
case 0:
{
dx=x+0x80;
break;
}
case 1:
{
dx=x+0x90;
break;
}
case 2:
{
dx=x+0x88;
break;
}
case 3:
{
dx=x+0x98;
break;
}
}
lcm12864_wirte_cmd(dx);
}
//***************************************************************************************
//*名称: lcm12864_dis_ascii(unsigned char ascii_code) *
//*功能: 显示一个ASCII字符 *
//*参数: ascii_code 显示的ASCII代码 *
//*返回: 无 *
//***************************************************************************************
void lcm12864_dis_ascii(unsigned char ascii_code)
{
lcm12864_wirte_data(ascii_code);
}
//***********************************************************************************************************************
//*名称: lcm12864_dis_string (unsigned char x, unsigned char y, unsigned char *ptr,unsigned int speed) *
//*功能: 显示一个字符 *
//*参数: x 水平列地址(0-7) y 垂直行地址(0-3) *ptr 字符串指针 *
//*返回:无 *
//***********************************************************************************************************************
void lcm12864_dis_string (unsigned char x, unsigned char y, unsigned char *ptr,unsigned int speed)
{
lcm12864_char_locate(x,y); // 定位字符的起点在DDRAM中的位置
while (*ptr)
{
lcm12864_wirte_data(*ptr++);
delay_nms(speed);
}
}
//*******************************************************************************************************
//*名称: lcm12864_draw_locate (unsigned char x,unsigned char y) *
//*功能: 绘图模式GDRAM定位 *
//*参数: x水平列地址(0-127) y垂直行地址(0-63) *
//*返回: 无 *
//*******************************************************************************************************
void lcm12864_draw_locate (unsigned char x,unsigned char y)
{
lcm12864_wirte_cmd(0x34);
lcm12864_wirte_cmd(y); // 垂直地址
lcm12864_wirte_cmd(x); // 水平地址
lcm12864_wirte_cmd(0x30);
}
//*******************************************************************************************************
//*名称: lcm12864_string_negative(unsigned char x,unsigned char y,unsigned char with) *
//*功能: 字符串反白显示 可以反白半宽的ASCII码字符 *
//*参数: x水平列地址(0-15) y垂直行地址(0-3) *
//*返回: 无 *
//*******************************************************************************************************
void lcm12864_string_negative(unsigned char x,unsigned char y,unsigned char with)
{
unsigned char temp1,temp2;
unsigned int dot_data;
if(x%2==1) // 初始化写入点数据
{
dot_data=0x00FF;
}
else
{
dot_data=0xFF00;
}
x=0x80+x/2; // 绘图GDRAM水平地址
switch(y) // 转换成DDRAM坐标
{
case 0:
{
y=0x80;
break;
}
case 1:
{
y=0x90;
break;
}
case 2:
{
y=0x80;
x+=8;
break;
}
case 3:
{
y=0x90;
x+=8;
break;
}
}
if(dot_data==0x00FF) // 反白起点为半个水平地址的字符
{
for(temp1=0;temp1<16;temp1++)
{
lcm12864_draw_locate(x,y+temp1); // 写绘图资料地址,先写垂直地址,再写水平地址
lcm12864_wirte_data((char)(dot_data/256)); // 连续写入两个字节的数据到绘图资料
lcm12864_wirte_data((char)(dot_data%256));
}
with--;
if(with==0) // 如果达到反白宽度则退出
{
lcm12864_wirte_cmd(0x36);
lcm12864_wirte_cmd(0x30);
return;
}
x++; // 水平坐标增加
}
for(temp1=0;temp1<16;temp1++) // 反白剩余宽度的字符
{
dot_data=0xFF00;
for(temp2=0;temp2<with;temp2++)
{
lcm12864_draw_locate(x+temp2/2,y+temp1); // 写绘图资料地址,先写垂直地址,再写水平地址
lcm12864_wirte_data((char)(dot_data/256)); // 连续写入两个字节的数据到绘图资料
lcm12864_wirte_data((char)(dot_data%256));
dot_data|=~dot_data;
}
}
lcm12864_wirte_cmd(0x36); // 打开绘图显示
lcm12864_wirte_cmd(0x30);
}
//*******************************************************************************************************
//*名称: lcm12864_dis_dot(unsigned char x,unsigned char y,const unsigned char *prt) *
//*功能: 显示16*16点阵
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -