วันอังคารที่ 20 มีนาคม พ.ศ. 2555

Blink LED on GP2 (PIC12F510)


//-------------------------------
// Program  :Blink LED on GP2
// Author   :Somlak Mangnimit
// Date     :19/03/2012
// Device   :PIC12F510
//-------------------------------
#include    <htc.h>
#define     _XTAL_FREQ  8000000
__CONFIG(OSC_IntRC&WDT_OFF&MCLRE_OFF&IOSCFS_ON);

//--- Main ---
void main(void){
CM1CON0 = 0x00;
ADCON0 = 0x00;
TRIS = 0x00;
OPTION = 0xc0;
    //--- Super loop ---
    while(1){
        GPIObits.GP2 = 1;
        __delay_ms(200);
        GPIObits.GP2 = 0;
        __delay_ms(200);
    }
}

วันพฤหัสบดีที่ 17 พฤศจิกายน พ.ศ. 2554

การเชื่อมต่อ PIC16F877 กับ SHT11


/*
Program : Read SHT11
Author  : Somlak Mangnimit
Date    : 16/11/2011
Device  : PIC16F877 @20Mhz
*/

#include <htc.h>
#include <math.h>
#include <stdio.h>

#define _XTAL_FREQ 20000000

__CONFIG(FOSC_HS & WDTE_OFF & LVP_OFF);

#include "clcd.c"

#define SHT_SCK             PORTBbits.RB4
#define SHT_DATA            PORTBbits.RB5

#define SHT_SCK_DDR         TRISBbits.TRISB4
#define SHT_DATA_DDR        TRISBbits.TRISB5

#define SHT_SCK_LOW()       SHT_SCK_DDR=0; SHT_SCK=0;
#define SHT_SCK_HIGH()      SHT_SCK_DDR=0; SHT_SCK=1;

#define SHT_DATA_LOW()      SHT_DATA_DDR=0; SHT_DATA=0;
#define SHT_DATA_HIGH()     SHT_DATA_DDR=0; SHT_DATA=1;
#define SHT_DATA_FLOAT()    SHT_DATA_DDR=1; SHT_DATA=0;

//SHT1x address=000 is currently supported
//SHT1x command code
                                    //adr  command  r/w
#define SHT_STATUS_REG_W    0x06    //000   0011    0
#define SHT_STATUS_REG_R    0x07    //000   0011    1
#define SHT_MEASURE_TEMP    0x03    //000   0001    1
#define SHT_MEASURE_HUMI    0x05    //000   0010    1
#define SHT_RESET           0x1e    //000   1111    0

//constant use for SHT1x Humidity Measurement
#define C1  -4.0
#define C2  +0.0405
#define C3  -0.0000028

//constant use for SHT1x Temperature Measurement
#define D1  -40.0
#define D2  +0.01

//constant use for SHT1x True Humidity Measurement
#define T1  +0.01
#define T2  +0.00008

//-----------
//delay usec
//-----------
void delay_us(unsigned int us){
while(--us){__delay_us(1);}
}

//-----------
//delay msec
//-----------
void delay_ms(unsigned int ms){
while(--ms){__delay_ms(1);}
}

//-----------------------------------
//SHT1x Transmission Start condition
//-----------------------------------
void SHTStart(void){
SHT_DATA_HIGH();                    //Initial state
SHT_SCK_LOW();
delay_us(2);
SHT_SCK_HIGH();
delay_us(1);
SHT_DATA_LOW();
delay_us(1);
SHT_SCK_LOW();
delay_us(2);
SHT_SCK_HIGH();
delay_us(1);
SHT_DATA_HIGH();
delay_us(1);
SHT_SCK_LOW();
}

//-----------------------
//SHT1x Connection Reset
//-----------------------
void SHTConReset(void){
unsigned char i;
SHT_DATA_HIGH();
SHT_SCK_LOW();
delay_us(2);
    for(i=0;i<9;i++){               //9 SCK cycles
        SHT_SCK_HIGH();
        delay_us(2);
        SHT_SCK_LOW();
        delay_us(2);
    }
SHTStart();
delay_ms(250);
}

