
Copie e baixe as informações necessárias:
http://pan.baidu.com/s/1dDzimwp







Tamanho do vidro:69,5*21,8*17,8
Texto branco sobre fundo azul
Módulo de exibição de caracteres LCD padrão 16X2 (luz de fundo/tela azul)
1602 usa uma interface padrão de 16 pinos, onde:
Pino: VSS é fonte de alimentação de aterramento
Pino 2: VDD conectado à fonte de alimentação positiva de 5V
Pino 3: V0 é o terminal de ajuste de contraste do display LCD. Quando conectado à fonte de alimentação positiva, o contraste é fraco, e quando conectado à fonte de alimentação de aterramento, o contraste é alto. Quando o contraste é muito alto, "imagens fantasmas" serão produzidas. Quando em uso, o contraste pode ser ajustado por meio de um potenciômetro de 10K
Pino 4: RS é a seleção do registro. Quando o nível é alto, o registro de dados é selecionado. Quando o nível está baixo, o registro de instrução é selecionado.
Pino 5: R/W é a linha de sinal de leitura/gravação. Quando RS e RW estão baixos, você pode escrever instruções ou exibir endereços. Quando RS está baixo e RW alto, você pode ler o sinal de ocupado. Quando RS está alto e RW está baixo, você pode gravar dados.
Pino 6: O terminal E é o terminal de habilitação. Quando o terminal E salta de um nível alto para um nível baixo, o módulo LCD executa o comando.
Pinos 7 a 14: D0 a D7 são linhas de dados bidirecionais de 8 bits.
Pino 5: Positivo de energia da luz de fundo
Pino 6: Negativo de energia da luz de fundo
A memória geradora de caracteres (CGROM) dentro do módulo LCD 1602 armazenou 160 gráficos de caracteres matriciais diferentes, conforme mostrado na Tabela 1. Esses caracteres incluem: algarismos arábicos, letras inglesas maiúsculas e minúsculas, símbolos comuns e kana japonês, etc. personagem tem um código fixo. Por exemplo, o código para a letra maiúscula "A" em inglês é 01000001B (41H). Ao exibir, o módulo exibe os gráficos de caracteres matriciais no endereço 41H, e podemos ver a letra “A”.
A seguir está o programa para exibir a letra "A" na segunda posição do caractere do módulo LCD: ORG 0000H
RS EQU P3.7; Determine o método de conexão de hardware específico
RW EQU P3.6 ; Determine o método de conexão de hardware específico
E EQU P3.5; Determine o método de conexão de hardware específico
MOV P1,#00000001B; Limpe a tela e redefina o cursor
ATIVAR A CHAMADA; chame a sub-rotina do comando de gravação
MOV P1,#00111000B; Definir modo de exibição: matriz de pontos 5x7 de 2 linhas e 8 bits
ACALL ENABLE ;Chama a sub-rotina do comando de escrita
MOV P1,#00001111B; Display ligado, cursor ligado, cursor pode piscar
ACALL ENABLE ;Chama a sub-rotina do comando de escrita
MOV P1,#00000110B; O texto não se move e o cursor se move automaticamente para a direita
ACALL ENABLE ;Chama a sub-rotina do comando de escrita
MOV P1,#0C0H; Escreva o endereço inicial da tela (a segunda posição da linha)
ACALL ENABLE ;Chama a sub-rotina do comando de escrita
MOV P1, #01000001B; código para a letra A
SETBRS;RS=1
CLR RW; WR=0 ; Prepare-se para gravar dados
CLRE; E = 0; Executar comando de exibição
ATRASO DE CHAMADA; Determinar se o módulo LCD está ocupado?
SETB E; E = 1; Display concluído, programa interrompido
AJMP $
HABILITAR:
CLR RS ;Escrever sub-rotina de comando de controle
CLR RW
CLR E
ATRASO DE CHAMADA
SETB E
RET
ATRASO:
MOV P1,#0FFH ; Subrotina para determinar se o LCD está ocupado
CLR RS
SETB RW
CLR E
NÃO
SETB E
JB P1.7, ATRASO; se P1.7 estiver alto, significa ocupado, então espere em loop
RET
FIM
No início do programa, a função do módulo LCD é inicializada e o formato de exibição é acordado. Observe que o cursor se move automaticamente para a direita ao exibir caracteres, sem intervenção manual. Cada vez que um comando é inserido, a subrotina DELAY é chamada para determinar se o módulo LCD está ocupado e, em seguida, o endereço da posição de exibição 0C0H é inserido e o código 41H do caractere A a ser exibido é inserido.
Método de fiação de porta analógica SMC1602A (16*2)
Diagrama de conexão:
-------------------------------------------------- -
|MCL-----51 | MMC-----51 | MMC------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 resistor de 1K ao GND |
-------------------------------------------------- -
[Nota: AT89S52 usa oscilador de cristal de 12M]
================================================= ===========*/
#define LCM_RW P2_0 //define o pino
#define LCM_RS P2_1
#define LCM_E P2_2
#define LCM_Data P1
#define Ocupado 0x80 //Usado para detectar o sinalizador Ocupado na palavra de status LCM
#incluir
void WriteDataLCM (caractere não assinado WDLCM);
void WriteCommandLCM(caractere não assinado WCLCM,BuysC);
caractere não assinado ReadDataLCM(void);
caractere não assinado ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(caractere não assinado X, caractere não assinado Y, caractere não assinado DData);
void DisplayListChar(char não assinado X, char não assinado Y, código de char não assinado *DData);
vazio Atraso5Ms(vazio);
Atraso vazio400Ms (vazio);
código de caractere não assinado uctech[] = {"uctech"};
código de caractere não assinado net[] = {"uctech.icpcn.com"};
vazio principal(vazio)
{
Delay400Ms(); //Iniciar espera, aguardar que o LCM entre no estado de trabalho
LCMInit(); //Inicialização do LCM
Delay5Ms(); //Atraso por um momento (opcional)
DisplayListChar(0, 5, uctech);
DisplayListChar(0, 0, líquido);
ReadDataLCM(); //A frase de teste não tem sentido
enquanto(1);
}
//Escreve dados
void WriteDataLCM (caractere não assinado WDLCM)
{
ReadStatusLCM(); //Detecção de ocupado
Dados_LCM = WDLCM;
MMC_RS = 1;
LCM_RW = 0;
LCM_E = 0; //Se a velocidade do cristal for muito alta, você pode adicionar um pequeno atraso depois disso
LCM_E = 0; //Atraso
MMC_E = 1;
}
//Escreve instrução
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC é 0 e a detecção de ocupado é ignorada
{
if (BuysC) ReadStatusLCM(); //Verifique se está ocupado conforme necessário
Dados_LCM = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
MMC_E = 0;
MMC_E = 0;
MMC_E = 1;
}
//Lê os dados
caractere não assinado ReadDataLCM (void)
{
MMC_RS = 1;
MMC_RW = 1;
MMC_E = 0;
MMC_E = 0;
MMC_E = 1;
retornar(LCM_Data);
}
//Lê o status
caractere não assinado ReadStatusLCM(void)
{
Dados_LCM = 0xFF;
LCM_RS = 0;
MMC_RW = 1;
MMC_E = 0;
MMC_E = 0;
MMC_E = 1;
while (LCM_Data & Busy); //Detectar sinal de ocupado
retornar(LCM_Data);
}
void LCMInit(void) //inicialização do LCM
{
Dados_LCM = 0;
WriteCommandLCM(0x38,0); //Configuração do modo de exibição três vezes, não detecta sinal de ocupado
Atraso5Ms();
WriteCommandLCM(0x38,0);
Atraso5Ms();
WriteCommandLCM(0x38,0);
Atraso5Ms();
WriteCommandLCM(0x38,1); //Configuração do modo de exibição, comece a exigir cada detecção de sinal ocupado
WriteCommandLCM(0x08,1); //Desliga a tela
WriteCommandLCM(0x01,1); //Limpar tela
WriteCommandLCM(0x06,1); // Exibe as configurações de movimento do cursor
WriteCommandLCM(0x0C,1); //Exibir e definir o cursor
}
//Mostra um caractere na posição especificada
void DisplayOneChar(caractere não assinado X, caractere não assinado Y, caractere não assinado DData)
{
E &= 0x1;
X &= 0xF; //Limite X para não ser maior que 15, Y para não ser maior que 1
se (Y) X |= 0x40; //Quando a segunda linha deve ser exibida, o código de endereço + 0x40;
X |= 0x80; // Calcula o código de instrução
WriteCommandLCM(X, 0); //Não detecte sinal de ocupado aqui, envie código de endereço
WriteDataLCM(DData);
}
//Exibe uma string de caracteres na posição especificada
void DisplayListChar(char não assinado X, char não assinado Y, código de char não assinado *DData)
{
unsigned char ComprimentoDaLista;
Comprimento da lista = 0;
E &= 0x1;
X &= 0xF; //Limite X para não ser maior que 15, Y para não ser maior que 1
enquanto (DData[ListLength]>0x20) // Sair se a string terminar
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //Exibe um único caractere
ComprimentoDaLista++;
X++;
}
}
}
//atraso de 5ms
Atraso vazio 5Ms (vazio)
{
int não assinado TempCyc = 5552;
enquanto(TempCyc--);
}
//atraso de 400ms
Atraso vazio400Ms (vazio)
{
char não assinado TempCycA = 5;
int não assinado TempCycB;
enquanto(TempCycA--)
{
TempCycB=7269;
enquanto(TempCycB--);
};
Os procedimentos acima são apenas para referência!!