51 Mikrocontroller steuert das 1602LCD-Display zur Ausgabe von zwei Textzeilen und einer

51 Mikrocontroller steuert das 1602LCD-Display zur Ausgabe von zwei Textzeilen und einer

1. Übersicht

In diesem Artikel werden die Grundkenntnisse des Bildschirms des Modells 1602 und die Verwendung eines Mikrocontrollers zur Steuerung zur Ausgabe von zwei Inhaltszeilen vorgestellt.

2.1602 Grundkenntnisse

Das 1602-LCD-Modul ist ein allgemeines industrielles LCD-Modul, ein Punktmatrix-LCD-Modul, das speziell zur Anzeige von Buchstaben, Zahlen, Symbolen usw. verwendet wird. Wie aus dem Namen hervorgeht, verfügt das LCD-Anzeigemodul über 2 Zeilen, jede Zeile hat 16 Zeichen und kann insgesamt 32 Zeichen anzeigen. Jedes Zeichen besteht aus 5x7 oder 5x11 Punktmatrixbits. Was wir hier erklären, ist das 5x7-Modusmodul.

1602 Pin-Beschreibung

Fügen Sie hier eine Bildbeschreibung ein

1602-Adresszuordnung

Es gibt 80 Bytes im RAM-Speicher des 1602, wobei die erste Zeile bei 0x00 und die zweite Zeile bei 0x40 beginnt
Fügen Sie hier eine Bildbeschreibung ein

1602 interner Initialisierungsbefehl

Bevor Sie 1602 steuern, initialisieren Sie es mithilfe der integrierten Anweisungen. Die integrierten Anweisungen lauten wie folgt.

// 定义指令集
/*设置显示模式*/
#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	// 显示右移
1602 Zeitmessung

Die 1602-Steuerung kann in zwei Kategorien zusammengefasst werden: Lesen und Schreiben. Diese beiden Vorgänge sind untrennbar mit dem Zeitdiagramm verbunden. Sie stellen den Kern der Steuerung von 1602 dar. Wenn Sie das Zeitdiagramm verstehen, können Sie die 1602-Ausgabe definierter Zeichen durch Code steuern.

Interpretation des Lesezeitdiagramms:
Ziehen Sie R/W hoch, um in den Lesebetriebsmodus zu gelangen. Gleichzeitig ist RS entweder ein hoher Pegel oder ein niedriger Pegel. Wenn es sich auf einem hohen Pegel befindet, handelt es sich um einen Lesedatenvorgang, und wenn es sich auf einem niedrigen Pegel befindet Es handelt sich um eine Lesezustandsoperation. Nach der Zeit tSP1 kann das Freigabesignal E hochgezogen werden, und die Hochpegel-Aufrechterhaltungszeit von E beträgt tPW. Nachdem das Freigabesignal E hochgezogen wurde, dauert es nicht länger als tD, der 1602 Das LCD zeigt Daten auf den Datenleitungen DB0–DB7 an. Zu diesem Zeitpunkt lesen wir die Daten und ziehen die Freigabe E auf Low, und das Lesen der gesamten Daten oder des Status ist abgeschlossen.

Fügen Sie hier eine Bildbeschreibung ein

Interpretation des Schreib-Timing-Diagramms Das
Timing des Schreibvorgangs ist grundsätzlich das gleiche wie das des Lesevorgangs. Der einzige Unterschied besteht darin, dass der tSP2-Mikrocontroller die zu schreibenden Daten an den Datenport senden muss, bevor das Freigabesignal E auf High gesetzt wird. Wenn RS=1, bedeutet dies, dass Daten auf 1602 geschrieben werden; wenn RS=0, bedeutet dies, dass Anweisungen auf 1602 geschrieben werden.
Fügen Sie hier eine Bildbeschreibung ein
Ausführungszeit jeder Phase im Sequenzdiagramm
Fügen Sie hier eine Bildbeschreibung ein

Schaltplan des Mikrocontrollers und des 1602-Schaltkreises

Fügen Sie hier eine Bildbeschreibung ein

3. Der Mikrocontroller steuert den Ausgabeinhalt von 1602

Im Folgenden wird der Mikrocontroller zur Steuerung von 1602 verwendet, um zwei Zeilen Zeichencode auszugeben. Dieser Code ist das Mindestprogramm zur Steuerung von 1602 und kann in die folgenden Teile unterteilt werden:

  • Pin-Funktion definieren
    • Definieren Sie die Funktion des Mikrocontroller-Pins, der mit dem 1602-Pin verbunden ist
  • Befehlssatz definieren
    • Mehrere notwendige Betriebsanweisungen sind im 1602-Chip verankert. Verwenden Sie diese Befehle, um den 1602 zu initialisieren.
  • Erstellen Sie eine Funktion zur Lesebesetzterkennung
    • 1602 kann erst nach Abschluss jedes Vorgangs neue Befehle empfangen. Überprüfen Sie daher, ob 1602 beschäftigt ist, bevor Sie den Befehl senden.
  • Erstellen Sie eine Schreibbefehlsfunktion
    • Empfangen Sie den 1602-Initialisierungsbefehl und die Adresse der Ausgabedaten.
  • Erstellen Sie eine Funktion zum Schreiben von Daten
    • Empfangen Sie Mikrocontroller-Zeichen und geben Sie sie dann zur Anzeige an 1602 aus
  • Erstellen Sie die Initialisierungsfunktion 1602
    • Stellen Sie durch Initialisierung den Standardarbeitsmodus 1602 ein
  • Erstellen Sie eine Ausgabezeichenfunktion
    • Rufen Sie die Schreibbefehlsfunktion auf, um die Adresse der Datenanzeige zu erhalten, und rufen Sie die Schreibdatenfunktion auf, um die Daten an der durch 1602 angegebenen Stelle anzuzeigen
  • Hauptfunktion erstellen
#include <STC12C2052AD.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++);
	}

}



void main(){
    
    
	unsigned char str[] = "Hello LCD 1602";
	unsigned char str1[] = "Beyound Self";
	LCD1602_Init();
	print(0x00,0,str);
	print(0x00,1,str1);
	while(1);
	
}

Supongo que te gusta

Origin blog.csdn.net/m0_38039437/article/details/134976934
Recomendado
Clasificación