//----------------------------------------------
//SHT1x Address & Command Mode with address=000
//----------------------------------------------
unsigned char SHTWrite(unsigned char Data){
unsigned char i;
    for (i=0x80;i>0;i/=2){                  //shift bit for masking data
        delay_us(1);
        if(i&Data){SHT_DATA_HIGH();}
        else{SHT_DATA_LOW();}
        delay_us(1);                        //Snend Clock each bit
        SHT_SCK_HIGH();
        delay_us(2);
        SHT_SCK_LOW();
    }
SHT_DATA_FLOAT();     //Change DATA Line to Input
delay_us(2);
SHT_SCK_HIGH();       //Clock for Acknowledge
delay_us(2);
i = SHT_DATA;         //Get Acknowledge
SHT_SCK_LOW();
delay_ms(250);
return(i);
}

//---------------------
//Read data from SHT1x
//---------------------
long SHTRead(void){
long lTmp,lValue,lVal1=0,lVal2=0;
unsigned char i;
//get MSB from SHT1x
SHT_DATA_FLOAT();               //Change to Input
    for(i=0;i<8;i++){
        lVal1<<=1;
        delay_us(1);
        SHT_SCK_HIGH();         //Send Clock Hight
        delay_us(1);
        lTmp = SHT_DATA;        //Read Data Bit
        delay_us(1);
        SHT_SCK_LOW();          //Send Clock Low
        delay_us(1);
        if(lTmp){lVal1|=1;}     //store in lVal1
    }

//Acknowledge for Next byte
SHT_DATA_LOW();
delay_us(1);
SHT_SCK_HIGH();
delay_us(2);
SHT_SCK_LOW();
delay_us(1);

//get LSB from SHT1x
SHT_DATA_FLOAT();               //Change to Input
    for(i=0;i<8;i++){
        lVal2<<=1;
        delay_us(1);
        SHT_SCK_HIGH();         //Send Clock Hight
        delay_us(1);
        lTmp = SHT_DATA;        //Read Data Bit
        delay_us(1);
        SHT_SCK_LOW();          //Send Clock Low
        delay_us(1);
        if(lTmp){lVal2|=1;}     //store in lVal2
    }

//noAcknowledge
SHT_DATA_HIGH();
delay_us(1);
SHT_SCK_HIGH();
delay_us(2);
SHT_SCK_LOW();

//Makes a 16 bit number out of two 8 bit numbers.
lValue = (unsigned int)(lVal1&0xff)*0x100+(lVal2&0xff);
return(lValue);
}

//-------------------------------------------------------------------
//SHT1x Soft Reset
//resets the interface, clears the status register to default values
//wait minimum 11ms before next command
//-------------------------------------------------------------------
void SHTSoftReset(void){
SHTConReset();
SHTWrite(SHT_RESET);
}


unsigned char buffer[20];
void clr_buffer(void){
char x;
for(x=0;x<20;x++){buffer[x]=0x20;}
}

//-------------
//Main Program
//-------------
void main(void){
long lValue_rh,lValue_temp,Status_reg;
float fRh_lin,fRh_true,fTemp_true,fDew_point,fLogEW;
unsigned char ER;

TRISB = 0b11110000;
TRISC = 0b11111000;

SHTConReset();
lcd_init();

SHTStart();
SHTWrite(SHT_STATUS_REG_R);
Status_reg = SHTRead();
Status_reg = (int)Status_reg;

if((Status_reg&0x007)!=0){
SHTStart();
SHTWrite(SHT_STATUS_REG_W);
SHTWrite(0x00);
}

delay_ms(12);

    while(1){
        SHTStart();                             //start transmission
        ER = SHTWrite(SHT_MEASURE_TEMP);        //measure temperature
            if(ER==1){
                lcd_write_command(0x01);
                lcd_gotoxy(0,0);
                lcd_print_string("-----[ SHT-11 ]-----");
                lcd_gotoxy(1,0);
                lcd_print_string("Sensor Error!");
                delay_ms(1000);
                continue;
            }
        lValue_temp = SHTRead();
        fTemp_true = D1+(D2*lValue_temp);     //temperature calculation

        //delay 11ms before next command
        delay_ms(12);
      
        SHTStart();                             //start transmission
        SHTWrite(SHT_MEASURE_HUMI);             //measure relative humidity
        lValue_rh = SHTRead();

        //relative humidity calculation
        fRh_lin = C1+(C2*lValue_rh)+(C3*lValue_rh*lValue_rh);
        fRh_true = (fTemp_true-25)*(T1+(T2*lValue_rh))+fRh_lin;
        if(fRh_true>100.0){fRh_true = 100.0;}
        if(fRh_true<0.1){fRh_true = 0.1;}

        //dewpoint calculation
        fLogEW = ((log10(fRh_true)-2)/0.4343)+(17.62*fTemp_true)/(243.12+fTemp_true);
        fDew_point = (243.12*fLogEW)/(17.62-fLogEW);

        lcd_gotoxy(0,0);
        lcd_print_string("-----[ SHT-11 ]-----");

        lcd_gotoxy(1,0);
        clr_buffer();
        sprintf(buffer,"Temperature :%3.1f C",fTemp_true);
        lcd_print_string(buffer);

        lcd_gotoxy(2,0);
        clr_buffer();
        sprintf(buffer,"Humidity    :%3.1f %%",fRh_true);
        lcd_print_string(buffer);

        lcd_gotoxy(3,0);
        clr_buffer();
        sprintf(buffer,"Dewpoint    :%3.1f C",fDew_point);
        lcd_print_string(buffer);

        delay_ms(1000);
    }
}

วันจันทร์ที่ 25 กรกฎาคม พ.ศ. 2554

Digital Clock & Temp with FTTL-655 Display

FTTL-655 เป็นจอแบบ Duplex LED Display ผมไม่เคยเล่นหรือเจอจอแบบนี้มาก่อน
มันประหลาดดี มันจะมี 2 common แถมแต่ละ sigment พ่วงกันแบบ งงๆ
หา datasheet ก็ไม่มี แต่ไปเจออันนี้เข้า
http://libesz.digitaltrip.hu/digital-clock/
มีที่เดียวจริงๆ แถม Source ดันเป็นภาษา C อีก เลยต้องดำน้ำเอง



มาว่ากันถึงหลักการขับแบบที่ผมคิดเอง
FTTL655S มีตัวเลข 4 หลัก ใช้ pin ในการขับ segment 14pin
มี colon ด้วยก็ 15pin พอดี แบบไม่รวม common และ am-pm ผมไม่ได้ใช้



อันดับแรกผมจะแบ่ง จอออกเป็น 4 ส่วน เพื่อง่ายต่อการมอง
ใช้ข้อมูล 4byte คือ 2byte บน 2byte ล่าง แยกจากกัน
ข้อมูล segment หลัก1-2 ใช้ 2byte คือ 1byte บน 1byte ล่าง
ข้อมูล segment หลัก3-4 ใช้ 2byte คือ 1byte บน 1byte ล่าง

ในข้อมูล 1byte ที่ส่งให้กับ segment จะประกอบด้วย
เลขสองหลัก และในตัวเลขสองหลักจะมี 2common sigment พ่วงกัน
จึงต้องแบ่งแยกข้อมูลออกเป็น 4 ชุดคือ

Table A = digit1บน+digit2บน
Table B = digit1ล่าง+digit2ล่าง

เอาทั้งหมดมารวมกันเป็น 2byte บนกับล่าง (A กับ B) ส่งแล้ว scan ตามลำดับ

เนื่องจากจอเป็นแบบ 2common การ scan จึงทำได้สองครั้ง
ผมก็เอาข้อมูล หลัก1-2 บน กับ หลัก3-4 บน ส่งออกไปยัง port 1-2
ตามลำดับ จากนั้นสั่ง common1 on ต่อไป ก็เอาข้อมูล หลัก1-2 ล่าง
กับ หลัก3-4 ล่าง ส่งออกไปยัง port 1-2 จากนั้นสั่ง common 2 on

การเปิดตาราง (อ้างจาก Code) โปรดดูรูปวงจรของ FTTL655S ประกอบ
ถ้านับหลักซ้ายมือสุดเป็นหลักที่1จะเห็นว่ามีการต่อ segment เหมือนกัน
ในหลักที่ 2 และ 4 สามารถใช้ตารางเดียกันได้ ส่วนหลักที่ 1 และ 3 ต่างกัน
เราก็แยกเป็นสองตาราง รวมทั้งหมด 3 ตาราง โดย table-A ใช้กับหลักที่ 1
table-B ใช้กับหลักที่ 3 และ table-C ใช้กับหลักที่ 2และ4

ต่อไปเป็นการเปิดตารางผมจะเรียกข้อมูลชุดบนว่า A และชุดล่างว่า B
ทุกครั้งที่เปิดตารางของแต่ละหลัก จะได้ข้อมูล 2 ชุด คือ A และ B
ซึ่งก็คือข้อมูลของ Common ซึ่งมีอยู่สองชุดนั่นเอง
แต่ใน 1 byte นั้นมันจะมีตัวเลขอยู่สองหลัก ดังนั้นเมื่อเปิดตารางแล้ว
ก็จะได้ข้อมูลมา 4 ชุดหรือ 4 byte คือ

A หลักที่ 1 และ B หลักที่ 1
A หลักที่ 2 และ B หลักที่ 2

นำข้อมูล A1 กับ A2 มา OR กันเป็น 1 byte
นำข้อมูล B1 กับ B2 มา OR กันเป็น 1 byte

การ scan ทำดังนี้
1.สั่ง Common 1-2 Off
2.เอาข้อมูลที่ได้จาก A1+A2 ส่งออกไปที่ port สั่ง Common 1 On
ค้างไว้ 5ms จากนั้น
3.สั่ง Common 1-2 Off
4.เอาข้อมูลที่ได้จาก B1+B2 ส่งออกไปที่ port สั่ง Common 2 On
ค้างไว้ 5ms กลับไปทำข้อ 1

จบแล้วครับ อาจไม่สมบูรณ์เท่าไร แต่คงพอเป็นแนวทางได้นะครับ

ประกอบไปด้วย Program Driver ตัวอย่าง และ Program นาฬิกา DS1307
และ Temp DS18B20 แก้ไขจาก Digital clock - Temp with 1.8 LED Display


Source Code

วันอาทิตย์ที่ 24 กรกฎาคม พ.ศ. 2554

7 Segment Thermometer 2 Digit

เป็น Temp monitor ที่ผมพยายามทำให้เล็กที่สุดครับซึ่งทำได้เล็กสุดแค่นี้



ย่านการวัด อยู่ที่ -9 ถึง +99 องศา ตามหลักของ 7segment
ที่เอาแค่หลักสิบไม่มีทศนิยม ถ้าเกินกว่าย่านวัดที่กำหนด จะมีตัว Er กระพริบ



ตัวแรกผมใช้กับ DS18S20 แต่ผมเห็นราคามันแพง เลยแก้ไปใช้กับ
DS18B20แทน ด้านอุปกรณ์ผมออกแบบให้ใช้อุปกรณ์ให้น้อยที่สุด
ราคาโดยรวมไม่น่าเกิน 150 บาท (เน้นประหยัด)

