Lampu lalu lintas pada PIC12F629 dengan program "salah". Program perakitan untuk menjumlahkan angka

Ketika putra saya menempelkan boneka lampu lalu lintas dari kertas untuk sekolah, muncul pemikiran: "Mengapa tidak merakit model lampu lalu lintas yang berfungsi untuknya di mikrokontroler." Di Internet, ada banyak skema dan program untuk mereka, menerapkan prinsip lampu lalu lintas paling sederhana. Tetapi mereka terlalu rumit untuk sebuah mainan (konverter DC-DC, register geser, dll.) atau hanya disajikan sebagai contoh program paling sederhana di assembler. Saya ingin menyajikan program bahasa skema dan rakitan untuk lampu lalu lintas mainan lengkap dengan beberapa fungsi tambahan. Selain itu, dipasang pada mikrokontroler "sen" sesuai dengan skema paling sederhana, yang penting bagi pemula. Semoga ini sirkuit sederhana akan menjadi bagi banyak pemula dalam pemrograman mikrokontroler PIC, desain berbasis PIC nyata pertama. Sederhana, tetapi pada saat yang sama mengandung teknik dasar dan atribut pemrograman, program akan membuatnya mudah untuk dipahami dan bereksperimen dengannya.

Setiap orang yang berurusan dengan mikrokontroler pemrograman mengetahui prinsip dasar penulisan penangan interupsi: waktu eksekusi sesingkat mungkin dan kode sesingkat mungkin, tidak ada loop dan panggilan dari penangan subrutin lain, dll. Dalam hal ini, interupsi hanya diperbolehkan pada perubahan level (kami tidak dapat melewatkan interupsi lain, karena mereka tidak ada) dan saya, untuk menyederhanakan program dan persepsinya, menganggap mungkin untuk menyimpang dari prinsip-prinsip ini. Di sini, di pengendali interupsi ada loop, dan panggilan ke subrutin lain, dan (oh horor!) Bahkan transisi ke mode SLEEP. Oleh karena itu, dalam judul, program ini disebut "salah". DI kasus ini, pengendali interupsi digunakan sebagai subrutin reguler, namun, dalam kasus lain, prinsip di atas, tentu saja, tetap berlaku.

Karakteristik singkat perangkat:

Perangkat ini adalah model lampu lalu lintas jalan dengan simulasi operasi yang andal (beralih warna, berkedip hijau) dan memiliki fungsi tambahan: mengubah frekuensi switching dengan menekan tombol, berkedip mode kuning, beralih ke mode tidur secara manual dan mode otomatis diikuti dengan menyalakan dengan menekan tombol. Perangkat ini dapat digunakan sebagai mainan anak-anak, serta alat bantu visual di lembaga prasekolah ketika mengajar anak-anak bagaimana berperilaku di jalan.

Jadi, mari kita beralih ke deskripsi dan pertimbangan sirkuit.

Sirkuit ini dirakit pada mikrokontroler PIC12F629 yang murah. Output GP0-GP2, GP4, GP5 (pin 7, b, 5, 3, 2), diprogram sebagai output, digunakan langsung untuk mengontrol LED. LED di setiap arah digabungkan ke dalam grup seri, yang meminimalkan konsumsi arus. Resistor R3-R8 membatasi arus LED. Jika ada perbedaan kuat dalam output LED dengan warna berbeda, Anda harus memilih resistor yang sesuai. Bagi saya, misalnya, dua kelompok kuning terhubung secara paralel dan terhubung ke satu resistor, dan nilainya sama dengan yang lain dan bersinar bahkan sedikit lebih terang dari yang lain (rekoil lebih besar).

