Cine este mestro si ma poate ajuta cu cateva functii logice la care au m-am incurcat.
Din fila “exemplu.bas” am luato si am incercat sa fac u un program cu “inbunatatiri” care de faptt nu am reusit inca .
Corect pic-ul este 16f728a
Initial in exemplul era 16f627a dar avea 1k memorie si nu era suficenta
Am migrat la 16f628a cu 2k memorie destul de multa pentru a avea loc initializarea LCD care ocupa mult spatiu.
Initial programul era scris si facut pentru PicBasic Pro fila fiind exemplu.bas nestiind sa declar LCD 16*2 caractere am trecut la mikroPascal unde am gasit in help exemplu cu LCD .
M-am tot uitat prin help si am scris programul sub alta forma dar din pavate face si altceva (in mare parte face cam tot numai ca incorect).
Ce trebuie sa faca el.
1. La alimentare sa apara pe LCD linia1 Initializare sis a ramana pana cand se va actiona un buton.
2. Sa aiba 2 butoane sa zicem “B+” si “B-” care sa se ocupe cu numararea de la 0 la 100
3.Sa mai aiba un buton care sa faca on/off pe un pin (aprind lumina pe afisor sau o sting pini afisor 15 si 16 comanda cu un bc747 sau bc557)
4. Un led sa lumineze doar in cazul in care unul din butoanele “B+” sau ”B-” va fi actionat dar, ledul sa nu mai lumineze in cazul in care pe ecran apare “Nr.0” cand se va reapesa “B-“ si in cazul in care pe ecarn va aparea “Nr. 100” si se va apasa “B+”.
5. Conditia de butoanele de adaugare sau de scadere sa fie astfel : Daca “B+” va fi apasat si se va tine actinu apasat el doar o data sa numere adica sa aduca pe afisor din (ex.: sa presupunem nr.5 sa aduca nr.6) chiar daca el va fi tinut apesat 1 ora el sa nu numere in continu si invers pentru “B-“ alta conditie ar fi daca unul din butoanele de numarat fie “B-” fie “B+” este apesat si tinut apesat atunci daca se apasa celalalt buton el sa fie ignorat.
6. Cand ajunge la nr.100 pe un pin sa trimita un semnal catre un buzzer.
La mine momentan
Afiseaza primul mesaj “initializare”
Actionarea nutoanelor “B-“ sau “B+” o face numai ca la tinerea apesata va numara incontinu si la “B-“ cand va ajunge la 0 va trece in 99, 98, 97, etc
Nici vorba de buton on/off (nu am reusit s ail scriu in program)
Nici vorba de led care sa semnalizeze apasarea unui buton (nu am reusit s ail scriu in program)
De buzzer………..
Voiam sa fac comunicarea pe I2C din motiv cablaj mai simplu on/off ar merge facut din soft, pini liberi pentru viitor a altor functii.(dar I2C pare a fi prea complicate pentru mine)

program TESTL_4;

var a,x,y: byte ; // declarare variabile
text1 : array[16] of char; // initializare variabila text1 ca lcd 16carectere

procedure Init;

begin
TRISB := 0; // toate liniile de port B RB0 (pentru a RB7), configurat ca iesiri
PORTB := 0; // clear portB

Lcd_Init(PORTB); // Initialize LCD on PORTB
Lcd_Cmd(LCD_CURSOR_OFF); // Turn off cursor
Lcd_Cmd(LCD_CLEAR);
a:=0; // initializare valoare de start
x:=0;
y:=0;
Lcd_out(1,1,'Initializare');
delay_ms(2000);
Lcd_Cmd(Lcd_Clear);
end;

procedure meniu;

begin
TRISB :=255; // Init port b intrare
PORTB :=255; // clear portB
begin
a :=0;
x :=0;
repeat
begin
if button(portb,0,100,1) then
a:=1;
if button(portb,0,100,0) then
x:=3;
if button(portb,1,100,1) then
a:=2;
if button(portb,1,100,0) then
x:=3;
end;
until (a > 0);
end;
end;

procedure calcul;
begin
TRISB := 0; // toate liniile de port B RB0 (pentru a RB7), configurat ca iesiri
PORTB := 0; // clear portB
Lcd_Init(PORTB);
Lcd_Cmd(Lcd_Clear);
if a=1 then
begin
y :=y+1;
bytetostr(y ,text1);
Lcd_Out(2, 1,text1); // Print text at LCD
Lcd_out(1,1,'Nr.');
end;

if a=2 then
begin
y :=y-1;
bytetostr(y ,text1);
Lcd_Out(2, 1,text1); // Print text at LCD
Lcd_out(1,1,'Locuri libere');
end;

if y>100 then
begin

y :=100;
bytetostr(y ,text1);
Lcd_Out(2, 1,text1); // Print text at LCD
Lcd_out(1,1,'Ocupat');
end;

if y<1 then
begin

y :=0;
bytetostr(y ,text1);
Lcd_Out(2, 1,text1); // Print text at LCD
Lcd_out(1,1,'Liber ');
end;

end;



// Programul principal

begin
Init;
while true do // daca s-a facut initializarea
begin
repeat
begin

meniu;
if ((a > 0) and (x = 3)) then calcul;

end;
until false;
end;
end.