Preview only show first 10 pages with watermark. For full document please download

Programa 3 Pmr2310 - Microprocessadores

programa do terceiro lab de microprocessadores

   EMBED


Share

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); } } } ",,