เพื่อให้รู้จนสามารถนำไปใช้งานได้ ต้องรู้ให้ถึง การทำงานเบื้องต้นของสิ่งที่ทำ กลไกการทำงาน ภายใน พร้อมทั้งเทคนิคที่นำมาใช้ ตัวอย่างง่ายๆนี้ ใช้อธิบายถึงการทำงานที่ซับซ้อนได้
ตัวอย่างนี้เป็นตัวอย่าง การเขียนโปรแกรมเพื่อให้เกิดการทำงานหลายๆอย่างไปพร้อมๆกัน (Multitasking) โดย
งานหลักหรืองานที่ 1 คือไฟวิ่ง งานที่สองคือตรวจสอบสวิทช์ ซึ่งมีการทำงานแบ่งเป็น 2 แบบ คือถ้ากดนาน ถือเป็นการปิดเปิดระบบ แต่ถ้ากดหรือแตะแป๊บเดียวที่สวิทช์แต่ละตัวถือเป็นการ เปลี่ยนวิธีการทำงานของระบบ
#include <TimerOne.h>
#define sw0 11
#define sw1 12
#define sw0_ON digitalRead(sw0)== HIGH
#define sw1_ON digitalRead(sw1)== HIGH
#define on true
#define off false
bool sw0_click = off;
bool Power_sw = off;
bool sw1_click = off;
#define time_period 10 //interrupt time's period = 10 ms
#define t_100ms 100/time_period // = 100ms/(time interval 10ms)
#define t_300ms 300/time_period // = 300ms/(time interval 10ms)
#define t_1s 1000/time_period // = 2000ms/(time interval 10ms)
unsigned char sw0_time, sw1_time, sh_time;
unsigned char operation;
unsigned char led = 0x01;
#define up true
#define dn false
bool dir = up;
#define standby_mode 0
#define ready_mode 1
void setup() {
Timer1.initialize(10000); // set a timer of length 10000 us = 10ms
Timer1.attachInterrupt( timerIsr ); // attach the service routine here
DDRD = B11111111; //Port D as output
pinMode(sw0, INPUT);
pinMode(sw1, INPUT);
sw0_time = 0;
sw1_time = 0;
sh_time = 0;
dir = up;
operation = standby_mode;
}
void loop() {
switch (operation) {
case standby_mode:
standby_op();
break;
case ready_mode:
ready_op();
break;
}
}
/// --------------------------
/// Scan key
/// --------------------------
void timerIsr()
{
++sh_time;
if(sw0_ON) {
++sw0_time;
if(sw0_time >100)
{
sw0_time = 100;
Power_sw = on;
sw0_click = off;
}
}else{
if((sw0_time>=t_100ms)&&(sw0_time<=t_300ms))
{
sw0_click = on;
}
else
{
sw0_click = off;
Power_sw = off;
}
sw0_time =0;
}
if(sw1_ON) {
++sw1_time;
if(sw1_time >100){
sw1_time = 100;
sw1_click = off;
}else{
if((sw1_time>=t_100ms)&&(sw1_time<=t_300ms))
{
sw1_click = on;
}
else
{
sw1_click = off;
}
}
}
}
void standby_op()
{
led = 0;
PORTD = led;
if(Power_sw)
{
led = 0x80;
operation = ready_mode;
Power_sw = off;
sw0_click = off;
sw1_click = off;
sw0_time = 0;
sw1_time = 0;
}
}
void ready_op()
{
if(sh_time > t_300ms){
if(dir==up){
if(led==0x80) led = 0x01;
else led <<=1;
}else{
if(led==0x01) led=0x80;
else led>>=1;
}
PORTD = led;
sh_time = 0;
}
if(sw0_click){
dir = up;
sw0_click = off;
sw0_time = 0;
sw1_time = 0;
}else if(sw1_click){
dir = dn;
sw1_click = off;
sw0_time = 0;
sw1_time = 0;
}
if(Power_sw){
operation = standby_mode;
Power_sw = off;
sw0_time = 0;
sw1_time = 0;
}
}