Vi điều khiển giao tiếp với led 7 đoạn thường không phải là vấn đề quá phức tạp. Tuy nhiên đối với chip stm8s003f3p6 thì mọi chuyện lại khác. Chip này không có port nào liên tục đủ 8 chân để xuất dữ liệu điều khiển led 7 đoạn.
Để giải quyết vấn đề này, ở đây chúng ta sẽ dụng cùng lúc2 port C và D để thực hiện xuất mã led, chương trình con:
void hien_thi(unsigned char data)Vấn đề đã được giải quyết, sau đây là chương trình đầy đủ:
{
GPIO_Write(GPIOC,(maled[data])<<3); //dich du lieu sang ben trai 3bit de lay 5 bit thap
GPIO_Write(GPIOD,((maled[data])>>4)); //dich du lieu sang ben phai 4bit de lay 3 bit cao
}
#include"stm8s_conf.h" // goi thu vien config
//***** Dinh nghi cho cac chan*****/
#define led1 (GPIO_PIN_2)
#define led2 (GPIO_PIN_3)
#define led3 (GPIO_PIN_1)
#define led4 (GPIO_PIN_5)
const unsigned long delay=16000000;
//***** Khai bao bien *****//
unsigned char maled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
unsigned int i,j;
//***** Ham tao thoi gian tre *****//
void delay_ms(unsigned int timer)
{
while(timer--)
{
for(int count=0; count<(delay/1000000);count++);
}
}
void delay_us(unsigned int timer)
{
while(timer--);
}
//***** Ham hien thi cho led 7seg *****//
void hien_thi(unsigned char data)
{
GPIO_Write(GPIOC,(maled[data])<<3); //dich du lieu sang ben trai 3bit de lay 5 bit thap
GPIO_Write(GPIOD,((maled[data])>>4)); //dich du lieu sang ben phai 4bit de lay 3 bit cao
}
//***** Ham cau hinh xung clock cho he thong *****//
static void CLK_Config(void)
{
CLK_DeInit();
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); //f_Master = HSI/1 = 16MHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1); //f_CPU = f_Master/1 = 16MHz
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY)!=SET); //wait until HSI ready
}
//***** Ham chinh *****//
int main( void )
{
CLK_Config();
GPIO_DeInit(GPIOD);
GPIO_DeInit(GPIOC);
GPIO_DeInit(GPIOA);
GPIO_Init(GPIOD,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOA,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOC,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_Init(GPIOB,GPIO_PIN_ALL,GPIO_MODE_OUT_PP_HIGH_FAST);
GPIO_WriteHigh(GPIOA,led1);
GPIO_WriteHigh(GPIOA,led2);
GPIO_WriteHigh(GPIOA,led3);
GPIO_WriteHigh(GPIOB,led4);
while(1)
{
for(i=0;i<=9999;i++)
{
for(j=0;j<=100;j++)
{
GPIO_Write(GPIOD,0xff);
GPIO_Write(GPIOC,0xff);
GPIO_WriteLow(GPIOA,led1);
hien_thi(i/1000);
delay_ms(1);
GPIO_WriteHigh(GPIOA,led1);
GPIO_Write(GPIOD,0xff);
GPIO_Write(GPIOC,0xff);
GPIO_WriteLow(GPIOA,led2);
hien_thi((i%1000)/100);
delay_ms(1);
GPIO_WriteHigh(GPIOA,led2);
GPIO_Write(GPIOD,0xff);
GPIO_Write(GPIOC,0xff);
GPIO_WriteHigh(GPIOB,led4);
GPIO_WriteLow(GPIOA,led3);
hien_thi(((i%1000)%100)/10);
delay_ms(1);
GPIO_WriteHigh(GPIOA,led3);
GPIO_Write(GPIOD,0xff);
GPIO_Write(GPIOC,0xff);
GPIO_WriteLow(GPIOB,led4);
hien_thi(((i%10000)%100)%10);
delay_ms(1);
GPIO_WriteHigh(GPIOB,led4);
}
}
}
}
A cho e hỏi:
ReplyDeleteChân led 7 thanh, mỗi port e lấy 1 đến 2 chân thôi thì phải code phần void hiển thị thế nào ạ. Em cảm ơn!