51 Mikrocontroller steuern 1602LCD zur Ausgabe von Ganzzahlen und Gleitkommazahlen

51 Mikrocontroller steuern 1602LCD zur Ausgabe von Ganzzahlen und Gleitkommazahlen

1. Übersicht

1602LCD kann nur ASCLL-Codezeichen anzeigen. Wenn wir Daten vom Typ Ganzzahl oder Gleitkommazahl eingeben und ausgeben lassen, kann das entsprechende Zeichen im ASCLL-Code nicht gefunden werden, sodass nichts ausgegeben wird.
Beispielsweise lassen wir das LCD anzeigen, dass die vom Sensor erfassten Daten vom Typ Ganzzahl oder Gleitkomma sind. Das LCD kann diese Daten nicht anzeigen. Wir müssen die Daten in Zeichen umwandeln. Das LCD sucht im Build nach dem ASCLL-Code -in CGROM, um das entsprechende Zeichen zu finden und auszugeben.

2. Konvertieren Sie ganzzahlige Daten in Zeichen

Erstellen Sie eine Funktion, um die Funktion zum Konvertieren von Ganzzahldaten in Zeichen zu kapseln. Im Folgenden finden Sie eine Einführung in die Idee der Funktionskapselung.

  • Stellen Sie zunächst fest, ob es sich bei den Daten um eine negative Zahl handelt. Wenn es sich um eine negative Zahl handelt, nehmen Sie den Absolutwert der Daten, konvertieren Sie ihn in eine positive Zahl und fügen Sie ein Symbol an der ersten Indexposition des str-Zeichenarrays hinzu, -um dies sicherzustellen Die negative Zahl ist nach Abschluss der Konvertierung immer noch eine negative Zahl.
if(ld<0){
    
    
	ld = -ld; // 如果是负数则取绝对值
	*str++ = '-'; //字符串第一位先赋值一个负符号
	len++;
	}
  • Nehmen Sie den Rest der positiven Ganzzahl, um die niedrigste Ziffer der Daten zu erhalten, und '0'wandeln Sie sie beim Spleißen in ein Zeichen vom Typ char um. Wenn beispielsweise 123 diese Anweisung ausführt, ist das niedrigste Bit 3 und wird in den Typ char konvertiert.'3'
  • Verarbeiten Sie dann das nächste Bit, ld /= 10was einer ld = ld / 10Verschiebung der Daten um ein Bit nach links und einer Reduzierung um das Zehnfache entspricht. Nachdem beispielsweise 123 ausgeführt wurde, ist der um ein Bit nach links verschobene Wert 12. Im nächsten Zyklus kann 2 genommen und in Zeichen vom Typ char umgewandelt werden. Dieser Zyklus wird fortgesetzt, bis alle Daten in Zeichen vom Typ char umgewandelt sind.
do{
    
    
	buf[i++] = ld % 10 + '0'; // 取余运算获取最后一位,拼接上'0',转为ASCLL码
	ld /= 10; // 除以10向左移动1位
}while(ld > 0);
	len += i;
  • Die obige Konvertierung ganzzahliger Daten in Zeichen beginnt beim niedrigsten Bit und erfolgt Bit für Bit, sodass die erhaltenen Daten umgekehrt sind. Beispielsweise ist 123 nach der Konvertierung 321.
  • Die Daten werden einzeln durch eine Schleife ausgelesen und dann einer char-Variablen zugewiesen, um das Umdrehen der Daten zu erreichen.
while(i-- >0){
    
    
	*str++ = buf[i];
}
integerToStr-Funktionscode
unsigned char integerToStr(long ld,unsigned char *str){
    
    
	unsigned char i;
	unsigned char len;
	unsigned char buf[11];
	if(ld<0){
    
    
		ld = -ld; // 如果是负数则取绝对值
		*str++ = '-'; //字符串第一位先赋值一个负符号
		len++;
	}
	do{
    
    
		buf[i++] = ld%10+'0'; // 取余运算获取最后一位,拼接上'0',转为ASCLL码
		ld /= 10; // 除以10向左移动1位
	}while(ld >0);
		len += i;
	while(i-- >0){
    
    
		*str++ = buf[i];
	}
	*str = '\0'; //字符串末尾加\0表示字符串的结尾
	return len;
}

Vollständiger Code
#include <STC12C2052AD.H>
#include <string.h> 
typedef unsigned char uint8;
// 定义引脚
#define	LCD1602_DB0_DB7	P1			// 定义LCD1602的数据总线
sbit LCD1602_RS = P3 ^ 2;					// 定义LCD1602的RS控制线
sbit LCD1602_RW = P3 ^ 3;					// 定义LCD1602的RW控制线
sbit LCD1602_E  = P3 ^ 4;					// 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;					// 定义LCD1602的测忙线(与LCD1602_DB0_DB7关联)


// 定义指令集
/*设置显示模式*/
#define LCD_MODE_PIN8 0x38	// 8位数据线,两行显示
#define LCD_MODE_PIN4 0x28	// 4位数据线,两个显示
#define LCD_SCREEN_CLR 0x01	// 清屏
#define LCD_CURSOR_RET 0x02	// 光标复位
#define LCD_CURSOR_RIGHT 0x06	// 光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04	// 光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移


/*光标开关控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f	// 显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0e	// 显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0c	// 显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08	// 显示关,光标关,光标不闪烁

/*光标、显示移动*/
#define LCD_CUR_MOVE_LEFT 0x10	// 光标左移
#define LCD_CUR_MOVE_RIGHT 0x14	// 光标右移
#define LCD_DIS_MOVE_LEFT 0x18	// 显示左移
#define LCD_DIS_MOVE_RIGHT 0x1c	// 显示右移