ปล.อาจมีคนทำเล่นเยอะแล้ว แต่ของmcs-51 หายากที่เห็นๆดูจะใช้อุปกรณ์
เยอะไปหน่อยไม่ค่อยถูกใจ

Source Code v1.0

วันเสาร์ที่ 23 กรกฎาคม พ.ศ. 2554

Low Cost Serial LCD Backpack

จริงๆ function เยอะกว่านี้แต่ผมตัดออกเพราะไม่ได้ใช้ แต่เป็น commend อยู่ใน code
เช่น การ เปิด ปิด backlight .... ลองไปแก้ code กันเอานะครับ ตัวนี้เป็น source
ที่สมบูรณ์ที่สุดแล้ว..... สามารถแก้ไปใช้กับ 89LPxxxx รองรับ baud 115k ได้สบายๆ
ส่วน auto baud กับ soft fifo ผมเพิ่งใส่ไป อาจมี bug แต่ผมลองแล้วยังไม่เจอ
ใครใช้แล้วมีปัญหากรุณารายงานผมด้วยครับ.....





คุณสมบัติ
Support Baud 1200,2400,4800,9600,19200,57600
Auto Baud rate function.
Software FIFO 80 byte
Command Prefix 254(0xFE)
Support CLCD 16x1 16x2 20x4 and more...

การ initial (Auto Baud rate function)
กำหนด Baud rate ฝั่งส่งให้เรียบร้อย
รอ 1 วินาที ให้ Serial LCD initial
ส่งค่า 0x20 ไปยัง Serial LCD
หาก ถูกต้อง LCD จะแสดงข้อความ Detect-xxxxx.bps
รอ 2 วินาที
ส่งข้อมูลตามต้องการ

Source code v8.0

Digital Temprature Controller

เป็น project ที่ไม่ซีเรียสมากแต่เอาไปใช้ได้จริง สามารถคุมได้ทั้งร้อนและเย็น
ตั้งแต่ -55องศา ถึง 125องศาcompare routine สามารถคำนวนและเปรียบเทียบ
ค่าลบได้ด้วย โดยคำนวนร่วมกับ flag tn,th,tl





มาว่ากันเรื่องการคำนวน มีหลักๆก็
TN ค่าอุณหภูมิ ปัจจุบันที่อ่านได้จาก ds18b20
TH ค่าอุณหภูมิ สูงสุดที่เรากำหนด
TL ค่าอุณหภูมิ ต่ำสุดที่เรากำหนด

เริ่มแรกให้คำนวน TH กับ TN ก่อน TNน้อยกว่าTH ??
ผมลองสุ่มค่าดังนี้
tn+15 th+10 = tnมากกว่าth
tn+15 th-10 = tnมากกว่าth
tn+15 th-15 = tnมากกว่าth
tn-15 th-20 = tnมากกว่าth
tn-15 th+15 = tnน้อยกว่าth**
การคำนวนให้คิดเครื่องหมายก่อนถ้าเป็นบวกทั้งคู่ใช้ th-tn
ถ้าเป็นลบทั้งคู่ใช้ tn-th แต่ถ้า tn เป็นบวก th เป็นลบจะคิด
แต่เครื่องหมายเพราะยังไง tn ก็ต้องเยอะกว่าแนนอนอยู่แล้ว
ในทางตรงกันข้าม ถ้า tn เป็นลบ th เป็นบวก tn จะมีค่า
น้อยกว่า ก็ข้ามไปคำนวณ tl ต่อไป

TL กับ TN ก่อน TNน้อยกว่าTL ??
ผมลองสุ่มค่าดังนี้
tl+15 tn+10 = tnน้อยกว่าtl
tl+15 tn-10 = tnน้อยกว่าtl
tl+15 tn-15 = tnน้อยกว่าtl
tl-15 tn-20 = tnน้อยกว่าtl
tl-15 tn+15 = tnมากกว่าtl**
การคำนวนให้คิดเครื่องหมายก่อนเช่นเดียวกับ th แต่คราวนี้
ใช้ tn เป็นตัวตั้งลบด้วย tl หากเป็นค่าบวกทั้งคู่....
ที่เหลื่อก้จะคำนวณคล้ายๆกันแค่สลับตัวตั้งเท่านั้น.....

