Saturday, May 21, 2016

BÀI 3 : HIỆU ỨNG LED PIC16F877A XC8 (PART 2)

7:37:00 AM - By Unknown 0

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;
}

Đối với đoan chương trình này chúng ta thấy ban đầu PORTB = 0x00 sau đó sẽ cho vong lặp for chay từ 0 - 9 (ở đây mình cho nó chạy dư vài lần các bạn không thích có thể sữa lại)
sau đó PORTB = (PORTB<<1) | 0X01; như các bạn biết bất kỳ số nào OR với 1 đều bằng 1 nên nó sẽ làm cho chương trình của chúng ta sáng dần sau đó sẽ tắt dần bằng lệnh tiếp theo.
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; //
}
Phần chương trình trên khi mới nhìn vào thì rất dài và hơi khó hiểu đối với những bạn mới bắt đầu học lập trình vì trong bài này có sử dụng một số kiến thức trong bộ môn kỹ thuật số nên đôi khi có những bạn chưa học bộ môn này thì nhìn vào chương trình sẽ rất khó hiểu ! Cho nên phần trên mình đã giải thích từng hàm dùng trong chương trình nên các bạn đọc thấy không hiểu chỗ nào thì comments bên dưới cho mình biết nha !
Link download project : Click here

Tôi là một người đam mê viết BLOG. Tuy tôi không phải là một người giỏi nhưng tôi muốn chia sẽ những gì tôi biết cho các bạn. Tôi hy vọng nó sẽ giúp được các bạn một phần nào đó !
Follow me @Programming PIC
Subscribe to this Blog via Email :

0 nhận xét:

Powered by Blogger.
back to top