You are on page 1of 18

BÀI 1: GPIO

a. Điều khiển led đơn


i) LED chớp tắt 5 lần (delay 0.5s) -> Dịch 1 led từ trái sang phải (D0 -> D7)
(delay 0.5s)-> lặp lại vô tận
CODE:
#include "io430f5529.h"
//--------Khai báo port vào/ra-------
#define LEDS P3OUT
//Khai báo prototype hàm
void delayms(int ms);
void blink(int time);
void shiftL();
//Ðinh nghia chương trình chính
void main(){
//-----------------khoi dong CHIP--------------
WDTCTL = WDTPW + WDTHOLD;
P3DIR = 0xFF;
blink(5);
//----------------------Vòng lap chuong trình chính-----------
while(1){
shiftL(); //module dich led sang trái
delayms(500); //module delay
}//end while
}//end main
//---Ðinh nghia chuong trình con------------
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
//----------------------------------------
void blink(int time){
for(int i=0;i<time;i++){
LEDS=0xFF;
delayms(500);
LEDS=0x00;
delayms(500);
}
}
//------------------------------------------------
void shiftL(){
char dat=0x01;
for(int i=0;i<8;i++){
LEDS=dat;
dat = dat<<1;
delayms(500);
}
}
ii. iii. Bổ sung chương trình
LEDS chớp tắt 5 lần (delay 0.5s)-> Dịch 1 led từ trái sang phải (delay 0.1s)->Dịch 1 led
từ phải sang trái (delay 0.1s)-> Sáng dần các led từ trái sang phải (0.1s)-> Sáng dần các
led từ phải sang trái (delay 0.1s) -> Dịch 1 led từ trái sang phải
(delay 0.1s)-> lặp lại vô tận.
CODE:
#include "io430f5529.h"
#define LEDS P3OUT
void delayms(int ms);
void blink(int time);
void dichledtrai();
void dichledphai();
void sangdanphai();
void sangdantrai();
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P3DIR = 0XFF;
blink(5);
while(1)
{
dichledphai();
dichledtrai();
sangdantrai();
sangdanphai();
}//end while
}
//-----------------------------------
void blink(int time)
{
for(int i =0;i<time;i++){
P3OUT = 0XFF; delayms(500);
P3OUT = 0X00; delayms(500);
}//end for
}
//-------------------------------------
void delayms(int ms){
for(int i = 0;i<=ms;i++)
__delay_cycles(1000);
}//end delayms
// dich phai
void dichledphai(){
char led = 0x80;
for (int i = 0 ;i<8;i++){
P3OUT = led;
led = led>>1;
delayms(100);
}
}
//dich trai-----------------------------------
void dichledtrai(){
char led = 0x01;
for(int i =0; i<8;i++){
P3OUT = led;
led =led <<1;
delayms(100);
}
}
//sang dan phai---------
void sangdanphai(){
char dat = 0x01;
for (int i= 0; i<8 ;i++){
P3OUT = dat;
dat= (dat<<1 ) + 0x01;
delayms(100);
}
}
//sang dan trai--------------------
void sangdantrai(){
char dat = 0x01;
for (int i= 0; i<8 ;i++){
P3OUT = dat;
dat= (dat>>1 ) + 0x80;
delayms(100);
}
}
b. Đọc phím đơn (không sử dụng ngắt)
i. Khi cấp điện các LED ở P3 chớp tắt 5 lần (delay 0.5s)->ấn K0 led đơn hiển
thị số 1-> ấn K1 led đơn hiển thị số 2->ấn K2 led đơn hiển thị số 3->ấn K3 led đơn
hiển thị số 4.
CODE:
#include "io430f5529.h"
//Khai báo port vào/ra
#define LEDS P3OUT
#define K0 P2IN_bit.P2IN3
#define K1 P2IN_bit.P2IN5
#define K2 P2IN_bit.P2IN4
#define K3 P4IN_bit.P4IN3
#define COM P4OUT_bit.P4OUT0
//-------Khai bao prototype hàm----------
void delayms(int ms);
void blink(int time);
//-------Dinh nghia chuong trinh chinh-----------
void main(){
//---Khoi dong CHIP-----------
WDTCTL = WDTPW + WDTHOLD;
P3DIR = 0xFF; //---------------------
P2REN = BIT3|BIT4|BIT5;
P2OUT = BIT3|BIT4|BIT5;
P4REN = BIT3;
P4OUT = BIT3;
P4DIR = 0x01;
COM = 0;
blink(5);
//---Vòng lap chuong trinh chinh------
while(1){
if(K0==0) LEDS = 1;
if(K1==0) LEDS = 2;
if(K2==0) LEDS = 3;
if(K3==0) LEDS = 4;
delayms(200);
}//end while
}//end main
//--------Dinh nghia chuong trinh con----
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
//----------------
void blink(int time){
for(int i=0;i<time;i++){
LEDS=0xFF; delayms(500);
LEDS=0x00; delayms(500);
}
}
ii. Bổ sung chương trình:
K0 tác động: dịch trái các led
K1 tác động: dịch phải các led
K2 tác động: sáng dần led từ trái sang phải
K3 tác động: sáng dần led từ phải sang trái
CODE:
#include "io430f5529.h"
//-----------Khai báo port vào/ra---------------------
#define LEDS P3OUT
#define K0 P2IN_bit.P2IN3
#define K1 P2IN_bit.P2IN5
#define K2 P2IN_bit.P2IN4
#define K3 P4IN_bit.P4IN3
#define COM P4OUT_bit.P4OUT0
//------------Khai bao prototype hàm-------------
void delayms(int ms);
void blink(int time);
void ShiftLLeft();
void ShiftLRight();
void SnakeLLeft();
void SnakeLRight();
//---------Dinh nghia chuong trinh chính-------------------
void main(){
//--------Khoi dong CHIP-----------
WDTCTL = WDTPW + WDTHOLD;
P3DIR = 0xFF;//---------------------
P2REN = BIT3|BIT4|BIT5;
P2OUT = BIT3|BIT4|BIT5;
P4REN = BIT3;
P4OUT = BIT3;
P4DIR = 0x01;
COM = 0;
blink(5);
//---------------Vòng lap chuong trinh chinh------------------
while(1){
if(K0==0) ShiftLLeft();
if(K1==0) ShiftLRight();
if(K2==0) SnakeLLeft();
if(K3==0) SnakeLRight();
delayms(200);
}//end while
}//end main
//--------Dinh nghia chuong trinh con------------------------
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
//--------------------------------------
void blink(int time){
for(int i=0;i<time;i++){
LEDS=0xFF; delayms(500);
LEDS=0x00; delayms(500);
}
}
void ShiftLLeft(){
char led = 0x01;
for(int i =0; i<8;i++){
P3OUT = led;
led =led <<1;
delayms(100);
}
}
void ShiftLRight(){
char led = 0x80;
for (int i = 0 ;i<8;i++){
P3OUT = led;
led = led>>1;
delayms(100);
}
}
void SnakeLLeft(){
char dat = 0x80;
for (int i= 0; i<8 ;i++){
P3OUT = dat;
dat= (dat>>1 ) + 0x80;
delayms(100);
}
}
void SnakeLRight(){
char dat = 0x01;
for (int i= 0; i<8 ;i++){
P3OUT = dat;
dat= (dat<<1 ) + 0x01;
delayms(100);
}
}
c. Đọc phím đơn (có sử dụng ngắt port pin)
i.) Nhận xét: Khi mới cấp điện thì các led ở P3 chớp tắt 5 lần, sau đó khi ấn
các phím tương ứng sẽ thực hiện các hiệu ứng như sau:
+ Khi ấn K0 thì led đơn hiển thị vị trí bit là số 1.
+ Khi ấn K1 thì led đơn hiển thị vị trí bit là số 2.
+ Khi ấn K2 thì led đơn hiển thị vị trí bit là số 3.
CODE:
#include "io430f5529.h"
//------------Khai báo port vào/ra---------------
#define LEDS P3OUT
#define K0 BIT3 //P2.3
#define K1 BIT5 //P2.5
#define K2 BIT4 //P2.4
#define COM P4OUT_bit.P4OUT0
//-------------Khai bao prototype ham-----------------------
void delayms(int ms);
//---------------Dinh nghia chuong trinh chinh---------------------
void main(){
WDTCTL = WDTPW + WDTHOLD;
P3DIR = 0xFF; P4DIR = BIT0;
P2REN = BIT3|BIT4|BIT5;
P2OUT = BIT3|BIT4|BIT5;
COM = 0;
//----------------------Khai bao ngat Port 1-----------------------------
P2IE = BIT3|BIT4|BIT5;
P2IES = BIT3|BIT4|BIT5; //1: high to low;
P2IFG = 0x00; //clear co ngat
__bis_SR_register(GIE); //cho phep ngat toan cuc
// ----------------Vong lap chuong trinh chinh------------------
while(1){
delayms(200);
}//end while
}//end main
//--------Khai bao vector ngat---------------------
#pragma vector = PORT2_VECTOR
__interrupt void Port1(void){
//---------------Thuc hien cac lenh tuong ung voi phim an-----------------------
if(P2IFG & K0) LEDS=1;
if(P2IFG & K1) LEDS=2;
if(P2IFG & K2) LEDS=3;
P2IFG = 0x00; //Clear co ngat
}
//--------------------------------------------------------------
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
ii.) Bổ sung chương trình: Khi mới cấp điện thì các led ở P3 chớp tắt 5 lần,
sau đó khi ấn các phím tương ứng sẽ thực hiện các hiệu ứng như sau:
+ Khi ấn K0 thì led thực hiện quá trình dịch led từ trái sang phải.
+ Khi ấn K1 thì led thực hiện quá trình dịch led từ phải sang trái.
+ Khi ấn K2 thì led thực hiện quá trình sáng dần led từ trái sang phải.
CODE:
#include "io430f5529.h"
//--------------Khai báo port vào/ra--------------------------------
#define LEDS P3OUT
#define K0 BIT3 //P2.3
#define K1 BIT5 //P2.5
#define K2 BIT4 //P2.4
#define COM P4OUT_bit.P4OUT0
//----------Khai bao prototype ham-------------------------------
void delayms(int ms);
void dichledtrai();
void dichledphai();
void sangdantrai();
//--------------------Dinh nghia chuong trinh chinh-------------------
void main(){
WDTCTL = WDTPW + WDTHOLD;
P3DIR = 0xFF; P4DIR = BIT0;
P2REN = BIT3|BIT4|BIT5;
P2OUT = BIT3|BIT4|BIT5;
P4DIR = 0x01;
COM = 0;
//-------------------------Khai bao ngat Port 1-----------------------------
P2IE = BIT3|BIT4|BIT5;
P2IES = BIT3|BIT4|BIT5; //1: high to low;
P2IFG = 0x00; //clear co ngat
__bis_SR_register(GIE); //cho phep ngat toan cuc
// ----------------Vong lap chuong trinh chinh-----------------------
while(1){
delayms(200);
}//end while
}//end main
//--------Khai bao vector ngat-------------------------------------
#pragma vector = PORT2_VECTOR
__interrupt void Port1(void){
//----------------Thuc hien cac lenh tuong ung voi phim an---------------------
if(P2IFG & K0) dichledtrai();
if(P2IFG & K1) dichledphai();
if(P2IFG & K2) sangdantrai();
P2IFG = 0x00; //Clear co ngat
}
//---------------------------------------------------
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
//---------------------dich trai--------------------
void dichledtrai(){
char led = 0x01;
for(int i =0; i<8;i++){
P3OUT = led;
led =led <<1;
delayms(100);
}
}
// -------------------------------dich phai----------------------------------
void dichledphai(){
char led = 0x80;
for (int i = 0 ;i<8;i++){
P3OUT = led;
led = led>>1;
delayms(100);
}
}
//--------------------------sang dan trai--------------------
void sangdantrai(){
char dat = 0x80;
for (int i= 0; i<8 ;i++){
P3OUT = dat;
dat= (dat>>1 ) + 0x80;
delayms(100);
}
}