การทำงานใน Hot mode (คุมร้อน)
เมื่อ TN ต่ำกว่าหรือเท่ากับ TL รีเลย์จะทำงานและจะตัด
การทำงานจนกว่าค่าของ TN จะสูงกว่าหรือเท่ากับ TH

การทำงานใน Cool mode (คุมเย็น)
คล้าย คุมร้อน แต่สลับกัน...
พอมองภาพออกกันมั๊ยครับ (ทั้งหมดนี่จะไม่มีความหมายหากเขียนด้วย ภาษาc)

Source code v2.0f

FIRMWARE 4.0F
รุ่นท้ายสุด... ผมปรับแก้ bug จนหมดแล้วครับ
อีกอย่างคือยัดอะไรไม่ได้แล้ว เต็ม2kแล้วจริงๆ อยากใส่ delay time
ให้ รีเลย์ แต่ยัดไม่ลงครับ ก็เลยเอาเท่าที่ได้...

การตั้งค่า กด set ค้างไว้ 1 วิครับมันจะขึ้น HC_x ซึง x ก็คือ ตัวกระพริบ
ถ้าเป็น C กระพริบก็ Cool คุมเย็น ถ้าเป็น H ก็คือ Hot คุมร้อน
กดปุ่ม inc เพื่อตั้งค่า จากนั้นกด set อีกครั้ง หน้าจอจะแสดง Hi_t
ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิสูง
กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set
เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Lo_t
ประมาณ1วินาที จากนั้น จะเปลี่ยนเป็นตัวเลข4หลัก คือค่าอุณหภูมิต่ำ
กดปุ่ม inc เพื่อตั้งค่าจากนั้นเลื่อนไปหลักต่อไปโดยกดปุ่ม set
เมื่อตั้งค่าหลักสุดท้ายเสร็จ กดปุ่ม set อีกครั้ง หน้าจอจะเสดง Succ
เป้นอันเสร็จการตั้งค่า

การ ลบค่าอุณหภูมิที่ตั้งไว้ทั้งหมด ทำได้โดยกด ปุ่ม set กับ inc ค้าง
ไว้ 1วิ หน้าจอจะแสดง CLr เท่านี้ค่าต่างๆก็จะถูกลบออกหมดแล้ว...

4.0F ผมตัด function ที่เกี่ยวกับ EEPROM ทั้งหมดออกนะครับ
อยากได้ต้องไปเพิ่มกันเองครับ เหลือไว้ให้คิดเองบ้างครับ ชีวิตจะได้
มีรสชาติ...อิอิ คงไปต่อยอดกันเองได้ไม่ยากนะ...

ปล. เกี่ยวกับ error msg.
Er_1 = family code ไม่ตรง หรือไม่ใช่ ds18b20 ที่ต่ออยู่
แต่ผมตัดออกเพาระไม่จำเป็น.
Er_2 = Device not Presence ไม่มีการตอบสนอง ต่อการ
reset บน bus 1-wire ซึ่งตัว ds18b20 อาจจะเสียหรือหลุด
หือสายอาจจะขาดก็ว่าไป.
Er_3 = ค่าอุณหภูมิสูง มีค่าที่น้อยกว่า ค่าอุณหภูมิต่ำ.
Er_4 = ค่าอุณหภูมิสูง และหรือ ค่าอุณหภูมิต่ำ มีค่าเกินย่านวัด
คือ -55 ถึง +125 องศา.
Er_5 = อันนี้เกี่ยวกับ EEPROM ทั้งหมด 4.0F จะไม่มี

