Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <reg51.h>
- sbit button = P1^1; // Botão de pressão: 0 -> pressionado, 1 -> não pressionado
- unsigned char counter = 0; // Contador de 50 ms
- void write(unsigned char character)
- {
- SBUF = character; // Carrega o caracter a ser transmitido para o buffer
- while (!TI); // Aguarda até a transmissão terminar
- TI = 0; // Limpa a flag
- }
- unsigned char read()
- {
- while (!RI); // Aguarda até a receção terminar
- RI = 0; // Limpa a flag
- return SBUF; // Retorna o caracter recebido
- }
- void write_msg(unsigned char* msg)
- {
- unsigned char i;
- for (i = 0; msg[i] != '\0'; i++)
- write(msg[i]);
- }
- void timer0() interrupt 1 // Rotina de interrupção do Timer 0
- {
- TH0 = 0x4C;
- TL0 = 0x24;
- counter++;
- }
- void delay_ms(unsigned int delay)
- {
- unsigned int i, j;
- for (i = 0; i < delay; i++)
- {
- for (j = 0; j < 100; j++);
- }
- }
- void main()
- {
- unsigned char no_code[] = {0xC0, 0xF9, 0xA4, 0xB0, 0X99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 0123456789
- unsigned char pos; // Posição do array a ser acedida
- unsigned char count_flag = 0; // Flag de contagem: 0 -> parado, 1 -> a contar
- unsigned char bt_up = 1; // Posição anterior do botão de pressão: 0 -> pressionado, 1 -> não pressionado
- bit count_mode = 1; // Modo de contagem: 0 -> descrescente 1 -> crescente
- TMOD = 0x21; // Timer 1: modo 2, Timer 0: modo 1
- SCON = 0x50; // Habilitar receção de dados
- TH1 = 0xFD; // Definir valor do Timer 1 para baudrate de 9600
- TR1 = 1;
- TH0 = 0x4C; // Valor do Timer 0: 50ms
- TL0 = 0x24;
- TR0 = 0; // Contagem do Timer 0: 0 -> parado, 1 -> a contar
- EA = 1; // Interrupções: 0 -> desabilitadas, 1 -> habilitadas
- ET0 = 1; // Interrupções do Timer 0: 0 -> desabilitadas, 1 -> habilitadas
- do
- {
- write_msg("Insira um número de 0 a 9:\n");
- pos = read() - 48;
- } while (pos < 0 || pos > 9);
- P2 = no_code[pos]; // Apresenta o valor no display
- write_msg("Pressione o botão para iniciar a contagem\n");
- write_msg("(0/1) altera o modo de contagem\n");
- while (1)
- {
- if (!button && bt_up) // Botão pressionado
- {
- delay_ms(50); // Debounce
- if (!button && bt_up) // Botão pressionado
- {
- count_flag = !count_flag;
- bt_up = !bt_up;
- TR0 = !TR0;
- counter = 0;
- if (count_flag)
- write_msg("Contador está a contar\n");
- else
- write_msg("Contador está parado\n");
- }
- }
- if (button && !bt_up) // Botão não pressionado
- {
- delay_ms(50); // Debounce
- if (button && !bt_up) // Botão não pressionado
- bt_up = !bt_up;
- }
- if (count_flag && counter == 20) // Timer atingiu 1s
- {
- if (count_mode)
- pos += (pos == 9) ? -9 : 1; // Incrementa o valor do display
- else
- pos -= (pos == 0) ? -9 : 1;
- P2 = no_code[pos]; // Apresenta o valor no display
- counter = 0;
- }
- if (RI)
- {
- if (SBUF == '0')
- {
- count_mode = 0;
- write_msg("Modo de contagem: decrescente\n");
- }
- else if (SBUF == '1')
- {
- count_mode = 1;
- write_msg("Modo de contagem: crescente\n");
- }
- else
- write_msg("Caracter não suportado!\n(0/1) altera o modo de contagem\n");
- RI = 0;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement