Para implementar um contador usando mais de um bloco de LED de 7 segmentos é necessário multiplexar o sinal (ligar um bloco por vez), todavia usando-se frequência tal que não seja perceptível ao olhos o "liga/desliga"
Depois de implementar o circuito na protoboard basta rodar o programa abaixo
** Para o caso apresentado, foram utilizados blocos de LED 7Segmentos de anodo comum, o que significa que o MSP fornecerá o GND, assim sendo, quando o MSP fornecer sinal ALTO o led desliga e quando fornecer sinal BAIXO o led acende.
Tutorial em vídeo - https://www.youtube.com/watch?v=ATGpmncioA8
Veja funcionando - https://www.youtube.com/watch?v=JGgaYKlFPNA
_________________________________________________
/*IMPLEMENTAR UM CRONOMETRO COM LED DE 7 SEGMENTOS USANDO O TIMER0_A
*/
#include "io430.h"
int unidade = 0;
int dezena = 0;
int centena = 0;
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
BCSCTL1 = CALBC1_1MHZ; //ajusta o DCO para 1MHz
DCOCTL = CALDCO_1MHZ; //ajusta o DCO para 1MHz
P1DIR |= 0x7F; //seta output direction para os bits 0,1,2,3,4,5,6
P2DIR |= 0x07; //seta output direction para os bits 0,1,2
P2OUT |= 0x07; //apaga com sinal alto
P1OUT |= 0x7F; //apaga com sinal alto
/* TESTE DOS LEDS E DOS NÚMEROS EM CADA BLOCO DE LED DE 7 SEGMENTOS
//P2.0 OUT
P2OUT |= 0x07;
P2OUT &= ~0x01;
//0
P1OUT |= 0x7F;
P1OUT &= ~0x3F;
//1
P1OUT |= 0x7F;
P1OUT &= ~0x06;
//2
P1OUT |= 0x7F;
P1OUT &= ~0x5B;
//3
P1OUT |= 0x7F;
P1OUT &= ~0x4F;
//4
P1OUT |= 0x7F;
P1OUT &= ~0x66;
//5
P1OUT |= 0x7F;
P1OUT &= ~0x6D;
//6
P1OUT |= 0x7F;
P1OUT &= ~0x7D;
//7
P1OUT |= 0x7F;
P1OUT &= ~0x07;
//8
P1OUT |= 0x7F;
P1OUT &= ~0xFF;
//9
P1OUT |= 0x7F;
P1OUT &= ~0xEF;
//P2.1 OUT
P2OUT |= 0x07;
P2OUT &= ~0x02;
//0
P1OUT |= 0x7F;
P1OUT &= ~0x3F;
//1
P1OUT |= 0x7F;
P1OUT &= ~0x06;
//2
P1OUT |= 0x7F;
P1OUT &= ~0x5B;
//3
P1OUT |= 0x7F;
P1OUT &= ~0x4F;
//4
P1OUT |= 0x7F;
P1OUT &= ~0x66;
//5
P1OUT |= 0x7F;
P1OUT &= ~0x6D;
//6
P1OUT |= 0x7F;
P1OUT &= ~0x7D;
//7
P1OUT |= 0x7F;
P1OUT &= ~0x07;
//8
P1OUT |= 0x7F;
P1OUT &= ~0xFF;
//9
P1OUT |= 0x7F;
P1OUT &= ~0xEF;
//P2.2 OUT
P2OUT |= 0x07;
P2OUT &= ~0x04;
//0
P1OUT |= 0x7F;
P1OUT &= ~0x3F;
//1
P1OUT |= 0x7F;
P1OUT &= ~0x06;
//2
P1OUT |= 0x7F;
P1OUT &= ~0x5B;
//3
P1OUT |= 0x7F;
P1OUT &= ~0x4F;
//4
P1OUT |= 0x7F;
P1OUT &= ~0x66;
//5
P1OUT |= 0x7F;
P1OUT &= ~0x6D;
//6
P1OUT |= 0x7F;
P1OUT &= ~0x7D;
//7
P1OUT |= 0x7F;
P1OUT &= ~0x07;
//8
P1OUT |= 0x7F;
P1OUT &= ~0xFF;
//9
P1OUT |= 0x7F;
P1OUT &= ~0xEF;
*/
//Setup do timer
TA0CTL = TASSEL_2 + ID_2 + MC_1;
/*TASSEL (timer_A clock source select) seleciona a fonte do timer, 2=0x10 que indica SMCLK
ID (input divider) 0=0x00(/1) > 1=0x01(/2) > 2=0x10(/4) > 3=0x11(/8) -->QUANTO MAIOR O NUMERO MAIS DEMORA PARA CHEGAR NO VALOR MAXIMO (PISCA MAIS LENTO)
MC (mode control) 0=0x00(stop) > 1=0x01(up) > 2=0x10(continuous) > 3=0x11(up/down)
UP(periodo diferente de 0xFFFF) conta até o valor armazenado no registrador TACCR0
e seta a flag CCIFG no registrador TACCTL0 quando atinge o valor de comparação no registrador TACCR0
e seta a flag TAIFG no registrador TACTL quando o timer passa do valor armazenado no registrador TACCR0 para 0
CONTINUOUS seta flag TAIFG no registrador TACTL quando zera a contagem
UP/DOWN timer conta até TACCR0 e depois decrementa até zero (grafico triangular)
seta flag CCIFG em DOIS MOMENTOS: quando atinge o valor de TACCR0 ou volta para zero
*/
TA0CCTL0 = CCIE; //(capture/compare interrupt enable) habilita a interrupção pela flag CCIFG
TA0CCR0 = 0x61A8;
TA0CCTL0 &= ~CCIFG; //limpa flag de interrupção
//Habilita interrupção
__bis_SR_register(GIE); //habilita interrupção
//__enable_interrupt(); //outra forma de habilitar interrupção
//MULTIPLEXAÇÃO
for (;;) //loop infinito
{
switch (unidade) {
case 0:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x3F;
break;
case 1:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x06;
break;
case 2:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x5B;
break;
case 3:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x4F;
break;
case 4:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x66;
break;
case 5:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x6D;
break;
case 6:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x7D;
break;
case 7:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x07;
break;
case 8:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0xFF;
break;
case 9:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0xEF;
break;
case 10:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x3F;
unidade = 0;
dezena++;
break;
}
P2OUT &= ~0x04; //acende o led da unidade
switch (dezena) {
case 0:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x3F;
break;
case 1:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x06;
break;
case 2:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x5B;
break;
case 3:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x4F;
break;
case 4:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x66;
break;
case 5:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x6D;
break;
case 6:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x7D;
break;
case 7:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x07;
break;
case 8:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0xFF;
break;
case 9:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0xEF;
break;
case 10:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x3F;
dezena = 0;
centena++;
break;
}
P2OUT &= ~0x02; //acende o led da dezena
switch (centena) {
case 0:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x3F;
break;
case 1:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x06;
break;
case 2:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x5B;
break;
case 3:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x4F;
break;
case 4:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x66;
break;
case 5:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x6D;
break;
case 6:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x7D;
break;
case 7:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x07;
break;
case 8:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0xFF;
break;
case 9:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0xEF;
break;
case 10:
P1OUT |= 0xFF;
P2OUT |= 0x07;
P1OUT &= ~0x3F;
centena = 0;
break;
}
P2OUT &= ~0x01; //acende o led da centena
}
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void interrupt_timer(void)
{
unidade++;
TA0CCTL0 &= ~CCIFG; //limpa flag de interrupção
}
____________________________________________________________________
Transforme o tempo livre em algo útil... ou pelo menos divertido. Leia-me!
quarta-feira, 8 de outubro de 2014
quinta-feira, 29 de dezembro de 2011
Teste de moral e ética
1º TESTE
Observe bem essa foto e diga quantas pessoas estão olhando para voce

