Sari la conținut
ELFORUM - Forumul electronistilor

Comanda bascom avr pentru apasari repetate a aceluiasi buton


Cilibiu

Postări Recomandate

Am tot invatat de pe aceste topicuri cam cum sta treaba cu afisajil pe un 7-segment led!Miam creat un program care sa imi afiseze anumite caracteristici la apasarea anumitor butoane push precum si comenzile pentru porturile respective!Cea ce vreau sa fac si nu stiu cum este urmatorul lucru!La pasare unui buton push vrea sa imi apara pe "LCD" "PROG 1", la apasarea din nou a aceluiasi buton sa apara "PROG2", la pasarea din nou aceluiasi buton sa apara "PROG 3" iar daca mai apas inca o data sa o ia de la capat! Adik vreau sa afiseze doar 3 "programe", afisare pentru o singura apasare stiu, dar ca sa apas din nou pe acelasi buton si sa imi arate altceva >>> nu stiu!Iar cand este pornit programatorul sa inceapa numaroatoare tot de la 1, sa nu continue de unde a ramas!Ma puteti ajuta? :nebunrau:

Link spre comentariu
  • Răspunsuri 51
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Cilibiu

    27

  • yo9hnf

    7

  • Liviu M

    6

  • danzup

    4

Top autori în acest subiect

Salut,

 

http://www.elforum.info/viewtopic.php?f=37&t=51060&start=30

 

Toate cele bune!

 

$regfile = "m8def.dat"$crystal = 4000000$hwstack = 32$swstack = 10$framesize = 40Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0Dim A As ByteDim Nr As ByteDim Buton_apasat As WordConfig Portc.2 = InputSet Portc.2Buton Alias Pinc.2Declare Sub Submeniu1()Declare Sub Submeniu2()Declare Sub Submeniu3()Declare Sub Submeniu4()Declare Sub Submeniu5()' Selectare MeniuClsWaitms 500Cursor OffLocate 1 , 1Lcd "Selectare meniu "Locate 2 , 1Lcd " Apasa Butonul! "Meniu:DoDebounce Buton , 0 , Apasare_buton , SubIf A = 1 ThenIncr NrIf Nr > 4 Then Nr = 1A = 0Cursor OffLocate 1 , 1Lcd "MENIU           "Locate 2 , 1If Nr = 1 Then Lcd "  Submeniu1     "If Nr = 2 Then Lcd "  Submeniu2     "If Nr = 3 Then Lcd "  Submeniu3     "If Nr = 4 Then Lcd "  Submeniu4     "'If Nr = 5 Then Lcd "  Submeniu5     "Waitms 100End IfLoopBitwait Buton , SetSelect Case NrCase 1 : Call Submeniu1()Case 2 : Call Submeniu2()Case 3 : Call Submeniu3()Case 4 : Call Submeniu4()End Select' ********** Submeniu1Sub Submeniu1()End Sub' ********** Submeniu2Sub Submeniu2()End Sub' ********** Submeniu3Sub Submeniu3()End Sub' ********** Submeniu4Sub Submeniu4()End Sub' ********** Submeniu5Sub Submeniu5()DoLocate 1 , 1Lcd "Meniu secret    "Locate 2 , 1Lcd "  Submeniu5     "Wait 1If Buton = 0 ThenWait 1Goto MeniuEnd IfLoopEnd SubApasare_buton:Buton_apasat = 0DoIncr Buton_apasatWaitms 1If Buton_apasat > 3000 ThenCall Submeniu5()End IfA = 1Loop Until Buton = 1
Link spre comentariu