VẤN ĐỀ 1: Cho sơ đô phân cứng như hình trên, viết chương trình thực hiện yêu cầu sau:
- Khi mới cấp điện (Reset): Các led chớp tắt 5 lần
- Khi K0 tác động: số đếm trên led đơn tăng lên 1 đơn vị (dạng nhị phân 8 bit), khi
tăng đến giá trị 0xFF thì trở về giá trị 0x00.
- Khi K1 tác động: số đếm trên led đơn giảm xuống 1 đơn vị (dạng nhị phân 8 bit),
khi giảm đến giá trị 0x00 thì trở về giá trị 0xFF.
- Khi K2 tác động: số đếm trên led đơn được gán về giá trị 0x00.
LƯU ĐỒ GIẢI THUẬT:
CODE:
#include "io430f5529.h"
#define LEDS P3OUT
#define K0 P2IN_bit.P2IN1
#define K1 P2IN_bit.P2IN2
#define K2 P2IN_bit.P2IN3
#define COM P4OUT_bit.P4OUT0
//-------------------Khai bao prototype ham-------------------------
void delayms(int ms);
void blink(int time);
void main(){
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0XFF;
P2REN = BIT1|BIT2|BIT3;
P2OUT = BIT1|BIT2|BIT3;
blink(5);
int count=0;
while(1){
if(K0==0){
delayms(250);
count++; LEDS=count;
if(count>255) count=0;
LEDS=count;
}
//------------------------------------------------
if(K1==0){
delayms(250);
count--; LEDS=count;
if(count<0) count=255;
LEDS=count;
}
//------------------------------------------------
if(K2==0){
delayms(250); count=0;
LEDS=count;
}
//------------------------------------------------
}
}
void blink(int time){
for(int i=0;i<time;i++){
LEDS = 0XFF;
delayms(500);
LEDS = 0X00;
delayms(500);
}
}
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
VẤN ĐỀ 2: Cho sơ đô phân cứng như hình trên, viết chương trình thực hiện yêu cầu
sau:
- Khi mới cấp điện (Reset): Các led dịch trái Š lần và dịch phải 3 lần.
- Khi K0 tác động: số đếm trên led đơn tăng lên 1 đơn vị (dạng nhị phân 8 bit), khi
tăng đến giá trị 0xFF thì trở về giá trị 0x00.
- Khi K1 tác động: số đếm trên led đơn giảm lên 1 đơn vị (dạng nhị phân 8 bit), khi
giảm đến giá trị 0x00 thì trở về giá trị 0xFF.
- Khi K2 tác động: số đếm trên led đơn tự tăng với chu kỳ 1s.
LƯU ĐỒ GIẢI THUẬT:
CODE:
#include "io430f5529.h"
#define LEDS P3OUT
#define K0 P2IN_bit.P2IN1
#define K1 P2IN_bit.P2IN2
#define K2 P2IN_bit.P2IN3
#define COM P4OUT_bit.P4OUT0
//------------Khai bao prototype ham-------------------------
void delayms(int ms);
void ShiftLLeft(int time);
void ShiftLRight(int time);
void main(){
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0XFF;
P2REN = BIT1|BIT2|BIT3;
P2OUT = BIT1|BIT2|BIT3;
ShiftLLeft(5);
ShiftLRight(3);
int count=0;
while(1){
if(K0==0){
delayms(250);
count++; LEDS=count;
if(count==255) count=0;
LEDS=count;
}
//------------------------------------------------
if(K1==0){
delayms(250);
count--; LEDS=count;
if(count<0) count=255;
LEDS=count;
}
//------------------------------------------------
if(K2==0){
for(int i=0;i<255;i++){
count++;
delayms(1000);
LEDS=count;
}
//------------------------------------------------
}
}
//------------------------------------
void delayms(int ms){
for(int i=0;i<ms;i++)
__delay_cycles(1000);
}
void ShiftLLeft(int time){
char led = 0x01;
for(int i =0; i<8;i++){
P3OUT = led;
led =led <<1;
delayms(100);
}
}
void ShiftLRight(int time){
char led = 0x80;
for (int i = 0 ;i<8;i++){
P3OUT = led;
led = led>>1;
delayms(100);
}
}

You might also like