2º TESTE
Olhe essa foto e diga o que lhe chamou a atenção

Resultado
\/
\/
\/
\/
\/
\/
\/
\/
\/
\/
Se na primeira foto voce não viu o rapaz negro
é porque voce é um racista
Se na segunda foto voce viu a bunda da garota de vestido rosa
e não o ombro da garota de camiseta branca
é porque voce é um maniaco sexual
Se voce viu o que não existia e não viu o que existia
além de racista pervertido sexual, você não tá bem da cabeça...
Observe bem essa foto e diga quantas pessoas estão olhando para voce

2º TESTE
Olhe essa foto e diga o que lhe chamou a atenção

Resultado
\/
\/
\/
\/
\/
\/
\/
\/
\/
\/
Se na primeira foto voce não viu o rapaz negro
é porque voce é um racista
Se na segunda foto voce viu a bunda da garota de vestido rosa
e não o ombro da garota de camiseta branca
é porque voce é um maniaco sexual
Se voce viu o que não existia e não viu o que existia
além de racista pervertido sexual, você não tá bem da cabeça...
ARGENTINA DECLARA GUERRA À CHINA!!!
Após uma consulta popular feita na "Plaza de Mayo", a Argentina enviou uma mensagem à República Popular da China:
"Chinos de mierda , maricones : les declaramos "Guerra": - tenemos 105 tanques, 47 aviones sanos, 4 barcos que navegan y 5.221 soldados".
O Estado chinês respondeu-lhes:
"Aceitamos a declaração, temos 38.000 tanques, 16.000 aviões, 790 navios e 300 milhões de soldados.
Ao que respondem os argentinos:
"Retiramos la declaración de guerra…. No tenemos como alojar tantos prisioneros".
"Chinos de mierda , maricones : les declaramos "Guerra": - tenemos 105 tanques, 47 aviones sanos, 4 barcos que navegan y 5.221 soldados".
O Estado chinês respondeu-lhes:
"Aceitamos a declaração, temos 38.000 tanques, 16.000 aviões, 790 navios e 300 milhões de soldados.
Ao que respondem os argentinos:
"Retiramos la declaración de guerra…. No tenemos como alojar tantos prisioneros".
*QUANDO UM HOMEM DEVE USAR BRINCO*
Um dia, no escritório de advocacia, um homem reparou que o seu colega,
muito conservador, estava usando um brinco.
- Não sabia que você gostava desse tipo de coisas - comentou.
*- Não é nada de especial, é só um brinco - replicou o colega.
- Há quanto tempo você o usa?
*- Desde que a minha mulher o encontrou, no meu carro,
na semana passada e eu disse que era meu...
muito conservador, estava usando um brinco.
- Não sabia que você gostava desse tipo de coisas - comentou.
*- Não é nada de especial, é só um brinco - replicou o colega.
- Há quanto tempo você o usa?
*- Desde que a minha mulher o encontrou, no meu carro,
na semana passada e eu disse que era meu...
Lógica do engenheiro
Em um julgamento de divórcio, o casal briga pela guarda do único filho.
A mãe, muito emocionada, tenta se defender:
- Meretíssimo Juiz... Esta criança foi gerada dentro de mim... Carreguei
Ela durante nove meses... Ela saiu do meu ventre... Eu mereço ficar com ela!
O juiz, emocionado e quase convencido, passa a palavra para o marido -
engenheiro, que resolve usar o seu lado lógico:
- Senhor Juiz, tenho apenas uma pergunta:
Quando eu coloco uma moeda em uma máquina de refrigerantes, a latinha que
sai é minha ou da máquina?...
A mãe, muito emocionada, tenta se defender:
- Meretíssimo Juiz... Esta criança foi gerada dentro de mim... Carreguei
Ela durante nove meses... Ela saiu do meu ventre... Eu mereço ficar com ela!
O juiz, emocionado e quase convencido, passa a palavra para o marido -
engenheiro, que resolve usar o seu lado lógico:
- Senhor Juiz, tenho apenas uma pergunta:
Quando eu coloco uma moeda em uma máquina de refrigerantes, a latinha que
sai é minha ou da máquina?...
Assinar:
Postagens (Atom)