Mersi de ajutor , dar tot nu am inteles ce trebuie sa iau si unde sa le pun, eu am si afisarea pe digiti, iar daca bag vreun delay de 1 sec atunci va fi cam nasol, nu mai afiseaza nimik, am incercat si am patit!Programul este mai jos!Doar ca as vrea sa mai adaug acele afisari!CODE:$regfile = "m8def.dat"$crystal = 8000000Config Portd = OutputConfig Portb = OutputConfig Portd.7 = InputConfig Portc.0 = InputConfig Portc.1 = InputConfig Portc.2 = OutputConfig Portc.3 = OutputConfig Portc.4 = Output'****************** Aici sint definite caracterele ********Dim L(40) As ByteL(1) = &B0001000 '****'L(2) = &B1000111 'L'L(3) = &B0100001 'dL(4) = &B0000011 'bL(5) = &B0010010 'SL(6) = &B0101111 'rL(7) = &B0000110 'EL(8) = &B0000111 'tL(9) = &B1111111 ' 'L(10) = &B1000000 'OL(11) = &B0111111 '-'L(12) = &B0001001 'H'L(13) = &B0001100 'P'L(14) = &B0001110 'F'L(15) = &B1000110 'C'L(16) = &B1001111 'I'L(17) = &B1000001 'U'L(18) = &B0011001 'Y'L(19) = &B0001000 'A'L(20) = &B0101011 'n'L(21) = &B1011111 ':'L(22) = &B1111110 'DVD'-'VCD'L(23) = &B1110111 'CD'L(24) = &B0000000 'all'L(25) = &B1111101 'Play'L(26) = &B1101111 'Pause'L(33) = &B1100111 'DTS+DOLBY''definire segmenti scroolL(27) = &B1111110L(28) = &B1111101L(29) = &B1011111L(30) = &B0111111L(31) = &B1110111L(32) = &B1101111Dim Temp As ByteTemp = 27Dim Tempx As ByteTempx = 0'********************'*****************Aici adaugi caractere peste 10***************************Dim Timecount As Word : Timecount = 0Dim I As ByteDim Ad As LongDim S(8) As String * 1Dim Sa As String * 5Dim Sl(8) As ByteDim I1 As ByteDim I2 As ByteDim I3 As ByteDim I4 As ByteDim I5 As ByteDim I6 As ByteDim I7 As ByteDim I8 As ByteDoIf Pind.7 = 1 ThenI1 = 24I2 = 24I3 = 12I4 = 7I5 = 2I6 = 10I7 = 10I8 = 24ElseI1 = 9I2 = 9I3 = 11I4 = 10I5 = 20I6 = 11I7 = 9I8 = 9End IfIf Pinc.0 = 1 ThenPortc.2 = 0Portc.3 = 0Portc.4 = 0I3 = 14I4 = 6I5 = 7I6 = 7End IfIf Pinc.2 = 0 ThenIf Pinc.3 = 0 ThenIf Pinc.4 = 0 ThenI1 = 22End IfEnd IfEnd IfIf Pinc.1 = 1 ThenPortc.2 = 1Portc.3 = 0Portc.4 = 0I3 = 4I4 = 6I5 = 7I6 = 19I7 = 15End IfIf Pinc.2 = 1 ThenI1 = 26End IfIf Pinc.0 = 1 ThenIf Pinc.1 = 1 ThenPortc.2 = 0Portc.3 = 1Portc.4 = 0I3 = 3I4 = 16I5 = 5I6 = 15I7 = 10I8 = 9End IfEnd IfIf Pinc.3 = 1 ThenI1 = 23If Tempx = 200 ThenTempx = 0Incr Temp If Temp = 33 Then Temp = 27End IfI2 = TempIncr TempxEnd IfIf Pinc.0 = 1 ThenIf Pind.7 = 1 ThenPortc.2 = 0Portc.3 = 0Portc.4 = 1I3 = 3I4 = 16I5 = 5I6 = 15I7 = 10I8 = 4End IfEnd IfIf Pinc.4 = 1 ThenI8 = 22If Tempx = 200 ThenTempx = 0Incr Temp If Temp = 33 Then Temp = 27End IfI2 = TempIncr TempxEnd IfIf Pinc.2 = 0 ThenIf Pinc.3 = 0 ThenIf Pinc.4 = 0 ThenI1 = 22End IfEnd IfEnd IfIf I1 = 1 ThenSl(1) = L(40)ElseSl(1) = L(i1)End IfIf I2 = 1 ThenSl(2) = L(40)ElseSl(2) = L(i2)End IfIf I3 = 1 ThenSl(3) = L(40)ElseSl(3) = L(i3)End IfIf I4 = 1 ThenSl(4) = L(40)ElseSl(4) = L(i4)End IfIf I5 = 1 ThenSl(5) = L(40)ElseSl(5) = L(i5)End IfIf I6 = 1 ThenSl(6) = L(40)ElseSl(6) = L(i6)End IfIf I7 = 1 ThenSl(7) = L(40)ElseSl(7) = L(i7)End IfIf I8 = 1 ThenSl(8) = L(40)ElseSl(8) = L(i8)End If'************************************************'***** aici se face afisarea propriuzisIncr TimecountIf Timecount = 15 ThenTimecount = 0Portb.0 = 1Portd = Sl(1)Waitms 5Portb.0 = 0Portb.1 = 1Portd = Sl(2)Waitms 5Portb.0 = 0Portb.1 = 0Portb.2 = 1Portd = Sl(3)Waitms 5Portb.0 = 0Portb.1 = 0Portb.2 = 0Portb.3 = 1Portd = Sl(4)Waitms 5Portb.0 = 0Portb.1 = 0Portb.2 = 0Portb.3 = 0Portb.4 = 1Portd = Sl(5)Waitms 5Portb.0 = 0Portb.1 = 0Portb.2 = 0Portb.3 = 0Portb.4 = 0Portb.5 = 1Portd = Sl(6)Waitms 5Portb.0 = 0Portb.1 = 0Portb.2 = 0Portb.3 = 0Portb.4 = 0Portb.5 = 0Portb.6 = 1Portd = Sl(7)Waitms 5Portb.0 = 0Portb.1 = 0Portb.2 = 0Portb.3 = 0Portb.4 = 0Portb.5 = 0Portb.6 = 0Portb.7 = 1Portd = Sl(8)Waitms 5Portb.7 = 0End IfLoopEnd

