历史上的今天
今天是:2025年04月15日(星期二)
2021年04月15日 | 通用型51单片机lcd1602驱动
2021-04-15 来源:eefocus
文件:lcd_1602.h
#ifndef _LCD1602_TRAVELER_H_
#define _LCD1602_TRAVELER_H_
/*************************待配置项*******************************/
#define DATA_LCD P0 //液晶与MCU 数据口
sbit RS_LCD = P2^5; // 液晶的RS、RW、E 端在 MCU端的连线
sbit RW_LCD = P2^6;
sbit E_LCD = P2^7;
/****************************************************************/
void lcdInit(void);
//lcdInit() 液晶初始化、所有对液晶的操作之前均需要调用此函数
void lcdDelayMs(const unsigned char ms);
// lcdDelayMs(ms) 液晶内部使用的毫秒级延时函数 如不需要请自行删除
// 该驱动函数须在不超过12MHz的晶振频率下才能正常工作
void lcdDelayUs(const unsigned char us);
// lcdDelayMs(ms) 液晶内部使用的微秒级延时函数 如不需要请自行删除
// 该驱动函数须在不超过12MHz的晶振频率下才能正常工作
void lcdWriteCmd(const unsigned char cmd);
// lcdWriteCmd(cmd) 向液晶写命令字函数
void lcdWriteChar(const unsigned char chr);
// lcdWriteChar(chr) 向液晶写字符函数
void lcdWriteData(const unsigned char pos,const unsigned char dat);
//lcdWriteData(pos,dat)向液晶板上指定位置写字符函数
void lcdWriteString(const unsigned char line,unsigned char *str,const unsigned char offset);
//lcdWriteString(line,*str,offset) 向液晶面板指定行、写字符串 可指定首字符偏移量 所显示的区域限制在当前行内
bit lcdReadBusy();
//读lcd的忙标志 忙 返回1 不忙 返回0
void lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset);
//lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset)写无符号整形数 到lcd (占位 5 字符)
//line 指明所在行、c要写的数据、offset 距首列偏移量
#endif
——————————————————
文件:lcd_1602.c
#include
#include "lcd_1602.h"
/*************************************************************************/
/***********************12MHz晶振下微秒级延时*****************************/
void lcdDelayUs(const unsigned char us){
unsigned char cin = us>>1; //prepare for clause while calculating time
cin++;
while(--cin);// 'dec cin' and 'jnz cin' 2 circles
}
/*************************************************************************/
/***********************12MHz晶振下毫秒级延时*****************************/
void lcdDelayMs(const unsigned char ms){
unsigned char cin = ms+1;
while(--cin){
lcdDelayUs(250);
lcdDelayUs(250);
lcdDelayUs(250);
lcdDelayUs(250);
}
}
/*************************************************************************/
/**************************写命令字***************************************/
void lcdWriteCmd(const unsigned char cmd){
while(lcdReadBusy());
E_LCD = 0;
RS_LCD = 0;
RW_LCD = 0;
DATA_LCD = cmd;
lcdDelayUs(40);
E_LCD = 1;
lcdDelayUs(250);
E_LCD = 0;
lcdDelayUs(250);
}
/*************************************************************************/
/************************写字符********************************************/
void lcdWriteChar(const unsigned char chr){
while(lcdReadBusy());
E_LCD = 0;
RS_LCD = 1;
RW_LCD = 0 ;
DATA_LCD = chr;
lcdDelayUs(40);
E_LCD = 1;
lcdDelayUs(250);
E_LCD = 0;
lcdDelayUs(250);
}
/*************************************************************************/
/*******************向指定位置写字符**************************************/
void lcdWriteData(const unsigned char pos,const unsigned char dat){
unsigned char p;
if(pos>=16) p = 0xb0 + pos ;
else p = 0x80 + pos ;
lcdWriteCmd(p);
lcdWriteChar(dat);
}
/*************************************************************************/
/**************************写字符串***************************************/
void lcdWriteString(const unsigned char line,unsigned char *str,const unsigned char offset){
unsigned char p;
unsigned char curlineend = (line)?32:16; //每次写字符串最多允许写完单行,不允许跨行写
unsigned char i=0;
if(line) p = 16;else p = 0;
p = p + offset;
while(p!=curlineend){
if(!str[i])break;//如果到字符尾则退出
lcdWriteData(p++,str[i++]);
}
}
/*************************************************************************/
/************************初始化液晶***************************************/
void lcdInit(void){
lcdDelayMs(15);
lcdWriteCmd(0x38);
lcdWriteCmd(0x38);
lcdWriteCmd(0x38);
lcdWriteCmd(0x06);
lcdWriteCmd(0x0c);
lcdWriteCmd(0x01);
lcdWriteData(1,' ');//此为驱动的bug,未消除bug之前请勿删除此行及下行两行
lcdWriteCmd(0x0c);
}
/*************************************************************************/
bit lcdReadBusy(){
bit i = 1;
E_LCD = 0;
RS_LCD = 0;
RW_LCD = 1;
E_LCD = 1;
i = DATA_LCD & 0x80;
return i;
}
//lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset)写无符号整形数 到lcd (占位 5 字符)
//line 指明所在行、c要写的数据、offset 距首列偏移量
void lcdWriteUint(unsigned char line,unsigned int c,unsigned char offset){
unsigned char i,j;
unsigned char arrTmp[6] = {" "};
j = 0;
do{
i = c % 10;
arrTmp[4 - j] = i + '0';
j ++ ;
c /= 10;
}while(c);
lcdWriteString(line,arrTmp,offset);
}
下一篇:单片机软件抗干扰的几种常见方法
史海拾趣
|
作为局域网的主要连接设备,以太网交换机成为应用普及最快的网络设备之一,同时,也是随着这种快速的发展,交换机的功能不断增强,随之而来则是交换机端口的更新换代以及各种特殊设备连接端口不断的添加到交换机上,这也使得交换机的接口类型变得非 ...… 查看全部问答> |
|
客户包括微软、苹果及百事可乐等业界巨头的顶尖创意管理公司IDEO的执行长兼总裁布朗(Tim Brown)把问题看得比答案更重要。 他回忆自己的第一份专业设计工作是在英格兰北部的一家小公司,那是一家从工业大革命时期开始营运,生产木工机械的老公司 ...… 查看全部问答> |
|
我用Tornado2.2(vxworks5.5),在虚拟机上建立文件系统FAT16格式,通过ftp从windows向目标机vxworks传递应用模块api.o,文件 可以用ls查看到,在目标机sell上运行ld(1,0,\"C:/api.o\"),报错\"error loading,errno=0x3d0001\".该文件在Tornado用target se ...… 查看全部问答> |
|
公司要做个项目,现在在确定平台,是使用windows mobile还是wince,主要是从研发周期和成本方面考虑,恳请大家给点建议。 目前只知道用mobile需要微软评估,另外开发工具费用、授权费用都很贵,但具体成本是多少没有概念;而用wince相对便宜些,网 ...… 查看全部问答> |
|
最近开始学习STM32,手头也有块板。 昨天晚上跑了下demo测试程序,用的是IAR4.42编译软件(第一次用IAR,不熟悉)。 现在问题是:跑原demo程序....debug....没问题; 但是在原demo上修改下程序后:rebuild all 没反应。 今天在 ...… 查看全部问答> |




