Wednesday, June 15, 2016

BÀI 2 : HIỆU ỨNG LED PIC18F4550 CCS

Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về I/O của PIC18F4550 rồi cụ thể là chớp tắt LED, trong bài này mình sẽ hướng dẫn các bạn tiếp tục với I/O đó là tạo 1 số hiệu ứng LED đơn giản !
- Đây là ảnh mô phỏng protues.
led sáng dồn pic18f4550
- Trong hình hình trên mình sử dụng PORTD dùng làm PORT điều khiển ! Sử dụng 8 LED màu vàng và 8 điện trở từ 270 - 330 là ok !
- Code chương trình.
#include <18F4550.h>
#fuses NOMCLR INTRC_IO
#use delay(clock=8000000)
void main()
{
  int i=0,a;
  setup_oscillator(OSC_8MHZ);
  while(TRUE)
  {
  a = 0x01;
  for(i=0;i<=7;i++)
  {
  output_d(a);
  delay_ms(200);
  a = a<<1;
  }
   // right
  a = 0x80;
  for(i=0;i<=7;i++)
  {
  output_d(a);
  delay_ms(200);
  a = a>>1;
  }
   // chase left 
   a = 0X00;
   for(i=0;i<=8;i++)
   {
   output_d(a);
   delay_ms(200);
   a = a<<1;
   a = a | 0X01;
   }
   // chase right
   delay_ms(200);
   a = 0X00;
   for(i=0;i<=8;i++)
   {
   output_d(a);
   delay_ms(200);
   a = a>>1;
   a = a | 0X80;
   }
   // sang dan and tat dan
   delay_ms(200);
   a = 0X00;
   for(i=0;i<=7;i++)
   {
   output_d(a);
   delay_ms(200);
   a = a<<1 | 0x01;
   }
   delay_ms(200);
   for(i=0;i<=7;i++)
   {
   output_d(a);   
   delay_ms(100);      
   a = a<<1;     
   }
   }
   }
- Giải thích chương trình trên như sau :
a. Dịch phải.
  a = 0x01;
  for(i=0;i<=7;i++)
  {
  output_d(a);
  delay_ms(200);
  a = a<<1;
  }
Ban đầu a = 0x01; LED ở chân RD0 sáng sau đó ta sử dụng lệnh dịch trái là a = a<< 1; vì PORTD có 8 chân nên vòng for được lặp lại từ 0 - 7. Tương tự như lệnh dịch phải lệnh dịch trái chỉ thây đổi chỗ a = a >> 1; hai lệnh này chỉ khác nhau chỗ đó thôi.
b. Sáng dồn
   a = 0X00;
   for(i=0;i<=8;i++)
   {
   output_d(a);
   delay_ms(200);
   a = a<<1;
   a = a | 0X01;
   }
Giống như lệnh dịch trái, dịch phải thôi nhưng có khác 1 chỗ là khi dịch xong 1 bít nó sẽ OR với 0x01 bằng lệnh này  a = a | 0X01; như các bạn biết một số bất kỳ OR với 1 điều bằng 1 lệnh trên nó là như vậy tương tự lệnh sáng dồn bên phải cũng vậy chỉ khác nhau là nó OR với 0x80. Xem bản dưới các bạn sẽ rõ :
- Link download project Click here

3 comments:

  1. ad giải thích cái định cấu hình PIC đi?
    #fuses NOMCLR INTRC_IO
    #use delay(clock=8000000)
    setup_oscillator(OSC_8MHZ);??
    cam on ad

    ReplyDelete
  2. Đây là mấy cấu hình cơ bản, khai báo thạnh anh, delay thôi !

    ReplyDelete
  3. cho em hỏi là dịch phải tại sao lại dùng lệnh: a=a<<1.em cảm ơn

    ReplyDelete