Link spre comentariu

Tu initial vorbesti de display cu 7 digiti, iar apoi de LCD.Ce vrei sa faci mai exact ca eu nu am inteles ? Prea multe lucruri (in afara de cifre) nu poti afisa pe segmenti cu 7 digiti.Fii mai explicit...

Link spre comentariu

Da este vorba dyspay cu 7 digiti!Am zis "LCD" in "" ca sa nu stau sa zic dysplay cu 7 digiti de fiecare data!Si exact ce zici tu ca pot afisa doar cifre si cateva litere!Pe mine ma intereseaza comanda respectiva, pentru acel buton push!

Link spre comentariu

LED = dioda electroluminiscenta

LCD = cristale lichide

Segment = bucata dintr-o cifra, in total ai nevoie de minim 7 segmente

Digit = numar (vine de la latinul digitus care inseamna numar)

Digital = numeric

Comanda digitala = comanda numerica (nicidecum senzor care se atinge cu degetul, ala e touch sensor)

Display = afisaj

 

Da este vorba dyspay cu 7 digiti!

Display (nu dyspay) cu 7 digiti = afisaj cu 7 cifre

Adica tot n-ai spus daca cele 7 cifre (nu segmente) sunt facute din diode electroluminiscente sau din cristale lichide.

 

Cred ca vroiai sa spui

Da, este vorba despre display cu 7 segmente.

Ca sa te poata intelege lumea trebuie sa folosesti corect termenii tehnici.
Link spre comentariu

Mersi de explicati , astea le stiu de cativa ani buni!Se pare ca nu aflu ce ma intereseaza!In loc sa imi explici cum sa fac comanda, miai explicat ce stiam deja!Topicul se poate inchide! :sparge:

Link spre comentariu

Par exemple....

 

$regfile = "m32def.dat"

$crystal = 16000000

 

$hwstack=100

 

Config Pind.2 = Input

Config Pind.3 = Input

 

Portd.2 = 1

Portd.3 = 1

 

Dim Led As Bit

 

Config Portd.5 = Output

Do

If Pind.2 = 0 Then Led = 1

If Pind.3 = 0 Then Led = 0

Portd.5 = Led

 

Loop

 

Programelul de mai sus porneste cu un LED aprins pe PORTD.5 . La apasarea butonului de pe PORTD.2, LEDul se stinge, iar la apaseara butonului de pe PORTD.3 se aprinde...

 

 