Source code v4.0f

7 Segment Serial interface (แก้ขัด MAX7219)

เมื่อไม่นานมานี้ผมทำเกี่ยวกับ 7segment เยอะก็เลยปิ๊งไอเดียที่จะเอามาทำ
display module แบบสำเร็จรูปคือมี controller chip ในตัวเลย
โดยการใช้งานจะต้องให้ง่ายมากที่สุด มาดูวิดีโอกันก่อน



จะเห็นว่าสามารถควบคุมการทำงานต่างๆได้อย่างง่ายดายโดยมี command บางตัว
ที่ใกล้เคียงกับ LCD ทั่วไป ส่วนที่เหลือยังไม่ได้กำหนดเป็นมาตรฐาน และใน version
ต่อๆไปอาจไม่ได้อ้าง command นี้



จริงๆอุปกรณ์ไม่ได้เยอะขนาดนี้ถ้าผมใช้ 7segment common A เพราะ mcs-51
มันขับแบบซอร์ซไม่ได้อย่างที่เรารู้กัน วงจรก็เลยใหญ่อย่างที่เห็น แต่ก็เอาเหอะอันแรก
เอาอะไรมากชิมิ

มาดู specification กันก่อน
Controller :at89c2051 @11.0592-MHz
Baud :9600-bps
Fifo Buffer :32-byte
Display Data Register :8-byte
Character Gen. Register :n/a
Scan frq. :~500Hz
Support Ascii :0-9

รายละเอียดกลุ่มคำสั่งมีดังนี้
Command pre fix :0xfe
Home Address :0x01
Clear Display :0x02
Display Off :0x03
Display On :0x04
Dot Control :0x09
Define Bin :0x0c
Rotate Display Register Left :0x0d
Rotate Display Register Right :0x0e
CG-Ram Address :0x40 -->> n/a
DD-Ram Address :0x80

Home Address
กำหนดให้ DD-Ram Address ไปอยู่ในตำแหน่ง 0 หรือ Digit1
--ตัวอย่าง--
[0xfe]-[0x01]

Clear All Display Register
เคลียร์ Display Register ทั้ง 8byte พร้อมกับ
กำหนดให้ DD-Ram Address ไปอยู่ในตำแหน่ง 0 หรือ Digit1
--ตัวอย่าง--
[0xfe]-[0x02]

Display Off
ปิดการแสดงผล ไม่มีผลกับ Display Register
--ตัวอย่าง--
[0xfe]-[0x03]

Display On
เปิดการแสดงผล ไม่มีผลกับ Display Register
--ตัวอย่าง--
[0xfe]-[0x04]

Dot Control Page1
ใช้ส่งข้อมูลเฉพาะ Dot-segment ของ Display Register ทั้ง 8-byte
--ตัวอย่าง--
[0xfe]-[0x09]-[xxxxxxxx]
Dot-On x=1
Dot-Off x=0
บิต 0 เป็น Dot ของ Digit1 ไล่ขึ้นไปจนถึง Digit8

Define Bin
ใช้ส่งข้อมูลแบบ Binary เช่นต้องการตัวอักษรแปลกๆ ที่เราสร้างขึ้นเอง
หลังกระทำคำสั่ง DD-Ram Address+1
--ตัวอย่าง--
[0xfe]-[0x0c]-[xxxxxxxx]
Segment-On x=1
Segment-Off x=0
Bit0 = Segment-A
Bit1 = Segment-B
Bit2 = Segment-C
Bit3 = Segment-D
Bit4 = Segment-E
Bit5 = Segment-F
Bit6 = Segment-G
Bit7 = Segment-Dot

Rotate Display Register Left
ใช้หมุนข้อมูล Display Register ไปทาง ซ้ายหนึ่งครั้ง ต่อคำสั่ง ไม่มีผลกับ DD-Ram Address
--ตัวอย่าง--
[0xfe]-[0x0d]

