[C9] Bài tập GPIO và thông báo thay đổi phòng học tuần sau.

Manhdd

Cố Vấn CLB
Staff member
Buổi lấy ý kiến trực tiếp thứ bảy vừa rồi cho thấy nhiều bạn C9 có dấu hiệu mất kiến thức qua quá trình nghỉ hè :-( Do vậy, chương trình C9 phải chậm lại, chèn thêm buổi ôn tập để giúp các bạn củng cố kiến thức. Nội dung bài tập GPIO sau buổi ôn tập đầu tiên như sau:
- Lập trình cho 1 Led chạy qua chạy lại trên hàng 8 Led, có điều khiển bằng nút nhấn.
- Thời gian chuyển đổi Led là 1 giây.
- Hai nút nhấn tác động vào 2 trạng thái tương ứng của hàng Led là chạy qua trái và chạy qua phải.
- Khi Led sáng đến biên của hàng thì ngừng chạy, chờ nút nhấn chuyển trạng thái chạy theo hướng ngược lại
Thắc mắc, demo về bài tập các bạn post luôn trong topic này :1cool_byebye:

Kể từ tuần sau, vì phòng học chiều thứ bảy không được ổn định, lớp chúng ta chuyển sang học vào sáng Chủ nhật, 8h, 315B1. Có bạn nào có vấn đề với thời gian này cũng phản hồi tại đây :6cool_boss:
 

Tuất

Thành Viên PIF
anh ơi giả sử như e mún nhấn nút thì chạy qua trái, nhấn cái khác chay qua phải thì viết vậy được không ạ...sao e buil bị lỗi syntax mà e coi lạ không thấy ạ.....a xem giùm e với ạ :)

Code:
#include <msp430g2553.h>
#define led_0 0xFE;
#define led_1 0xFD;
#define led_2 0xFB;
#define led_3 0xF7;
#define led_4 0xEF
#define led_5 0xDF;
#define led_6 0xBF;
#define led_7 0x7F;
void config_IO();
void config_IO()
{
    P2DIR&=~BIT0+~BIT1;
    P1DIR|=0xFF;
}
unsigned char i;
unsigned char disp[8] = {led_0,led_1,led_2,led_3,led_4,led_5,led_6,led_7};
 
 
void main(void)
{
 
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    config_IO();
    while(1)
    {
    if (P2IN & BIT0)
        {
        for (i=0;i<=7;i++)
        P1OUT=disp[i];
        _delay_cycles(100000);
        }
    if (P2IN & BIT1)
        {
        for (i=7;i>=0;i--)
        P1OUT=disp[i];
        _delay_cycles(100000);
        }
 
    }
 
}
mà không phải mặc định là trở kéo lên là mình viết P2IN&BIT0 là nhấn nút sao a, e thấy code bài gpio là !(P2IN&BIT0)...a giảng lại chỗ này giùm e với ạ :)
 

Phạm Thành Danh

Thành Viên PIF
hix, em viết cho khi nhấn nút thì nó nhảy qua một cái rồi dừng lại thì được, mà viết để khi không nhấn và vẫn chạy thì bó tay :gach
code của em zì nè, anh xem giúp em nhé
Code:
#include <msp430.h>
int i,t, k, dem, al, led;
void conf_io(void)
{
    P1SEL= P1SEL2=0;
    P1DIR =0xFF;
    P2DIR &=~(BIT0+ BIT1);
    P2IE |= BIT0 +BIT1;
    P2IES |= BIT0+ BIT1;
    P2IFG &= ~(BIT0 + BIT1);
}
void tien(void)
{
    while(dem<8 & al==1)
    {
        dem+=1;
        k<<= 1;
        led=~k;
        P1OUT=led;
        _delay_cycles(10000000);
    }
}
void lui(void)
{
    while(dem>1 &al==0)
    {
        dem -=1;
        k>>=1;
        led=~k;
        P1OUT=led;
        _delay_cycles(10000000);
    }
}
/*
* main.c
*/
int main(void)
{
 
    Config_stop_WDT();// Stop watchdog timer
    conf_io();
    k=0x08; dem=4;
 
    _BIS_SR(GIE);
    led=~k;
    P1OUT =led;
    // Config_Clocks();
   
}
#pragma vector =PORT2_VECTOR
__interrupt void button(void)
{
   
    switch (P2IFG & 0x03)
    {
        case BIT0:
        {
 
                al=1;
                tien();
                /*dem+=1;
                k<<=1;
                P1OUT=led;
                _delay_cycles(100);*/
                P2IFG &= ~(BIT0+ BIT1);
            break;
        }
        case BIT1:
        {
                    al=0;
                    /*dem-=1;
                    k>>=1;
                    P1OUT=led;
                    _delay_cycles(100);*/
                    lui();
                    P2IFG &= ~(BIT0+ BIT1);
 
            break;
        }
    }
 
}
//}
 

Manhdd

Cố Vấn CLB
Staff member
Bài tập đã được sửa trên lớp. Code mẫu như sau :)
Code:
#include <msp430.h>
#include "Basic_config.h"
 
unsigned char right; // Mode dich phai
unsigned char left; // Mode dich trai
unsigned char pos; // Vi tri cua Led dang sang (tu 1->8)
 
void Config_IO_Int (void)
{
    P1DIR = 0xFF; // Port 1 output
    P2DIR &= ~BIT0 + ~BIT1; // P2.0, P2.1 input
 
    // Interrupt config
    P2IE |= BIT0 + BIT1;        // Enable P2.0, P2.1 Interrupt
    P2IES |= BIT0 + BIT1;        // Falling Edge Interrupt
    P2IFG &= ~(BIT0 + BIT1);    // Clear Interrupt Flags
}
 
int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;    // Stop watchdog timer
    Config_IO_Int ();
    right=1;
    left=0;
    pos=1;
    _BIS_SR(GIE); // enable global interrupt
 
    while(1)
    {
        if(right==1)
        {
            if(pos!=8)
            {
                pos++;
                P1OUT= ~(0x80>>(pos-1));
                _delay_cycles(1000000);
            }
            else
                _delay_cycles(100000);
        }
        else
        {
            if(pos!=1)
                {
                    pos--;
                    P1OUT= ~(0x80>>(pos-1));
                    _delay_cycles(1000000);
                }
                else
                    _delay_cycles(100000);
        }
    }
}
 
#pragma vector = PORT2_VECTOR
__interrupt void P2_ISR (void)
{
    switch (P2IFG &0x03)
    {
        case BIT0:
        {
            left=1;
            right=0;
            break;
        }
        case BIT1:
        {
            left=0;
            right=1;
            break;
        }
    }
    P2IFG &= ~(BIT0 + BIT1);    // Clear Interrupt Flags
}
 
Top