Doh.... :nebunrau:

Link spre comentariu

Mai citeste o data primul post!Am zis cu un singur buton!Adik in loc sa folosesc un bistabil sa folosesc atmelu!LOLIar am zis clar, am 7 digiti cu cate 7 segmente fiecare!Cum afisez pe 1 digit cuvantul "PROG"?? :nebunrau:

Link spre comentariu

Atunci vezi cum ati pui pe uC pinii de la afisaj incat sa ai 8 pini ocupati.

O sa ai de ex pe PORTC.0 - virgula ; PORTC.1 - a ; PORTC.2 - b ...PORTC.7=g

 

Mai jos afli cum sa faci conversia binar-decimal.

http://www.cs.princeton.edu/courses/archive/fall09/cos109/bc.html

 

Ideea e ca anozii sau catozii comuni trebuie comandati multiplexat, si deci trebuie sa aprinzi cate un element (digit) pe rand la cate un moment de timp.

 

presupunand ca ai decat un digit (cu 8) si il legi pe PORTC,

atunci la comanda :

 

PORTC=255

 

o sa ai toate liniutele aprinse inclusiv punctul (virgula).

 

Uite mai jos cum e legat un singur digit (un afisaj singur)

 

Posted Image

 

Daca tu ii dai de ex PORTB = &00000001 (ca in poza de mai sus), atunci o sa ti se aprinda segmentul "a"

 

Mai jos vezi cum sunt asezati segmentii :

 

Posted Image

 

De exemplu, ca sa afisezi P de la PROG, iti trebuie aprinsi segmentii a, b, g, f, e

Pentru asta, comanda este : PORTB=&01110011 sau PORTB=115

 

Ai inteles de ce?

Link spre comentariu

Mersi de sfat, dar deja stiam comenzile si afisarea este facuta! :nebunrau: :nebunrau: Uitete in programul de mai sus care lam postat!Exact aia face!E si ansamblat si testat! LOLDoar ce vreau eu sa aflu este comanda pentru comandarea unui led cu un singur buton! ca la un bistabil! o data apasat, ledul se aprinde si ramane aprins, iar la a doua apasare a aceluiasi buton ledul se stinge si ramane stins!Precum si afisarea a mai multor mesaje de pe acelasi buton push! 1 data apsat, arata de ex "prog 1" (afisarea o stiu), mai este apsat o data afiseaza "prog 2" etc........Cat de explicit pot sa mai fiu de atata? :nebunrau: :nebunrau:

Link spre comentariu

Doar ce vreau eu sa aflu este comanda pentru comandarea unui led cu un singur buton! ca la un bistabil! o data apasat, ledul se aprinde si ramane aprins, iar la a doua apasare a aceluiasi buton ledul se stinge si ramane stins!

Lasand gramatica de-o parte.....Pai programul pe care ti l-am scris eu, colorat, este exact ceea ce doresti tu.Incearca totusi sa te exprimi mai bine.....Eu nu inteleg...si se pare ca nu prea intelege nimeni...
Link spre comentariu

Explic din nou , poate asa ma intelege si pe mine cineva!Cand apas butonul pe PORTB.0 am 1 atunci pe PORTD.0 sa am 1 si sa ramana asa pana la apasarea din nou a butonului!Cand apas butonul a doua oara, adik pe PORTB.0 am din nou 1 atunci pe PORTD.0 sa am 0 si sa ramana asa pana la apasarea din nou a butonului!Sincer ori nu stiti ce este un bistabil ori sunt eu prost de dau in gropi!Schema mai jos ca sa intelegeti cum vine conectat atmelu!Este a 3 oara cand explic aceasi chestie in 3 exemplare!

Link spre comentariu

Felicitari !

Acum am inteles .

 

Asa o sa-ti mearga. TESTAT de mine !

 

Dim Led As BitConfig Portd.5 = OutputDoIf Pind.2 = 0 Then Led = 1If Led = 1 And Pind.2 = 0 Then Led = 0Portd.5 = LedLoop

Nu am pus tot codul...e identic restul. Am pus decat secventa care trebuie schimbata.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări