Mô phỏng hiệu ứng 8 LED đơn với PIC16F877A XC8 (P2)

Mô phỏng hiệu ứng 8 LED đơn với PIC16F877A XC8 (P2)

Tác giả: Huỳnh Ngọc Lâm
Nguồn: Programming PIC


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…

Chú ý tất cả các project được viết code trên phần mềm Mplab XC8 và mô phỏng trên phần mềm Proutes 8.1.

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.

- Đâ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; //

}

Bình Luận
Cùng danh mục: Cơ bản Vi điều khiển

Ứng dụng vi điều khiển AT89S52 đếm và đặt trước vòng quay từ 0-99 cho máy quấn băng keo máy biến áp xung

21/02/2018 21:32:46 / Lượt xem: 885 / Người đăng: Nguyễn Thế Trọng Nhân

Đây là bài mô phỏng vi điều khiển AT89S52 đếm và cài đặt vòng quay cho mô tơ hiển thị trên 2 led 7 vach từ 00-99. Áp dụng cho máy quấn keo biến áp xung

Chia sẻ đèn giao thông ngã tư PIC16F877A CCS

24/09/2016 16:09:11 / Lượt xem: 3742 / Người đăng: lam3ngon

Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về đèn giao thông ngã tư nhưng là chạy 1 cách tư động nên trong bài này hướng dẫn các bạn điều khiển bằng nút nhấn nha !

BÀI 4 : Mô phỏng PIC16F877A (XC8) giao tiếp với nút nhấn

25/05/2016 20:50:22 / Lượt xem: 3561 / Người đăng: lam3ngon

Nói về nút nhấn (button) thì có lẽ chúng ta đã quá quen với nó rồi thậm chí chúng ta chúng ta còn tiếp xúc với nó hằng ngày nữa, ví dụ như : bàn phím máy tính, các thiết bị điều khiển tivi, máy điều hòa…..

Giao tiếp SPI và mô phỏng trên AVR

18/05/2016 13:20:22 / Lượt xem: 3432 / Người đăng: biendt

Bài này giúp các bạn biết cách sử dụng cách truyền thông nối tiếp đồng bộ SPI. Công cụ chính cũng là 2 bộ phần mềm AVRStudio (+gcc-avr) và Proteus. Thực chất ngôn ngữ lập trình vẫn là gcc-avr nhưng tôi không dùng Programmer Notepad để biết code như thông thường, thay vào đó tôi dùng AVRStudio làm trình biên tập,

Bài 2 : Mô phỏng hiệu ứng 8 LED đơn với PIC16F877A XC8 (P1)

13/05/2016 14:48:16 / Lượt xem: 2411 / Người đăng: lam3ngon

Trong bài đăng này mình sẽ hướng dẫn các bạn chớp tắt nhiều LED cùng lúc cũng như 1 số hiệu ứng đơn giản như : Xen kẻ, nữa sáng nữa tắt,sáng hết tắt hết …. Để tạo được nhứng hiệu ứng đơn giản như vậy thì mình sẽ giới thiệu với các bạn bảng mã HEX để giúp chúng ta dễ dàng tạo ra nhưng hiệu ứng đơn giản trên.

Quảng cáo - Tài trợ

 -----------------------------

Hỗ trợ trực tuyến