Red de conocimiento informático - Espacio del host - Comprender el progreso del microcontrolador 80C51~

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;

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) {

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

}

/*== ========================================== ========= ===

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

}

}