Projektuodamas robotą, pritrukau išvadų klaviatūrai, tad sumasčiau, kaip būtų galima išsisukti šioje padėtyje. Ir štai, rezultatas: 16 ar daugiau klavišų – tik per 2 valdiklio išvadus.
Viskas veikia realybėje.
Teorinė schema
Programos pavyzdys
void meniu1(void)
{
zym1: lcd_cls();
lcd_puts("MENIU");
garsas();
delay_ms(uzlaikymas2/2);
PlayStr_f((char*)"mmm~e`ee`n`n`n~yj`uuu");
delay_ms(uzlaikymas2/4);
garsas1();
while (PINC.4==0){
} ;
delay_ms(100);
klava(); // Klaviatūros apklausa
switch (kl)
{ case 106: { // nuspaudus 1kl. parodo baterijos talpą
while(1){
lcd_cls();
Baterija();
lcd_puts(_str98);
delay_ms(1);
lcd_gotoxy(1,1);
itoa(bat,txt); //ftoa(bat,5,txt);
lcd_puts(txt);
delay_ms(1);
lcd_puts("V");
PlayStr_f((char*)"b`aa`ttt~ee`r,r,r`iy`ja");
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();
}
kl=1;
break;}
case 101: {
while(1){irdiodas=0;
lcd_cls();
lcd_puts("IR1=");
PORTD=0b00000001;
poll_sensor();
PORTD=0;
lcd_gotoxy(0,1);
itoa(delta,txt);
lcd_puts(txt);
PlayStr_f((char*)"i`n~f~r,r`aa`r,r`ee`d~aa`ss");
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 98: {
while(1){irdiodas=1;
lcd_cls();
lcd_puts("IR2=");
PORTD=0b00000010;
poll_sensor();
PORTD=0;
lcd_gotoxy(0,1);
itoa(delta,txt);
lcd_puts(txt);
PlayStr_f((char*)"i`n~f~r,r`aa`r,r`ee`d~aa`ss");
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 130: {
while(1){ irdiodas=2;
lcd_cls();
lcd_puts("IR3=");
PORTD=0b00000100;
poll_sensor();
PORTD=0;
lcd_gotoxy(0,1);
itoa(delta,txt);
lcd_puts(txt);
PlayStr_f((char*)"i`n~f~r,r`aa`r,r`ee`d~aa`ss");
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 86: {
while(1){irdiodas=3;
lcd_cls();
lcd_puts("IR4=");
PORTD=0b00001000;
poll_sensor();
PORTD=0;
lcd_gotoxy(0,1);
itoa(delta,txt);
lcd_puts(txt);
PlayStr_f((char*)"i`n~f~r,r`aa`r,r`ee`d~aa`ss");
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 155: {
while(1){ lcd_cls();
lcd_puts("Apkrova=");
Apkrova();
lcd_gotoxy(0,1);
itoa(apkr,txt);
lcd_puts(txt);
lcd_puts("mA");
PlayStr_f((char*)"aa~p~~k~r,r,r~ooo`v~aa");
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 136:{
while(1){
lcd_cls(); //
PlayStr_f((char*)(" ") );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 114:{
while(1){
lcd_cls();
PlayStr_f((char*)("aa~v~aa~r,r,r`iy`ja") );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 52: {
while(1){
lcd_cls();
PlayStr_f((char*)("pppp~~yi`r`r`r~m`m~yyy`nnnn") );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 61:
{ while(1)
{ lcd_cls();
PlayStr_f((char*)("sz`ee~n~k~a b`aa`ttt~ee`r,r,r`iy`ja") );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 71:
{ while(1)
{ lcd_cls();
lcd_puts("<"); //
PlayStr_f((char*)("kk~~aaa`iy`j~r,r,r~eeee`nnn" ) );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 82:
{ while(1)
{ lcd_cls();
lcd_puts(">"); //
PlayStr_f((char*)("dd~~ee`&&&&`yi~nn~eeee`nnn" ) );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 94: {
while(1){
lcd_cls();
lcd_puts("^"); //
PlayStr_f((char*)("aa~t`t`t~g`g~aaaa`lllll") );
delay_ms(uzlaikymas2);
if (PINC.4==0)break;
garsas1();}
break;}
case 107: {
main(); // numetimas
break;}
case 121:{
lcd_cls();
lcd_puts("PROG.Rez."); //
PlayStr_f((char*)("p~r,r`oo`g`r,r`aa~m`m~aa`v~yi~m~aa`sz") );
delay_ms(uzlaikymas2);
garsas1();
meniu(); //meniu – parametrų programavimas
BUSENA=100; // nepamenu kodėl, reiks išsiaiškinti!!!!!!
break;}
default: {
lcd_cls();
lcd_puts("Klaida");
PlayStr_f((char*)("k~l~aa`y~d~aaa v`y`ss`ooo g~eeaa`r,r`ooo") );
delay_ms(uzlaikymas2/2);
goto zym1;
break;
}
}
garsas();
while (PINC.4==0){
delay_ms(200);
}
while (PINC.4==1);
delay_ms(200);
while (PINC.4==0);
PlayStr_f((char*) "a`&&& e~sz`u r,r,r`ooo`b~ooo`t~a`sz");
//PlayStr_f((char*) *_txt4);
garsas();
delay_ms(1000);
}
//****** PROGRAMAVIMO REŽIMAS ******
void meniu(void) //
{PROGRAMAVIMAS=1;
LCDNUST=100;
lcd_cls();
lcd_puts("PROG.Nr.");
while(PROGRAMAVIMAS==1)
{ klava();
switch (kl){
case 106: {
lcd_cls();
lcd_puts("NEURO");
delay_ms(uzlaikymas2);
PORTC.6=1; //variklio 1 leidimas
PORTC.7=1; //variklio 2 leidimas
//main1(); //neuroninių tinklų programa
PORTC.6=0; //variklio 1 draudimas
PORTC.7=0; //variklio 2 draudimas
garsas2();
//reset(); //reiks padaryti programinį numetimą
//main(); // grįžti į pagrindinę programą
break;}
case 101: {
while(1){
lcd_cls();
lcd_puts("IR="); // ir jautrumas
lcd_gotoxy(4,0);
itoa(irjautrumas,txt);
lcd_puts(txt);
delay_ms(uzlaikymas2/8);
garsas2();
klava();
if (kl==71)irjautrumas=irjautrumas-1;
if (kl==82)irjautrumas=irjautrumas+1;
if (kl==94)irjautrumas=irjautrumas-10;
if (kl==107)irjautrumas=irjautrumas+10;
if (irjautrumas<=0) irjautrumas=1;
if (irjautrumas>=254) irjautrumas=254;
if (kl==121) break;
}
delay_ms(uzlaikymas2/8);
break;}
case 98: {
while(1){
lcd_cls();
lcd_puts("Gr=");
lcd_gotoxy(4,0);
itoa(uzlaikymasf,txt);
lcd_puts(txt);
delay_ms(uzlaikymas2/8);
garsas2();
klava();
if (kl==71)uzlaikymasf=uzlaikymasf-1;
if (kl==82)uzlaikymasf=uzlaikymasf+1;
if (kl==94)uzlaikymasf=uzlaikymasf-10;
if (kl==107)uzlaikymasf=uzlaikymasf+10;
if (uzlaikymasf<=0) uzlaikymasf=1;
if (uzlaikymasf>=254) uzlaikymasf=254;
if (kl==121) break;
} //
delay_ms(uzlaikymas2/8);
break;}
case 130: {
lcd_cls();
lcd_puts("Pabegimas");
delay_ms(uzlaikymas2);
break;}
case 86: {
lcd_cls();
lcd_puts("UG daviklis");
delay_ms(uzlaikymas2);
break;}
case 155: {
lcd_cls();
delay_ms(1);
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 136: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 114: {
lcd_cls();
lcd_puts("nesugalvojau");
delay_ms(uzlaikymas2);
break;}
case 52: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 61: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 71: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 82: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 81: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
PROGRAMAVIMAS=0;
break;}
case 107: {
lcd_cls();
lcd_puts("nesugalvojau"); //
delay_ms(uzlaikymas2);
break;}
case 121: {
lcd_cls();
lcd_puts("PROG. Pabaiga");
delay_ms(uzlaikymas2); //
PROGRAMAVIMAS=0;
break;}
default: {
lcd_cls();
lcd_puts("PROG.Nr.");
}
}
garsas();
}
while (PINC.4==0){
delay_ms(200);
}
while (PINC.4==1);
delay_ms(200);
while (PINC.4==0);
garsas();
}
//******* Klaviatūros apklausa ******
void klava(void)
{ klini();
kl=16; // pradinis svorio koeficientas
LCDNUST=100;
// lcd_gotoxy(0, 0);
while (PINC.4==1){};
delay_ms(10);
for (tmp=1; tmp <=19; tmp=tmp+1)
{ PORTC.5=0;
delay_us(10);
PORTC.5=1;
delay_us(10);
PORTC.5=0;
if (PINC.4==0) kl=kl+tmp;}
// lcd_gotoxy(0,0);
//lcd_puts(_str0);
//_str0 tai tuščias laukas dėl „codevision“ klaidos
//lcd_clear();
//itoa(kl,txt); //
//lcd_puts(txt); //
//lcd_gotoxy(0,0);
garsas1();
}
//******** Klaviatūros inicializacija (gali jos ir nebūti)******
void klini(void) //
{
for (tmp=1; tmp <= 16; tmp=tmp+1)
// Pradinė klaviatūros inicializacija
{ PORTC.5=1;
delay_us(10);
PORTC.5=0;
delay_us(10);
}
}
//****** Klaviatūros garsai ******
void garsas(void) //
{
for (tmp=1; tmp <= 100; tmp=tmp+1)
{ PORTC.5=1;
delay_us(100);
PORTC.5=0;
delay_us(100);
}
}
void garsas1(void) //
{
for (tmp=1; tmp <= 200; tmp=tmp+1)
{ PORTC.5=1;
delay_us(200);
PORTC.5=0;
delay_us(200);
}
}
void garsas2(void) //
{
for (tmp=1; tmp <= 254; tmp=tmp+1)
{ PORTC.5=1;
delay_us(150);
PORTC.5=0;
delay_us(150);
}
}
Reali schema
Ir dar, prie to pačio klaviatūros taktavimo išvado prijungiu garsiakalbį. Kartu yra roboto garso išvadas. Taktavimo impulsų skaičius nesvarbus, jis kartu nustato registrus į pradinę būsena. Registrai KMOP, tad tai labai ekonomiškas variantas. Tranzistorius gali būti bet koks npn. Aš naudojau KT315.
Reikalingas papildomas klavišas į tranzistoriaus bazę – tai numetimas. Kartais (retai) dėl mechaninių kontaktų „triukšmo“ registrai pasimeta.
Dar, aš padariau klaidą, nes pagal esamą „svorio“ koeficientą gaunasi, kad 7 ir 16 kl. reikšmės sutampa, bet man klavišų užteko, o viskas buvo jau parašyta (paskutinis klavišas buvo paskutinis ir meniu aprašas). Paprogramę pagal nuspaustą klavišą kviesti tikrinant kl. išėjimą, o geriau parašyti pertraukimą.
Siuntiniai
- Klaviatura.ZIP [66,95 kB]
Arnoldas Černiakovas. Kaunas