Salam Brasil!
Pertama-tama terima kasih Joby untuk contoh Anda. Kedua, contohnya hanya memiliki kesalahan kecil. Angka 0x20 tidak benar. Seharusnya 0x04. Juga, seperti saran, saya tidak akan menggunakan angka heksadesimal seperti 0xFB, 0x20, atau 0x04 dalam kode. Saya akan menyarankan menggunakan definisi port PIN yang ditemukan di io.h dan yang lainnya dirujuk oleh file header. Saya telah menulis ulang contoh Joby di bawah ini, dengan beberapa komentar untuk para pemula.
# include <avr/io.h>
int main (void)
{
// set all pins on PORTB for output
DDRB = 0xFF;
// set port pin PORTD2 as input and leave the others pins
// in their originally state (inputs or outputs, it doesn't matter)
DDRD &= ~(1 << PD2); // see comment #1
while (1)
{
if (PIND & (1<<PD2)) // see comment #2
PORTB |= (1<<PB2); // see comment #3
else
PORTB &= ~(1<<PB2); // see comment #4
}
return 0;
}
/ *
komentar untuk pemula
komentar # 1: (1 << PD2) menghasilkan binary 00000100. Operasi "~" membalik semua digit, yaitu, biner sekarang adalah 11111011. Akhirnya & = menerapkan logika "DAN" antara DDRD dan 11111011 dan hasilnya ditempatkan lagi dalam memori DDRD. Catatan: Apa yang dilakukan operator "DAN" adalah untuk setiap bit dalam memori DDRD, ia membandingkannya dengan angka biner di atas. Jika bit dalam DDRD adalah 0 dan bit dalam biner pada posisi gigitan yang sama adalah 1, maka bit yang dihasilkan adalah 0, jika DDRD adalah 1 dan bit dalam biner adalah 1, bit yang dihasilkan adalah 1, dan jika bit dalam DDRD adalah 1 atau 0 dan bit dalam biner adalah 0 maka bit yang dihasilkan selalu 0. Singkatnya, perintah DDRD & = ~ (1 << PD2) hanya mengubah bit PD2 ke nol dan membiarkan yang lainnya (nol atau yang) tidak tersentuh. Tampaknya sedikit rumit, tetapi setelah Anda terbiasa, itu adalah cara terbaik untuk mengubah sedikit gigitan tanpa mengubah bit lainnya.
comment # 2 : (1 << PD2) menghasilkan binary 00000100. Menggunakan logika yang sama "AND" yang dijelaskan dalam komentar # 1, perintah "PIND & 0000100" hanya memeriksa jika PIND2 (pin input kami di mana tombol push terhubung) ke) diatur ke tinggi atau tidak. Semua pin lainnya akan FALSE karena bit biner diatur ke 0, dan karena bit biner # 2 diatur ke 1, pernyataan IF akan BENAR hanya jika input PD2 disetel ke tinggi atau FALSE jika input PD2 adalah diatur ke rendah.
komentar # 3 : Mengikuti logika yang dijelaskan dalam komentar # 1, perintah ini menetapkan pin PINB2 pada port PORTB menjadi tegangan tinggi. Jika LED Anda terhubung dengan benar ke port pin ini dengan resistor ~ 300 ohm, dan resistor itu terhubung ke ground, LED akan menyala.
komentar # 4 : LED harus dimatikan karena alasan yang sama yang dijelaskan dalam komentar sebelumnya.
Pertimbangan terakhir:
a) Untuk menghindari osilasi tegangan pada pin input PD2 ketika tombol push tidak ditekan (sirkuit terbuka), saya sangat menyarankan untuk menempatkan resistor pull-down (1 kOhm atau lebih tinggi), sehingga LED tidak menyala secara tidak sengaja karena untuk osilasi tegangan acak ini.
b) Catatan sangkalan: Ide-ide yang diuraikan di sini hanya akan digunakan sebagai pendidikan dan tidak boleh digunakan dalam sistem nyata sebelum berkonsultasi dengan seorang ahli dalam bidang elektronik.
* /