Rotate Display Register Right
ใช้หมุนข้อมูล Display Register ไปทาง ขวาหนึ่งครั้ง ต่อคำสั่ง ไม่มีผลกับ DD-Ram Address
--ตัวอย่าง--
[0xfe]-[0x0e]

DD-Ram Address
ใช้กำหนด DD-Ram Address
--ตัวอย่าง--
[0xfe]-[0x80... thru 0x87]

การใช้งาน
เราสามารถส่งตัวเลข 0-9 ที่เป็นรหัส ascii ไปแสดงผลได้ทันที นอกเหนื่อจากนี้จะไม่มีผล
หรือข้อมูลจะถูกละทิ้งไป ในทุกๆครั้งที่ส่งข้อมูลไปแสดงผล display buffer address จะ
เพิ่มขึ้นเองอัตโนมัติ รวมทั้งคำสั่ง define bin ด้วย ที่เหลือศึกษาได้จาก code ครับ

Source Code v1.0

วันศุกร์ที่ 22 กรกฎาคม พ.ศ. 2554

Countdown Timer 3 Mode with Alarm

เนื่องมาจากที่บ้านผม
มีเครื่องซักผ้าแบบ กึ่ง อัตโนมือ... เวลาปั่นเสร็จมันจะไม่เตื่อนใดๆทั้งสิ้น
ส่วนระหว่างปั่น ผมก็จะมานั่งเล่น internet มันก็จะเพลินจน
เลยเวลาตากผ้าหรือเวลาหมดแดด ก็เลยทำเครื่องเตือนเป็น CountDown
ขึ้นมาจะได้ไม่เล่นเพลินจนลืมตากผ้าดังกล่าว...เห่อๆๆ



ของจริง


รายละเอียดการใช้งาน
CountDown ตัวนี้มีด้วยกันหลักๆ 3 โหมด คือ
1-99 วินาที,1-99 นาที,1-99 ชั่วโมง
แต่ละโหมด จะมีย่อย อีก 4 แบบ คือ ตั้งเวลาปิด,เปิด ให้ alarm หรือไม่ alarm
โดย dot1 หากติดคือเปิด alarm ไม่ติดคือปิด alarm
ส่วน dot2 ถ้าติดคือ การตั้งเวลาเปิด ถ้าไม่ติดคือ การตั้งเวลาปิด

A = sec
b = min
C = hour

ปุ่ม Set ทำงานสองหน้าที่
กดปล่อย = start,stop
กดค้าง = set

การตั้งเวลาทำได้โดยกด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง
หน้าจอจะแสดง mode ให้กด + ตั้งค่า mode ตามต้องการ จากนั้นกด set 1ครั้ง
จะเป็นการตั้งค่าหลัก สิบ กด + เลือก 0-9 จากนั้นกด set 1ครั้ง เป็นการตั้งหลัก
หน่วย กด + เพื่อตั้งค่า กด set 1ครั้ง ตัวเลขจะหยุดกระพริบ กด set 1ครั้ง
จะเห็น dot2 กระพริบแสดงว่าเวลาเริ่มเดินแล้ว ในระหว่างเวลานับถอยหลังอยู่
สามารถหยุดได้โดยกด set 1ครั้งหรือกด set ค้างไว้ประมาน 1วินาที
จะได้ยินเสียง beep 1ครั้ง เป็นการกลับไปตั้งค่าใหม่อีกครั้ง...

เปิด alarm
เมื่อการนับถอยหลังเสร็จสิ้น จะเกิด alarm ประมาณ 30วินาที
จากนั้นจะหยุดไปเอง ถ้าในระหว่างเกิด alarm อยู่แล้วต้องการปิด
ให้กด set ค้างไว้ประมาน 1วินาทีจะได้ยินเสียง beep 1ครั้ง
alarm จะหยุด...

Source Code v1.0
Source Code v1.2 ใส่ alarm relay เพิ่ม...