Di sirkuit ini, LED diumpankan 1,5 V lebih banyak daripada mikrokontroler dari elemen tambahan (dalam hal ini, ketika output mati, arus tidak mengalir ke output sirkuit mikro, karena tegangan yang jauh lebih tinggi diperlukan untuk membuka transisi dua LED (setidaknya 2,5 B). Dan bahkan dengan kedua LED tertusuk (yang tidak mungkin), arus melalui dioda pelindung internal ke plus catu daya akan menjadi sekitar 7,5 mA, yang jauh lebih kecil daripada arus yang diizinkan. Secara eksperimental ditetapkan bahwa, meskipun ada penurunan arus melalui LED ketika baterai habis, kecerahan cahayanya tetap pada tingkat yang dapat diterima di seluruh rentang tegangan baterai. arus, yang memungkinkan untuk ditinggalkan sakelar daya (konsumsi saat ini dalam mode tidur - 1-3 m kA).

Tombol untuk mengontrol mode operasi perangkat terhubung ke pin GP3 (pin 4), yang dinyatakan sebagai input digital dalam bit konfigurasi. Ketika tombol ditekan, interupsi terjadi, di mana handler yang berikut ini terjadi. Saat ditekan untuk waktu yang lama (lebih dari 4 detik), perangkat memasuki mode tidur. Dengan penekanan yang lebih pendek, ada peralihan berurutan dari kecepatan lampu lalu lintas dalam lingkaran dengan indikasi kecepatan saat ini sesuai dengan gambar.

Dalam mode terakhir (LED merah menyala), sinyal berkedip kuning diaktifkan. Dengan menekan lama pada tombol (dikonfirmasi dengan padamnya semua LED), kami beralih ke operasi normal dengan mengubah mode ke yang baru, jika tombol tidak ditekan lebih dari 6 detik, mode operasi tetap sama seperti sebelum tombol ditekan.

Pengisian daya sel AA dalam mode tidur akan bertahan setidaknya selama satu tahun, itulah sebabnya perangkat tidak memiliki sakelar daya. Perangkat masuk ke mode tidur juga setelah 0,5 - 1 jam (tergantung pada kecepatan pergantian warna) tanpa mempengaruhi tombol. Mode SLEEP keluar dengan menekan tombol apa saja. Daya disuplai ke mikrokontroler melalui pin 1 dan 8. Untuk menghemat pin dan menyederhanakan desain, mode generator internal tanpa elemen eksternal diaktifkan.

Penjelasan kecil untuk program ini, yang diberikan dalam lampiran.

Pemrosesan klik tombol dilakukan dalam subrutin: wait_butt __- menunggu menekan dan mendaftar selama 6 detik. tanpa menekan, push_butt __- pendaftaran durasi menekan, wait_nobutt __- menunggu tombol yang tidak ditekan. Saat status lampu lalu lintas berubah (kuning dan hijau berkedip), nilai untuk port keluaran dibaca dari tabel di subrutin tact__ (kuean rendah atau tinggi). Demikian juga, indikasi status saat tombol ditekan berasal dari subrutin ind__. Untuk beralih ke mode tidur setelah berakhirnya waktu pengoperasian, transisi paksa ke subrutin pemrosesan interupsi terjadi oleh: instalasi perangkat lunak bendera interupsi. Dengan mengubah konstanta CONST_MIN, CONST_REG, CONST_SL, Anda dapat mengubah periode kedipan hijau, mode awal saat baterai terhubung, waktu pengoperasian tanpa dampak hingga transisi ke mode SLEEP.

Papan sirkuit tercetak terbuat dari fiberglass berlapis foil satu sisi dan memiliki dimensi 22x87 mm. LED terluar dipasang sejajar dengan papan dalam arah yang berbeda. Yang tengah dipasang satu dari sisi pemasangan bagian, dan yang lain dari sisi trek dengan memasukkan ujung ke dalam lubang papan dan memperbaikinya dari sisi bagian dengan setetes solder, dan dari sisi trek dengan menyolder ke trek yang sesuai.

Semua resistor 0,125W. LED dapat diambil domestik atau impor apa pun, lebih disukai dari jenis yang sama dengan penurunan tegangan langsung pada arus 10 mA sekitar 2 Volt. Tombol - apapun tanpa memperbaiki. Mikrokontroler dipasang di blok.

Kata konfigurasi dimasukkan ke dalam memori secara otomatis ketika firmware dimuat ("birdie" hanya dipasang di item "PWRT", item lainnya "dihapus", "intOSC GP4" diatur di "osilator" kolom). Pertama, Anda perlu membaca firmware dari sirkuit mikro yang bersih dan menulis nilai kata di akhir memori program di alamat 03FF, yang diperlukan untuk menyesuaikan frekuensi generator internal dari instance sirkuit mikro tertentu. Setelah memuat file HEX ke dalam program, nilai ini harus dimasukkan secara manual pada 03FF. DI alat ini penyimpangan frekuensi tidak kritis, tetapi Anda harus tetap menyadari bahwa prosedur ini diperlukan untuk sirkuit mikro ini. Sebagai upaya terakhir, jika nilai pabrik hilang, Anda tidak dapat melakukan apa pun - program telah mengambil tindakan untuk operasi yang benar dalam kasus ini.

Perangkat ditempatkan dalam kotak plastik yang sesuai. Lubang yang sesuai dibuat untuk LED di dalam kotak dan tutupnya. Dalam versi saya, lampu lalu lintas itu sendiri dan alas dengan tombol dan baterai dihubungkan melalui sepotong pipa air plastik dengan diameter 20 mm.

Aplikasi ini berisi: model, papan sirkuit tercetak dalam format LAY, program assembler MPASM, file firmware HEX.

Daftar elemen radio

Penunjukan Sebuah tipe Denominasi jumlah CatatanSkorbuku catatan saya
IC1 MK PIC 8-bit

PIC12F629

1 MENUKIK Ke dalam notepad
R1 Penghambat

3 k

1 0.125W Ke dalam notepad
R2 Penghambat

100 ohm

1 0.125W Ke dalam notepad
R3-R8 Penghambat

200 Ohm

6 0.125W Ke dalam notepad
HL1, HL2, HL9, HL10 Dioda pemancar cahaya

AL307A

4 MERAH Ke dalam notepad
HL3, HL4, HL11, HL12 Dioda pemancar cahaya

Ketika putra saya menempelkan boneka lampu lalu lintas dari kertas untuk sekolah, muncul pikiran: "Mengapa tidak merakit model lampu lalu lintas yang berfungsi untuknya di mikrokontroler." Di Internet, ada banyak skema dan program untuk mereka, menerapkan prinsip lampu lalu lintas paling sederhana. Tetapi mereka terlalu rumit untuk sebuah mainan (konverter DC-DC, register geser, dll.) atau hanya disajikan sebagai contoh program paling sederhana di assembler. Saya ingin menyajikan program bahasa skema dan rakitan untuk lampu lalu lintas mainan lengkap dengan beberapa fungsi tambahan. Selain itu, dipasang pada mikrokontroler "sen" sesuai dengan skema paling sederhana, yang penting bagi pemula. Semoga rangkaian sederhana ini akan menjadi desain berbasis PIC nyata pertama bagi banyak orang yang mulai belajar pemrograman PIC. Sederhana, tetapi pada saat yang sama mengandung teknik dasar dan atribut pemrograman, program akan membuatnya mudah untuk dipahami dan bereksperimen dengannya.

Setiap orang yang berurusan dengan mikrokontroler pemrograman mengetahui prinsip-prinsip dasar penulisan penangan interupsi: waktu eksekusi sesingkat mungkin dan kode sesingkat mungkin, tidak ada loop dan panggilan dari penangan subrutin lain, dll. Dalam hal ini, interupsi hanya diperbolehkan pada perubahan level (kami tidak dapat melewatkan interupsi lain, karena mereka tidak ada) dan saya, untuk menyederhanakan program dan persepsinya, menganggap mungkin untuk menyimpang dari prinsip-prinsip ini. Di sini, di pengendali interupsi ada loop, dan panggilan ke subrutin lain, dan (oh horor!) Bahkan transisi ke mode SLEEP. Oleh karena itu, dalam judul, program ini disebut "salah". Dalam hal ini, pengendali interupsi digunakan sebagai subrutin normal, namun, dalam kasus lain, prinsip di atas, tentu saja, tetap berlaku.

Karakteristik singkat perangkat:

Perangkat ini adalah model lampu lalu lintas jalan dengan simulasi operasi yang andal (beralih warna, berkedip hijau) dan memiliki fungsi tambahan: mengubah frekuensi switching dengan menekan tombol, berkedip mode kuning, beralih ke mode tidur secara manual dan otomatis mode, diikuti dengan menyalakan dengan menekan tombol. Perangkat ini dapat digunakan sebagai mainan anak-anak, serta alat bantu visual di lembaga prasekolah ketika mengajar anak-anak bagaimana berperilaku di jalan.

Jadi, mari kita beralih ke deskripsi dan pertimbangan sirkuit:

Sirkuit ini dirakit pada mikrokontroler yang murah. Output GP0-GP2, GP4, GP5 (pin 7, b, 5, 3, 2), diprogram sebagai output, digunakan langsung untuk mengontrol LED. LED di setiap arah digabungkan secara seri untuk meminimalkan konsumsi arus. Resistor R3-R8 membatasi arus LED. Dalam kasus perbedaan yang kuat dalam output LED dengan warna yang berbeda, Anda harus memilih resistor yang sesuai. Bagi saya, misalnya, dua kelompok kuning terhubung secara paralel dan terhubung ke satu resistor, dan nilainya sama dengan yang lain dan bersinar bahkan sedikit lebih terang dari yang lain (rekoil lebih besar).

Di sirkuit ini, 1,5 V disuplai ke LED lebih banyak daripada ke mikrokontroler dari elemen tambahan (dalam hal ini, ketika output mati, arus tidak mengalir ke output sirkuit mikro, karena tegangan yang jauh lebih tinggi diperlukan untuk membuka transisi dua LED (setidaknya 2,5 B).Dan bahkan dengan kedua LED tertusuk (yang tidak mungkin), arus melalui dioda pelindung internal ke plus catu daya akan menjadi sekitar 7,5 mA, yang jauh lebih sedikit dari arus yang diizinkan. Secara eksperimental ditetapkan bahwa, meskipun ada penurunan arus melalui LED saat baterai habis, kecerahan cahayanya tetap pada tingkat yang dapat diterima di seluruh rentang tegangan baterai. Rangkaian ini sangat disederhanakan, dan tidak ada penstabil tegangan yang mengkonsumsi arus tambahan, yang memungkinkan untuk meninggalkan sakelar daya (konsumsi saat ini dalam mode tidur - 1-3 m kA).

Tombol untuk mengontrol mode operasi perangkat terhubung ke pin GP3 (pin 4), yang dinyatakan sebagai input digital dalam bit konfigurasi. Ketika tombol ditekan, interupsi terjadi, di mana handler yang berikut ini terjadi. Saat ditekan untuk waktu yang lama (lebih dari 4 detik), perangkat memasuki mode tidur. Dengan penekanan yang lebih pendek, ada peralihan berurutan dari kecepatan lampu lalu lintas dalam lingkaran dengan indikasi kecepatan saat ini sesuai dengan gambar:

Dalam mode terakhir (LED merah menyala), sinyal berkedip kuning diaktifkan. Dengan menekan lama pada tombol (dikonfirmasi dengan padamnya semua LED), kami beralih ke operasi normal dengan mengubah mode ke yang baru, jika tombol tidak ditekan lebih dari 6 detik, mode operasi tetap sama seperti sebelum tombol ditekan.

Pengisian daya sel AA dalam mode tidur akan bertahan setidaknya selama satu tahun, itulah sebabnya perangkat tidak memiliki sakelar daya. Perangkat masuk ke mode tidur juga setelah 0,5 - 1 jam (tergantung pada kecepatan pergantian warna) tanpa mempengaruhi tombol. Mode SLEEP keluar dengan menekan tombol apa saja. Daya disuplai ke mikrokontroler melalui pin 1 dan 8. Untuk menghemat pin dan menyederhanakan desain, mode generator internal tanpa elemen eksternal diaktifkan.

Penjelasan kecil untuk program, yang diberikan dalam lampiran:

Pemrosesan klik tombol dilakukan dalam subrutin: wait_butt __- menunggu menekan dan mendaftar selama 6 detik. tanpa menekan, push_butt __- pendaftaran durasi menekan, wait_nobutt __- menunggu tombol yang tidak ditekan. Saat status lampu lalu lintas berubah (kuning dan hijau berkedip), nilai untuk port keluaran dibaca dari tabel di subrutin tact__ (kuean rendah atau tinggi). Demikian juga, indikasi status saat tombol ditekan berasal dari subrutin ind__. Untuk beralih ke mode tidur setelah berakhirnya waktu operasi, transisi paksa ke rutinitas pemrosesan interupsi terjadi oleh pengaturan perangkat lunak dari flag interupsi. Dengan mengubah konstanta CONST_MIN, CONST_REG, CONST_SL, Anda dapat mengubah periode kedipan hijau, mode awal saat baterai terhubung, waktu pengoperasian tanpa dampak hingga transisi ke mode SLEEP.

Papan sirkuit tercetak terbuat dari fiberglass berlapis foil satu sisi dan memiliki dimensi 22x87 mm. LED terluar dipasang sejajar dengan papan dalam arah yang berbeda. Yang tengah dipasang satu dari sisi pemasangan bagian, dan yang lain dari sisi trek dengan memasukkan ujung ke dalam lubang papan dan memperbaikinya dari sisi bagian dengan setetes solder, dan dari sisi trek dengan menyolder ke trek yang sesuai.

Semua resistor 0,125W. LED dapat diambil domestik atau impor apa pun, lebih disukai dari jenis yang sama dengan penurunan tegangan langsung pada arus 10 mA sekitar 2 Volt. Tombol - apapun tanpa memperbaiki. Mikrokontroler dipasang di blok.

Kata konfigurasi dimasukkan ke dalam memori secara otomatis ketika firmware dimuat (IC-Prog memiliki "birdie" yang diinstal hanya di item "PWRT", item lainnya "dihapus", "intOSC GP4" diatur di " kolom osilator). Pertama, Anda perlu membaca firmware dari sirkuit mikro yang bersih dan menulis nilai kata di akhir memori program di alamat 03FF, yang diperlukan untuk menyesuaikan frekuensi generator internal dari instance sirkuit mikro tertentu. Setelah memuat file HEX ke dalam program, nilai ini harus dimasukkan secara manual pada 03FF. Di perangkat ini, penyimpangan frekuensi tidak kritis, tetapi Anda harus tetap tahu bahwa sirkuit mikro ini memerlukan prosedur seperti itu. Sebagai upaya terakhir, jika nilai pabrik hilang, Anda tidak dapat melakukan apa pun - program telah mengambil tindakan untuk operasi yang benar dalam kasus ini.

Perangkat ditempatkan dalam kotak plastik yang sesuai. Lubang yang sesuai dibuat untuk LED di dalam kotak dan tutupnya. Dalam versi saya, lampu lalu lintas itu sendiri dan alas dengan tombol dan baterai dihubungkan melalui sepotong pipa air plastik dengan diameter 20 mm.

Halo!
Saya ingin menunjukkan bagaimana sebuah program ditulis untuk mengontrol peralatan teknologi pada PLC.
Sebagian besar waktu saya berurusan dengan PLC yang dibuat oleh Schneider Electric. Quantum yang saya pilih untuk tugas ini adalah PLC yang paling kuat dan mahal dari pabrikan ini. Itu dapat mengontrol peralatan dengan ribuan sinyal, untuk lampu lalu lintas di kehidupan nyata secara alami, tidak ada yang akan menggunakannya.

Saya tidak pernah berurusan dengan otomatisasi lampu lalu lintas, jadi saya membuat algoritma sendiri. Ini dia:
1. Lampu lalu lintas untuk penyeberangan pejalan kaki yang diatur. itu. lampu lalu lintas untuk mobil, lampu lalu lintas untuk pejalan kaki dan tombol untuk pejalan kaki, dengan menekan yang mana, pejalan kaki memberi tahu tentang keinginan untuk menyeberang jalan.
2. Setelah program dimulai, lampu hijau untuk mobil dan merah untuk pejalan kaki.
3. Setelah pejalan kaki menekan tombol, hijau untuk mobil berkedip, lalu kuning, lalu merah. Setelah itu, lampu hijau menyala untuk pejalan kaki, setelah Atur waktu mulai berkedip, menyala merah untuk pejalan kaki, lalu untuk mobil menyala kuning dan merah, lalu hijau.
4. Selama periode waktu tertentu setelah lampu hijau di lampu lalu lintas pejalan kaki, menekan tombol oleh pejalan kaki tidak memulai algoritma penyeberangan. Dalam hal ini, algoritma transisi dimulai hanya setelah waktu yang ditentukan telah berlalu.
Pemrograman PLC dilakukan di lingkungan pemrograman Unity dalam bahasa standar IEC 61131-3. DI standar ini termasuk 5 bahasa. Misalnya, saya telah memilih bahasa blok fungsi - FBD.
Berikut adalah browser proyek di Unity:

Mengkonfigurasi PLC:


PLC terdiri dari panel pemasangan, catu daya (1), pengontrol (2), modul input digital untuk 32 sinyal 24V DC (4), modul input digital untuk 32 sinyal 24V DC (5). Dalam proyek nyata panel perakitan yang terhubung ke satu pengontrol dengan berbagai jaringan, bisa ada lusinan, dan ratusan modul I / O.
Kami membuat variabel dari jenis yang diperlukan di editor variabel:


Variabel yang terkait dengan saluran modul I / O memiliki alamat yang menunjukkan rak, modul, dan saluran mana yang terikat dengan sinyal.
Program ini terdiri dari bagian-bagian yang dieksekusi setiap siklus pemindaian pengontrol secara berurutan.
Siklus pemindaian pengontrol yang disederhanakan terlihat seperti ini:
1. Membaca sinyal input dari modul input menjadi variabel dengan alamat.
2. Eksekusi bagian.
3. Menulis nilai dari variabel dengan alamat ke sinyal keluaran dari modul keluaran.
4. Pergi ke butir 1.
Buat bagian Jam dengan generator pulsa 0,5 detik. Blok TP, ketika sinyal input berubah dari 0 ke 1, mengeluarkan pulsa dengan durasi tertentu.


Di sini dan di bawah, tangkapan layar bagian ditampilkan dalam mode animasi, bukan mode edit. Mereka menampilkan nilai-nilai variabel di saat ini waktu saat menghubungkan ke PLC dengan program yang dimuat (angka untuk variabel numerik, hijau (1) -merah (0) untuk boolean).
Bagian Utama menangani logika utama.
Blok SR mengatur output ke 1 ketika S1 = 1 dan me-reset output ke 0 ketika R = 1.
Blok R_TRIG menyetel output untuk 1 siklus pemindaian menjadi 1 ketika input bertransisi dari 0 ke 1 (detektor terdepan).
Blok F_TRIG menyetel output untuk 1 siklus pemindaian menjadi 1 ketika input bertransisi dari 1 ke 0 (detektor trailing edge).
Variabel inButton yang terikat ke saluran tombol telah diganti di bagian dengan inButtonForTest sehingga Anda dapat mengubah nilainya pada simulator pengontrol tanpa perangkat keras nyata.


Bagian Keluaran menghasilkan sinyal keluaran untuk mengendalikan lampu lalu lintas.


Muat proyek ke simulator pengontrol:


Arti dari setiap variabel dapat dilihat di tabel animasi:


Tetapi untuk kenyamanan debugging, Anda dapat membuat layar operator dengan grafik sederhana, yang animasinya terkait dengan variabel:

Mencoba menyeberang jalan:

Saya tidak menyangka bahwa dibutuhkan 30 blok untuk mengendalikan objek sederhana seperti lampu lalu lintas.
Di artikel berikutnya saya akan menunjukkan cara menulis program ini menggunakan semua bahasa standar IEC 61131-3 secara bersamaan.

UPD. Memperbaiki kesalahan dalam nama standar.

(Bentuk), (Panel).

Sebelum membuat aplikasi, Anda harus mempelajari deskripsi komponen baru.

Tugas. Simulasikan lampu lalu lintas. Saat memulai proyek, panel lampu lalu lintas harus kosong. Setelah menekan tombol Start, lampu lalu lintas mulai menyala. Setelah menekan tombol Stop, panel lampu lalu lintas kembali kosong. Dengan menggunakan pengatur waktu, pastikan bahwa sinyal lalu lintas berubah secara berkala. Di bidang Kecepatan, masukkan interval pengatur waktu.

Proses proyek

1. Buat proyek baru... Simpan di folder terpisah, beri nama Traffic Light.

2. Tempatkan pada formulir panel (TPanel) dengan tiga bentuk (TShape), dua tombol (TButton), bidang teks (TEdit), tulisan (TLabel), timer (TTimer) sesuai dengan contoh:

Seharusnya terlihat seperti ini:

2. Kami membuat desain:

Tetapkan nilai properti ini di inspektur objek:

Komponen Properti Nilai
Formulir1 keterangan Lampu lalulintas
Panel1 keterangan * Kosong *
Bentuk1 Bentuk stLingkaran
Bentuk2 Bentuk stLingkaran
Bentuk3 Bentuk stLingkaran
Label1 keterangan Kecepatan
Sunting1 Teks * kosong *
Tombol1 keterangan Mulailah
Tombol2 keterangan Berhenti

3. Buat acara untuk Form1 di bagian OnCreate - Tekan elipsis

Buat acara untuk Timer1 di bagian OnTimer - Tekan elipsis

4. Tetapkan warna pada bentuk:

Jenis pekerjaan akhir:

5. Selama pemuatan formulir, penghitung waktu mati, bentuk pada panel menjadi tidak terlihat.

Buat pengendali acara untuk acara FormCreate (klik dua kali pada komponen Form1) dan tempel kode ini:

var k: bilangan bulat; prosedur TForm1.FormCreate (Pengirim: TObject); mulai Timer1.Enabled: = false; Shape1.Visible: = false; Shape2.Visible: = false; Shape3.Visible: = false; akhir;

6. Untuk mengganti bohlam lampu lalu lintas, tulis kode program di pengatur acara Timer1Timer. Kode ini akan dieksekusi pada interval yang dimasukkan pengguna di bidang Kecepatan. Menurut pembacaan penghitung waktu, jumlah bola lampu ditentukan, yang harus menyala saat ini.

Klik dua kali pada komponen Timer1 dan rekatkan kode ini:

6. Tulis kode program untuk tombol Start. Dengan mengklik tombol dari bidang Kecepatan, interval untuk penghitung waktu dibaca, penghitung waktu dihapus, penghitung waktu dihidupkan.

Klik dua kali pada komponen Button1 dan rekatkan kode:

prosedur TForm1.Button1Click (Pengirim: TObject); mulai Timer1.Interval: = StrToInt (Edit1.text); k: = 0; Timer1.Enabled: = benar; akhir;

7. Tulis kode untuk tombol Stop. Setelah mengklik tombol, timer harus mati, lampu lalu lintas menjadi tidak terlihat lagi.

Klik dua kali pada komponen Button2 dan rekatkan kode:

prosedur TForm1.Button2Click (Pengirim: TObject); mulai Timer1.Enabled: = false; Shape1.Visible: = false; Shape2.Visible: = false; Shape3.Visible: = false; akhir;

8. Mulai proyek. Di bidang Kecepatan, masukkan 1000 (1000ms = 1s). Lampu lalu lintas akan mulai beralih pada interval satu detik.

Artem Poznyak, siswa kelas 10 "A" di sekolah menengah 23, Ekibasbuz

Banyak orang berpikir bahwa Assembler sudah ketinggalan zaman dan tidak digunakan di mana pun, tetapi sebagian besar adalah anak muda yang tidak terlibat secara profesional dalam pemrograman sistem. Pengembangan perangkat lunak, tentu saja, bagus, tetapi tidak seperti bahasa pemrograman tingkat tinggi, Assembler akan mengajarkan Anda untuk memahami pengoperasian komputer secara mendalam, mengoptimalkan pekerjaan dengan sumber daya perangkat keras, dan juga memprogram teknik apa pun, sehingga berkembang ke arah pembelajaran mesin. . Untuk memahami YP kuno ini, pertama-tama ada baiknya berlatih dengan program sederhana yang paling menjelaskan fungsionalitas Assembler.

IDE untuk Assembler

Pertanyaan pertama adalah: di lingkungan pengembangan apa yang diprogram di Assembler? Jawabannya tegas - MASM32... saya t program standar, yang digunakan untuk PL ini. Anda dapat mengunduhnya di situs web resmi masm32.com dalam bentuk arsip, yang perlu dibongkar dan kemudian jalankan penginstal install.exe. Atau, Anda dapat menggunakan FASM, tetapi kode untuk itu akan sangat berbeda.

Sebelum mulai bekerja, hal utama adalah jangan lupa untuk menambahkan baris berikut ke variabel sistem PATH:

C:\masm32\bin

Program perakitan "Halo dunia"

Hal ini diyakini program dasar dalam pemrograman, yang ditulis oleh pemula pertama kali ketika mereka berkenalan dengan bahasa tersebut. Mungkin pendekatan ini tidak sepenuhnya benar, tetapi dengan satu atau lain cara ini memungkinkan Anda untuk segera melihat hasil visual:

386 .model flat, peta kasus opsi stdcall: tidak ada include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 / lib / kernel32.lib .data msg_title db "Title", 0 msg_message db "Hello world", 0 .code start: aktifkan MessageBox, 0, addr msg_message, addr msg_title, MB_OK panggil ExitProcess, 0 end start

Pertama, jalankan editor qeditor.exe di folder dengan MASM32 terinstal, dan tulis kode program di dalamnya. Setelah itu kami menyimpannya sebagai file dengan ekstensi ".asm", dan membangun program menggunakan item menu "Project" → "Build all". Jika tidak ada kesalahan dalam kode, program akan berhasil dikompilasi, dan pada output kita akan mendapatkan file exe siap yang akan ditampilkan jendela jendela dengan tulisan "Halo dunia".

Menambahkan dua angka di assembler

Dalam hal ini, kita melihat apakah jumlah angkanya nol atau tidak. Jika demikian, pesan yang sesuai akan muncul di layar, dan jika tidak, pemberitahuan lain akan muncul.

486 .model flat, peta kasus opsi stdcall: tidak ada include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 / lib / kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov ebx, -90 add eax, ebx test eax, eax jz zero memanggil MessageBox, 0, chr $("Di eax bukan 0!"), chr $("Info"), 0 jmp lexit zero: aktifkan MessageBox, 0, chr $("Di eax 0!"), chr $("Info"), 0 lexit: aktifkan ExitProcess, 0 akhir mulai

Di sini kami menggunakan apa yang disebut label dan tim khusus menggunakannya (jz, jmp, tes). Mari kita lihat lebih dekat:

  • test - digunakan untuk perbandingan logis variabel (operan) dalam bentuk byte, kata, atau kata ganda. Sebagai perbandingan, perintahnya menggunakan perkalian logis, dan melihat bit: jika sama dengan 1, maka bit hasilnya akan sama dengan 1, jika tidak - 0. Jika kita mendapat 0, flag diset bersama dengan ZF ( bendera nol), yang akan sama dengan 1 Hasilnya kemudian dianalisis berdasarkan ZF.
  • jnz - jika bendera ZF tidak disetel di mana pun, lompatan dilakukan pada label ini. Perintah ini sering digunakan ketika program berisi operasi perbandingan yang entah bagaimana mempengaruhi hasil ZF. Ini termasuk tes dan cmp.
  • jz - jika bendera ZF masih disetel, label akan dilompati.
  • jmp - terlepas dari apakah ada ZF atau tidak, labelnya dilompati.

Program perakitan untuk menjumlahkan angka

Program primitif yang menunjukkan proses penambahan dua variabel:

486 .model flat, peta kasus opsi stdcall: tidak ada include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 / lib / kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h B DB 2h buffer db 128 dup (?) format db "% d", 0 .kode mulai: MOV AL, A ADD AL, B memanggil wsprintf, buffer addr, format addr, eax memanggil MessageBox, 0, buffer addr, addr msg_title, MB_OK memanggil ExitProcess, 0 akhir mulai

Di Assembler, untuk menghitung jumlah, itu akan membutuhkan banyak tindakan, karena bahasa pemrograman bekerja langsung dengan memori sistem. Di sini kami sebagian besar memanipulasi sumber daya, dan secara independen menunjukkan berapa banyak yang harus dialokasikan untuk variabel, dalam bentuk apa untuk melihat angka, dan di mana menempatkannya.

Mendapatkan nilai dari baris perintah di assembler

Salah satu langkah dasar terpenting dalam pemrograman adalah mendapatkan data dari konsol untuk diproses lebih lanjut. Dalam hal ini, kami mendapatkannya dari garis komando dan tampilkan di jendela Windows:

486 .model flat, peta kasus opsi stdcall: tidak ada include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 / lib / kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: panggil GetCommandLine; hasilnya akan ditempatkan di eax push 0 push chr $("Command Line") push eax; kami mengambil teks untuk output dari eax push 0 call MessageBox push 0 call ExitProcess end start

Anda juga dapat menggunakan metode alternatif:

486 .model flat, peta kasus opsi stdcall: tidak ada include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 / lib / kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: panggil GetCommandLine; hasilnya akan ditempatkan di eax memanggil GetCommandLine memanggil MessageBox, 0, eax, chr $ ("Command Line"), 0 memanggil ExitProcess, 0 push 0 panggilan ExitProcess end start

Ini menggunakan panggilan, makro khusus yang menyederhanakan kode program. Pada waktu kompilasi, perintah makro diubah menjadi perintah assembler. Dengan satu atau lain cara, kami menggunakan tumpukan - cara primitif untuk menyimpan data, tetapi pada saat yang sama sangat nyaman. Dengan stdcall konvensi, di semua fungsi WinAPI, variabel dilewatkan melalui tumpukan, hanya di urutan terbalik, dan ditempatkan di register eax yang sesuai.

Loop perakit

Kasus penggunaan:

Data msg_title db "Title", 0 A DB 1h buffer db 128 dup (?) Format db "% d", 0 .code start: mov AL, A .REPEAT inc AL .UNTIL AL == 7 memanggil wsprintf, addr buffer, format addr, AL memanggil MessageBox, 0, addr buffer, addr msg_title, MB_OK memanggil ExitProcess, 0 end start .data msg_title db "Title", 0 buffer db 128 dup (?) format db "% d", 0 .code start: mov eax, 1 mov edx, 1 .WHILE edx == 1 inc eax .IF eax == 7 .BREAK .ENDIF .ENDW memanggil wsprintf, addr buffer, addr format, eax memanggil MessageBox, 0, addr buffer, addr msg_title, MB_OK aktifkan ExitProcess, 0

Perintah repeat digunakan untuk membuat loop. Kemudian, dengan menggunakan inc, nilai variabel dinaikkan 1, terlepas dari apakah variabel tersebut masuk atau tidak memori akses acak, atau di dalam prosesor itu sendiri. Untuk menghentikan kerja siklus, arahan ".BREAK" digunakan. Keduanya dapat menghentikan siklus dan melanjutkan aksinya setelah "jeda". Anda juga dapat menginterupsi eksekusi kode program dan memeriksa kondisi repeat dan while menggunakan direktif ".CONTINUE".

Jumlah elemen array pada assembler

Berikut ini kami rangkum nilai-nilai variabel dalam array menggunakan for loop:

486 .model flat, peta kasus opsi stdcall: tidak ada include /masm32/include/windows.inc include /masm32/include/user32.inc include /masm32/include/kernel32.inc includelib /masm32/lib/user32.lib includelib / masm32 / lib / kernel32.lib include /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h x dd 0,1,2,3,4,5,6,7, 8,9,10,11 n dd 12 buffer db 128 dup (?) Format db "% d", 0 .code start: mov eax, 0 mov ecx, n mov ebx, 0 L: add eax, x add ebx, ketik x dec ecx cmp ecx, 0 jne L panggil wsprintf, buffer addr, format addr, eax panggil MessageBox, 0, addr buffer, addr msg_title, MB_OK panggil ExitProcess, 0 akhir mulai

Perintah dec, seperti inc, mengubah nilai operan dengan satu, hanya dalam arah yang berlawanan, dengan -1. Tetapi cmp membandingkan variabel dengan metode pengurangan: itu mengurangi satu nilai dari yang kedua, dan, tergantung pada hasilnya, menetapkan tanda yang sesuai.

Perintah jne menavigasi label berdasarkan hasil perbandingan variabel. Jika negatif, transisi terjadi, dan jika operan tidak sama satu sama lain, transisi tidak dilakukan.

Assembler menarik karena representasi variabelnya, yang memungkinkan Anda melakukan apa pun yang Anda inginkan dengannya. Seorang spesialis yang menemukan semua seluk-beluknya bahasa ini pemrograman, memiliki pengetahuan yang sangat berharga yang dapat digunakan dalam banyak cara. Satu masalah dapat diselesaikan oleh sebagian besar cara yang berbeda, jadi jalannya akan berduri, tapi tak kalah seru.

Tampilan Postingan: 767