การต่อโมดูล LED 8X8
กรณีที่ใช้ LED 8x8 รุ่น ตามรูป
ให้ดูการต่อสัญญาณจาก http://narong.ece.engr.tu.ac.th/learn_play/micro/lcd8x8_psoc/index.html
สำหรับตัวอย่างนี้ใช้ โมดูล LED 8X8
ซึ่งมีขาสัญญาณอยู่ 16 ขา โดยตำแหน่งสัญญาณเป็นดังนี้
การต่อเข้ากับพอร์ทของ Arduino ใช้ Port B Port C (พอร์ท Analog ) ต่อกับ C0 - C7 และ PORT D ต่อกับ R0 - R7
การติดตั้ง Library timer 1
เนื่องจากในตัวอย่างนี้ต้องใช้การอินเตอร์รัพท์ของ Timer 1 ดังนั้นต้องติดตั้ง Library timer 1 โดยมีขั้นตอนดังนี้
ดาวน์โหลดไลบรารี่จาก http://www.arduino.cc/playground/code/timer1 หรือ ที่นี่้ TimerOne-v9.zip
แตกไฟล์ จะได้ไฟล์เป็น examples keywords.txt TimerOne.cpp TimerOne.h
นำไฟล์ทั้งหมด ไปเก็บที่โฟลเดอร์เดียวกัน ภายใต้โฟลเดอร์ libraries เช่น C:\Program Files\arduino-1.0.1\libraries\TimerOne
เท่านี้ก็สามารถใช้ Timer 1 อินเตอร์ได้แล้ว
หมายเหตุ การอินเตอร์รัพท์ของ Timer ดูได้จาก http://www.protostack.com/blog/2010/09/timer-interrupts-on-an-atmega168/
ข้อควรจำ เนื่องจากขา Digital 0 (PD0) เป็นขา RxD และ Digital 1 (PD1) เป็นขา ธxD ของพอร์ทอนุกรม UART ซึ่ง Arduino ใช้เป็นพอร์ทดาวน์โหลดโปรแกรมลงชิพ AVR ดังนั้นขณะดาวน์โหลดโปรแกรมนี้ ห้ามต่อขา D0 และ D1 เข้ากับวงจรใดๆ
โปรแกรมที่ 1
#include <TimerOne.h> //เรียกใช้ ไลบรารี่ TimerOne
unsigned char col;
const unsigned char pattern[] = {0xff,0x7e,0x3c,0x18,0x81,0x42,0x24,0x18}; //ภาพที่ต้องการแสดง
unsigned char dis_buf[8]; //บัฟเฟอร์สำหรับแสดงภาพ
//--------------------------------------------------------------------------------
void setup() {
DDRD = B11111111; //Port D as output
DDRC = B11111111; //Port C as output
DDRB = B11111111; //Port B as output
Timer1.initialize(1000); // กำหนดระยะเวลาการอินเตอร์รัพท์ของ timer 1 ให้เป็นทุกๆ 1000 microseconds
Timer1.attachInterrupt( timerIsr ); // กำหนดตำแหน่งโปรแกรมรองรับการอินเตอร์รัพท์
col = 0;
copymem(pattern); //คัดลอกภาพที่จะแสดงไปเก็บที่บัฟเฟอร์สำหรับแสดง
}
//--------------------------------------------------------------------------------
void copymem(const unsigned char image[])
{
int i;
for (i=0;i<8;i++) // Draw the columns to print the character.
{
dis_buf[i]=image[i];
}
}
//--------------------------------------------------------------------------------
void loop() {
}
//--------------------------------------------------------------------------------
/// Scan display
/// ทุกครั้งที่อินเตอร์รัพท์ จะทำการสแกน 1 คอลัมน์
//--------------------------------------------------------------------------------
void timerIsr()
{
switch (col) {
case 0:
PORTD = dis_buf[col];
PORTC = 0B11111110;
PORTB = 0B11111111;
break;
case 1:
PORTD = dis_buf[col];
PORTC = 0B11111101;
PORTB = 0B11111111;
break;
case 2:
PORTD = dis_buf[col];
PORTC = 0B11111011;
PORTB = 0B11111111;
break;
case 3:
PORTD = dis_buf[col];
PORTC = 0B11110111;
PORTB = 0B11111111;
break;
case 4:
PORTD = dis_buf[col];
PORTC = 0B11101111;
PORTB = 0B11111111;
break;
case 5:
PORTD = dis_buf[col];
PORTC = 0B11011111;
PORTB = 0B11111111;
break;
case 6:
PORTD = dis_buf[col];
PORTC = 0B11111111;
PORTB = 0B11101111;
break;
case 7:
PORTD = dis_buf[col];
PORTC = 0B11111111;
PORTB = 0B11011111;
break;
}
col++;
if (col > 7) col = 0;
}
โปรแกรมที่ 2
ไฟล์ LED_8x8_2.ino
โปรแกรมที่ 3
ไฟล์ LED_8x8_3.ino
อีกตัวอย่าง