📄 lcd1.c
字号:
/************************************
*函数名:void lcd_writCM(char dt)
*功 能:向lcd写入命令
*输 入:
*返 回:void
*命令表:0x01 将ddram填满"20h",并且设定ddram的位置计数器(ac)到"00h"
0x02 设定ddram的位置计数器(ac)到"00h"但不改变ddram
*************************************/
void lcd_writeCM(char dt)
{
unsigned char busy;
unsigned int wait = 0;
RS_LCD = 0;
RW_LCD = 1;
do
{
DATABUS = 0xFF;
E_LCD = 1;
busy = DATABUS;
E_LCD = 0;
if(wait++>1200) //超过一定时间,不等待
break;
}while(busy&0x80); //如果忙,一直等待
RS_LCD = 0; //写指令的时序
RW_LCD = 0;
DATABUS = dt;
E_LCD = 1;
E_LCD = 0;
RW_LCD = 1;
}
/************************************
*函数名:void lcd_writDT(char dt)
*功 能:向lcd写入一字节数据
*输 入:
*返 回:void
*************************************/
void lcd_writeDT(char dt)
{
unsigned char busy;
unsigned int wait = 0;
RS_LCD = 0;
RW_LCD = 1;
do
{
DATABUS = 0xFF;
E_LCD = 1;
busy = DATABUS;
E_LCD = 0;
if(wait++ >1200) //超过一定时间,不等待
break;
}while(busy&0x80); //如果忙,一直等待
RS_LCD = 1; //写数据的时序
RW_LCD = 0;
DATABUS = dt;
E_LCD = 1;
E_LCD = 0;
RW_LCD = 1;
}
#if 0
/************************************
*函数名:char lcd_Read(void)
*功 能:读取lcd
*输 入:void
*返 回:char
*************************************/
char lcd_Read(void)
{
unsigned char dt;
DATABUS = 0xFF;
RS_LCD = 1;
RW_LCD = 1;
dt = DATABUS;
E_LCD = 1;
E_LCD = 0;
RW_LCD = 0;
return dt;
}
/************************************
*函数名:char lcd_Busy(void)
*功 能:判忙并读取ac
*输 入:void
*返 回:char
*注备:毫无用处,经测试,返回值和
char lcd_Read(void)一模一样,都为
最后一次写入的数据,why?
*************************************/
bit lcd_Busy(void)
{
unsigned char dt;
bit lcdbusy_flag;
DATABUS = 0xFF;
RS_LCD = 0;
RW_LCD = 1;
dt = DATABUS;
E_LCD = 1;
E_LCD = 0;
RW_LCD = 0;
lcdbusy_flag = dt&0x80;
return lcdbusy_flag;
}
#endif //char lcd_Busy(void)编译关闭
/************************************
*函数名:void lcd_init(void)
*功 能:初始化lcd
*输 入:void
*返 回:void
*************************************/
void lcd_init(void)
{
Delay1ms(100);
lcd_writeCM(0x30);//设定基本指令集
Delay1us(100);
lcd_writeCM(0x30);//设定基本指令集
Delay1us(40);
lcd_writeCM(0x0c);//显示开
Delay1us(100);
lcd_writeCM(0x01);//清除
Delay1ms(40);
lcd_writeCM(0x06);//设定AC+1
Delay1us(100);
lcd_writeCM(0x80);//设定起始地址
Delay1us(100);
}
/************************************
*函数名:void lcd_SetXY(void)
*功 能:在液晶上定位显示位置
*输 入:void
*返 回:void
*************************************/
void lcd_SetXY(void)
{
lcd_adr = (0x80+lcd_x); //计算出x坐标
switch(lcd_y) //计算出y坐标
{
case 1: //第2行
lcd_adr = lcd_adr+16;break;
case 2: //第3行
lcd_adr = lcd_adr+8;break;
case 3: //第4行
lcd_adr = lcd_adr+24;break;
default:
break;
}
lcd_writeCM(lcd_adr); //设定DDRAM位址到位址计数器
}
/************************************
*函数名:void lcd_CH(unsigned char *buf)
*功 能:显示字符串
*输 入:
汉字:x范围 0~7 y范围 0~3
英文:x范围 0~15 y范围 0~3
*返 回:void
*注 备:此函数使用了全局变量
使用之前应设置全局变量,
已经做了防溢出处理
*************************************/
void lcd_CH(char *buf)
{
bit i=1;
EA = 0;
lcd_SetXY();
Delay1us(100);
while((*buf)!='\0') //字符串没结束
{
lcd_writeDT(*buf++);
Delay1us(30);
if((i=~i)) lcd_x++;
if(lcd_x>7)
{
lcd_x=0;
lcd_y++;
if(lcd_y>3) lcd_y=0; //防止溢出
lcd_SetXY();
Delay1us(100);
}
}
EA = 1;
}
#if NEEDBMP
/************************************
*函数名:Nonius_Ctrl(NONIUS)
*功 能:游标控制
*输 入:CM1{on,off,left,right,reverse}NONIUS
*返 回:void
*************************************/
void Nonius_Ctrl(NONIUS)
{
lcd_SetXY();
switch(NONIUS)
{
case on: //游标显示开
lcd_writeCM(0x0e);
Delay1us(30);
break;
case off: //游标显示关
lcd_writeCM(0x0c);
Delay1us(30);
break;
case left: //游标左移
if(lcd_x>0)
{
lcd_writeCM(0x10);
lcd_x--;
Delay1us(30);
}
else
{
lcd_y--;
if(lcd_y<0) lcd_y=3;
lcd_x=7;
lcd_SetXY();
Delay1us(30);
}
break;
case right: //游标右移
if(lcd_x<7)
{
lcd_writeCM(0x14);
lcd_x++;
Delay1us(30);
}
else
{
lcd_y++;
if(lcd_y>3) lcd_y=0;
lcd_x=0;
lcd_SetXY();
Delay1us(30);
}
break;
case reverse: //游标反白
lcd_writeCM(0x0f);
Delay1us(30);
break;
default:break;
}
}
/************************************
*函数名:lcd_disBMP(unsigned char *dt)
*功 能:显示图形点阵(128*64) 横向取模
*输 入:unsigned char *dt
*返 回:void
*************************************/
void lcd_disBMP(unsigned char *dt)
{
// unsigned char adr;
unsigned char i,j;
EA = 0;
lcd_writeCM(0x34);//设定扩充指令集
Delay1us(100);
lcd_writeCM(0x36);//开绘图模式
Delay1us(100);
for(i=0;i<32;i++)
{
lcd_writeCM(0x80|i); //写y的地址
lcd_writeCM(0x80); //写x的地址
for(j=0;j<16;j++)
{
lcd_writeDT(*dt++);
Delay1us(20);
}
}
for(i=0;i<32;i++)
{
lcd_writeCM(0x80|i); //写y的地址
lcd_writeCM(0x88); //写x的地址
for(j=0;j<16;j++)
{
lcd_writeDT(*dt++);
Delay1us(20);
}
}
EA = 1;
}
/************************************
*函数名:void lcdgraph_init(void)
*功 能:初始化lcd到图形模式
*输 入:void
*返 回:void
*************************************/
void lcdgraph_init(void)
{
Delay1ms(100);
lcd_writeCM(0x34);//设定扩充指令集
Delay1us(100);
lcd_writeCM(0x36);//开绘图模式
Delay1us(40);
lcd_writeCM(0x0c);//显示开
Delay1us(100);
lcd_writeCM(0x01);//清除
Delay1ms(40);
lcd_writeCM(0x06);//设定AC+1
Delay1us(100);
lcd_writeCM(0x80);//设定起始地址
Delay1us(100);
}
#endif //NEEDBMP
#endif //_LCD_CHINESE_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -