Red de conocimiento informático - Material del sitio web - ¿Cómo utilizar un teclado matricial 4*4 con 51 microcontroladores y una pantalla LCD 1602 para lograr una pantalla de cuatro dígitos (o varios dígitos)?

¿Cómo utilizar un teclado matricial 4*4 con 51 microcontroladores y una pantalla LCD 1602 para lograr una pantalla de cuatro dígitos (o varios dígitos)?

//Presione la tecla F en el teclado 4X4 para ingresar al estado de configuración

//La tecla E D es la tecla de movimiento hacia adelante y hacia atrás

// La tecla C es la clave de ajuste de valor

#include "reg52.h"

#define uchar unsigned char

sbit RW=P2^1;

sbit RS=P2 ^0;

sbit E=P2^2;

bit at=0;

código uchar shen[] ={"¡RELOJ!"};

palabra de código uchar[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20};

uchar dispbuf[8] ,h,m,s,counter;

void delay()

{

uchar i;

for(i=0 ;i<255;i++);

}

/************Escribir comando*** *******/

void lcd_wmc(uchar i)

{

P0=i;

RS=0 ;

RW=0;

E=0;

retraso();

E=1;

}

/*** ****Escribir datos************/

void lcd_wmd(uchar i)

{

P0=i;

RS=1;

RW=0;

E=0;

retardo();

E=1;

}

/************Inicializar LCD ************/

void lcd_init()

{

uchar i;

lcd_wmc (0x01);

lcd_wmc(0x38);

lcd_wmc( 0x0c);

lcd_wmc(0x06);

lcd_wmc(0xc9 );

for(i=0;i<6;i++)

lcd_wmd(shen[i]);

lcd_wmc(0xc0);

}

/*******Actualizar subprograma de buffer*******/

void newbuf()

{

dispbuf[0]=s%10;

dispbuf[1]=s/10;

dispbuf[3]=m%10;

dispbuf[4]=m/10;

dispbuf[6]=h%10;

dispbuf[7]=h/10;

}

/************mostrar subrutina **********/

void disp(uchar dispadd)

{

uchar tmp;

lcd_wmc (dispadd);

tmp=dispbuf[7];

tmp=palabra[tmp];

lcd_wmd(tmp);

tmp=dispbuf[6]

;

tmp=palabra[tmp];

lcd_wmd(tmp);

tmp=dispbuf[5];

tmp= palabra[tmp];

lcd_wmd(tmp);

tmp=dispbuf[4];

tmp=palabra[tmp];

lcd_wmd(tmp);

tmp=dispbuf[3];

tmp=word[tmp];

lcd_wmd(tmp);

tmp=dispbuf[2];

tmp=palabra[tmp];

lcd_wmd(tmp);

tmp=dispbuf[1] ;

tmp=palabra[tmp];

lcd_wmd(tmp);

tmp=dispbuf[0];

tmp= palabra[tmp];

lcd_wmd(tmp);

}

/***************** ***** ****Subrutina de teclado**********************/

uchar keypro(void)

{

uchar scanl,scanh;

P1=0x0f;//Primero baje todas las líneas de fila

if((P1&0x0f)!=0x0f ) //Si la línea de la columna cambia

{

delay();//Retraso por un período de tiempo.

if((P1&0x0f)!=0x0f)//Si la línea de la columna aún cambia en este momento, significa que efectivamente se presionó un botón

{

scanl =0xfe;

while((scanl&0x10)!=0)

{

P1=scanl; , solo cada vez Tire hacia abajo una línea

if((P1&0xf0)!=0xf0) // Si el juicio es verdadero, significa que se ha encontrado la línea donde se presionó la tecla

{

scanh=(P1&0xf0)|0x0f; //Calcular código de identificación

return (~scanh)+(~scanl);

}

else scanl=( scanl<<1)|0x01; // De lo contrario, baje la segunda, tercera y cuarta líneas en secuencia

}

}

}

}

p>

return 0;//Devuelve 0 si no se presiona ningún botón

}

/****************** **Subrutina de ajuste de tiempo********************* ***/

void ajustarime()

{

uchar k;

static uchar add;

k=keypro();

switch(k)

{

caso 0x88: if(!at){add=0xc1;EA=0; lcd_wmc(0xc1);lcd_wmc(0x0f);at=1;}

else {lcd_wmc(0xc0 );lcd_wmc(0x0c);at=0;EA=1;} descanso;

caso 0x48: if(at)

{

if(add ==0xc1){add=0xc7; lcd_wmc(add);}

else {add=add-3;lcd_wmc(add);}

}

descanso;

caso 0x28: if(at)

{

if(add==0xc7) {add=0xc1;lcd_wmc(add);}

else {add=add+3;lcd_wmc(add);}

}

descanso;

caso 0x18: if( at)

{

if(add==0xc1 ) h++;

si(h==24)

h=0 ;

si(add==0xc4) m++;

si(m==60)

m=0;

if(add==0xc7) s++;

if(s==60)

s=0;

newbuf();

disp(0xc0);

lcd_wmc(add);

}

descanso;

predeterminado: descanso;

}

if(k!=0)

{

mientras((P1&0xf0)!=0xf0)

P1=0xf0;

}

}

/************************ **Subrutina de inicialización**********************/

void init()

{

TMOD=0x01;

TH0=0x4c;

TL0=0x00;

EA=1;

ET0=1 ;

TR0=1;

contador=0;

h=12;m=0;s=0;

dispbuf [2 ]=10;

dispbuf[5]=10;

}

/************** ** ***********Programa principal************************/

void main( vacío)

{

init();

lcd_init();

mientras(1)

{

ajustar tiempo();

if(!at)

{

//Flash

si (contador <10)

{

dispbuf[2]=10;

dispbuf[5]=10;

}

más

{

dispbuf[2]=11;

dispbuf[5]=11;

}

//Actualiza el búfer de visualización y llama al programa de visualización

if(counter==0)

{

newbuf( );

disp(0xc0);

}

else if(counter==10)

disp(0xc0); /p>

}

}

}

/********************* *** ***Interrupción del temporizador 0************************/

void Time0() interrupción 1 usando 2 / /Énfasis de nuevo Cuanto más corto sea el tiempo de ejecución de la subrutina de interrupción, mejor

{

TH0=(65536-46075)/256;

TL0=( 65536-46075)%256 ;

contador++;

if(contador==20)

{

s++;

contador=0;

if(s== 60)

{

m++;

s=0;

si(m==60)

{

h++;

m=0;

si(h==24)

h=0;

}

}

}

}

Este es un programa de reloj digital que utiliza un teclado matricial para ajustar el tiempo