1602液晶显示程序(C语言详细解说)

转载地址:http://blog.163.com/six-lhf@126/blog/static/199212322010051126667/


液晶屏显示模块与数码管相比,它显得更为专业、漂亮。液晶显示屏以其微功耗、体积小、显示内容丰富、超薄轻巧、使用方便等诸多优点,在通讯、仪器仪表、电子设备、家用电器等低功耗应用系统中得到越来越广泛的应用,使这些电子设备的人机界面变得越来越直观形象,目前已广泛应用于电子表、计算器、IC卡电话机、液晶电视机、便携式电脑、掌上型电子玩具、复印机、传真机等许多方面。1602字符型液晶模块(带背光),是目前工控系统中使用最为广泛的液晶屏之一。1602采用标准的16脚接口,其引脚功能如下:

  第1脚:VSS为电源地,接GND。
  第2脚:VDD接5V正电源。
  第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
  第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
  第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
  第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
  第7~14脚:D0~D7为8位双向数据线。
  第15脚:BLA背光电源正极(+5V)输入引脚。
  第16脚:BLK背光电源负极,接GND。
      
1602液晶模块内带标准字库,内部的字符发生存储器(CGROM)已经存储了192个5×7点阵字符,32个5×10点阵字符。另外还有字符生成RAM(CGRAM)512字节,供用户自定义字符。如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
    液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。
    C51程序如下:
[ :AT89S51 使用 12M 晶振 ]
/*==========================================================*/
#include <reg51.h>
#define LCM_Data P1
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LCM_RW P2^0; //定义引脚
sbit LCM_RS P2^1;
sbit LCM_E P2^2;

void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code csdn[] = {"csdn"};
unsigned char code net[] = {www.csdn.net};
void main(void)
{
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0, 5, csdn);
DisplayListChar(1, 0, net);
ReadDataLCM();//测试用句无意义
while(1);
}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
//读状态
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码 0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
//5ms延时
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}


  • 8
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的C语言程序,它使用单片机和1602液晶显示器来实现秒表功能。程序中使用了注释来帮助理解代码。 ```c #include <reg52.h> // 8051单片机头文件 #include <intrins.h> #define LCD_DATA P0 // 定义液晶数据口 sbit RS = P2^0; // 定义液晶命令口 sbit RW = P2^1; // 定义液晶读写控制口 sbit EN = P2^2; // 定义液晶使能口 unsigned char code table[] = { // 显示数字表格 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f }; void delayms(unsigned int xms) { // 延时函数 unsigned int i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void write_com(unsigned char com) { // 发送命令函数 LCD_DATA = com; RS = 0; // 命令模式 RW = 0; // 写操作 EN = 1; // 使能 _nop_(); // 等待 EN = 0; // 关闭使能 } void write_data(unsigned char dat) { // 发送数据函数 LCD_DATA = dat; RS = 1; // 数据模式 RW = 0; // 写操作 EN = 1; // 使能 _nop_(); // 等待 EN = 0; // 关闭使能 } void init_lcd() { // 初始化液晶函数 write_com(0x38); // 8位数据,2行显示,5x7点阵 write_com(0x0c); // 显示开,光标关,闪烁关 write_com(0x06); // 光标右移,字符不动 write_com(0x01); // 清屏 } void display(unsigned char n) { // 显示数字函数 write_data(table[n/10]); // 显示十位 write_data(table[n%10]); // 显示个位 } void main() { // 主函数 unsigned char i,j,k; init_lcd(); // 初始化液晶 while(1) { // 循环执行 for(i=0;i<60;i++) { // 秒 for(j=0;j<60;j++) { // 分 for(k=0;k<24;k++) { // 时 write_com(0x80); // 设置首行第一列 write_data(k/10); // 显示小时的十位 write_data(k%10); // 显示小时的个位 write_data(':'); // 显示冒号 write_data(j/10); // 显示分钟的十位 write_data(j%10); // 显示分钟的个位 write_data(':'); // 显示冒号 write_data(i/10); // 显示秒钟的十位 write_data(i%10); // 显示秒钟的个位 delayms(1000); // 延时1秒 } } } } } ``` 该程序的主要思路是在一个三重循环中,依次显示小时、分钟和秒钟,并通过延时函数实现1秒钟的计时。在每次循环中,首先设置液晶显示器的光标位置,然后将要显示的数字分解成十位和个位,并通过显示数字函数在液晶上显示出来。 需要注意的是,该程序中使用的是8051单片机和1602液晶显示器。如果使用其他类型的单片机和液晶显示器,需要根据具体情况进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值