Transcript
/********************************************/
/* ANDR LUIZ ZIMMERMANN NUSP:5437692 */
/* JULIANA COSTA DE OLIVEIRA NUSP:5432220 */
/* */
/* TURMA:04 PROF:JUN OKAMOTO */
/* DATA: 26/04/07 */
/********************************************/
"#include ""\mc85\8085io.h
#include ""\mc85\8085int.h"
"#define ADD 0xe // base dos endere os usados do display ""ADDress
#define BUSY 1 // constante que indica que o display est ocupado
#define CLEAN 0x01 // comando que limpa a mem ria e o contador do display
#define CONFIG 0x3c // comando de configura o do modo do display
#define FLAG 0x80 // m scara usada na consulta do flag de busy
#define FORWARD 0x01 // tecla 0 - incremnto da vari vel que armazena o caracter
#define KEYS 0xe8 // constante que armazena o endere o das chaves
#define LIMIT 100 // limite de contagem da fun o STOP na fun o INITLCD
#define LIMITTWO 2000 // limite de contagem da fun o STOP
#define LINEONE 0x80 // endere o da primeira linha do display
#define LINETWO 0xc0 // endere o da segunda linha do display
#define LSBT0 0x64 // programa o byte menos significativo de contagem do timer 0
#define LSBT1 0x00 // programa o byte menos significativo de contagem do timer 1
#define MSBT0 0x00 // programa o byte mais significativo de contagem do timer 0
#define MSBT1 0x0c // programa o byte mais significativo de contagem do timer 1
#define NULL -1 // indica n o recebimento de caracter pelo canal serial
#define OFF 0x08 // comando para desligar o programa
#define ONDISP 0x0f // comando para ligar o display
#define ONE 0x01 // constante de valor um
#define REWARD 0x02 // tecla 1 - decremento da vari vel que armazena o caracter
#define SEND 0x04 // tecla 2 - envio de caracter pelo canal serial
#define TEN 0x10 // constante de valor dez
#define TWO 0x02 // constante de valor dois
#define ZERO 0x00 // constante de valor zero
/**************************************/
/* Fun o STOP: pausa temporariamente */
/* a execu o de comandos inserindo */
/* um loop vazio no programa. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/**************************************/
void stop (int limit){
int i;
for(i=ZERO;i<=limit;i++);
}
/******************************************/
/* Fun o GETSTATUS: verifica o status do */
/* flag de busy do display, retornando */
/* 1 se ele est ocupado e 0 se est livre*/
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/******************************************/
int getStatusLCD (int e){
int flag;
flag=in(e*TEN+ONE); //a vari vel ""flag"" recebe a leitura do endere o n1h
if((flag&FLAG)==ZERO) // condicional usando a m scara para o flag
flag=ZERO;
else
flag=BUSY;
return (flag);
}
/**************************************/
/* Fun o WAIT: pausa temporariamente */
/* a execu o de comandos inserindo */
/* um loop que cessa apenas quando o */
/* display est desocupado (flag=0). */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/**************************************/
void wait (){
int flag;
flag=getStatusLCD(ADD);
while(flag!=ZERO)
flag=getStatusLCD (ADD);
}
/****************************************************************/
/* Fun o INITLCD: inicializa o display limpando a mem ria e */
/* o contador interno, configurando-o para opera o com 8 bits, */
/* 2 linhas, matriz 5x10 al m de configurar o contador para */
/* incrementar a cada passagem e por fim aciona o display. */
/* aqui a fun o STOP usada em alternativa fun o WAIT, */
/* uma vez que at este ponto o flag de busy do display pode */
/* n o funcionar corretamente. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/****************************************************************/
void initLCD (int e){
int address;
address=TEN*e; // composi o interna do endere o de sa da
stop(LIMIT); // comandos de configura o do display
out(address,CONFIG);
stop(LIMIT);
out(address,CLEAN);
stop(LIMIT);
out(address,IMPROVE);
stop(LIMIT);
out(address,ONDISP);
stop(LIMIT);
}
/***********************************************/
/* Fun o SETCURSOR: recebe a base de endere o */
/* do display, as coordenadas de onde o cursor */
/* dever ser colocado e posiciona o cursor */
/* nestas coordenadas. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/***********************************************/
void setCursorLCD (int e, int l, int c){
int cursor;
if(l==ONE) // posiciona o cursor na linha um se l==1
cursor=LINEONE+c-ONE;
else // posiciona o cursor na linha dois se l==2
cursor=LINETWO+c-ONE;
if(getStatusLCD(e)==BUSY) // verifica se o display est livre
wait();
out(e*TEN, cursor);
}
/***********************************************/
/* Fun o PUTCHRLCD: recebe a base de endere o */
/* do display, um caracter ""c"" e o coloca na */
/* posi o atual do display. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/***********************************************/
void putChrLCD (int e, char c){
if(getStatusLCD(e)==BUSY) // verifica se o display est livre
wait();
out(TEN*e+TWO,c); // coloca o caracter no display
}
/***********************************************************/
/* Fun o PUTSTRLCD: recebe a base de endere o do display, */
/* um vetor ""s"" e o coloca no display chamando */
/* sucessivamente a fun o PUTCHRLCD. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/***********************************************************/
void putStrLCD (int e, char *s){
int i;
for(i=ZERO; s[i]!=ZERO; i++){
putChrLCD(e, s[i]);
}
}
/***************************************************************/
/* Fun o MAIN: esta fun o envia e recebe caracteres ASCII */
/* atrav s do canal serial e apresenta os mesmos no display */
/* de LCD. */
/* */
/*AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:26/04/2007 */
/***************************************************************/
main(){
int keys;//vari vel de leitura de chaves
char atual;//vari vel que armazena o caracter que ser enviado
int cursor1;//vari vel para posicionamento do cursor(1a. linha)
int cursor2;//vari vel para posicionamento do cursor(2a. linha)
int received;//vari vel que armazena caracter recebido pelo canal serial
//inicializa o das vari veis
keys=ZERO;
atual='0';//inicializa o: caracter a ser vizualizado no display
cursor1=ONE;
cursor2=ONE;
initLCD(ADD);//configurando o display de LCD
setCursorLCD(ADD, TWO, ONE);//posicionamento do cursor de LCD
putChrLCD(ADD,atual);// apresentado o caracter armazenado em ""atual"" no display
setCursorLCD(ADD, TWO, ONE);/* reposicionamento do cursor na posi o anterior - esta estrutura
intercalada da fun o putChrLCD com a setCursorLCD ser adota para que o cursor seja incrementado
apenas quando o caracter vizualizado no display for realmente enviado*/
while(keys!=OFF){// loop externo que mant m o programa rodando at que a tecla 7 seja pressionada
keys=in(KEYS);// leitura das chaves
stop(LIMITTWO);//tratamento do debounce
/* bloco respons vel pelo incremento da vari vel que armazena os caracteres
a serem visualizados no display*/
if(keys==FORWARD){
if((atual!='9')&&(atual!='Z'))
atual=(atual+ONE);
if(atual=='9')
atual='A';
if(atual=='Z')
atual='0';
setCursorLCD(ADD, TWO, cursor2);
putChrLCD(ADD,atual);
setCursorLCD(ADD, TWO, cursor2);
}
/* bloco respons vel pelo decremento da vari vel que armazena os caracteres
a serem visualizados no display*/
if(keys==REWARD){
if((atual!='0')&&(atual!='A'))
atual=(atual-ONE);
if(atual=='0')
atual='Z';
if(atual=='Z')
atual='9';
setCursorLCD(ADD, TWO, cursor2);
putChrLCD(ADD,atual);
setCursorLCD(ADD, TWO, cursor2);
}
/* se a tecla 2 for pressionada, o caracter que est sendo visualizado no display
ser enviado pelo canal serial*/
if(keys==SEND){
putchr(atual);//fun o que envia caracter pelo canal serial
putChrLCD(ADD,atual);
cursor2++;
}
received=chkchr();//fun o que verifica o recebimento de caracteres pelo canal serial
if(received!=(NULL)){//se a fun o retorna -1 significa que um caracter n o foi recebido
setCursorLCD(ADD, ONE, cursor1);
putChrLCD(ADD,atual);
cursor1++;// o cursor incrementado
}
}
}
"