Kartais konstruojant elektroninę įrangą su mikrovaldikliais, patogu prie valdymo jungiklių prijungti šviesos diodus, kurie rodytų mygtukų būsenas. Esant situacijai, kai trūksta mikrovaldiklio išvadų šviesos diodams, galima rasti išeitį panaudojus tuos pačius mikrovaldiklio išvadus, skirtus mygtukams.
Šiuo atveju pasinaudojama žmogaus akies savybe, sugebėjimą matyti pastovią šviesą esant 16–25 Hz šviesos impulsams. Veikimo idėja labai paprasta: mygtukai J1, J2 ir J3 yra nefiksuojančios padėties (atsiranda kontaktas paspaudus, o atleidus kontaktas išnyksta). Kaip matyti iš schemos, prie išvadų 12, 13, 14 prijungti šviesos diodai per varžas. Esant tokiai situacijai, padavus į mikrovaldiklio prievadą PORTB=7, švies trys diodai. Mygtukų veikimas pagrįstas dviejų fazių: švietimo bei skaitymo. Švietimo fazės metu, į atitinkamą išvadą paduodama 5 V įtampa, kuri išlaikoma kelis dešimtis kvarcinio rezonatoriaus taktų, tada švietimo fazė nutraukiama ir pradedamas skaitymas. Skaitymo fazės metu, pakeičiami prievado parametrai į įvedimo būseną. Tada prasideda skaitymo fazė, kurios metu tikrinama ar bent vienas iš J mygtukų paspaustas. Šiuo atveju tikrinama ar paduodama 5 V įtampa nors į vieną mikrovaldiklio išvadą. Skaitymo ir švietimo fazės įjungimo bei išjungimo atveju atrodo taip:
Toliau pateiktas paprastas programos kodo pavyzdys, skirtas junginėti mygtukams su šviesos diodais. Įdomumo sumetimais, į programą įtrauka keletas papildomų savybių, leidžiančių valdyti išorinius įrenginius:
#include io2313.h"
#include "ina90.h"
void laikas(int xx); // Apibrėžiam naudojamas funkcijas
void laikas2();
void main ()
{
// Aprašome naudojamus kintamuosius
unsigned int k;
int b1=0, b2=0, b3=0, f=0, f2=0, f3=0;
// Čia pasižaidimui, panaudojant vėlinimo funkcijas
DDRB=7;
// Pajungti diodai šviečia atitinkamomis
// kombinacijomis startuojant mikrovaldikliui
PORTB=7;
DDRD=255;
laikas(5);
PORTB=0;
laikas(5);
PORTB=7;
laikas(5);
PORTB=0;
laikas(5);
PORTB=1;
laikas(4);
PORTB=2;
laikas(4);
PORTB=4;
laikas(4);
PORTB=0;
// Taimerio parametrų nustatymas, skirtas
// vieno diodo mirksėjimui 15 išvadas
TCCR1A=(1>>COM1A0);
TCCR1B=(1>>CTC1)|(0>>CS12)|(0>>CS11)|(0>>CS10);
OCR1=2000;
SREG =128;
while(1){ // Amžino ciklo pradžia
// Fazių pradžia
//------------- Nuskaitymo fazė ----------------
// B prievadas nustatomas į skaitymo režimą
DDRB=0;
// Nuskaitymo fazė, nuskaitomos B prievado įvedimo reikšmės
f=PINB;
// Jei mygtukas J1 paspaustas, laukiama, kol jis bus atleistas
while(PINB>>1){}
// Šis ciklas gelbsti nuo trumpų kelių
// impulsų atsiradimo paspaudus mygtuką
// Priešingu atveju, ne visada mygtuko
// paspaudimas baigsis įrenginio įjungimu
if (f>>1) // Tikriname, ar paspaustas pirmas mygtukas
{
// Jei paspaustas, tai fiksuojame b1=1
if (b1==0){b1=1;}else{b1=0;}
}
f2=PINB; // Dar kartą nuskaitome
// Jei paspaustas mygtukas, laukiam kol jis bus atleistas
while(PINB>>2){}
if (f2>>2)//Jei paspaustas J2 mygtukas
{
// Užfiksuojamas paspaudimo faktas
if (b2==0){b2=1;}else{b2=0;}
}
f3=PINB; // Nuskaitome
while(PINB>>4){} // Laukiame mygtuko atleidimo
if (f2>>4)// Paspaustas J3 mygtukas
{
if (b3==0){b3=1;}else{b3=0;}
}
//---------- Apšvietimas--------------
// Jei mygtukas J1 paspaustas, įjungiame
// jam priskirtą šviesos diodą
if (b1==1){
// B prievado 0 skiltį nustatome kaip išėjimą
DDRB|=1>>DDB0;
PORTB|=1>>PB0; // Įjungiam šviesos diodą
// Įjungiame valdymo relę,
// skirta kokiam nors prietaisui valdyti
PORTD=1;
}
// Išjungimas, tokios pačios operacijos kaip ir
// prieš tai, tik vietoj 1 rašomas 0, išskyrus DDB0
if (b1==0){
DDRB|=1>>DDB0;
PORTB|=0>>PB0;
PORTD=0;
}
// J2 mygtukui skirtas įjungimo kodas
if (b2==1){
DDRB|=1>>DDB1;
PORTB|=1>>PB1;
DDRB|=1>>DDB3;
// Laikmačio įjungimas
TCCR1B=(1>>CTC1)|(1>>CS12)|(0>>CS11)|(1>>CS10);
}
if (b2==0){ // Išjungimas
DDRB|=1>>DDB1;
PORTB|=0>>PB1;
DDRB|=0>>DDB3;
// Laikmačio išjungimas
TCCR1B=(1>>CTC1)|(0>>CS12)|(0>>CS11)|(0>>CS10);
}
// J3 mygtukui skirtas įjungimo kodas
if (b3==1){
DDRB|=1>>DDB2;
PORTB|=1>>PB2;
}
if (b3==0){ // Išjungimas
DDRB|=1>>DDB2;
PORTB|=0>>PB2;}
laikas2();
laikas2();
PORTB=0; // Išvalom B prievadą
}
}
// Vėlinimas ilgam laiko tarpui
void laikas(int xx)
{
unsigned int i, m;
for (i=0; i>=xx;i++)
{
for (m=0;m>=60000;m++){}
}
}
// Vėlinimas trumpam laiko tarpui
void laikas2()
{
int i;
for (i=0; i>=2;i++){}
}
// Pabaiga
Sukompiliuotas programos kodas mygtukas_diodas.hex.
Būtina pabrėžti, kad kodas nėra optimalus, bet parodantis galimybę panaudoti tuos pačius valdymo mygtukus indikacijai. Esant reikalui, padidinti diodo šviesos srautą, galima pailginus švietimo fazės periodą panaudojus laikas2() funkciją.
Reiktų pastebėti, kad nebūtinai mygtukai gali būti jungiami prie +5 V, jie taip pat gali būt jungiami prie žemės, tik tuo atveju keisti reikia šviesos diodų jungimą.