提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
提示:这里可以添加本文要记录的大概内容:
一直用LED和数码管显示,LED显示数据不够明显,数码管需要动态扫描,都不方便,那还有什么更方便的显示模块的。最简单的就是LCD1602。
提示:以下是本篇文章正文内容,下面案例可供参考
LCD1602是一种字符型液晶显示模块,通常由字符型液晶显示屏、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
#include <reg52.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c); //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/
void LcdInit();
unsigned int a=0;
main
void main()
{
// 初始化LCD1602
LcdInit();
LcdWriteCom(0x80);
LcdWriteData('a');
LcdWriteData('1');
LcdWriteData('2');
LcdWriteData('3');
LcdWriteData('4');
// WUZHOU 1234 第一行
// 0123456789123456 第二行
while(1)
{
a++;
if(a==10000)
{
a=0;
}
LcdWriteCom(0x80);
LcdWriteData('a');
LcdWriteData(a/1000%10+0x30); //+0x30 将数字转换成字符 acii表
LcdWriteData(a/100%10+0x30);
LcdWriteData(a/10%10+0x30);
LcdWriteData(a%10+0x30);
Lcd1602_Delay1ms(2000);
}
}
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
思考
在指定地址显示任意四位数
void lcd_4num(unsigned char dizhi,unsigned int num)
{
LcdWriteCom(dizhi);
// LcdWriteData('a');
LcdWriteData(num/1000%10+0x30); //+0x30 将数字转换成字符 acii表
LcdWriteData(num/100%10+0x30);
LcdWriteData(num/10%10+0x30);
LcdWriteData(num%10+0x30);
}
调用
lcd_4num(0xc0,a);
完整程序
#include <reg52.h>
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
/**********************************
PIN口定义
**********************************/
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;
/**********************************
函数声明
**********************************/
/*在51单片机12MHZ时钟下的延时函数*/
void Lcd1602_Delay1ms(uint c); //误差 0us
/*LCD1602写入8位命令子函数*/
void LcdWriteCom(uchar com);
/*LCD1602写入8位数据子函数*/
void LcdWriteData(uchar dat);
/*LCD1602初始化子程序*/
void LcdInit();
/*LCD1602 指定地址显示任意四位数*/
void lcd_4num(unsigned char dizhi,unsigned int num);
unsigned int a=0;
main
void main()
{
// 初始化LCD1602
LcdInit();
LcdWriteCom(0x80);
LcdWriteData('a');
LcdWriteData('1');
LcdWriteData('2');
LcdWriteData('3');
LcdWriteData('4');
// WUZHOU 1234 第一行
// 0123456789123456 第二行
while(1)
{
a++;
if(a==10000)
{
a=0;
}
// LcdWriteCom(0x80);
// LcdWriteData('a');
// LcdWriteData(a/1000%10+0x30); //+0x30 将数字转换成字符 acii表
// LcdWriteData(a/100%10+0x30);
// LcdWriteData(a/10%10+0x30);
// LcdWriteData(a%10+0x30);
lcd_4num(0xc0,a);
Lcd1602_Delay1ms(2000);
}
}
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
void lcd_4num(unsigned char dizhi,unsigned int num)
{
LcdWriteCom(dizhi);
// LcdWriteData('a');
LcdWriteData(num/1000%10+0x30); //+0x30 将数字转换成字符 acii表
LcdWriteData(num/100%10+0x30);
LcdWriteData(num/10%10+0x30);
LcdWriteData(num%10+0x30);
}
思考字符串: