Por favor copie y descargue la información requerida:
http://pan.baidu.com/s/1dDzimwp
Tamaño del vaso:69,5*21,8*17,8
Texto blanco sobre fondo azul
Módulo de pantalla LCD de 16 x 2 caracteres estándar (retroiluminación/pantalla azul)
1602 utiliza una interfaz estándar de 16 pines, donde:
Pin: VSS es fuente de alimentación de tierra
Pin 2: VDD conectado a fuente de alimentación positiva de 5 V
Pin 3: V0 es el terminal de ajuste de contraste de la pantalla LCD. Al conectarlo a la fuente de alimentación positiva, el contraste es bajo, y al conectarlo a la fuente de alimentación de tierra, el contraste es alto. Si el contraste es demasiado alto, se producirán imágenes fantasma. Durante el uso, el contraste se puede ajustar mediante un potenciómetro de 10 K.
Pin 4: RS es la selección del registro. Cuando el nivel es alto, se selecciona el registro de datos. Cuando el nivel es bajo, se selecciona el registro de instrucciones.
Pin 5: R/W es la línea de señal de lectura/escritura. Cuando RS y RW están en nivel bajo, se pueden escribir instrucciones o mostrar direcciones. Cuando RS está en nivel bajo y RW en nivel alto, se puede leer la señal de ocupado. Cuando RS está en nivel alto y RW en nivel bajo, se pueden escribir datos.
Pin 6: El terminal E es el terminal de habilitación. Cuando el terminal E salta de un nivel alto a uno bajo, el módulo LCD ejecuta el comando.
Pines 7 a 14: D0 a D7 son líneas de datos bidireccionales de 8 bits.
Pin 5: Alimentación positiva de la luz de fondo
Pin 6: Negativo de alimentación de luz de fondo
La memoria generadora de caracteres (CGROM) del módulo LCD 1602 almacena 160 gráficos de caracteres matriciales diferentes, como se muestra en la Tabla 1. Estos caracteres incluyen: números arábigos, letras mayúsculas y minúsculas del alfabeto inglés, símbolos comunes, kana japonés, etc. Cada carácter tiene un código fijo. Por ejemplo, el código de la letra mayúscula "A" del alfabeto inglés es 01000001B (41H). Al visualizar, el módulo muestra los gráficos de caracteres matriciales en la dirección 41H, donde se puede ver la letra "A".
El siguiente es el programa para mostrar la letra "A" en la segunda posición de carácter del módulo LCD: ORG 0000H
RS EQU P3.7; Determinar el método de conexión de hardware específico
RW EQU P3.6; Determinar el método de conexión de hardware específico
E EQU P3.5 ; Determinar el método de conexión de hardware específico
MOV P1,#00000001B ; Limpia la pantalla y reinicia el cursor
ACALL ENABLE; llamar a la subrutina de comando de escritura
MOV P1,#00111000B ; Establecer modo de visualización: matriz de puntos de 5x7, 8 bits y 2 líneas
ACALL ENABLE ;Llama a la subrutina de comando de escritura
MOV P1,#00001111B; Pantalla encendida, cursor encendido, cursor permitido para parpadear
ACALL ENABLE ;Llama a la subrutina de comando de escritura
MOV P1,#00000110B; El texto no se mueve y el cursor se mueve automáticamente hacia la derecha
ACALL ENABLE ;Llama a la subrutina de comando de escritura
MOV P1,#0C0H; Escribe la dirección de inicio de la pantalla (la posición de la segunda línea)
ACALL ENABLE ;Llama a la subrutina de comando de escritura
MOV P1, #01000001B; código para la letra A
SETB RS;RS=1
CLR RW ; RW=0 ; Prepararse para escribir datos
CLR E ; E = 0 ; Ejecutar comando de visualización
RETARDO DE LLAMADA; ¿Determinar si el módulo LCD está ocupado?
SETB E; E = 1; Visualización completada, programa detenido
AJMP $
PERMITIR:
CLR RS;Escribir subrutina de comando de control
CLR RW
CLR E
RETRASO DE LLAMADA
SETB E
RETIRADO
DEMORA:
MOV P1,#0FFH ; Subrutina para determinar si la pantalla LCD está ocupada
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7, RETARDO; si P1.7 es alto, significa ocupado, entonces espera en un bucle
RETIRADO
FIN
Al inicio del programa, se inicializa la función del módulo LCD y se acuerda el formato de visualización. Tenga en cuenta que el cursor se mueve automáticamente hacia la derecha al mostrar caracteres, sin intervención manual. Cada vez que se introduce un comando, se llama a la subrutina DELAY para determinar si el módulo LCD está ocupado, y luego se introduce la dirección de la posición de visualización 0C0H, y se introduce el código del carácter A a mostrar 41H.
Método de cableado del puerto analógico SMC1602A (16*2)
Diagrama de conexión:
---------------------------------------------------
|MCM-----51 | MCM-----51 | MCM------51 |
------------------------------------------------|
|DB0-----P1.0 | DB4-----P1.4 | RW-------P2.0 |
|DB1-----P1.1 | DB5-----P1.5 | RS-------P2.1 |
|DB2-----P1.2 | DB6-----P1.6 | E--------P2.2 |
|DB3-----P1.3 | DB7-----P1.7 | VLCD conecta una resistencia de 1K a GND |
---------------------------------------------------
[Nota: AT89S52 utiliza un oscilador de cristal de 12 M]
===============================================================*/
#define LCM_RW P2_0 //define pin
#define MCM_RS P2_1
#define MCM_E P2_2
#define MCM_Data P1
#define Busy 0x80 //Se utiliza para detectar el indicador de Ocupado en la palabra de estado LCM
#incluir
vacío WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
carácter sin signo ReadDataLCM(void);
carácter sin signo ReadStatusLCM(void);
vacío LCMInit(vacío);
void DisplayOneChar(carácter sin signo X, carácter sin signo Y, carácter sin signo DData);
void DisplayListChar(carácter sin signo X, carácter sin signo Y, código de carácter sin signo *DData);
vacío Delay5Ms(vacío);
vacío Retraso400Ms(vacío);
código de carácter sin signo uctech[] = {"uctech"};
código char sin signo net[] = {"uctech.icpcn.com"};
void principal(vacío)
{
Delay400Ms(); //Iniciar espera, esperar a que LCM entre en estado de trabajo
LCMInit(); //Inicialización de LCM
Delay5Ms(); //Retrasar por un momento (opcional)
DisplayListChar(0, 5, uctech);
DisplayListChar(0, 0, neto);
ReadDataLCM(); //La oración de prueba no tiene sentido
mientras(1);
}
//Escribir datos
void WriteDataLCM(carácter sin signo WDLCM)
{
ReadStatusLCM(); //Detección ocupada
LCM_Datos = WDLCM;
MCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //Si la velocidad del cristal es demasiado alta, puedes agregar un pequeño retraso después de esto
LCM_E = 0; //Retraso
MCM_E = 1;
}
//Escribir instrucción
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC es 0 y se ignora la detección de ocupación
{
if (BuysC) ReadStatusLCM(); //Verificar si está ocupado según sea necesario
LCM_Datos = WCLCM;
MCM_RS = 0;
LCM_RW = 0;
MCM_E = 0;
MCM_E = 0;
MCM_E = 1;
}
//Leer datos
carácter sin signo ReadDataLCM(void)
{
MCM_RS = 1;
MCM_RW = 1;
MCM_E = 0;
MCM_E = 0;
MCM_E = 1;
devolver(LCM_Data);
}
//Leer estado
carácter sin signo ReadStatusLCM(void)
{
LCM_Datos = 0xFF;
MCM_RS = 0;
MCM_RW = 1;
MCM_E = 0;
MCM_E = 0;
MCM_E = 1;
mientras (LCM_Data & Busy); //Detectar señal de ocupado
devolver(LCM_Data);
}
void LCMInit(void) //Inicialización de LCM
{
LCM_Datos = 0;
WriteCommandLCM(0x38,0); //Configuración del modo de visualización tres veces, no detecta señal de ocupado
Retraso5Ms();
WriteCommandLCM(0x38,0);
Retraso5Ms();
WriteCommandLCM(0x38,0);
Retraso5Ms();
WriteCommandLCM(0x38,1); //Configuración del modo de visualización, comience a requerir cada detección de señal de ocupado
WriteCommandLCM(0x08,1); //Apaga la pantalla
WriteCommandLCM(0x01,1); //Borrar pantalla
WriteCommandLCM(0x06,1); //Mostrar la configuración del movimiento del cursor
WriteCommandLCM(0x0C,1); //Mostrar y configurar el cursor
}
//Mostrar un carácter en la posición especificada
void DisplayOneChar(carácter sin signo X, carácter sin signo Y, carácter sin signo DData)
{
Y &= 0x1;
X &= 0xF; //Limite X para que no sea mayor que 15, Y para que no sea mayor que 1
si (Y) X |= 0x40; //Cuando se vaya a mostrar la segunda línea, el código de dirección + 0x40;
X |= 0x80; // Calcular el código de instrucción
WriteCommandLCM(X, 0); //No se detecta señal de ocupado aquí, enviar código de dirección
WriteDataLCM(DData);
}
//Mostrar una cadena de caracteres en la posición especificada
void DisplayListChar(carácter sin signo X, carácter sin signo Y, código de carácter sin signo *DData)
{
carácter sin signo ListLength;
Longitud de lista = 0;
Y &= 0x1;
X &= 0xF; //Limite X para que no sea mayor que 15, Y para que no sea mayor que 1
mientras (DData[ListLength]>0x20) // Salir si se alcanza el final de la cadena
{
si (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //Mostrar un solo carácter
LongitudDeLista++;
X++;
}
}
}
//Retraso de 5 ms
vacío Retardo5Ms(vacío)
{
entero sin signo TempCyc = 5552;
mientras(TempCyc--);
}
//Retraso de 400 ms
Retardo de vacío 400 ms (vacío)
{
carácter sin signo TempCycA = 5;
entero sin signo TempCycB;
mientras(TempCycA--)
{
TempCycB=7269;
mientras(TempCycB--);
};
¡Los procedimientos anteriores son sólo para referencia!