[51 microordenador de un solo chip] (cuatro) herramienta de depuración LCD1602


1. Comprender LCD1602 y sus funciones de depuración

LCD1602 se refiere a esto:
Inserte la descripción de la imagen aquí
esto debe ser conectado a la placa de circuito por nosotros mismos: después de enchufarlo, el tubo digital no funcionará.
Inserte la descripción de la imagen aquí

Las funciones de depuración de uso común de las herramientas de depuración de LCD1602 son las siguientes: Inserte la descripción de la imagen aquí
Estas funciones de depuración de LCD1602 están listas para usar:
[Nota: Las siguientes funciones de depuración no las escribo yo mismo, pero son recursos compartidos en la red. Los tiempos de reimpresión son muchas veces , por lo que la fuente de reimpresión no está marcada]

(1) 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

(2) LCD1602.c:

#include <REGX52.H>

//引脚配置:
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');
	}
}


2. El método de uso del archivo de encabezado de depuración

(1) Copie los archivos .cy .h anteriores en el directorio del proyecto del programa actual, luego se puede llamar al programa.

Inserte la descripción de la imagen aquí
(2) En el compilador, haga clic con el botón derecho en Grupo de origen para agregar archivos existentes.
Inserte la descripción de la imagen aquí
El efecto final es el siguiente: Inserte la descripción de la imagen aquí
(3) Use la forma de include "name.h" para llamar al archivo de encabezado, haga clic derecho para ver las funciones debajo del archivo de encabezado.
Inserte la descripción de la imagen aquí


Tres. Programa de depuración

(1) LCD_Init (); debe usarse para la inicialización desde el principio, de lo contrario no se puede mostrar más tarde.
(2) La depuración se puede completar llamando a la función de acuerdo con el método de uso estipulado por la función.

Prueba uno:

#include<regx52.h>
#include"LCD1602.h"

void main()
{
    
    
	LCD_Init();
	LCD_ShowChar(1,1,'A');
	LCD_ShowChar(2,1,'B');
	LCD_ShowString(1,3,"LWC");
	LCD_ShowNum(1,7,8,1);
	LCD_ShowSignedNum(2,3,-11451,5);
	LCD_ShowSignedNum(2,9,4,1);
	LCD_ShowHexNum(2,12,0xA8,2);
	LCD_ShowBinNum(1,9,0xAA,8);
	while(1)
	{
    
    
	}
}

Mostrar resultados:
Inserte la descripción de la imagen aquí

Prueba dos:

#include<regx52.h>
#include"LCD1602.h"
void Delay(int x)		
{
    
    
  while(x!=0)
	{
    
    x--;}
}

int result=0;

void main()
{
    
    
	LCD_Init();
	while(1)
	{
    
    
		result++;
		Delay(50000);
		LCD_ShowNum(1,1,result,3);
	}
}

Resultado de la pantalla: a
partir de 001, incremente en 1 cada corto período de tiempo.
(001-> 002-> 003-> 004-> ……)

Supongo que te gusta

Origin blog.csdn.net/GalaxyerKw/article/details/114108032
Recomendado
Clasificación