加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
LCD1602.c 3.46 KB
一键复制 编辑 原始数据 按行查看 历史
dk鲁晓东 提交于 2019-12-20 13:07 . LCD1602驱动
#include "LCD1602.h"
#define LCD1602DT NOP96();NOP96() //时序单位时间11.0592对应NOP48,22.1184对应NOP96,在15W4kxx54.h中调整
#define LCDdata P0 //数据口修改
sbit RS= P5^2;
sbit RW = P5^1;
sbit EN = P5^0;
//#define uchar unsigned char
//ms延时程序
void delay_ms_lcd(unsigned char ms)
{
unsigned char i;
while(ms--)
{ //1ms
for(i = 0;i<250;i++)
{//4us
LCD1602DT;
}//for
}//while
}
//LCD1602忙信号检测,每次操作前都要询问的
bit lcd_busy()//忙为1,闲为0
{
bit Bflag;
RS = 0;
RW = 1;
EN = 1;
//按照技术手册上的说明此处只需要延时150ns以上即可,但是经过proteus仿真反复验
//延 时至少四个机器周期,为什么呢?
LCD1602DT;
Bflag = (bit)(LCDdata & 0x80);//提取BF信号
EN=0;
return Bflag;
}
//向LCD写命令
void lcd_wcmd(unsigned char cmd)
{ LCDdata=0xff;
while(lcd_busy());//等待LCD空闲
RS=0; RW=0;
EN=0;//需要产生高脉冲
LCDdata=cmd;//cmd; //写命令
LCD1602DT; //此处至少延时1个周期,最好也延时两到四个周期
EN=1; //高脉冲,写入命令,命令有效
// _nop_(); _nop_();//此处延时至少四个周期
// _nop_(); _nop_(); _nop_();_nop_();
LCD1602DT;
EN=0;//高脉冲下降,使能结束
}
//向LCD写数据函数:
void lcd_wdat(unsigned char dat)
{
while(lcd_busy());//等待LCD空闲
RS=1; RW=0;
EN=0;//需要产生高脉冲
LCDdata=dat;//数据准备
// _nop_(); _nop_();
// _nop_();_nop_();
//此处至少延时1个周期,最好也延时两到四个周期
LCD1602DT;
EN=1;//高脉冲,写入数据,数据有效
// _nop_();_nop_(); //此处至少延时四个周期
// _nop_(); _nop_();
LCD1602DT;//48*1/11.0592=4us
EN=0;//高脉冲下降,使能结束
}
//1602初始化
void LCD_init(void)
{
lcd_wcmd(0x38); /*显示模式设置*/
delay_ms_lcd(10); // 原先为5
lcd_wcmd(0x38);
lcd_wcmd(0x08); /*显示关闭*/
lcd_wcmd(0x01); /*显示清屏*/
lcd_wcmd(0x06); /*显示光标移动设置*/
delay_ms_lcd(10);
lcd_wcmd(0x0C); /*显示开关及光标设置*/
}
//显示单个字符子程序:
void display_lcd_byte(unsigned char y,unsigned char x,unsigned char z) //Y=0,1(起始行)X=0~15(起始列)Z=想写字符的ASCII码
{
if(y) //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第二行,进入IF语句
{
x+=0x40; //第二行起始地址0x40加上一行时的列数,为字符显示地址
}
x+=0x80; //写入显示地址时要求最高为1;
lcd_wcmd(x);//设置光标位置
lcd_wdat(z);//写入数据内容
}
//显示字符串子程序:
void display_lcd_text(unsigned char y,unsigned char x,unsigned char table[]) //Y,X同上字符显示,table[]字符串数组
{
unsigned char z=0;
unsigned char t;
t=strlen(table)+x; // 求得字符串长度加上起始列位置
while(x<t) //功能为LCD显示到字符串最后一个字符,防止字符串
{ //没有16个字符,从而不够位产生乱码;
display_lcd_byte(y,x,table[z]); //逐位显示数组内字符
x++;
z++;
}
}
//自定义字模CGRAM中的01000000-01000111 然后结合字模软件
void MynewByte(unsigned char *Newtable,unsigned char n)
{unsigned char nwcom,k;
nwcom=0x40+n*8;
lcd_wcmd(nwcom); /*置字符发生ROM地址*/
for(k=0;k<8;k++)
lcd_wdat(*(Newtable+k)); /*写入自定义字符到ROM地址*/
}
void Numtostr(unsigned char *p,int x)
{
sprintf(p, "%d",x);
}
void Flotostr(unsigned char *p,float x)
{
sprintf(p, "%3.2f",x);
}
unsigned char * Timetostr(char h,char min,char sec)
{static unsigned char p[8];
sprintf(p, "%02d:%02d:%02d",(int)h,(int)min,(int)sec);
return p;}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化