返回

【51单片机】【STC89C52(A2版)】5-2LCD1602调试工具

发布时间:2023-01-31 13:21:20 179
# 数据

【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

【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]!='\0';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<Y;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');

}

}

【main.c】

#include

#include "LCD1602.h"

#include "Delay.h"

 

int Reasult;

void main()

{

LCD_Init();

LCD_ShowString(1,1,"time");

while(1)

{

 

 Reasult++;

 Delay(1000);

 LCD_ShowNum(1,6,Reasult,3);

 

}

}

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线