BÀI 3 : HIỆU ỨNG LED PIC16F877A XC8 (PART 2) - Lập Trình PIC

Lập trình PIC Menu Lập trình PIC PIC16F877A XC8 XC8 BÀI 3 : HIỆU ỨNG LED PIC16F877A XC8 (PART 2) BÀI 3 : HIỆU ỨNG LED PIC16F877A XC8 (PART 2) 3:50:00 AM PIC16F877A XC8 XC8 Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn tăng mức độ khó của PORJECT lên khó hơn 1 tý so với bài đăng trước nếu như bài đăng trước chúng ta chỉ dùng lại ở việc chớp tắt LED và sáng xen kẻ thì trong bài đăng này mình sẽ giới thiệu với các bạn về Đuổi LED (Chaser LED), sáng dồn, dịch trái, dịch phải, sáng dần, tắt dần… Đây là những hiệu ứng được sư dụng rộng rãi trong các các mạng LED trái tim hay biển quảng cáo… Sau đây mình sẽ giải thích cho các bạn cụ thể về từng hiệu ứng trong bài đăng này. 1. Dịch phải và dịch trái. Để dịch phải thì ta phải cho giá trị ban đầu của PORTB là : PORTB = 0X01; Sau đó chúng ta sử dụng lệnh DỊCH PHẢI để dịch LED : PORTB = PORTB <<1; Lệnh này chỉ dịch được 1 bit nên nếu muốn dịch nhiều bit hơn thì ta phải sử dụng vòng lặp FOR để dịch nhiều lần. Trong bài này mình dịch 8bit nên code sẽ viết như sau : For(i=0;i<8;i++) { PORTB = PORTB<<1; } Như vậy thì ban đầu i=0 sau đó tăng I lên và mỗi lần tăng lên thì PORTB sẽ dịch qua 1 bit. Tương tự lệnh DỊCH TRÁI thì chỉ cần sử dụng lệnh như sau : For(i=0;i<8;i++) { PORTB = PORTB>>1; } Từ hai lệnh trên chúng ta có thể dịch 2 hoặc 3 led 1 lần, chỉ cần thay đổi giá trị ban đầu cho PORTB và tăng số bit cần dịch là được. Ví dụ dịch 1 lần 2 LED qua phải thì giá trị ban đầu cần nạp cho PORTB là PORTB = 0X03 và dịch qua 2 bit thì PORTB = PORTB<<2. 2. Sáng dần và tắt dần. __delay_ms(300); PORTB = 0X00;for(i=0;i<9;i++){__delay_ms(300);PORTB = (PORTB<<1) | 0X01;}// chase off left__delay_ms(300);for(i=0;i<9;i++){__delay_ms(300);PORTB = PORTB<<1;} 3. Sáng dồn. CD=0X00000000;for ( J=8;J>0;J--){D=0X00000001;for(I=0;I<J;I++){Y=CD+D;PORTB = (Y);__delay_ms(300);D=(D<<1);}CD=Y;} - Đây là ảnh mô phỏng proteus. chaser led pic16f877a xc8 - Đây là code chương trình. #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define _XTAL_FREQ 8000000 // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled) #pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off) void GPIO_init(void);// goi ham xuat nhap void main (void) { GPIO_init(); // unsigned char i,I,J,CD,D,Y,X; while(1) { // left PORTB = 0X01; for(i=0;i<8;i++) { __delay_ms(300); PORTB = PORTB<<1; } // right __delay_ms(300); PORTB = 0X80; for(i=0;i<8;i++) { __delay_ms(300); PORTB = PORTB>>1; } // left 2 PORTB = 0X03; for(i=0;i<4;i++) { __delay_ms(300); PORTB = PORTB<<2; } // right 2 PORTB = 0XC0; for(i=0;i<4;i++) { __delay_ms(300); PORTB = PORTB>>2; } // chase left __delay_ms(300); PORTB = 0X00; for(i=0;i<9;i++) { __delay_ms(300); PORTB = PORTB>>1; PORTB = PORTB | 0X80; } // chase right __delay_ms(300); PORTB = 0X00; for(i=0;i<9;i++) { __delay_ms(300); PORTB = PORTB<<1; PORTB = PORTB | 1; } // chase on left __delay_ms(300); PORTB = 0X00; for(i=0;i<9;i++) { __delay_ms(300); PORTB = (PORTB<<1) | 0X01; } // chase off left __delay_ms(300); for(i=0;i<9;i++) { __delay_ms(300); PORTB = PORTB<<1; } // chase right on and off __delay_ms(300); X=0X00000000; for(I=0;I<8;I++) { X=(X<<1)+0X01; PORTB = X; __delay_ms(300); } for(I=0;I<8;I++) { X=(X>>1); PORTB = X; __delay_ms(300); } // don 1 __delay_ms(300); CD=0X00000000; for ( J=8;J>0;J--) { D=0X00000001; for(I=0;I<J;I++) { Y=CD+D; PORTB = (Y); __delay_ms(300); D=(D<<1); } CD=Y; } // don 2 __delay_ms(300); CD=0X00; for ( J=4;J>0;J--) { __delay_ms(300); D=0X03;//0x03 for(I=0;I<J;I++) { __delay_ms(100); Y=CD+D; PORTB = (Y); __delay_ms(300); D=(D<<2); } CD=Y; } } } void GPIO_init(void) { TRISB = 0X00; // cho porta la output PORTB = 0X00; // } - Đây là video mô phỏng. - Link download project : Click here

