Descrição

O objectivo desta montagem é permitir que, com recurso a 4 comutadores, se possa seleccionar um de 4 estados possíveis para um conjunto de 8 LEDs, ligados no porto P1.

Seleccionável com o 1º comutador, ligado ao pino P2.0, os 8 LEDs ligados ao porto 1, deverão acender e apagar em simultâneo.

O 2º comutador, ligado ao pino P2.1, deve acender um dos 8 LEDs ligados a P1, e ir sucessivamente acendendo o que se LED que se encontra á sua direita, apagando o anterior, de tal forma que quando o 8º LED, após apagado, seja acendido o 1º. Isto dará a ideia de rotação para a direita, do LED aceso.

Com o 3º comutador, ligado em P2.2, o procedimento deverá ser identico, mas a rotação do LED aceso deverá ser feita para a esquerda.

Com o 4º comutador activo, ligado em P2.3, deverão estar em cada momento 2 LEDs acesos, começando do exterior, isto é, 1º e 8º LEDs, e progredindo para o centro, na seguinte sequência: 1-8, 2-7, 3-6 e 4-5, após o que fará o inverso, 3-6, 2-7, 1-8, e assim sucessivamente. A ideia que dá é que os LEDs se dirigem um para o outro, colidem e afastam-se, sendo novamente repetido o processo.

Para que seja possível visualizar as comutações, aceso - apagado, dos LEDs, é necessário que os mesmos permaneçam num dado estado por algum tempo, pois caso contrário, a nossa vista não consegue distinguir as comutações de estado, isto é, um LED deverá permanecer por algumas dezenas de milissegundos no estado aceso e o mesmo quando está apagado, para que se perceba que está a piscar, pois caso contrário, com a velocidade de execução das instruções do microcontrolador, o LED pareceria estar permanentemente aceso.
Este delay necessário, foi efectuado de forma simples, sem recurso a temporizadores (timers), recorrendo-se apenas a 2 ciclos encadeados onde os registos R7 e R6, vão sendo decrementados da seguinte forma: Por cada decremento de R7, R6, iniciado com o valor 255, será sucessivamente decrementado até atingir 0, após o que R7 será novamente decrementado de 1, e R6 novamente 266 vezes, e assim sucessivamente até que R7 atinja o valor 0. Durante todo este tempo, o, ou os LEDs estarão permantemente acesos, ou apagados, alterando o seu estado no ciclo seguinte.

A intrução "DJNZ Rn,rel" demora 4 ciclos de clock a ser executada por um DS89C420. Se o cristal usado tiver uma frequência de 11.0952MHz, temos T=0.09us, o que significa que a instrução demorará 0.36us a ser executada. Como temos 256*256=65536 intruções DJNZ para executar, o tempo consumido pela rotina de delay será de 23.6ms.
Um 8051 consome tipicamente 24 ciclos de relógio para executar a intrução DJNZ, ou seja, demora 2.17us a executá-la. Então o tempo consumido pela rotina será de 2.17us * 65536 intruções = 142.2ms. Percebe-se melhor neste caso o piscar dos LEDs.

_