Transcript
/********************************************/,,,
/* ANDR LUIZ ZIMMERMANN NUSP:5437692 */,,,
/* JULIANA COSTA DE OLIVEIRA NUSP:5432220 */,,,
/* */,,,
/* TURMA:04 PROF:JUN OKAMOTO */,,,
/* DATA: 03/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 CW 0xc7 // endere o de envio da palavra de controle dos timers
#define CW0 0x36 // programa o timer 0 para o modo 3, contagem bin ria
#define CW1 0x74 // programa o timer 1 para o modo 2, contagem bin ria
#define FLAG 0x80 // m scara usada na consulta do flag de busy
#define FREE 0x00 // n vel l gico das teclas igual a zero (tecla liberada)
#define IMPROVE 0x06 // comando de incremento do contador do display
#define KEYS 0xe8 // constante que armazena o endere o das chaves
#define LEDS 0xe4 // constante que armazena o endere eo dos LEDS
#define LIGHTOFF 0xff // constante usada para desligar o LED
#define LIGHTON 0xfe // constante usada para ligar o LED
#define LIMIT 100 // limite de contagem da fun o STOP na fun o INITLCD
#define LIMITTWO 200 // 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 MASK 0x01 // m scara utilizada para leitura das teclas (no main)
#define MAX 17 // tamanho do vetor ""s"" que armazena os strings
#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 OFF 0x08 // comando para desligar o cron metro
#define ONDISP 0x0e // comando para ligar o display
#define ONE 0x01 // constante de valor um
#define RESET 0x10 // comando que zera o cron metro
#define SHOWMENU 0x80 // comando que exibe o menu inicial
#define SIX 6 // constante de valor 6
#define SIXTY 60 // constante de valor 60
#define START 0x01 // comando que inicia a contagem do cron metro
#define STOP 0x01 // comando que interrompe a contagem do cron metro
#define TEN 0x10 // constante de valor dez
#define TIMER0 0xc4 // endere o do timer 0
#define TIMER1 0xc5 // endere o do timer 1
#define TWO 0x02 // constante de valor dois
#define ZERO 0x00 // constante de valor zero
int accountant; // contador global para o cron metro
/***************************************************************************/
/* Fun o CONFIGTIMER: configura o circuito integrado 82C54 programando */
/* o timer0 para o modo 3 e contagem bin ria com constante de valor 100d e */
/* o timer1 para o modo 2 e contagem bin ria com constante de valor 3072d. */
/* gerando pulsos peri dicos com freq encia de 10Hz usados na interrup o */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:12/04/2007 */
/***************************************************************************/
void configTimer (){
out(CW,CW0);
out(TIMER0,LSBT0);
out(TIMER0,MSBT0);
out(CW,CW1);
out(TIMER1,LSBT1);
out(TIMER1,MSBT1);
}
/************************************************************************************/
/* Fun o MAKEPULSE: gera interrup es no processador com freq encia predeterminada */
/* pelo timer e executa uma rotina de interrup o que incrementa o contador global. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:11/04/2007 */
/************************************************************************************/
INTERRUPT (32820) makePulse (){
accountant++;
}
/**************************************/
/* 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 a implementa o de um cron metro */
/* digital usando timers do circuito integrado 82C54. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:12/04/2007 */
/***************************************************************/
main (){
char s[MAX]; // vetor que recebe os strings a serem impressos no display
int key; // vari vel que recebe os valores lidos das chaves
int sec; // vari vel que armazena os segundos contados
int min; // vari vel que armazena os minutos contados
int logicalLevel; // avalia se a tecla liga/desliga foi mantida pressionada
int flag;
asm { // desmascaramento da interrup o INT1
mvi A,$1D
sim
}
initLCD(ADD); // inicializa o display
configTimer(); // configura o timer
key=ZERO; // inicializa as vari veis
sec=ZERO;
min=ZERO;
while(key!=OFF){ // loop externo: roda o programa at que o usu rio aperte OFF
key=in (KEYS);
if(key==SHOWMENU){ // exibe o menu inicial se o usu rio pressionar a tecla 8
sprintf(s,""iniciar: tecla 1""); // apresenta o menu inicial no display
setCursorLCD(ADD, ONE, ONE);
putStrLCD(ADD,s);
sprintf(s,""limpar: tecla 5 "");
setCursorLCD(ADD, TWO, ONE);
putStrLCD(ADD,s);
}
if(key==RESET){ // reinicia o cron metro caso o usu rio pressione a tecla 5
sec=ZERO;
min=ZERO;
sprintf(s,""Time: %02d:%02d",min,sec);,
setCursorLCD(ADD, TWO, SIX);,
putStrLCD(ADD,s);,,
} ,,,
,,,
if(key==START){ // inicia o cron metro caso o usu rio pressione a tecla 1,,,
sprintf(s,"parar: tecla 1 ""); // imprime op o de parada no display
setCursorLCD(ADD, ONE, ONE);
putStrLCD(ADD,s);
out(LEDS, LIGHTON); // acende o primeiro LED
key=ZERO; // zera a vari vel ""key",,
logicalLevel=ONE; // inicializa o da vari vel,,,
enable(); // habilita as interrup es,,,
accountant=ZERO; // zera accountant para inicio de uma nova contagem,,,
,,,
while((key!=STOP)&&(key!=OFF)){ // loop de contagem ,,,
flag=in (KEYS); /* leitura das teclas com a finalidade de avaliar ,,,
se o usu rio est mantendo a mesma pressionada*/,,,
if(((flag&MASK)==FREE)&&(logicalLevel!=FREE)){,,,
logicalLevel=FREE; /* caso a tecla j tenha sido liberada permitida a ,,,
leitura das chaves com a finalidade de verificar ,,,
o momento em que o usu rio encerrar o cron metro*/,,,
stop(LIMITTWO); // fun o stop utilizada para lidar com o debounce,,,
},,,
if(logicalLevel==FREE) // libera a leitura das teclas ,,,
key=in (KEYS);,,,
,,,
if(accountant==TEN){ // condicional que incrementa os segundos,,,
accountant=ZERO;,,,
sec++;,,,
},,,
if(sec==SIXTY){ // condicional que incrementa os minutos,,,
sec=ZERO;,,,
min++;,,,
},,,
if(min==SIXTY){ // reinicia a contagem caso a mesma atinja 1 hora,,,
min=ZERO;,,,
},,,
,,,
sprintf(s,Time: %02d:%02d,min,sec); // exibe a situa o atual da contagem
setCursorLCD(ADD, TWO, SIX);,
putStrLCD(ADD,s);,,
},,,
disable(); // desabilita as interrup es,,,
out(LEDS, LIGHTOFF); // apaga o primeiro LED,,
,,,
sprintf(s," ""); // apaga do display a mensagem da op o de parada
setCursorLCD(ADD, ONE, ONE);
putStrLCD(ADD,s);
}
}
}
",,