7 segment + Interrupt timer0 นับเลขง่ายๆ ด้วย Hi-tech C

วันที่โพสต์: Jan 17, 2011 4:38:19 PM

7 segment + Interrupt timer0 นับเลขง่ายๆ ด้วย Hi-tech C

วันนี้ ผมขอเสนอวิธีการเขียนโค๊ดด้วยภาษาซี ด้วยคอมไพล์เลอร์ Hi-tech C กับบอร์ดที่ผมมีอยู่ ซึ่งเป็นบอร์ด BasePicR2 ที่ผมมีอยู่ ซึ่งบนบอร์ดตัวนี้ ผมได้ใส่ไมโครคอนโทรลเลอร์ เบอร์ PIC16F877 ในการส่งตัวเลขแสดงออกทาง 7-segment จำนวนสี่หลัก โดยให้ตัวเลขเพิ่มค่าขึ้นเรื่อยๆ โดยเปลี่ยนแปลงค่าโดยใช้ค่าเวลาจาก Timer0 ( 8 บิต) เป็นโค๊ดง่ายๆ เพื่อให้เพื่อนๆ ลองเอาไปประยุกต์ใช้งานกันครับ 

วงจร

แนวทางการออกแบบ

1. กำหนดค่า register ที่เกี่ยวข้องกับ Timer0 เำืพื่อให้ Timer0 ทำหน้าที่เป็น Timer

2. สร้าง Interrupt service routine เพื่อให้โปรแกรมกระโดดเข้ามาทำงานเมื่อ Timer0 เกิด Interrupt เนื่องจาก Overflow 

3. ดึงค่าที่ถูกเปลี่ยนแปลงจาก Interrupt routine เข้ามาแสดงผลในส่วนของฟังก์ชั่น main ซึงทำหน้าที่วนลูปไปเรื่อยๆ 

4. ค่าที่ถูกแสดงถูกหารเอาเศษ และหารแบบเลขจำนวนเต็ม เพื่อนำไปชี้ค่าใน Array ที่เป็นส่วนที่แสดงผลของ 7-segment เืพื่อให้ตัวเลขติด

โค๊ด 

#include <htc.h>

#define _XTAL_FREQ 20000000

__CONFIG(FOSC_HS & LVP_OFF & WDTE_OFF & PWRTE_OFF & BOREN_OFF);

void iniTimer0(void);

unsigned char _7Segment[16] = {0x3F,0x06,0x5B,0x4F,0x66,    //0,1,2,3,4

                   0x6D,0x7D,0x07,0x7F,0x6F,    //5,6,7,8,9

                   0x77,0x7C,0x39,0x5E,0x79,    //A,b,C,d,E

                   0x71};                       //F

                   

unsigned char num[4] = {0x08,0x04,0x02,0x01}; 

unsigned int count;

unsigned int ms;

void interrupt TIMER0_INT(void)

{

if(T0IF)  // TMR0 Overflow Interrupt Flag bit

{

TMR0 = 216;

T0IF = 0; // reset TMR0 Overflow Interrupt Flag bit

ms++;

if(ms >= 100)

{

count = (count >9999)?0:count++;

ms = 0;

}


}

}

void main(void)

{

unsigned int time = 1;


ADCON1 |= 0x06; // all pin A is digital 

TRISB = 0x00;

TRISA &= 0b11100000;

PORTB = 0x00;

PORTA = 0x00;

GIE = 1; //Global Interrupt Enable

iniTimer0();

while(1)

{

PORTB = _7Segment[((count%1000)%100)%10];

PORTA = num[0];

PORTB = _7Segment[((count%1000)%100)/10];

PORTA = num[1];

PORTB = _7Segment[(count%1000)/100];

PORTA = num[2];

PORTB = _7Segment[count/1000];

PORTA = num[3];

}

}

void iniTimer0(void)

{

T0CS = 0; // use timer0 in timer mode.

PS0 = 0;  // prescaler 1:128

PS1 = 1;

PS2 = 1; 

PSA = 0;  //Prescaler is assigned to the Timer0

TMR0 = 216; // 234 

T0IF = 0;

T0IE = 1; // Enables the TMR0 interrupt

}

วีดีโอสาธิต