单片机
返回首页

51单片机基础学习(五):LCD1602调试工具

2025-09-19 来源:cnblogs

在51单片机中,LCD1602是一种常用的调试工具,可以起到以下几个作用:


        1. 显示调试信息:通过将调试信息输出到LCD1602上,可以实时显示程序的执行状态、变量的数值等信息,方便程序员进行调试和排错。


        2. 显示运行结果:在程序开发过程中,可以将一些重要的运行结果输出到LCD1602上,以便进行实时观察和验证。


        3. 监控系统状态:LCD1602可以用来显示系统的各种状态信息,例如温度、湿度、电压等,方便用户实时监控系统运行情况。


        总之,LCD1602作为调试工具在51单片机中具有显示信息、输出结果、显示用户界面和监控系统状态等多种作用,可以提高程序开发和系统调试的效率。


江协科技提供的LCD1602代码属于模块化的代码,使用者只需要知道所提供函数的作用和使用方法就可以很容易的使用LCD1602。

image.png

详解:


void main()

{

LCD_Init();                   //初始化

 

LCD_ShowChar(1,1,'A');        //1行1列 显示字符'A' 

LCD_ShowString(1,3,'HELLO');  //1行3列 显示字符串“HELLO”

 

LCD_ShowNum(1,9,123,3);       //1行9列 显示十进制数“123”    

LCD_ShowSignedNum(1,13,-66,2);//1行13列 显示有符号十进制数“-66”

LCD_ShowHexNum(2,1,33,2);     //2行1列 显示十六进制数“21” 33=16×2+1

LCD_ShowBinNum(2,4,0xAA,8);   //2行4列 显示二进制数“10101010”

while(1)                       

{

      

}

}


        函数void LCD_Show××Num(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length),其中共有“Line”、“Column”、“Number”、“Length”四个参数。    


        当LCD_Show××Num()函数的第四个参数“Length”小于“想要显示数据的位数”时,数据会从右向左依次显示,例:LCD_ShowNum(1,9,123,2),结果:1行9列 显示十进制数“23”;当参数“Length”大于“想要显示数据的位数”时,则高位补0,例:LCD_ShowNum(1,9,123,4),结果:1行9列 显示十进制数“0123”。


实例:计数


#include

#include 'LCD1602.h'

#include 'Delay.h'

 

void main()                      //计数 1秒加1

{

int sum=0;

    LCD_Init();                   //初始化

 

while(1)                       

{

sum++;                     

Delay(1000);               //Delay()函数为单位毫秒延时函数

LCD_ShowNum(1,1,sum,2);    //验证         

}

}


LCD1602.c文件:


#include

 

//引脚配置:

sbit LCD_RS=P2^6;

sbit LCD_RW=P2^5;

sbit LCD_EN=P2^7;

#define LCD_DataPort P0

 

//函数定义:

/**

  * @brief  LCD1602延时函数,12MHz调用可延时1ms

  * @param  无

  * @retval 无

  */

void LCD_Delay()

{

unsigned char i, j;

 

i = 2;

j = 239;

do

{

while (--j);

} while (--i);

}

 

/**

  * @brief  LCD1602写命令

  * @param  Command 要写入的命令

  * @retval 无

  */

void LCD_WriteCommand(unsigned char Command)

{

LCD_RS=0;

LCD_RW=0;

LCD_DataPort=Command;

LCD_EN=1;

LCD_Delay();

LCD_EN=0;

LCD_Delay();

}

 

/**

  * @brief  LCD1602写数据

  * @param  Data 要写入的数据

  * @retval 无

  */

void LCD_WriteData(unsigned char Data)

{

LCD_RS=1;

LCD_RW=0;

LCD_DataPort=Data;

LCD_EN=1;

LCD_Delay();

LCD_EN=0;

LCD_Delay();

}

 

/**

  * @brief  LCD1602设置光标位置

  * @param  Line 行位置,范围:1~2

  * @param  Column 列位置,范围:1~16

  * @retval 无

  */

void LCD_SetCursor(unsigned char Line,unsigned char Column)

{

if(Line==1)

{

LCD_WriteCommand(0x80|(Column-1));

}

else if(Line==2)

{

LCD_WriteCommand(0x80|(Column-1+0x40));

}

}

 

/**

  * @brief  LCD1602初始化函数

  * @param  无

  * @retval 无

  */

void LCD_Init()

{

LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵

LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关

LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动

LCD_WriteCommand(0x01);//光标复位,清屏

}

 

/**

  * @brief  在LCD1602指定位置上显示一个字符

  * @param  Line 行位置,范围:1~2

  * @param  Column 列位置,范围:1~16

  * @param  Char 要显示的字符

  * @retval 无

  */

void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)

{

LCD_SetCursor(Line,Column);

LCD_WriteData(Char);

}

 

/**

  * @brief  在LCD1602指定位置开始显示所给字符串

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  String 要显示的字符串

  * @retval 无

  */

void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)

{

unsigned char i;

LCD_SetCursor(Line,Column);

for(i=0;String[i]!='';i++)

{

LCD_WriteData(String[i]);

}

}

 

/**

  * @brief  返回值=X的Y次方

  */

int LCD_Pow(int X,int Y)

{

unsigned char i;

int Result=1;

for(i=0;i {

Result*=X;

}

return Result;

}

 

/**

  * @brief  在LCD1602指定位置开始显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:0~65535

  * @param  Length 要显示数字的长度,范围:1~5

  * @retval 无

  */

void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

{

unsigned char i;

LCD_SetCursor(Line,Column);

for(i=Length;i>0;i--)

{

LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');

}

}

 

/**

  * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:-32768~32767

  * @param  Length 要显示数字的长度,范围:1~5

  * @retval 无

  */

void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)

{

unsigned char i;

unsigned int Number1;

LCD_SetCursor(Line,Column);

if(Number>=0)

{

LCD_WriteData('+');

Number1=Number;

}

else

{

LCD_WriteData('-');

Number1=-Number;

}

for(i=Length;i>0;i--)

{

LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');

}

}

 

/**

  * @brief  在LCD1602指定位置开始以十六进制显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:0~0xFFFF

  * @param  Length 要显示数字的长度,范围:1~4

  * @retval 无

  */

void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

{

unsigned char i,SingleNumber;

LCD_SetCursor(Line,Column);

for(i=Length;i>0;i--)

{

SingleNumber=Number/LCD_Pow(16,i-1)%16;

if(SingleNumber<10)

{

LCD_WriteData(SingleNumber+'0');

}

else

{

LCD_WriteData(SingleNumber-10+'A');

}

}

}

 

/**

  * @brief  在LCD1602指定位置开始以二进制显示所给数字

  * @param  Line 起始行位置,范围:1~2

  * @param  Column 起始列位置,范围:1~16

  * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111

  * @param  Length 要显示数字的长度,范围:1~16

  * @retval 无

  */

void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)

{

unsigned char i;

LCD_SetCursor(Line,Column);

for(i=Length;i>0;i--)

{

LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');

}

}


LCD1602.h头文件:


#ifndef __LCD1602_H__

#define __LCD1602_H__

 

//用户调用函数:

void LCD_Init();

void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);

void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);

void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);

void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);

 

#endif


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章