สวัสดีชาวบราซิล!
ก่อนอื่นขอบคุณ Joby สำหรับตัวอย่างของคุณ ประการที่สองตัวอย่างของเขามีข้อผิดพลาดเล็กน้อย หมายเลข 0x20 ไม่ถูกต้อง ควรเป็น 0x04 นอกจากนี้เช่นเดียวกับข้อเสนอแนะฉันจะไม่ใช้ตัวเลขฐานสิบหกเช่น 0xFB, 0x20 หรือ 0x04 ในรหัส ฉันขอแนะนำให้ใช้คำจำกัดความพอร์ต PIN ที่พบใน io.h และอื่น ๆ ที่อ้างอิงโดยไฟล์ส่วนหัว ฉันได้เขียนตัวอย่างของ Joby ใหม่ด้านล่างพร้อมความคิดเห็นสำหรับผู้เริ่มต้น
# 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;
}
/ *
ความคิดเห็นสำหรับผู้เริ่มต้น
ความคิดเห็น # 1: (1 << PD2) สร้างไบนารี 00000100 การดำเนินการ "~" จะพลิกตัวเลขทั้งหมดเช่นไบนารีตอนนี้คือ 11111011 ในที่สุดเครื่องหมาย & = ใช้ตรรกะ "AND" ระหว่าง DDRD และ 11111011 และวางผลลัพธ์อีกครั้ง ในหน่วยความจำ DDRD หมายเหตุ: สิ่งที่ผู้ประกอบการ "และ" ทำสำหรับแต่ละบิตในหน่วยความจำ DDRD มันเปรียบเทียบกับเลขฐานสองข้างต้น หากบิตใน DDRD เป็น 0 และบิตในไบนารีที่ตำแหน่งการกัดเดียวกันคือ 1 ดังนั้นบิตที่ได้คือ 0 หาก DDRD คือ 1 และบิตในไบนารีเป็น 1 บิตที่ได้คือ 1 และหาก บิตใน DDRD คือ 1 หรือ 0 และบิตในไบนารีคือ 0 ดังนั้นบิตที่ได้คือ 0 เสมอ โดยสรุปคำสั่ง DDRD & = ~ (1 << PD2) เปลี่ยนเพียงบิต PD2 เป็นศูนย์และปล่อยให้คนอื่น (ศูนย์หรือคน) ไม่ถูกแตะต้อง ดูเหมือนว่าจะซับซ้อนเล็กน้อย แต่หลังจากที่คุณชินกับมันแล้วมันเป็นวิธีที่ดีที่สุดในการเปลี่ยนการกัดโดยไม่ต้องเปลี่ยนบิตอื่น ๆ
ความคิดเห็น # 2 : (1 << PD2) สร้างไบนารี 00000100 โดยใช้ตรรกะเดียวกัน "และ" ที่อธิบายไว้ในความคิดเห็น # 1 คำสั่ง "PIND & 0000100" จะตรวจสอบเฉพาะถ้า PIND2 (พินอินพุตของเราที่เชื่อมต่อปุ่มกด ถึง) ตั้งค่าไว้สูงหรือไม่ หมุดอื่น ๆ ทั้งหมดจะเป็น FALSE ตั้งแต่ไบนารีบิตถูกตั้งค่าเป็น 0 และเนื่องจากไบนารีบิต # 2 ถูกตั้งค่าเป็น 1 คำสั่ง IF จะเป็น TRUE เฉพาะถ้าอินพุต PD2 ถูกตั้งค่าเป็นสูงหรือ FALSE ถ้าอินพุต PD2 เป็น ตั้งเป็นต่ำ
ความคิดเห็น # 3 : ตามตรรกะที่อธิบายไว้ในความคิดเห็น # 1 คำสั่งนี้ตั้ง PINB2 เอาท์พุทในพอร์ต PORTB เป็นไฟฟ้าแรงสูง หาก LED ของคุณเชื่อมต่ออย่างถูกต้องกับพอร์ตพินนี้ด้วยตัวต้านทาน ~ 300 โอห์มและตัวต้านทานนั้นเชื่อมต่อกับกราวด์ LED ควรเปิด
ความคิดเห็น # 4 : LED ควรปิดด้วยเหตุผลเดียวกันที่อธิบายไว้ในความคิดเห็นก่อนหน้า
ข้อพิจารณาสุดท้าย:
a) เพื่อหลีกเลี่ยงการสั่นของแรงดันไฟฟ้าในขาอินพุต PD2 เมื่อไม่กดปุ่ม (วงจรเปิด) ฉันแนะนำให้วางตัวต้านทานแบบดึงลง (1 kOhm หรือสูงกว่า) เพื่อไม่ให้ LED ติดสว่างขึ้นโดยไม่ตั้งใจ ถึงการสั่นของแรงดันไฟฟ้าแบบสุ่ม
b) ข้อความปฏิเสธความรับผิดชอบ: แนวคิดที่อธิบายไว้ที่นี่จะใช้เพื่อการศึกษาเท่านั้นและไม่ควรใช้ในระบบจริงใด ๆ ก่อนที่จะปรึกษาผู้เชี่ยวชาญด้านอุปกรณ์อิเล็กทรอนิกส์
* /