6,125
社区成员
发帖
与我相关
我的任务
分享
include "LCD1602.h"
sbit lcd_port_rs=LCD_PORT_RS;
sbit lcd_port_e=LCD_PORT_E;
///////////////////////////LCD延时,等待命令执行完//////////////////////
#ifdef MCU_STC89
void lcd_delay(char j)
{
int i=0;
while(j--)
for(i=0;i<60;i++);
}
#endif
#ifdef MCU_STC12
void lcd_delay(char j)
{
int i=0;
while(j--)
for(i=0;i<160;i++);
}
#endif
//////////////////////////////////////////////////////////////////////////////
//写入命令,下降沿写入
void lcd_en()
{
lcd_port_e=1;
lcd_delay(1);
lcd_port_e=0;
}
///////////////////////////写入内容:rs_mode 0为指令,1为数据//////////////////////
#ifdef LCD_DATA_8_LINE
void lcd_write(char rs_mode,unsigned char value)
{
lcd_port_rs=rs_mode;
LCD_PORT_DATA=value;
lcd_en();
lcd_delay(1);
}
#endif
#ifdef LCD_DATA_4_LINE
void lcd_write(char rs_mode,unsigned char value)
{
lcd_port_rs=rs_mode;
//首先发送高4位
LCD_PORT_DATA&=0x0f; //使用数据口高4位输出,低4位不变,高4位清零
LCD_PORT_DATA|=value&0xf0; //低4位不变,高4为赋值value的高4位
lcd_en();
lcd_delay(1);
//然后发送低4位
LCD_PORT_DATA&=0x0f;
LCD_PORT_DATA|=value<<4;//低4位不变,高4为赋值value的低4位
lcd_en();
lcd_delay(1);
}
#endif
//////////////////////////////////////////////////////////////////////////////
//初始化
void lcd_init()
{
lcd_delay(80); //40ms,等待VDD>4.5V
#ifdef LCD_DATA_8_LINE
lcd_write(0,0x38);//8位数据,2行显示。等待一段时间
lcd_delay(20);//10ms
lcd_write(0,0x38);//8位数据,2行显示。等待一段时间
lcd_delay(2);//1ms
#endif
#ifdef LCD_DATA_4_LINE
lcd_write(0,0x33);//8线,8线
lcd_delay(20);//10ms
lcd_write(0,0x32);//8线,4线
lcd_delay(20);//10ms
lcd_write(0,0x28);//4线,2行显示
lcd_delay(20);//10ms
#endif
lcd_write(0,0x01);//清屏
lcd_delay(10);
lcd_write(0,0x0c);//显示器开,光标关,字符不闪烁
lcd_write(0,0x06);//字符不动,光标右移
}
//指定位置写入字符,x坐标,y坐标,字符。
void lcd_write_char(unsigned char x_pos,unsigned char y_pos,char value)
{
//写入地址
x_pos&=0x0f;//限制范围
y_pos&=0x01;//限制范围
if(y_pos) x_pos+=0x40;//实际位置
x_pos+=0x80;// 设置地址
lcd_write(0,x_pos);//写入地址
lcd_delay(5);
lcd_write(1,value);//写入数据
}
//写入正行,字符串长度应小于16,不足则不覆盖
void lcd_write_line(char line,char* str)
{
char i=0;
for(i=0;i<16;i++)
{
lcd_write_char(i,line,*(str+i));
}
}
//写入字符串,(x坐标,y坐标,字符串,长度)
void lcd_write_str(char x,char y,char* str,char len)
{
char i=0;
for(i=0;i<len;i++)
{
lcd_write_char(x+i,y,*(str+i));
}
}
//写入数字(x坐标,y坐标,数据,整数长度,小数长度)
//整数长度,小数长度=0时候为不显示。 小数长度要小于5
void lcd_write_num(char x,char y,double num,char len1,char len2)
{
long left=0; //小数点左边
long right=0; //小数点右边
signed char i=0; //循环变量
char ubNegFlag = 0; //负数标志,1为负数,0为正数
if(num<0){num*=-1;ubNegFlag=1;}
left=(long)num; // 小数点左边
right=((long)(num*100000))%100000; //小数点右边,取5个有效数字
if(len1>0) //如果需要显示整数
{
for(i=x+len1-1;i>=x;i--) //计算整数区域
{
if((i == x) & (ubNegFlag == 1)) lcd_write_char(x,y,'-');//负数的话,显示负号
else lcd_write_char(i,y,(left%10)+'0'); // 显示出来
left/=10; // 循环左移
}
}
if(len2>0) //如果需要显示小数
{
lcd_write_char(x+len1,y,'.'); // 显示小数点
for(i=x+len1+1;i<=x+len1+len2;i++) //显示区域
{
lcd_write_char(i,y,((right/10000)%10)+'0'); //显示出来
right*=10; //循环移动
}
}
}