C51单片机对1602lcd模块的驱动

手上有一片1602的lcd,ks0066的驱动芯片,带led背光。参考网站上的一些资料,写了个驱动程序,写完了才发现,跟网上流传的代码基本上差不多/*======================================= 1602lcd模块驱动程序===============
说明:1.晶体:11.0592mhz
2.1602驱动:ks0066
******************************************/
#i nclude
#i nclude
#define lcm_rs p2_7 //寄存器选择
#define lcm_rw p2_6 //读/写控制
#define lcm_e p2_5 //读/写使能
#define lcm_blk p2_4 //背光led 1.off 0.on
#define lcm_data p0
//函数声明
void delay5ms(void);
void delay400ms(void);
void lcm_write_command(unsigned char wc_lcm,busy_c);
/***********************************
//函数名称: void lcm_ini(void)
//传递参数: 无
//返 回 值: 无
//函数功能: lcm初始化
//函数说明:
***********************************/
void lcm_ini(void)
{
lcm_data = 0;
lcm_write_command(0x38,0); //16*2显示,5*7点阵,8位数据接口,不检测忙
delay5ms();
lcm_write_command(0x38,0);
delay5ms();
lcm_write_command(0x38,0); //三次显示模式, 不检测忙
delay5ms();
lcm_write_command(0x38,1); //16*2显示,5*7点阵,8位数据接口,需要检测忙
lcm_write_command(0x80,1); //关闭显示
lcm_write_command(0x01,1); //clear显示
lcm_write_command(0x06,1); //指针和光标+1,不滚屏
lcm_write_command(0x0c,1); //开显示,不显示光标
}
/***********************************
//函数名称: unsigned char lcm_read_status(void)
//传递参数: 无
//返 回 值: unsigned char
//函数功能: 读lcm状态,等待lcm空闲
//函数说明: db7=1,忙
***********************************/
unsigned char lcm_read_status(void)
{
lcm_data=0xff;
lcm_rs=0;
lcm_rw=1;
lcm_e=0;
lcm_e=0;
lcm_e=1;
while(lcm_data & 0x80);
return lcm_data;
}
/***********************************
//函数名称: void lcm_write_data(unsigned char wd_lcm)
//传递参数: unsigned char wd_lcm
//返 回 值: 无
//函数功能: lcm写数据
//函数说明:
***********************************/
void lcm_write_data(unsigned char wd_lcm)
{
lcm_read_status(); //判断lcm忙标志
lcm_data = wd_lcm;
lcm_rs = 1;
lcm_rw = 0;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
}
/***********************************
//函数名称: void lcm_write_command(unsigned char wc_lcm, busy_c)
//传递参数: unsigned char wc_lcm, busy_c
//返 回 值: 无
//函数功能: lcm写命令
//函数说明: busy_c=0是,不用检测忙信号
***********************************/
void lcm_write_command(unsigned char wc_lcm, busy_c)
{
if (busy_c)
lcm_read_status();
lcm_data = wc_lcm;
lcm_rs=0;
lcm_rw = 0;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
}
/***********************************
//函数名称: void disp_one_char(unsigned char x, unsigned char y,unsigned char disp_data)
//传递参数: unsigned char x, unsigned char y,unsigned char disp_data
//返 回 值: 无
//函数功能: 指定位置显示一个字符
//函数说明:
***********************************/
void disp_one_char(unsigned char x,unsigned char y,unsigned disp_data)
{
y = y&0x01;
x = x&0x0f; //限制2行,没行15个字
if (y)
x =x + 0x40; //算ram地址
x = x + 0x80;
lcm_write_command(x,0);
lcm_write_data(disp_data);
}
/***********************************
//函数名称: void disp_one_char(unsigned char x, unsigned char y,unsigned char *disp_data)
//传递参数: unsigned char x, unsigned char y,unsigned char *disp_data
//返 回 值: 无
//函数功能: 指定位置显示一串字符
//函数说明:
***********************************/
void disp_list_char(unsigned char x,unsigned char y,unsigned char *disp_data)
{
unsigned char char_length,j;
char_length = strlen(disp_data);
y = y&0x1;
x = x&0x0f;
for (j=0;j
{
disp_one_char( x,y,disp_data[j]); //显示一个字符
x++;
}
}
/***********************************
//函数名称: void delay5ms(void)
//传递参数: 无
//返 回 值: 无
//函数功能: 延时5ms
//函数说明:
***********************************/
void delay5ms(void)
{
unsigned int tempcyc = 5552;
while(tempcyc--);
}
/***********************************
//函数名称: void delay400ms(void)
//传递参数: 无
//返 回 值: 无
//函数功能: l延时400ms
//函数说明: lcm开机延时
***********************************/
void delay400ms(void)
{
unsigned char tempcyca = 5;
unsigned int tempcycb;
while(tempcyca--)
{
tempcycb=7269;
while(tempcycb--);
};
}
/*****d******************************
//函数名称: void main(void)
//传递参数: 无
//返 回 值: 无
//函数功能: 主函数
//函数说明:
************************************/
void main(void)
{
delay400ms();
lcm_ini();
disp_list_char(1,0,“welcome”);
disp_list_char(1,0,“www.dzkjcn.com”)
while(1);
}
以上的程序只是简单的显示两行字符,没有滚屏和背光
4线液晶1602的c51程序
----------------------------------
| lcm-----51  | lcm-----51 |
----------------------------------
|rs-----p2.1 | db4-----p1.4 |
|rw-----p2.0 | db5-----p1.5 |
|e -----p2.2 | db6-----p1.6 |
|vlcd接1k电阻到gnd| db7-----p1.7 |
---------------------------------------------------
[注:at89s51使用12m晶振]
=============================================================*/
void writelcd(bit command,unsigned char ddata)
{
readstatuslcm(); //检测忙
lcm_data = (ddata&0xf0)|(p1&0x0f);
lcm_rw = 0;
if(command==0) lcm_rs = 0; else lcm_rs=1;
lcm_e = 1;
lcm_e = 0;
lcm_e = 0;
lcm_data = ((ddata《《4)&0xf0)|(p1&0x0f);
if(command==0) lcm_rs = 0; else lcm_rs=1;
lcm_e = 1;
lcm_e = 0;
lcm_e = 0;
}
//读状态
unsigned char readstatuslcm(void)
{
p1_7=1;
lcm_rs = 0;
lcm_rw = 1;
lcm_e = 0;
lcm_e = 0;
lcm_e = 1;
while(p1_7&0x01);//检测忙信号
return(p1_7);
}
void lcminit(void) //lcm初始化
{
lcm_data=0xff;
writelcd(0,0x28); //三次显示模式设置,不检测忙信号
delay5ms();
writelcd(0,0x28);
d

关于多通道矢量信号源的时差定位系统性能测试分析和说明
http代理的作用如下所示
双法兰差压液位计在石化行业中的应用有哪些
WSL2中使用USB串口
高级人工智能是什么
C51单片机对1602lcd模块的驱动
最高年终奖系列:走入华为就走入了成功之路!
比特币市值比债券市场相比怎样
一个小型负荷切换装置的制作
Leitz Reference BX测量方案实现对零部件检测精度最大化
中国移动首张200G商用骨干网络,率先实现OXC+OTN集群规模商用
苹果AirPods Max比大多数竞品耳罩式耳机更重
共模电感选择请收好谷景电感教你的小方法
迪兰水冷版RX 5700 XT显卡曝光 科技气息浓烈
中美电动车充电设施比较:量与质的差异
戴姆勒将投资支持自动驾驶卡车开发
温湿度传感器在博物馆温湿度监测平台中的应用
2017年小米手机出货量预计超9000万台
非洲正在成为加密货币发展的关键地区
WM8320 高集成度的电源管理解决方案