Comprender el progreso del microcontrolador 80C51~
Pegue dos controladores LCD1602 que he usado (tanto bus como puertos IO, que definitivamente me vendrán bien)
Pegue el controlador en el bus ADC0809, pero no funciona Sé cómo mostrar los requisitos específicos del póster original en la pantalla LCD, que solo se pueden guardar en la matriz
La conexión del hardware básicamente se ha completado en el código, por lo que no debería ser necesario decirlo. más sobre el resto, ¿no? ! ^_^
****************************************** *******************************
/*========== == ================================================== == =============
KS0070(44780) Programa de demostración del controlador LCD de 16x2 caracteres modo bus Xiaoqi
======== ==================================================== ===================
Diagrama de conexión: LCM-------51 LCM-------51 LCM- - ------51
DB0-----P0.0 DB4-----P0.4 RW-------P2.0
DB1-----P0.1 DB5-----P0.5 RC-------P2.1
DB2-----P0.2 DB6--- - -P0.6 E--------P2.7 =gt;74ls00 wr rd
DB3-----P0.3 DB7-----P0.7 Conector VLCD 1K2 resistencia a GND
[Nota]: La frecuencia del oscilador de cristal del AT89C51 es 12MHz
====================== = =================================================== = ====*/
//#pragma src // Generar archivo de ensamblaje
#include lt;reg51.hgt;
#includelt;intrins hgt;
//========== Definición macro de identificación de tipo variable, a todos les gusta hacer esto==============
#define Uchar unsigned char
#define Uint unsigned int
// ================== Puerto LCM1602A definición de dirección =======================
char xdata Lcd1602CmdPort _at_ 0x7cff //E=1 RS=0 RW=0<; /p >
char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
char xdata Lcd1602StatusPort _at_ 0x7dff //CS=1 RS=0 RW=1
#define Busy 0x80 // Bit de identificación de ocupado
ejemplo de código de caracteres
l[]="Por ejemplo. - Por xiaoqi\n";
void Delay400Ms(void);
void Delay5Ms(void);
void LcdWriteData( char dataW );
void LcdWriteCommand( Uchar CMD, Uchar AttribC
void LcdReset( void
void Display( Uchar dd );
void DispOneChar(Uchar x, Uchar y, Uchar Wdata
void ePutstr(Uchar x, Uchar y, código Uchar *ptr); /================ Simplemente escribe algunas oraciones para probar el programa principal=================
void main( void)
{
Uchar temp;
Delay400Ms(); // El retraso necesario en el inicio, esperando que lcm entre en estado de funcionamiento
LcdReset(); // Esto también es necesario....Inicialización
temp = 32
ePutstr(0, 0, ejemplol); / La línea anterior muestra una cadena predeterminada
Delay400Ms(); // Conserva el contenido mostrado
Delay400Ms()
Delay400Ms(); >
Retraso400Ms( );
Retraso400Ms();
Retraso400Ms();
Retraso400Ms(); );
while(1)
{
temp amp; = 0x7f // Solo muestra caracteres ASCII
if (templt; ; 32)temp=32 ; // Protege los caracteres de control y no los muestra
Display( temp
Delay400Ms(); p>
}
/*==================================== ========= =============
Mostrar cadena
============ ======== ====================================*/
void ePutstr(Uchar x, Uchar y, código Uchar *ptr) {
Uchar i, l=0;
while (ptr[l] gt; 31){l ;};
for (i=0;ilt;l;i) {
DispOneChar(x,y,ptr[i]);
si (x == 16){
x = 0; y ^= 1
}
}
}
/*== =======================
==============================
Demuestra una línea de cuerdas continuas y coopera con la parte superior. programa de nivel para demostrar cuerdas en movimiento
====================================== ======= ============*/
Pantalla vacía( Uchar dd ) {
Uchar i;
for (i=0 ; ilt; 16; i ) {
DispOneChar(i, 1, dd);
dd amp = 0x7f; > si (ddlt; 32) dd=32;
}
}
/*=============== ======= ==================================
Mostrar cursor posicionamiento
=========================================== ======== ======*/
void LocateXY(char posx, char posy) {
Uchar temp;
temp = posx amp; 0xf;
posy amp;= 0x1;
if ( posy )temp |= 0x40;
temp |= 0x80; p>
LcdWriteCommand(temp , 0);
}
/*====================== =========== ==========================
Mostrar y contar un carácter a la vez la posición especificada
== ======================================= ============ ===*/
void DispOneChar(Uchar x, Uchar y, Uchar Wdata) {
LocateXY( x, y) ; // Dirección de visualización de posición
LcdWriteData( Wdata ); // Escribir caracteres
}
/*=========== ============= =================================
El proceso de inicialización debe seguir el proceso de inicialización introducido en la información del producto.Continuar
=========================. =================== =============*/
void LcdReset( void ) {
LcdWriteCommand(0x38, 0); // Configuración del modo de visualización (no se detecta señal de ocupado)
Delay5Ms();
LcdWriteCommand(0x38, 0); **tres veces
Delay5Ms();
LcdWriteCommand(0x38, 0);
Delay5Ms();
LcdWriteCommand(0x38 , 1); // Configuración del modo de visualización (la señal de ocupado se detectará en el futuro)
LcdWrite
Command(0x08, 1); //Mostrar apagado
LcdWriteCommand(0x01, 1); //Mostrar pantalla clara
LcdWriteCommand(0x06, 1); //Mostrar configuración de movimiento del cursor
LcdWriteCommand(0x0c, 1); //Configuración de pantalla y cursor
}
/*============ = ==========================================
Escribir subrutina de carácter de control: E=1 RS=0 RW=0
============================= == =========================*/
void LcdWriteCommand( Uchar CMD, Uchar AttribC ) {
if (AttribC) while( Lcd1602StatusPort amp; Busy ); // ¿Detecta señal de ocupado?
Lcd1602CmdPort = CMD
}
/*= == ================================================= == ==
Subrutina para escribir caracteres en la posición actual: E =1 RS=1 RW=0
================= =======================================*/
void LcdWriteData ( char dataW ) {
while( Lcd1602StatusPort amp; Busy ); // Detecta señal de ocupado
Lcd1602WdataPort = dataW
}
//Retraso corto
void Delay5Ms(void)
{
Uint i = 5552;
while(i-- ) ;
}
//Retraso largo
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
mientras(j--);
};
}
****************** ************************************************** * ***
/*====================================== === =============================
KS0070(44780) Programa de demostración del controlador LCD de 16x2 caracteres Xiaoqi
============================================ === =========================
Diagrama de conexión: LCM-------51 LCM-- -- ---51 LCM--------51
> DB0-----P0.0 DB4-----P0.4 RS-------P2.5
DB1-----P0.1 DB5--- --P0.5 RW-------P2.6
DB2-----P0.2 DB6-----P0.6 E-------- P2.7
DB3-----P0.3 DB7-----P0.7 VLCD conecta la resistencia 1K2 a GND
[Nota]: La frecuencia del oscilador de cristal de AT89C51 es 12MHz
========================================= == ==========================*/
#include lt;reg51.hgt;
#includelt;intrins.hgt;
//Definición macro de identificación de tipo variable, a todos les gusta hacer esto
#define Uchar unsigned char
# define Uint unsigned int
//Definición del pin de control, la parte que debe modificarse para diferentes conexiones
sbit RS = P2^5;
sbit RW = P2^6 ;
sbit Elcm = P2^7;
#define DataPort P0 // Puerto de datos, debe activar la resistencia
#define Busy 0x80
código char ejemplo[]="Para un ejemplo. - Por xiaoqi\n";
void Delay400Ms(void);
void Delay5Ms(void) ;
void WaitForEnable( void );
void LcdWriteData( char dataW
void LcdWriteCommand( Uchar CMD, Uchar AttribC ); p>void LcdReset (void);
void Display( Uchar dd);
void DispOneChar(Uchar x, Uchar y, Uchar Wdata);
void ePutstr(Uchar x , Uchar y, código Uchar *ptr);
//Probar programa principal
void main(void)
{
Uchar temp;
Delay400Ms();
LcdReset()
temp = 32
ePutstr(0, 0, ejemplo) ; // La línea anterior muestra una cadena programada
Delay400Ms();
Delay400Ms()
Delay400Ms(); >
Retraso400Ms();
Retraso400Ms();
Retraso400Ms();
Retraso400Ms();
Retraso400Ms( );
p>
while(1)
{
temp amp; = 0x7f; // Solo muestra caracteres ASCII
if (templt; 32)temp=32 ; // Proteger los caracteres de control y no mostrarlos
Display( temp
Delay400Ms()
}
}
/*========================================== === =============
Mostrar cadena
=================== == ===================================*/
void ePutstr(Uchar x, Uchar y, código Uchar *ptr) {
Uchar i, l=0;
while (ptr[l] gt; 31){l;};
for (i=0;ilt;l;i) {
DispOneChar(x,y,ptr[i]);
if (x == 16) {
x = 0; y ^= 1
}
}
}
/* == ================================================== == ===
Demuestre una línea de cadenas continuas y coopere con el programa anfitrión para demostrar cadenas en movimiento
=============== ======== ====================================*/
void Display( Uchar dd ) {
Uchar i;
for (i=0; ilt; 16; i) {
DispOneChar(i, 1, dd);
dd amp;= 0x7f;
if (ddlt;32) dd=32;
}
}
/*========================================= ======== =======
Mostrar posición del cursor
=================== ========== =============================*/
void LocateXY (char posx, char posy) { p>
Uchar temp;
temp = posx amp 0xf;
posy amp;= 0x1;
if ( posy )temp |= 0x40 ;
temp |= 0x80;
LcdWriteCommand(temp, 0);
}
/*====== ========================================= =========
Muestra y cuenta un carácter en la posición especificada
=================== ============== ===========================*/
void DispOneChar(Uchar x, Uchar y, Uchar Wdata) {
LocateXY( x, y ); // Localizar la dirección de visualización
LcdWriteData( Wdata ); Personajes
}
/*================================= =======================
El procedimiento de inicialización debe realizarse según el proceso de inicialización introducido en la información del producto
= ============================================== ===== ====*/
void LcdReset( void ) {
LcdWriteCommand(0x38, 0); // Configuración del modo de visualización (no detecta señal de ocupado)
Delay5Ms();
LcdWriteCommand(0x38, 0); // ***tres veces
Delay5Ms();
LcdWriteCommand(0x38, 0);
Delay5Ms();
LcdWriteCommand( 0x38, 1); // Configuración del modo de visualización (la señal de ocupado se detectará en el futuro)
LcdWriteCommand( 0x08, 1) ; //Mostrar apagado
LcdWriteCommand(0x01, 1); //Mostrar pantalla clara
LcdWriteCommand(0x06, 1); Mostrar configuración de movimiento del cursor
LcdWriteCommand(0x0c, 1 //Configuración de pantalla y cursor
}
/*========= ========= ======================================
Escribir subrutina de carácter de control: E=1 RS=0 RW=0
=========================== ========== =====================*/
void LcdWriteCommand( Uchar CMD, Uchar AttribC ) {
if (AttribC ) WaitForEnable(); // ¿Detecta señal de ocupado?
RS = 0; _nop_(); ; _nop_(); // Enviar palabra de control Subrutina
Elcm = 1; _nop_(); Elcm = 0 // Activar operación señal de pulso
} p>
/*== ========================================== ========= ===
Subrutina para escribir caracteres en la posición actual: E =1 RS=1 RW=0
====== ============ ======================================== */
void LcdWriteData( char dataW ) {
EsperarF
orEnable(); // Detecta señal de ocupado
RS = 1; RW = 0;
DataPort = _nop_(); Elcm = 1; _nop_(); _nop_(); Elcm = 0; // Señal de pulso de habilitación de operación
}
/*=========== =============================================
El estado del controlador LCD debe detectarse antes de las operaciones normales de lectura y escritura: CS=1 RS=0 RW=1
DB7: 0 controlador LCD inactivo 1 controlador LCD ocupado
= = ================================================== = ====*/
void WaitForEnable( void ) {
DataPort = 0xff;
RS =0 _nop_(); = 1; _nop_(); _nop_();
mientras( Puerto de datos y ocupado
Elcm = 0
}
//Retraso corto
void Delay5Ms(void)
{
Uint i = 5552;
while(i -- );
}
//Retraso largo
void Delay400Ms(void)
{
Uchar i = 5;
Uint j;
while(i--)
{
j=7269;
p>
mientras(j--);
};
}
************ ** ************************************************* *** *****
#includelt;REG51.Hgt;
#includelt;ABSACC.Hgt
#define uchar unsigned char
p>
//Número de canal, modificado según el hardware real
#define IN0 XBYTE[0X0000] //Canal 0
#define IN1 XBYTE[0X0001]
#define IN2 XBYTE[0X0002]
#define IN3 XBYTE[0X0003]
#define IN4 XBYTE[0X0004]
#define IN5 XBYTE [0X0005]
#define IN6 XBYTE[0X0006]
#define IN7 XBYTE[0X0007]
sbit ad_busy=P3^5
void AD0809 (uchar idata *x);
//Después de llamar a este programa, la cantidad analógica debe convertirse en una cantidad digital y almacenarse en una matriz adcRes[]
>void AD0809(uchar idata *adcRes)
{
uchar i
datos uchar xdata *ad_adr
ad_adr=amp; ; IN0; // Apunta al primer canal
for(i=0; ilt; 8; i ) {
*ad_adr=0; >
ad_busy=0; //Después de la depuración, se encontró que 0 es correcto
while(ad_busy==0); //Espera a que se complete la conversión de AD
adcRes[i] =*ad_adr; //Guardar el resultado de la conversión
ad_adr; //Siguiente canal
}
}