Sunday, January 18, 2015

Giao tiếp lcd chỉ với 1 dây tín hiệu

Thông thường, để giao tiếp với lcd ở chế độ 4-bit, ta cần sử dụng 7 chân của Vi Điều Khiển. Bằng cách sử dụng ic mở rộng chân ta có thể chỉ sử dụng 1 chân của Vi Điều Khiển để có thể giao tiếp với lcd.
Chương trình mẫu các bạn có thể download ở đây:

Sunday, January 11, 2015

Stm8 - Input


Để giao tiếp với nút nhấn, chúng ta sử dụng hàm:
GPIO_ReadInputPin(GPIOx, GPIO_PIN_x);
Trong đó GPIOx là port cần đọc tín hiệu( A, B, C, D), GPIO_PIN_x là chân có số thứ tự x của port tương ứng.
 Sau đây là chương trình mẫu

Stm8 - 7seg

     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)
{
  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
}
  Vấn đề đã được giải quyết, sau đây là chương trình đầy đủ:
 #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);
            }
          }
  }
}

inmoov finger voice test

Inmoov finger voice test