/**
LCD1602忙碌状态不会接收新指令,因此在发送新指令前先检测是否忙碌。
判断LCD1602_Busy变量的值为低电平则为不忙。
*/
void LCD1602_TestBusy(void){
    
    
	LCD1602_DB0_DB7 = 0xff;	//将数据引脚置为高电平
	LCD1602_RS = 0; // 指令状态
	LCD1602_RW = 1;	// 读状态
	LCD1602_E = 1;	// 打开LCD显示器读指令
	while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环
	LCD1602_E = 0;	// 关闭LCD显示器读指令
}


/********************************************************************************************
// 写指令程序 //
// 向LCD1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) {
    
     
	LCD1602_TestBusy();
	//输入的命令赋值给LCD1602_DB0_DB7
	LCD1602_DB0_DB7 = LCD1602_command;
	LCD1602_RS = 0;
	LCD1602_RW = 0;
	LCD1602_E = 1;
	LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCD1602写数据 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){
    
     
	LCD1602_TestBusy();
	LCD1602_DB0_DB7 = LCD1602_data;
	LCD1602_RS = 1;
	LCD1602_RW = 0;
	LCD1602_E = 1;
	LCD1602_E = 0;
}


// LCD1602初始化
void LCD1602_Init(void){
    
    
	LCD1602_WriteCMD(LCD_MODE_PIN8);	// 显示模式设置:显示2行,每个字符为5*7个像素
	LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关
	LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移
	LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}


/*
输出字符串
x:数据地址
y:输出的行位置,第一行和第二行
str:输入字符串
*/
void print(uint8 x, uint8 y, uint8 *str){
    
    
	if(0 == y){
    
    
		LCD1602_WriteCMD(0x80 | x);
	}
	else{
    
    
		// 第二行起始位置是0x40
		LCD1602_WriteCMD(0x80 | (0x40+x));
	}
	while(*str != '\0'){
    
    
		LCD1602_WriteData(*str++);
	}

}

//整数转换为ASCLL码
unsigned char integerToStr(long ld,unsigned char *str){
    
    
	unsigned char i;
	unsigned char len;
	unsigned char buf[11];
	if(ld<0){
    
    
		ld = -ld; // 如果是负数则取绝对值
		*str++ = '-'; //字符串第一位先赋值一个负符号
		len++;
	}
	do{
    
    
		buf[i++] = ld%10+'0'; // 取余运算获取最后一位,拼接上'0',转为ASCLL码
		ld /= 10; // 除以10向左移动1位
	}while(ld >0);
		len += i;
	while(i-- >0){
    
    
		*str++ = buf[i];
	}
	*str = '\0'; //字符串末尾加\0表示字符串的结尾
	return len;
}
void main(){
    
    
	long ld = 12345678;
	unsigned char i;
	unsigned char str[11];
	LCD1602_Init();
	// 整型数据转为char字符函数
	integerToStr(ld,str);
	// ld长整型转为ASCLL码存入到str数组,输出结果
	print(0,0,str);
		
	while(1){
    
    
	}
	
}

3. Konvertieren Sie eine Gleitkommazahl in ein Zeichen

Gleitkommazahlen werden in zwei Situationen unterteilt: feste und nicht feste Dezimalstellen. Beispielsweise nehmen wir für die erfasste Temperatur nur die beiden Dezimalstellen. Dies ist eine Voraussetzung für eine feste Dezimalstelle. Wenn beispielsweise die erfassten Daten mit höchster Genauigkeit erfasst werden sollen, dann wird die Anzahl der Nachkommastellen der erfassten Daten jedes Mal unterschiedlich sein. Diese beiden Szenarien müssen getrennt behandelt werden.

3.1. Die Anzahl der Dezimalstellen ist festgelegt und wird in Zeichen vom Typ char umgewandelt.

Wenn die Anzahl der Datenbits festgelegt ist, werden die Daten Bit für Bit aufgeteilt und Bit für Bit in Zeichen umgewandelt.

void main(){
    
    
	float fdata = 1.234;
	int temp;
	unsigned char str[11];
	LCD1602_Init();
	// 浮点数变为整数后必须先赋值给int类型,不能用float类型进行取模运算
	temp = fdata * 1000;
	
	str[0] = temp /1000 + '0';	// 获取千位数据,转为char型字符
	str[1] = '.';
	str[2] = temp/100 %10 + '0';	// 除以100得到12,然后取模运算获取到最低一位就是2,转为char型字符
	str[3] = temp /10 % 10 + '0';	// 除以10得到123,然后取模运算获取到最低一位就是3,转为char型字符
	str[4] = temp % 10 + '0';	// 取模运算获取到最低一位就是4,转为char型字符
	
	print(0,0,str);
		
	while(1){
    
    
	}
	
}

3.2. Die Anzahl der Dezimalstellen ist nicht festgelegt und die Umwandlung in Zeichen ist nicht festgelegt.

Zeichen werden automatisch durch die Funktionen der C-Sprache sprintfformatiert und die Genauigkeit verschiedener Ziffern kann eingestellt werden.

#include <stdio.h>

void main()
{
    
    
    float num = 1.234;
    unsigned char charbuf[10];
    // 将num格式化为char型字符,精度是小数点后3位
    sprintf(charbuf, "%0.3f",num);
    print(0,0,charbuf);
		
	while(1){
    
    
	}
}

おすすめ

転載: blog.csdn.net/m0_38039437/article/details/135017241