STM8s105C4T6 Drive 7 Segment 3 Digit

July 17, 2010 by 10Logic.com  
Filed under Microcontroller, STM8s-Discovery



วันนี้ผมนั่นเขียนโปรแกรม Drive 7 Segment 3 digit ด้วย STM8s105C4T6 เสร็จแล้วก็เลยเขียนวงจรและเผยแพร่ต่อไป เผื่อว่าใครที่กำลังหัดเล่น STM8s จะได้เริ่มต้นได้ถูก ในประเทศไทยยังไม่มีหนังสือให้อ่าน แต่ก็สามารถค้นหาใน internet ได้แต่ต้องใช้ความพยายามหน่อยครับ หาไปเรื่อยเดี๋ยวก็หาเจอ

จากที่ผมซื้อไอซี STM8s105C4T6 จากอีทีทีตัวละ 60 กว่าบาท แล้วก็ซื้อ ET-PCB LQFP48 มาด้วยเพื่อมาต่อวงจรเอง เสียดายไม่มีกล้องครับ จะได้ถ่ายภาพมาให้ดูสถาปัตยกรรมการต่อวงจรของผม อิอิ(มันส์จริงๆ)

โปรแกรมที่เขียนเป็นการนับเลขจาก 0-999 ครับ โค้ดโปรแกรมตามด้านล่างนี้ เดี๋ยววันหลังผมจะเขียนอธิบายไว้ อย่างเช่น GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST, GPIO_DeInit ฯลฯ (ผมใช้ Cosmic compiler นะครับ) เพราะเป็นสิ่งที่ผมเริ่มต้นใหม่เช่นกัน ว่างๆก็เล่น ส่วน atmega128 ก็ยังเล่นอยู่เหมือนเดิมแต่ STM8 เป็นทางเลือกครับ

วงจร

โค้ดโปรแกรม

//	Program	: Program Drive 7' segment 3Digit
//	Writer	: akiraten
//	Email		: akirten@hotmail.com
//	Blog		: http://www.10logic.com
//	Development tools: STM8S Discovery

// Includes -----------------------------------------
#include
#include
#include
#include"stm8s.h"
#include"inigpio.h"
// Private defines ----------------------------------

char digithex[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
char bufuart[4];

void initialGPIO(void){
		// Reset ("de-initialise") GPIO port D,B
    GPIO_DeInit(GPIOB);
		GPIO_DeInit(GPIOA);
    // Initialise pin 0 of port B.
		GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_PP_LOW_FAST);

		GPIO_Init(GPIOA,(GPIO_PIN_3)|(GPIO_PIN_4)|(GPIO_PIN_5),GPIO_MODE_OUT_PP_LOW_FAST);
//		GPIO_Init(GPIOE,GPIO_PIN_1,GPIO_MODE_OUT_PP_LOW_FAST);
//		GPIO_Init(GPIOE,GPIO_PIN_2,GPIO_MODE_OUT_PP_LOW_FAST);
}
void charto7segment(char digit){

	switch(digit){
		case 0x30: GPIO_Write(GPIOB,digithex[0]);
			break;
		case 0x31: GPIO_Write(GPIOB,digithex[1]);
			break;
		case 0x32: GPIO_Write(GPIOB,digithex[2]);
			break;
		case 0x33: GPIO_Write(GPIOB,digithex[3]);
			break;
		case 0x34: GPIO_Write(GPIOB,digithex[4]);
			break;
		case 0x35: GPIO_Write(GPIOB,digithex[5]);
			break;
		case 0x36: GPIO_Write(GPIOB,digithex[6]);
			break;
		case 0x37: GPIO_Write(GPIOB,digithex[7]);
			break;
		case 0x38: GPIO_Write(GPIOB,digithex[8]);
			break;
		case 0x39: GPIO_Write(GPIOB,digithex[9]);
			break;
	}
}

void delay(unsigned int i){
 unsigned int j;
 while(i--){
  for(j=0;j<2000;j++);
 }
}

void main(void){

	// Delay for a short while.
	u16 d=0,i=0;
	unsigned char len=1;

	memset(bufuart,0,sizeof(bufuart));
	strcpy(bufuart,"0");
	initialGPIO();
	GPIO_Write(GPIOA,(GPIO_PIN_3)|(GPIO_PIN_4)|(GPIO_PIN_5));

	for(;;) {

		if(i>100){
			memset(bufuart,0,sizeof(bufuart));	// clear bufuart
			sprintf(bufuart,"%d",d);						// convert int to string
			len = strlen(bufuart);
			d++;
			if(d>999)
				d=0;
			i=0;
		}

		if(len==1){
			GPIO_WriteHigh(GPIOA, GPIO_PIN_3);	// 7'segment digit 1 on
			GPIO_WriteLow(GPIOA, GPIO_PIN_4);		// 7'segment digit 2 off
			GPIO_WriteLow(GPIOA, GPIO_PIN_5);		// 7'segment digit 3 off
			charto7segment(bufuart[0]);					// write data to 7'segment
			delay(1);
		}else if(len==2){
			GPIO_WriteLow(GPIOA, GPIO_PIN_4);		// 7'segment digit 2 off
			GPIO_WriteLow(GPIOA, GPIO_PIN_5);		// 7'segment digit 3 off
			GPIO_WriteHigh(GPIOA, GPIO_PIN_3);	// 7'segment digit 1 on
			charto7segment(bufuart[1]);					// write data to 7'segment
			delay(1);
			GPIO_WriteLow(GPIOA, GPIO_PIN_3);		// 7'segment digit 1 off
			GPIO_WriteLow(GPIOA, GPIO_PIN_5);		// 7'segment digit 3 off
			GPIO_WriteHigh(GPIOA, GPIO_PIN_4);	// 7'segment digit 2 on
			charto7segment(bufuart[0]);					// write data to 7'segment
			delay(1);
		}else if(len==3){
			GPIO_WriteLow(GPIOA, GPIO_PIN_3);		// 7'segment digit 1 off
			GPIO_WriteLow(GPIOA, GPIO_PIN_4);		// 7'segment digit 2 off
			GPIO_WriteHigh(GPIOA, GPIO_PIN_5);	// 7'segment digit 3 on
			charto7segment(bufuart[0]);					// write data to 7'segment
			delay(1);

			GPIO_WriteLow(GPIOA, GPIO_PIN_3);		// 7'segment digit 1 off
			GPIO_WriteLow(GPIOA, GPIO_PIN_5);		// 7'segment digit 3 off
			GPIO_WriteHigh(GPIOA, GPIO_PIN_4);	// 7'segment digit 2 on
			charto7segment(bufuart[1]);					// write data to 7'segment
			delay(1);

			GPIO_WriteLow(GPIOA, GPIO_PIN_4);		// 7'segment digit 3 off
			GPIO_WriteLow(GPIOA, GPIO_PIN_5);		// 7'segment digit 3 off
			GPIO_WriteHigh(GPIOA, GPIO_PIN_3);	// 7'segment digit 1 on
			charto7segment(bufuart[2]);					// write data to 7'segment
			delay(1);

		}
		i++;
	}
}

Source: Segment3Digit.rar

เนื้อหาที่เกี่ยวข้องกันด้านล่างนี้ครับ!

Post Footer automatically generated by Add Post Footer Plugin for wordpress.

แสดงความคิดเห็น

เขียนความคิดของคุณลงในช่องด้านล่างนี้ครับ!...
และถ้าคุณต้องการแสดงรูปภาพเมื่อแสดงความคิดเห็น สมัครใช้บริการที่นี่ >> gravatar!

*