Share this

Huỳnh Ngọc Lâm

Author : Huỳnh Ngọc Lâm

Related Posts

Next « Prev Post Previous Next Post »

6 nhận xét

Write nhận xét Unknown February 4, 2016 at 5:37 AM delete

tôi xin góp ý 1 chút là sau mỗi dòng code bạn nên ghi chú thích, tôi mới học PIC nên vẫn chưa biết ý nghĩa của câu lệnh vd: PORTB = (PORTB<<1) | 0X01; // ???????????bạn nên ghi chú câu lệnh này thì có ý nghĩa như thế nào thì mọi người sẽ dễ hiểu hơn, tôi góp ý chút vậy thôi, những bài viết của bạn rất có ích với tôi,thanks.

Reply avatar Huỳnh Ngọc Lâm February 4, 2016 at 6:13 AM delete

Cảm ơn bạn đã góp ý ! Thật ra các ký hiệu trên chỉ là toán tử trong C thôi bạn ak ! Lệnh trên ý nghĩa là dịch sang phải 1 bit rồi OR với 0x01. Bạn có thể đọc cái này để hiểu hơn về các lệnh trên nha link : https://devobjc.wordpress.com/category/objective-c/

Reply avatar Unknown April 16, 2016 at 9:27 AM delete

Nếu viết trên 2 port thì sao viết đc nhỉ e k hiểu cái chổ sáng dồn :((

Reply avatar Huỳnh Ngọc Lâm April 16, 2016 at 8:16 PM delete

a = ADC_Read(0);PORTB = a;PORTC = a>>8;tương tự như trên thôi giá trị ADC có 10 bít !Hoặc xem bài này là hiểu : http://xcvn.blogspot.com/2015/12/bai-22-doc-gia-tri-adc-xuat-ra-led.htmlHoặc bài này : http://xcvn.blogspot.com/2015/11/led-trai-tim-pic16f887.html

Reply avatar Anonymous February 27, 2018 at 7:05 AM delete

Anh cho em hỏi tí,sao mình ko khai báo biến i để viết hết,mà phải thêm J,CD,D,Y,Xem mới học nên chưa rành lắm.thank anh nhiều!

Reply avatar Unknown May 7, 2018 at 8:29 PM delete

Anh chỉ em làm sao sáng dồn hai bóng su dung protB

Reply avatar

EmoticonEmoticon

Subscribe to: Post Comments (Atom)

LIKE FANPAGE

Follow us

GOOGLE +

THÀNH VIÊN

PROJECT

  • PIC16F877A CCS 51
  • PIC16F877A XC8 40
  • PIC16F887 30
  • PIC18F4431 9
  • PIC18F452 7
  • PIC18F4550 XC8 7
  • ARDUINO 6
  • IC THÔNG DỤNG 6
  • PIC16F628A 6
  • PIC16F84A 6
  • PIC18F4550 CCS 5
  • ĐIỆN TỬ CĂN BẢN 5
  • LINH KIỆN 4
  • Protues 4
  • VI XỬ LÝ 4
  • MPLAB XC8 2
  • PIC C 2
  • TÀI LIỆU PLC 2
  • 8051 1
  • AUTOCARD 1
  • Arduino IDE 1
  • CẢM BIẾN QUANG 1
  • CẢM BIẾN TIỆM CẬN ĐIỆN DUNG 1
  • CẢM BIẾN TIỆN CẬN ĐIỆN CẢM 1
  • CẢM BIẾN TỪ 1
  • Keil C 1
  • Thiết kế mạch 1

XEM NHIỀU

  • HƯỚNG DẪN ĐỌC GIÁ TRỊ ĐIỆN TRỞ 1 Giới thiệu. a) Hình dáng và ký hiệu :  Trong thiết bị điện tử  điện trở là một linh kiện quan trọng , chúng được làm từ hợp chất cacbon v...
  • BÀI 11 : TIMER 1 PIC16F877A CCS Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về timer0 và trong bài đăng này mình sẽ tiếp tục hướng dẫn các ban về timer1 c...
  • BÀI 30 : PWM VÀ L298 PIC16F877A CCS 1 .IC L298. IC L298 là một IC tích hợp nguyên khối gồm 2 mạch cầu H bên trong. Với điện áp làm tăng công suất đầu ra từ 5V – 47V , dòng l...
  • BÀI 4 : GIAO TIẾP VỚI NÚT NHẤN PIC16F877A CCS (P2) Chào các bạn trong bài 3 mình đã giới thiệu với các bạn về cách giao tiếp với nút nhấn rồi bạn nào chưa xem thì xem lại  tại đây   để hiểu ...
  • TÌM HIỂU VỀ CẢM BIẾN TIỆM CẬN ĐIỆN DUNG 1. Cảm biến tiệm cận điện dung Omron E2K-X8ME1-2M - Cấu trúc của cảm biến tiệm cận điện dung. Hình 1. Cấu tạo cảm biến tiệm cận điện du...

THỐNG KÊ

Từ khóa » Code Led Sáng đuổi