http://www.youtube.com/v/PJHyPlNTOEM
function ของปุ่ม ใน v1
function ของปุ่ม ใน v2
วงจรเอาไว้อ้างอิงกับ Arduino รุ่นอื่นๆ
ขอ code กันมาเยอะเอามาแปะให้แล้วคับ ถูกใจกด like ใต้ภาพ avata ด้วยคับ
Download Arduino Clock 1.0
Download Arduino Clock 2.0
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Show posts Menu
/*
Program :Blink LED on PF4
Author :Somlak Mangnimit
Date :19/10/2013
Device :stm8s103k3
Compiler :IAR V1.41
*/
#include <iostm8s103k3.h>
//--------------------
//delay
//--------------------
void delay_us(unsigned int x){
x *= 3;
while(x--);
}
//--------------------
//delay
//--------------------
void delay_ms(unsigned int x){
while(x--){
delay_us(1000);
}
}
//--------------------
//main
//--------------------
void main(void){
PF_DDR_DDR4 = 1; //output
PF_CR1_C14 = 1; //push-pull
PF_CR2_C24 = 1; //output speed up 10mhz
CLK_CKDIVR = 0x00; //1
for(;{
PF_ODR_ODR4 = 1;
delay_ms(500);
PF_ODR_ODR4 = 0;
delay_ms(500);
}
}
/*
Program :AD Keypad adaptor test
Author :Somlak Mangnimit (JENG)
Date :09/08/2013
MCU :ATmega8 @16Mhz
Board :Arduino S3v3
Soft :Arduino IDE v1.0.5
more info. please visit www.electoday.com
*/
uint8_t key_tab[]= {"123456789*0#"};
uint16_t adc_key_val[] ={1000, 750, 600, 500, 420, 370, 320, 290, 260, 240, 220, 200};
#define NUM_KEYS 12
#define NO_KEY 255
int adc_key_in,key,oldkey;
//-------------------------------------
//
//-------------------------------------
void setup(){
Serial.begin(9600);
Serial.println("ADC key testing");
}
//-------------------------------------
//
//-------------------------------------
void loop(){
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey){ // if keypress is detected
delay(50); // wait for debounce time
adc_key_in = analogRead(0); // read the value from the sensor
key = get_key(adc_key_in); // convert into key press
if (key != oldkey){
oldkey = key;
if (key != NO_KEY){
Serial.write(key);
}
}
}
}
//-------------------------------------
// Convert ADC value to key number
//-------------------------------------
uint8_t get_key(uint16_t input){
uint8_t k;
for(k = 0; k < NUM_KEYS; k++){
if(input > (adc_key_val[k])){
k = (key_tab[k]);
return k;
}
}
if(k >= NUM_KEYS)k = 255;
return k;
}
/*
Program :max7219 clock (DS1307)
Author :Somlak Mangnimit
Date :09/05/2013
MCU :ATmega8A
Xtal :16Mhz
Compiler :WinAVR20100110
Version :-
Note :-
*/
//build in library
#define use_swi2c
#define SDA_pinx analog_4
#define SCL_pinx analog_5
#define SDA_pin pin_analog_4
#define SDA_ddr ddr_analog_4
#define SCL_ddr ddr_analog_5
//build in library
#define use_pause
//library
#include "../m8lib.c"
#include "max7219.h"
//rtc equ name
#define rtc_id 0xd0
#define rtc_sec_addr 0x00
#define rtc_min_addr 0x01
#define rtc_hour_addr 0x02
#define rtc_date_addr 0x04
#define rtc_month_addr 0x05
#define rtc_year_addr 0x06
uint8_t table[] PROGMEM = {
0b01111110, //0
0b00110000, //1
0b01101101, //2
0b01111001, //3
0b00110011, //4
0b01011011, //5
0b00011111, //6
0b01110000, //7
0b01111111, //8
0b01110011, //9
0b00000010, //' = 10
0b00000101, //r = 11
0b00110111, //H = 12
0b01000011 //c = 13
};
//write rtc
void write_rtc(void){
swi2c_write_byte(rtc_id,rtc_sec_addr,0x00);
swi2c_write_byte(rtc_id,rtc_min_addr,0x59);
swi2c_write_byte(rtc_id,rtc_hour_addr,0x23);
swi2c_write_byte(rtc_id,rtc_date_addr,0x09);
swi2c_write_byte(rtc_id,rtc_month_addr,0x05);
swi2c_write_byte(rtc_id,rtc_year_addr,0x13);
}
//main
int main(void){
uint8_t ds1,ds2,ds3,cnt=0,c=0;
maxInitial();
write_rtc();
pause_ms(1000);
for(;;){
if(!c){//time
ds1 = swi2c_read_byte(rtc_id,rtc_hour_addr);
ds2 = swi2c_read_byte(rtc_id,rtc_min_addr);
ds3 = swi2c_read_byte(rtc_id,rtc_sec_addr);
if(cnt++>10){
c = 1;
cnt = 0;
}
}
if(c){//date
ds1 = swi2c_read_byte(rtc_id,rtc_date_addr);
ds2 = swi2c_read_byte(rtc_id,rtc_month_addr);
ds3 = swi2c_read_byte(rtc_id,rtc_year_addr);
if(cnt++>5){
c = 0;
cnt = 0;
}
}
maxSend(8,pgm_read_byte(&table[(ds1>>4)&0x0f]));
maxSend(7,pgm_read_byte(&table[ds1&0x0f]));
maxSend(6,pgm_read_byte(&table[10]));
maxSend(5,pgm_read_byte(&table[(ds2>>4)&0x0f]));
maxSend(4,pgm_read_byte(&table[ds2&0x0f]));
maxSend(3,pgm_read_byte(&table[10]));
maxSend(2,pgm_read_byte(&table[(ds3>>4)&0x0f]));
maxSend(1,pgm_read_byte(&table[ds3&0x0f]));
pause_ms(1000);
}
return 0;
}
#ifndef _MAX7219_H_
#define _MAX7219_H_
#include "../m8lib.c"
#define dataIn digital_2
#define load digital_3
#define clock digital_4
#define HIGH 1
#define LOW 0
#define writeBit(p,b) p=b
#define max7219_reg_noop 0x00
#define max7219_reg_digit0 0x01
#define max7219_reg_digit1 0x02
#define max7219_reg_digit2 0x03
#define max7219_reg_digit3 0x04
#define max7219_reg_digit4 0x05
#define max7219_reg_digit5 0x06
#define max7219_reg_digit6 0x07
#define max7219_reg_digit7 0x08
#define max7219_reg_decodeMode 0x09
#define max7219_reg_intensity 0x0a
#define max7219_reg_scanLimit 0x0b
#define max7219_reg_shutdown 0x0c
#define max7219_reg_displayTest 0x0f
void putByte(uint8_t data);
void maxSend(uint8_t reg, uint8_t col);
void maxInitial(void);
#endif
#include "max7219.h"
void putByte(uint8_t data){
uint8_t i;
for(i=0;i<8;i++){
writeBit(dataIn,LOW);
if(data&0x80){writeBit(dataIn,HIGH);}
writeBit(clock,HIGH);
writeBit(clock,LOW);
data <<= 1;
}
}
void maxSend(uint8_t reg, uint8_t col){
writeBit(load,LOW);
putByte(reg);
putByte(col);
writeBit(load,HIGH);
}
void maxInitial(void){
uint8_t i;
ddr_digital_2 = _output;
ddr_digital_3 = _output;
ddr_digital_4 = _output;
//initiation of the max 7219
maxSend(max7219_reg_scanLimit, 0x07);
maxSend(max7219_reg_decodeMode, 0x00);
maxSend(max7219_reg_shutdown, 0x01);
maxSend(max7219_reg_displayTest, 0x00);
for (i=1;i<=8;i++){
maxSend(i, 0);
}
maxSend(max7219_reg_intensity, 0x0f);
}
atmega8.name=Arduino Internal Clock (5V, 8 MHz) w/ ATmega8
atmega8.upload.protocol=stk500v2
atmega8.upload.maximum_size=6143
atmega8.upload.speed=19200
atmega8.bootloader.low_fuses=0x44
atmega8.bootloader.high_fuses=0xc8
atmega8.bootloader.path=atmega8
atmega8.bootloader.file=ATmegaBOOT_int_clock.hex
atmega8.bootloader.unlock_bits=0x3F
atmega8.bootloader.lock_bits=0x0F
atmega8.build.mcu=atmega8
atmega8.build.f_cpu=8000000L
atmega8.build.core=arduino
atmega8.build.variant=standard
//--------------------------------------------------
//Program :Control Servo motor
//Author :Somlak Mangnimit
//Date :01/02/2013
//MCU :ATmega8A
//XTAL :16Mhz
//Compiler :WinAVR20100110
//Version :-
//Note :-
//--------------------------------------------------
//use analog build in library driver
#define use_analog
//my library
#include "../m8lib.c"
//define equ name
#define servo_min 1500
#define servo_max 4500
//main program
int main(void){
unsigned int ch1,ch2;
//configure timer 1 for fast pwm mode via ICR1, with no prescaling
ICR1 = 0x9c3f; //period 20ms
TCCR1A |= (1<<WGM11);
TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS11);
//enable PWM on port B1 B2 in non-inverted compare mode 2
TCCR1A |= (1<<COM1A1)|(1<<COM1B1);
//1ms pulse
OCR1A = ch1 = servo_min;
OCR1B = ch2 = servo_min;
//set digital 9,10 as outputs
ddr_digital_9 = output;
ddr_digital_10 = output;
[color=red]for(;;){
_delay_us(500);
if(!pin_analog_1){
if(ch1>1500){ch1--;}
OCR1A = ch1;
}
else if(!pin_analog_0){
if(ch1<4500){ch1++;}
OCR1A = ch1;
}
if(!pin_analog_3){
if(ch2>1500){ch2--;}
OCR1B = ch2;
}
else if(!pin_analog_2){
if(ch2<4500){ch2++;}
OCR1B = ch2;
}
}[/color]
return 0;
}
//--------------------------------------------------
//Program :Control Servo motor
//Author :Somlak Mangnimit
//Date :26/01/2013
//MCU :ATmega8A
//XTAL :16Mhz
//Compiler :WinAVR20100110
//Version :-
//Note :-
//--------------------------------------------------
//use analog build in library driver
#define use_analog
//my library
#include "../m8lib.c"
//define equ name
#define servo_min 1500
#define servo_max 4500
//main program
int main(void){
unsigned long x;
analog_initial();
unsigned int ch1,ch2;
//configure timer 1 for fast pwm mode via ICR1, with no prescaling
ICR1 = 0x9c3f; //period 20ms
TCCR1A |= (1<<WGM11);
TCCR1B |= (1<<WGM13)|(1<<WGM12)|(1<<CS11);
//enable PWM on port B1 B2 in non-inverted compare mode 2
TCCR1A |= (1<<COM1A1)|(1<<COM1B1);
//1ms pulse
OCR1A = ch1 = servo_min;
OCR1B = ch2 = servo_min;
//set digital 9,10 as outputs
ddr_digital_9 = output;
ddr_digital_10 = output;
for(;;){
x = analog_read(0);
OCR1A = (int)((x*(servo_max-servo_min))/1023)+servo_min;
x = analog_read(1);
OCR1B = (int)((x*(servo_max-servo_min))/1023)+servo_min;
}
return 0;
}
//--------------------------------------------------
//Filename :m8lib.c
//Program :onono mega8 library
//Author :Somlak Mangnimit
//Date :5/07/2012
//
//Special Thank
//firmware.c@electoday.com
//for IO Library
//
//v1.0release :09-07-2012
//note :bug fix pause function
// :+ error message
// :+ usart put pgm
//
//v1.1 :21-01-2013
//note :+ one wire function
//
//v1.2 :26-01-2013
//note :bug fix one wire function
// :+ soft i2c function
//--------------------------------------------------