/************************************************ Experiencia 4: Configura o Timer T0 e display LCD Pisca um LED a cada segundo. Mostra contagem no LCD LabProc 2010-1 Marcos Augusto Stemmer *************************************************/ #include #define CCLK 12000000 #define LCD_E (1<<24) #define LCD_RS (1<<25) /* Espera t milisegundos */ void espera(unsigned int t) { unsigned int tf; tf = T0TC + t; /* tf = Valor futuro do T0TC */ while(tf != T0TC); /* espera ate que tf==T0TC */ } /* Escreve um comando para o LCD */ void LCDcomando(int c) { FIO3PIN0 = c; FIO4CLR = LCD_RS; /* RS=0: comando */ FIO4SET = LCD_E; FIO4CLR = LCD_E; espera(20); } /* Escreve um caractere no LCD */ void LCDputchar(int c) { FIO3PIN0 = c; FIO4SET = LCD_RS; /* RS=1: caractere */ FIO4SET = LCD_E; FIO4CLR = LCD_E; espera(8); } /* Configura LCD */ void LCDinit(void) { /* Configura portas I/O do LCD */ FIO3DIR |= 0xff; /* Dados do LCD como saidas */ FIO4DIR |= LCD_E | LCD_RS; /* EN e RS do LCD como saidas */ espera(20); LCDcomando(0x38); /* Configura LCD para 2 linhas */ LCDcomando(1); /* Limpa display */ LCDcomando(0x0c); /* Apaga cursor */ } /* Envia uma mensagem no LCD */ void LCDputs(char *txt) { while(*txt) LCDputchar(*txt++); } /* Escreve numero decimal de 2 digitos */ void escreve2digs(int x) { LCDputchar((x/10) + '0'); /* Escreve dezena */ LCDputchar((x%10) + '0'); /* Escreve unidade */ } int main (void) { int c=0, tempo; PCONP |= 2; /* Liga energia do Timer 0 */ PCLKSEL0 = (PCLKSEL0 & (~0x0c)) | 0x04; /* Divide CCLK por 1 no T0 */ T0TCR = 0; /* Desabilita T0 */ T0PR = CCLK/1000 - 1; /* Incrementa T0TC 1000 vezes por segundo */ T0TCR = 2; /* Inicializa T0 */ T0TCR = 1; /* Habilita T0 */ FIO4DIR = 1; /* LED1 como saida */ LCDinit(); LCDputs("Teste do Timer"); LCDcomando(0xc0); LCDputs("e LCD:"); tempo=T0TC; do { if(T0TC == tempo+600) FIO4CLR = 1; /* Liga LED1 em 600ms */ if(T0TC == tempo+1000){ FIO4SET = 1; /* Desliga LED1 em 1000ms */ tempo += 1000; /* Atualiza o tempo */ LCDcomando(0xc7); /* Cursor no meio da linha 2 do LCD */ escreve2digs(c++); /* Escreve contagem a cada segundo */ if(c==100) c=0; /* Quando contagem = 100 volta para zero */ } } while(1); return 0; } /* Estas rotinas sao chamados pelo crt.S. Devem existir, mas ainda nao estao sendo usadas */ void UNDEF_Routine(){} void SWI_Routine(){} void FIQ_Routine(){}