Jump to content
ELFORUM - Forumul electronistilor

Comanda bascom avr pentru apasari repetate a aceluiasi buton


Recommended Posts

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 to comment
  • Replies 51
  • Created
  • Last Reply

Top Posters In This Topic

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 to comment

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 to comment

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 to comment

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 to comment

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 to comment

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 to comment

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 to comment

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 to comment

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 to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines