Semafor la PIC12F629 cu program "incorect". Numărul de numere pe asamblare

Când Fiul lipit pentru școală din hârtia de la semafor, gândul a venit: "Și de ce să nu colecteze pentru el modelul de acțiune al semei de trafic pe microcontroler". Pe internet există numeroase scheme și programe, implementarea principiului celui mai simplu semafor de trafic. Dar ele sunt sau prea complicate pentru jucării (traductor DC-DC, registrele de schimbare etc.) sau sunt reprezentate doar ca un exemplu al celui mai simplu program de asamblare. Vreau să revizuiesc schema și programul de asamblare a designului finalizat al luminii de trafic de jucărie cu câteva caracteristici suplimentare. Mai mult, se colectează pe un microcontroler "Penny" de-a lungul celei mai simple scheme, care este important pentru începători. Sper asta schemă simplă Va deveni pentru mulți începători să studieze programarea microcontrolerelor PIC, primul design asamblat de fapt pe PIC. Simplu, dar, în același timp, care conține principalele tehnici și atributele de programare, programul va face ușor să înțelegeți și să experimentați acest lucru.

Chiar și cine se ocupă cu microcontrolerele de programare, sunt cunoscute principiile de bază ale stivuitorilor de scriere: ca un timp scurt de execuție și cod scurt, fără cicluri și apeluri de la lucrătorul altor subrutine etc. În acest caz, întreruperile sunt permise doar pentru a schimba nivelul (nu putem pierde alte întreruperi, deoarece acestea nu sunt pur și simplu) și eu, pentru a simplifica programul și percepția acesteia, a constatat că este posibil să se îndepărteze de aceste principii. Aici, în manipultorul de întrerupere există cicluri și un apel către un alt subprogram și (despre groază!) Chiar și tranziția la modul de repaus. Prin urmare, în antet, programul se numește "greșit". ÎN acest cazManipulatorul de întrerupere este folosit ca un subprogram regulat, cu toate acestea, în alte cazuri, principiile de mai sus rămân în vigoare.

Caracteristicile scurte ale dispozitivului:

Dispozitivul este un model al unei lumini de trafic stradă cu o simulare fiabilă a operațiunii sale (comutare de flori, clipire verde) și are funcții suplimentare: Schimbați frecvența de comutare apăsând butonul, modul clipește este galben, trecerea la modul de repaus în manual și mod automat urmată de apăsarea butonului. Acest dispozitiv poate fi folosit ca jucărie pentru copii, precum și o alocație vizuală în instituțiile preșcolare ale copiilor atunci când predă copiii pe comportamentul rutier.

Deci, ne întoarcem la descrierea și luarea în considerare a schemei.

Schema este colectată pe un microcontroler ieftin PIC12F629. Direct pentru controalele LED, sunt utilizate concluzii GP0-GP2, GP4, GP5 (picioarele 7, B, 5, 3, 2), programate ca ieșiri. LED-urile pentru fiecare direcție sunt combinate în grupuri seriale, ceea ce vă permite să minimalizați curentul consumat. Rezistențele R3-R8 limitează curenții LED. În cazul unei diferențe puternice în returnarea LED-urilor de diferite culori, va trebui să selectați rezistențele corespunzătoare. Eu, de exemplu, două grupări galbene sunt conectate în paralel și conectate la un rezistor și același nominal ca restul și strălucește chiar și un pic mai strălucitor decât altele (se întoarce mai mult).

În această schemă, LED-urile sunt hrănite la 1,5 în mai mult de un microcontroler dintr-un element suplimentar (în acest caz, când ieșirea curentă este oprită, nu trece la ieșirea microcircuitului, deoarece este mult mai multă tensiune pentru a deschide tranzițiile din două LED-uri de 1,5 V (cel puțin 2,5 ° C). Și chiar și cu defalcarea ambelor LED-uri (care este puțin probabil), curentul printr-o diodă de protecție internă pe o putere plus va fi de aproximativ 7,5 mA, ceea ce este mult mai puțin admisibil. Consumul curent de LED-uri este mult mai mare decât consumul de MK, prin urmare, diferența de descărcare a elementelor (prin intermediul unui consum de curent al MK nu curge) Este posibil să se neglijeze. Este stabilit experimental că, în ciuda scăderii curentul prin intermediul LED-urilor atunci când bateria este descărcată, luminozitatea strălucirii lor rămâne la un nivel acceptabil în întreaga gamă de tensiune a bateriei. Diagrama este extrem de simplificată și nu există stabilizator de tensiune care consumă curent suplimentar, ceea ce a făcut posibilă abandonarea Comutator de alimentare (consum curent în modul de repaus - 1-3 m ka).

Butonul de comandă al operațiunilor dispozitivului este conectat la ieșirea GP3 (piciorul 4), care în biții de configurare este declarat ca o intrare digitală. Când apăsați butonul, întreruperea apare în procesarea căreia apare următoarele. Cu apăsare lungă (mai mult de 4 s), dispozitivul intră în modul Sleep. Cu presiuni mai scurte, există o comutare secvențială a vitezei de semafor într-un cerc cu indicarea vitezei curente în funcție de desen.

În ultimul mod (LED-urile roșii sunt aprinse), modul de semnal galben clipește este pornit. Cu o apăsare lungă a butonului (confirmată de populația tuturor LED-urilor), mergeți la funcționarea normală cu schimbarea modului la unul nou, dacă butonul nu este apăsat mai mult de 6 secunde., Modul de operare rămâne același ca și Butonul este apăsat.

Elementele de încărcare AA în modul Sleep este suficientă pentru nu mai puțin de un an, motiv pentru care comutatorul de alimentare nu este furnizat în dispozitiv. Dispozitivul intră în modul de repaus și după 0,5 - 1 oră (depinde de viteza culorilor de comutare) fără a afecta butonul. Din modul de repaus, ieșirea are loc la orice apăsare a butonului. Microcontrolerul este alimentat de ieșiri 1 și 8. Pentru a salva concluzii și a simplifica designul, acesta este pornit în modul generatoare interne fără elemente externe.

Explicații mici pentru programul care este prezentat în investiție.

Procesarea butonului de presare este realizată în subrotine: wait_butt __- așteaptă apăsarea și înregistrarea 6s. Fără apăsarea, push_butt __- Înregistrarea duratei de clic, Wait_Nobutt __ - Așteptarea unui buton care nu este apăsat. În momentele de schimbare a stării de semafor (verde galben și clipește), portul de ieșire este citit de la masă în subrutina Tact__ (semi-tort mai tânăr sau senior). În mod similar, indicatorul de stare când este apăsat butonul - de la subrutina indică. Pentru a comuta la modul de repaus după ora de funcționare, o tranziție forțată are loc la subrutina de procesare a întreruperii instalarea software-ului Steagul de întrerupere. Schimbarea Constanței Constanța, Const_reg, Const_SL poate fi modificată în mod corespunzător, perioada de clipește verde, modul inițial la conectarea bateriei, timpul de funcționare fără a influența tranziția la modul de repaus.

Placa de circuite imprimată este realizată din fibră de sticlă cu o singură față și are dimensiuni de 22x87 mm. LED-urile extreme sunt stabilite paralele cu placa în direcții diferite. Media setată unul din partea părții părților și cealaltă - pe partea laterală a pieselor cu ieșirea concluziilor în deschiderile plăcii și le fixează din părțile izvoarelor de lipire și pe partea laterală a pieselor prin lipirea pe piesele corespunzătoare.

Toate rezistoarele cu o capacitate de 0,125 wați. LED-urile pot fi luate orice tip intern sau importat de dorit cu o scădere directă de tensiune la un curent de 10 mA de aproximativ 2 volți. Buton - orice fără fixare. Microcontrolerul este instalat pe bloc.

Cuvântul de configurare este introdus automat în memorie atunci când firmware-ul este încărcat (în "pasăre" instalat numai în punctul PWRT, elementele rămase sunt "resetate", în coloana "Oscilator" instalat "Inscomb GP4"). Este necesar mai întâi să citiți firmware-ul cu un cip curat și să scrieți valoarea cuvântului la sfârșitul memoriei programului la 03FF, ceea ce este necesar pentru configurarea frecvenței generatorului intern al instanței specifice a cipului. După descărcarea în programul de fișiere Hex, trebuie să prescrieți manual această valoare la 03FF. ÎN acest aparat Deviația de frecvență nu este critică, dar totuși ar trebui să știți că această procedură necesită o astfel de procedură. În cazuri extreme, dacă valoarea fabricii este pierdută, puteți face orice - programul a luat măsuri pentru munca corectă și în acest caz.

Dispozitivul este plasat într-o cutie de plastic adecvată. Găurile relevante se fac sub LED-urile din cutie și capacul. În realizarea mea, semaforul în sine și baza cu butonul și bateria sunt conectate prin segmentul țevii de apă din plastic, cu un diametru de 20 mm.

Aplicația are: modelul, placă de circuit imprimat În format laic, program pe asamblorul MPASM, fișierul firmware hexagonal.

Lista elementelor radio

Desemnare Un fel Nominal număr NotăScorCaietul meu
IC1. Mk pic 8-bit

PIC12F629.

1 DiP. În notebook.
R1. Rezistor.

3 COM.

1 0,125 W. În notebook.
R2. Rezistor.

100 oh.

1 0,125 W. În notebook.
R3-R8. Rezistor.

200 Oh.

6 0,125 W. În notebook.
HL1, HL2, HL9, HL10 Dioda electro luminiscenta

Al307a.

4 roșu În notebook.
HL3, HL4, HL11, HL12 Dioda electro luminiscenta

Când Fiul lipit pentru școală din hârtia de la semafor, gândul a venit: "Și de ce să nu colecteze pentru el modelul de acțiune al semei de trafic pe microcontroler". Pe internet există numeroase scheme și programe, implementarea principiului celui mai simplu semafor de trafic. Dar ele sunt sau prea complicate pentru jucării (traductor DC-DC, registrele de schimbare etc.) sau sunt reprezentate doar ca un exemplu al celui mai simplu program de asamblare. Vreau să revizuiesc schema și programul de asamblare a designului finalizat al luminii de trafic de jucărie cu câteva caracteristici suplimentare. Mai mult, se colectează pe un microcontroler "Penny" de-a lungul celei mai simple scheme, care este important pentru începători. Sper că această schemă simplă va deveni pentru mulți începători să studieze programarea microcontrolerelor PIC, primul design colectat real. Simplu, dar, în același timp, care conține principalele tehnici și atributele de programare, programul va face ușor să înțelegeți și să experimentați acest lucru.

Chiar și cine se ocupă cu microcontrolerele de programare, sunt cunoscute principiile de bază ale stivuitorilor de scriere: ca un timp scurt de execuție și cod scurt, fără cicluri și apeluri de la lucrătorul altor subrutine etc. În acest caz, întreruperile sunt permise doar pentru a schimba nivelul (nu putem pierde alte întreruperi, deoarece acestea nu sunt pur și simplu) și eu, pentru a simplifica programul și percepția acesteia, a constatat că este posibil să se îndepărteze de aceste principii. Aici, în manipultorul de întrerupere există cicluri și un apel către un alt subprogram și (despre groază!) Chiar și tranziția la modul de repaus. Prin urmare, în antet, programul se numește "greșit". În acest caz, manipulatorul de întrerupere este folosit ca un subprogram regulat, totuși, în alte cazuri, principiile de mai sus rămân în vigoare.

Caracteristicile scurte ale dispozitivului:

Dispozitivul este un model al unei lumini de trafic stradă cu o simulare fiabilă a funcționării sale (comutare de flori, verde de culoare) și are funcții suplimentare: Schimbați frecvența de comutare apăsând butonul, modul de clipește este galben, trecerea la modul de repaus în Modul manual și automat urmat de pornirea butonului apăsând butonul. Acest dispozitiv poate fi folosit ca jucărie pentru copii, precum și o alocație vizuală în instituțiile preșcolare ale copiilor atunci când predă copiii pe comportamentul rutier.

Deci, ne întoarcem la descrierea și luarea în considerare a schemei:

Schema este colectată pe un microcontroler ieftin. Direct pentru controalele LED, sunt utilizate concluzii GP0-GP2, GP4, GP5 (picioarele 7, B, 5, 3, 2), programate ca ieșiri. LED-urile pentru fiecare direcție sunt combinate în grupuri seriale, ceea ce vă permite să minimalizați curentul consumat. Rezistențele R3-R8 limitează curenții LED. În cazul unei diferențe puternice în returnarea LED-urilor de diferite culori, va trebui să selectați rezistențele corespunzătoare. Eu, de exemplu, două grupări galbene sunt conectate în paralel și conectate la un rezistor și același nominal ca restul și strălucește chiar și un pic mai strălucitor decât altele (se întoarce mai mult).

În această schemă, LED-urile sunt hrănite la 1,5 în mai mult de un microcontroler dintr-un element suplimentar (în acest caz, când ieșirea curentă este oprită, nu trece la ieșirea microcircuitului, deoarece este mult mai multă tensiune pentru a deschide tranzițiile din două LED-uri de 1,5 V (cel puțin 2,5 ° C). Și chiar și cu defalcarea ambelor LED-uri (care este puțin probabil), curentul printr-o diodă de protecție internă pe o putere plus va fi de aproximativ 7,5 mA, ceea ce este mult mai puțin admisibil. Consumul curent de LED-uri este mult mai mare decât consumul de MK, prin urmare, diferența de descărcare a elementelor (prin intermediul unui consum de curent al MK nu curge) Este posibil să se neglijeze. Este stabilit experimental că, în ciuda scăderii curentul prin intermediul LED-urilor atunci când bateria este descărcată, luminozitatea strălucirii lor rămâne la un nivel acceptabil în întreaga gamă de tensiune a bateriei. Diagrama este extrem de simplificată și nu există stabilizator de tensiune care consumă curent suplimentar, ceea ce a făcut posibilă abandonarea Comutator de alimentare (consum curent în modul de repaus - 1-3 m ka).

Butonul de comandă al operațiunilor dispozitivului este conectat la ieșirea GP3 (piciorul 4), care în biții de configurare este declarat ca o intrare digitală. Când apăsați butonul, întreruperea apare în procesarea căreia apare următoarele. Cu apăsare lungă (mai mult de 4 s), dispozitivul intră în modul Sleep. Cu presiuni mai scurte, există o comutare secvențială a vitezei de semafor într-un cerc cu indicarea vitezei curente în funcție de desen:

În ultimul mod (LED-urile roșii sunt aprinse), modul de semnal galben clipește este pornit. Cu o apăsare lungă a butonului (confirmată de populația tuturor LED-urilor), mergeți la funcționarea normală cu schimbarea modului la unul nou, dacă butonul nu este apăsat mai mult de 6 secunde., Modul de operare rămâne același ca și Butonul este apăsat.

Elementele de încărcare AA în modul Sleep este suficientă pentru nu mai puțin de un an, motiv pentru care comutatorul de alimentare nu este furnizat în dispozitiv. Dispozitivul intră în modul de repaus și după 0,5 - 1 oră (depinde de viteza culorilor de comutare) fără a afecta butonul. Din modul de repaus, ieșirea are loc la orice apăsare a butonului. Microcontrolerul este alimentat de ieșiri 1 și 8. Pentru a salva concluzii și a simplifica designul, acesta este pornit în modul generatoare interne fără elemente externe.

Explicații mici pentru program, care este furnizat în investiție:

Procesarea butonului de presare este realizată în subrotine: wait_butt __- așteaptă apăsarea și înregistrarea 6s. Fără apăsarea, push_butt __- Înregistrarea duratei de clic, Wait_Nobutt __ - Așteptarea unui buton care nu este apăsat. În momentele de schimbare a stării de semafor (verde galben și clipește), portul de ieșire este citit de la masă în subrutina Tact__ (semi-tort mai tânăr sau senior). În mod similar, indicatorul de stare când este apăsat butonul - de la subrutina indică. Pentru a merge la modul de repaus după timpul de funcționare, se produce o tranziție obligatorie la subrutina de manipulare a întreruperii de către software pentru a instala software-ul de pavilion de întrerupere. Schimbarea Constanței Constanța, Const_reg, Const_SL poate fi modificată în mod corespunzător, perioada de clipește verde, modul inițial la conectarea bateriei, timpul de funcționare fără a influența tranziția la modul de repaus.

Placa de circuite imprimată este realizată din fibră de sticlă cu o singură față și are dimensiuni de 22x87 mm. LED-urile extreme sunt stabilite paralele cu placa în direcții diferite. Media setată unul din partea părții părților și cealaltă - pe partea laterală a pieselor cu ieșirea concluziilor în deschiderile plăcii și le fixează din părțile izvoarelor de lipire și pe partea laterală a pieselor prin lipirea pe piesele corespunzătoare.

Toate rezistoarele cu o capacitate de 0,125 wați. LED-urile pot fi luate orice tip intern sau importat de dorit cu o scădere directă de tensiune la un curent de 10 mA de aproximativ 2 volți. Buton - orice fără fixare. Microcontrolerul este instalat pe bloc.

Cuvântul de configurare este introdus automat în memorie când firmware-ul este încărcat (în IC-PROG, "pasărea" este instalată numai în elementul PWRT, elementele rămase "Resetare", în coloana "oscilator" set "INTSCOC GP4" ). Este necesar mai întâi să citiți firmware-ul cu un cip curat și să scrieți valoarea cuvântului la sfârșitul memoriei programului la 03FF, ceea ce este necesar pentru configurarea frecvenței generatorului intern al instanței specifice a cipului. După descărcarea în programul de fișiere Hex, trebuie să prescrieți manual această valoare la 03FF. În acest dispozitiv, abaterea de frecvență nu este critică, dar totuși ar trebui să știți că acest microcircuit necesită o astfel de procedură. În cazuri extreme, dacă valoarea fabricii este pierdută, puteți face orice - programul a luat măsuri pentru munca corectă și în acest caz.

Dispozitivul este plasat într-o cutie de plastic adecvată. Găurile relevante se fac sub LED-urile din cutie și capacul. În realizarea mea, semaforul în sine și baza cu butonul și bateria sunt conectate prin segmentul țevii de apă din plastic, cu un diametru de 20 mm.

Buna!
Vreau să arăt cum este scris programul pentru a controla echipamentul tehnologic pe PLC.
Cel mai adesea am tratat producția PLC de Schneider Electric. Cuantumul ales de mine pentru această sarcină este cel mai puternic și mai scump PLC al acestui producător. Poate controla echipamentul cu mii de semnale pentru semafoare în viata reala Nimeni nu o folosesc în mod natural.

Nu am fost niciodată implicat în automatizarea luminilor de trafic, așa că algoritmul a venit cu el însuși. Aici este:
1. Semafor pentru trecerea pietonilor reglabilă. Acestea. Semafor pentru autoturisme, semafoare pietonală și un buton pentru pietoni făcând clic, un pieton notifică despre dorința de a muta drumul.
2. După începerea programului, verde pentru mașini și roșu pentru pietoni se aprind.
3. După apăsarea butonului, pietonii începe să clipească verde pentru mașini, apoi galben, apoi roșu. După aceea, verde pentru pietoni se aprinde, prin regleaza ora Începe să clipească, roșu pentru pietoni se aprinde, apoi galben și roșu se aprinde pentru mașini, apoi verde.
4. Pentru o perioadă predeterminată de timp după verde pe semafor pietonală, apăsarea butonului pietonal nu pornește algoritmul de tranziție. Algoritmul de tranziție este pornit în acest caz numai după expirarea timpului specificat.
Programarea PLC se desfășoară în mediul de programare a unității în limbile standard IEC 61131-3. ÎN acest standard Sunt incluse 5 limbi. De exemplu, am ales limba blocurilor de funcții - FBD.
Iată un browser de proiect în Unitate:

Configurați PLC:


PLC constă dintr-un panou de montare, o unitate de alimentare (1), un controler (2), un modul de intrare discret 32 \u200b\u200bdin semnalul de 24V DC (4), un modul de intrare discret pentru semnalul de 32 de DC 24V (5). În proiectul real al panourilor de montare conectate la un controler prin diverse rețelePoate fi zeci, iar modulele I / O sunt sute.
Creați variabile necesare tipurilor în editorul de variabile:


Variabilele afectate de module I / O au o adresă care arată coșul, modulul și canalul este legat un semnal.
Programul este alcătuit din secțiuni efectuate de fiecare ciclu de scanare al controlerului în ordine.
Un ciclu de scanare a controlerului simplificat arată astfel:
1. Citiți semnalele de intrare din modulul de intrare la variabilele cu adrese.
2. Efectuarea secțiunilor.
3. Înregistrarea valorilor de la variabilele cu adrese la modulele de ieșire de ieșire.
4. Tranziție la revendicarea 1.
Creați o secțiune de ceas cu un generator de impuls cu o perioadă de 0,5 secunde. Unitatea TP Când semnalul de intrare se modifică de la 0 la 1 la ieșire, acesta dă pulsul unei anumite durate.


Aici și sub capturile de ecran ale secțiunilor sunt date în modul Animație și nu modul de editare. Acestea sunt afișate valori ale valorilor variabile la ora curentă atunci când se conectează la un PLC cu un program încărcat (numere pentru variabile numerice, culoare verde (1) -cain (0) pentru boolean).
Secțiunea principală procesează logica principală.
Unitatea SR se fixează la 1 la S1 \u003d 1 și resetează ieșirea la 0 la r \u003d 1.
Unitatea R_TRIG stabilește ieșirea la 1 ciclu de scanare în 1 când introduceți intrarea de la 0 la 1 (detector frontal).
Block F_TRIG Seturi de ieșire la 1 ciclu de scanare în 1 atunci când introduceți intrarea de la 1 la 0 (detector de margine spate).
Variabila INBUTTON, legată de butonul butonului, este înlocuită cu secțiunea de pe InbuttonFort, pentru a-și schimba valoarea pe simulatorul controlerului fără echipament real.


Secțiunea de ieșire generează semnale de ieșire pentru a controla luminile de semafor.


Descărcați proiectul la simulatorul controlerului:


Valoarea oricăror variabile poate fi vizualizată în tabelul de animație:


Dar pentru confortul depanării, puteți face ecranul operatorului cu o grafică simplă, a cărui animație este legată de variabila:

Încercăm să mutăm drumul:

Nu m-am așteptat ca să controleze un astfel de obiect simplu, ca un semafor, va dura 30 de blocuri.
În următorul articol vă voi arăta cum să scrieți acest programUtilizarea tuturor limbilor standard IEC 61131-3 în același timp.

Actualizare. A corectat o greșeală în numele standardului.

(Figuri), (panou).

Înainte de a crea o aplicație, trebuie studiată o descriere a noilor componente.

Sarcina. Modelarea activității de semafor. Când porniți proiectul, panoul de trafic trebuie să fie gol. După apăsarea butonului Start, becul de lumină începe va începe comutarea. După apăsarea butonului STOP - panoul de lumină este gol din nou. Folosind un cronometru, pentru a schimba semnalul de trafic la intervale egale. În câmpul de viteză, este introdus intervalul temporizatorului.

Progresul proiectului

1. Creați proiect nou. Salvați-l într-un dosar separat, numele "semafoare".

2. Puneți pe panoul de formă (TSHAPE), două butoane (Tbutton), un câmp de text (TEDIT), inscripția (TLABEL), cronometrul (TTIMER) în conformitate cu eșantionul:

Acest lucru ar trebui să arate așa:

2. Facem înregistrarea:

Setați aceste valori ale proprietăților în Inspectorul Objector:

Componenta Proprietate Valoare
Forma1. Legendă Semafor
Panou1. Legendă * Gol *
Forma1. Formă sTCIRCIA.
Forma2. Formă sTCIRCIA.
Forma3. Formă sTCIRCIA.
Etichetă1 Legendă Viteză
Edita1. TEXT. * Gol *
Buton1. Legendă start
Buton2. Legendă Stop

3. Creați un eveniment pentru formularul din secțiunea Oncreate - apăsați TroyTeTeTater

Creați un eveniment pentru Timer1 în secțiunea Ontimer - Apăsați Truech-ul

4. Setați culorile la cifre:

Tip final:

5. În timpul încărcării formei, cronometrul este oprit, formele de pe panou devin invizibile.

Creați un handler de evenimente Formcreate (de două ori, faceți clic pe componenta Form1) și introduceți acest cod:

vAR K: INTEGER; Procedură TFORM1.Formcreate (expeditor: TOGJECT); Începe cronometrul1.Enabled: \u003d FALSE; Forma1.vizibil: \u003d FALSE; Shape2.vizibil: \u003d FALSE; Shape3.visible: \u003d FALSE; Sfârșit;

6. Pentru a schimba becurile, scrieți codul programului în manipulatorul evenimentului Timer1Timer. Acest cod va fi efectuat cu intervalul că utilizatorul intră în viteza din câmp. În funcție de mărturia cronometrului, numărul becului este determinat, care ar trebui angajat în acest moment.

De două ori faceți clic pe componenta Timer1 și introduceți acest cod:

6. Scrieți codul programului pentru butonul START. Făcând clic pe butonul din câmp, intervalul pentru temporizator este citit, se introduc citirile cronometrului, cronometrul se aprinde.

De două ori faceți clic pe componenta Button1 și introduceți codul:

procedură tform1.button1Click (expeditor: togject); Începe cronometrul1.Interval: \u003d strtoint (edit1.text); K: \u003d 0; Timer1.Enabled: \u003d Adevărat; Sfârșit;

7. Scrieți codul programului pentru butonul STOP. După ce faceți clic pe buton, temporizatorul trebuie să se oprească, becurile sunt din nou invizibile.

De două ori faceți clic pe componenta buton2 și introduceți codul:

procedură tform1.button2Click (expeditor: togject); Începe cronometrul1.Enabled: \u003d FALSE; Forma1.vizibil: \u003d FALSE; Shape2.vizibil: \u003d FALSE; Shape3.visible: \u003d FALSE; Sfârșit;

8. Rulați proiectul. În câmpul Viteză, introduceți numărul 1000 (1000 MS \u003d 1C). Becurile de lumină ale semaforului vor începe trecerea la un interval într-o secundă.

Artem Poznyak, student 10 "o clasă de școală nr. 23, Ekibasbuz

Mulți cred că asamblarea este deja depășită și nu a folosit nicăieri, ci mai ales tineri care nu sunt angajați în programarea sistemică profesională. Dezvoltarea software-ului, desigur, este bună, dar spre deosebire de limbile de programare la nivel înalt, asamblorul va învăța profund înțelegerea activității calculatorului, va optimiza munca cu resursele hardware, precum și programul oricărei tehnici, dezvoltând astfel în direcția direcției învățare automată. Pentru a înțelege acest vechi yap, mai întâi ar trebui să fie practicat cu programe simpleCare explică cel mai bine funcționalitatea asamblorului.

IDE pentru asamblare.

Prima întrebare: În ce mediu de dezvoltare este programul la asamblare? Răspunsul este neechivoc - MASM32.. aceasta program standardfolosit pentru acest jap. Puteți să-l descărcați pe site-ul oficial MASM32.com sub forma unei arhive care va trebui să despacheteze și după executarea instalatorului Install.exe. Ca o alternativă, puteți utiliza FIMM, dar codul va fi semnificativ diferit pentru acesta.

Înainte de muncă, principalul lucru nu este să uitați să adăugați o linie de cale la variabila sistemului:

C: \\ MASM32 \\ bin

Bună ziua Program World pe Assembler

Se crede că acest lucru program de bază În programarea că începătorii scriu în primul rând. Poate că această abordare nu este destul de credincioasă, dar într-un fel sau altul vă permite să vedeți imediat un rezultat vizual:

386 lib / kernel32.lib .data msg_title db "titlu", 0 msg_message db "salut lume", 0.code Start: Invoce Messagebox, 0, adds msg_message, add msg_title, mb_ok invocat ieșireProcess, 0 sfârșitul final

Pentru a începe cu, lansați editorul Qdeitor.exe în dosarul cu MASM32 instalat și în el scriem codul programului. După ce îl salvăm ca un fișier cu extensia ".asm" și programul Bildim utilizând elementul de meniu al proiectului → "Construiți toate". Dacă nu există erori în cod, programul este compilat cu succes, iar la ieșire vom obține un fișier EXE preparat care va apărea fereastră de ferestre Cu inscripția "Bună ziua".

Adăugarea a două numere pe asamblare

În acest caz, arătăm dacă cantitatea de numere este zero sau nu. Dacă da, atunci mesajul corespunzător apare pe ecran și, dacă nu, există o notificare diferită.

486 .Model plat, STDCall Opțiune Casemap: Niciuna include /Masm32/include/windows.inc includeți /MASM32/include/user32.inc includ /Masm32/include/kernel32.cloud includelib /masm32/lib/user32.lib includElib / Masm32 / lib / kernel32.lib includ / EMASM32 / MacroS / Macros.asm Uselib Masm32, COMCTL32, WS2_32 .Data. Cod Start: MOV EAX, 123 MOV EBX, -90 Adăugați EAX, EBX Test EAX, EAX JZ ZERO INVOKEBOX, 0, Chry $ ("în eax nu 0!"), Chry $ ("info"), 0 JMP LEXIT ZERO: INVOKE MESACHBOX, 0, CHR $ ("în EAX 0!"), CHR $ ("Info"), 0 LEXIT: INVOKE EXITPROSSCES, 0 START START

Aici folosim așa-numitele etichete și echipe speciale Cu utilizarea lor (JZ, JMP, testul). Vom discerne mai multe:

  • test - utilizat pentru compararea logică a variabilelor (operanzii) sub formă de octeți, cuvinte sau cuvinte duble. Pentru comparație, comanda utilizează multiplicare logică și se uită la biți: dacă sunt egali cu 1, atunci rezultatul va fi 1, altfel - 0. Dacă am obține 0, steagurile sunt stabilite împreună cu ZF (Zero Flag ), care va fi egal cu 1. Următoarele rezultate sunt analizate pe baza ZF.
  • jNZ - În cazul în care steagul ZF nu a fost livrat nicăieri, trecerea pe această etichetă. Adesea, această comandă este aplicată dacă programul are operațiuni de comparație care afectează cumva rezultatul ZF. Aceasta include testul și CMP.
  • jz - dacă steagul ZF a fost încă instalat, tranziția de la etichetă.
  • jMP - indiferent dacă există ZF sau nu, tranziția este făcută de etichetă.

Numărul de numere pe asamblare

Program primitiv care arată procesul de însumare a două variabile:

486 .Model plat, STDCall Opțiune Casemap: Niciuna include /Masm32/include/windows.inc includeți /MASM32/include/user32.inc includ /Masm32/include/kernel32.cloud includelib /masm32/lib/user32.lib includElib / Masm32 / lib / kernel32.lib includ / EMASM32 / Macros / Macros.asm UseLib Masm32, COMCTL32, WS2_32 .Data msg_title db "Titlu", 0 A db 1H B DB 2H Buffer DB 128 DUP (?) Format DB "% D", 0 .Code Start: MOV AL, Adăugați AL, B Invocați WSPrintf, Tampon ADR, format AddR, EAX INVOKEBOX, 0, ADR Buffer, AddR Msg_TITLE, MB_OK INVOKE EXITPROSSCESS, 0 Start Fince

În asamblare pentru a calcula suma, va fi necesar să se efectueze o mulțime de acțiuni, deoarece limbajul de programare funcționează direct cu memoria sistemului. Aici manipulam mai mult resursele și indicăm în mod independent cât de mult pentru a evidenția variabila, în ce formă de percepe numere și unde să le facem.

Obținerea valorii din linia de comandă de pe asamblare

Una dintre acțiunile importante de bază în programare este obținerea de date din consola pentru prelucrarea lor ulterioară. În acest caz, le luăm de la ei linie de comanda și afișați în fereastra Windows:

486 .Model plat, STDCall Opțiune Casemap: Niciuna include /Masm32/include/windows.inc includeți /MASM32/include/user32.inc includ /Masm32/include/kernel32.cloud includelib /masm32/lib/user32.lib includElib / Masm32 / lib / kernel32.lib includ / emasm32 / macros / macroS.asm USLIB MASM32, COMCTL32, WS2_32 .Data. codul de pornire: apelați GetComandline; Rezultatul va fi plasat în EAX Push 0 Push CHR $ ("linia de comandă") Apăsați EAX; Text pentru ieșire Luăm din EAX Push 0 Call Messagebox Push 0 Apel Solution StartProcess Start

De asemenea, puteți utiliza o metodă alternativă:

486 .Model plat, STDCall Opțiune Casemap: Niciuna include /Masm32/include/windows.inc includeți /MASM32/include/user32.inc includ /Masm32/include/kernel32.cloud includelib /masm32/lib/user32.lib includElib / Masm32 / lib / kernel32.lib includ / emasm32 / macros / macroS.asm USLIB MASM32, COMCTL32, WS2_32 .Data. codul de pornire: apelați GetComandline; Rezultatul va fi plasat în EAX INVOKE GETCOMMANDINE INVOKEBOX, 0, EAX, CHR $ ("Linia de comandă"), 0 Invocare ExitProcess, 0 Apăsați 0 apel Apel Start End Start

Aici este folosit INVOKE - un macro special cu care codul programului este simplificat. În timpul compilării, comenzile macro sunt transformate în comenzile de asamblare. Oricum, folosim un stivă - o modalitate primitivă de stocare a datelor, dar în același timp foarte convenabil. Prin acordul STDCALL, în toate funcțiile WinAPI, variabilele sunt transmise prin stivă, numai în ordine inversăși plasate în Registrul EAX corespunzător.

Cicluri în asamblare

Utilizați opțiunea:

DATE MSG_TITLE DB "Titlu", 0 A DB 1H Buffer DB 128 DUP (?) Format DB "% D", 0.Code Start: MOV AL, ANEPEAT INC Al .until Al \u003d\u003d 7 Invoca WWRNTF, ADR Tampon, Addr Format, Al Invoce Messagebox, 0, ADR Tampon, AddR Msg_TITLE, MB_OK INVOKE EXITPROSSESS, 0 END Start .DATA MSG_TITLE DB "Titlu", 0 Tampon DB 128 DUP (?) Format db "% D", 0.Code Start: MOV EAX, 1 MOV EDX, 1 .FILE EXTX \u003d\u003d 1 Inc EAX. Dacă eAX \u003d\u003d 7. -NGAK .Dendif .endw invocă WPRNTF, ADR Tampon, format AddR, EAX INVOKEBOX, 0, ADR Buffer, Addr Msg_TITLE, MB_OK Invocați ieșire, 0

Pentru a crea un ciclu, utilizați comanda repetată. Apoi, utilizând Inc crește valoarea unei variabile cu 1, indiferent dacă este în memorie cu acces aleatorsau în procesor în sine. Pentru a întrerupe funcționarea ciclului, se utilizează directiva ". Poate fi cum să opriți ciclul și să continuați acțiunea după "pauză". De asemenea, puteți întrerupe executarea codului programului și puteți verifica repetarea și, în timp ce condiția utilizând Directiva ".continue".

Cantitatea de elemente de matrice pe asamblare

Aici rezumă valorile variabilelor din matrice utilizând ciclul "pentru":

486 .Model plat, STDCall Opțiune Casemap: Niciuna include /Masm32/include/windows.inc includeți /MASM32/include/user32.inc includ /Masm32/include/kernel32.cloud includelib /masm32/lib/user32.lib includElib / Masm32 / lib / kernel32.lib include /masm32/macros/macros.asm UseLib Masm32, COMCTL32, WS2_32 .Data msg_title db "titlu", 0 A db 1H x DD 0,1,2,3,4,5,6,7, 8,9,10,11 N DD 12 Tampon DB 128 DUP (?) Format DB "% D", 0.Code Start: MOV EAX, 0 MOV ECX, N MOV EBX, 0 L: Adăugați EAX, X Adăugați EBX, Tipul X DEC ECX CMP ECX, 0 JNE L INVOKE WWRNTF, Tampon ADR, format AddR, EAX INVOKEBOX, 0, ADR Buffer, Addr Msg_TITLE, MB_OK INVOKE EXITPROSSESS, 0 START DE START

Comanda Dec, precum și Inc, modifică valoarea operandului pe unitate, numai în direcția opusă, pe -1. Dar CMP compară variabilele prin scăderea: ia o valoare de la al doilea și, în funcție de rezultat, se pun steagurile corespunzătoare.

Folosind comanda JNE, eticheta se bazează pe eticheta bazată pe compararea variabilelor. Dacă este negativă - există o tranziție, iar dacă operanții nu sunt egali unul cu celălalt, tranziția nu este efectuată.

Asamblorul este interesant pentru prezentarea de variabile, ceea ce vă permite să faceți ceva cu ei. Specialist care a dat seama în toate subtilitățile din această limbă Programarea, deține cunoștințe foarte valoroase care au multe modalități de utilizare. O sarcină poate fi rezolvată cel mai mult căi diferitePrin urmare, calea va fi o spinoasă, dar nu mai puțin interesantă.

Post Vizualizări: 767