Ccs c for pic16F877a mục lục I. Tổng quan về ccs vì sao ta sử dung ccs ?



tải về 1.15 Mb.
trang4/15
Chuyển đổi dữ liệu23.08.2016
Kích1.15 Mb.
#26977
1   2   3   4   5   6   7   8   9   ...   15

5.2. Ngắt ngoài

Chương trình ngắt đây

+Các bạn coi gium` mình có sai chỗ nào không mà mình delay không được: Mình muốn khi đóng RB4 thì LED sẽ nháp nháy với delay 50ms chẳng hạn. Phần ngắt chuyển chế độ thì mình làm được nhưng delay trong mỗi chế độ thì potay.

Code:


#include <16F877A.h>

#fuses NOWDT,PUT,XT,NOPROTECT

#use delay(clock=1000000)

#use fast_io(b)

#byte portb=0x06

#byte intcon=0x000B

#bit RB4=portb.4

#bit RB5=portb.5

#bit RBIF=intcon.0 //dinh nghia co ngat RB

#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB


// Chuong trinh ngat

#int_RB


void ngat_RB()

{

if((RBIF)&&(RBIE))



{

//Kiem tra sw1

{

if(RB4==0)



{

portb=0b00000001;

delay_ms(200);

portb=0b00001111;

delay_ms(200);

}

}



//Kiem tra sw2

{

if(RB5==0)



{

portb=0b00001000;

}

}

RBIF=0; //Xoa co ngat RB



}

}

// Chuong trinh chinh



main()

{

set_tris_b(0b11110000);



portb=0b11110000;

enable_interrupts(global);

enable_interrupts(int_RB);

ext_int_edge(H_to_L);

while(true)

{

}



}

TL:

Code:

#include <16F877A.h>

#fuses NOWDT,PUT,XT,NOPROTECT

#use delay(clock=4000000)

#use fast_io(b)

#byte portb=0x06

#byte intcon=0x000B

#bit RB4=portb.4

#bit RB5=portb.5

#bit RBIF=intcon.0 //dinh nghia co ngat RB

#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB


// Chuong trinh ngat

#int_RB


void ngat_RB()

{

if((RBIF)&&(RBIE))



{

//Kiem tra sw1

{

if(RB4==0)



{

portb=0b00000001;



delay_ms(50);

portb=0b00001111;



delay_ms(50);

}

}



//Kiem tra sw2

{

if(RB5==0)



{

portb=0b00001000;

}

}

RBIF=0; //Xoa co ngat RB



}

}

// Chuong trinh chinh



main()

{

set_tris_b(0b11110000);



portb=0b11110000;

enable_interrupts(global);

enable_interrupts(int_RB);

ext_int_edge(H_to_L);

while(true)

{

}



}

Đã sửa lại cho phù hợp file mô phỏng của bạn. Với code trên, kết thúc ngắt tất nhiên ko còn delay nữa. 50ms hơi ít, tăng lên 1000ms, thấy kết quả.



+Chào cả nhà !
Sao không thấy bác nào post bài vào luồng này vậy kà !Trầm quá...!Trầm quá...!Hay cái CCS C này không hấp dẫn mọi người chăng!
Không ai viết gì, tớ vẫn post cho nó đỡ trầm....!
Đã ví dụ về ngắt Timer, sau đây là 2 ví dụ về ngắt ngoài trên chân RB0 và trên các chân RB4 đến RB7:
Chương trình sau dùng ngắt ngoài trên RB0 đếm số lần cái button được nhấn xuống, hiển thị lên led 7 đoạn (common cathode).Nếu số lần nhấn vượt quá 9, chương trình sẽ quay về hiển thị lên led từ số 1.

Code:


//*************************************************************************

// Author : nhh

// Date : 03/04/06

// Hardware: PIC16F877A

//*************************************************************************

#include <16F877A.h>

#fuses NOWDT,PUT,XT,NOPROTECT

#use delay(clock=4000000)

#use fast_io(b)

#use fast_io(d)

#byte portb=0x06

#byte portd=0x08

const unsigned char digital[]={0b00000110, 0b01011011, 0b01001111, 0b01100110,\

0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111};

// ma hoa digital duoi dang mang

// Chuong trinh ngat

#int_ext

void ngat_RB0()

{

int i;


if(i<9)

{

portd=digital[i];



++i;

}

if(i==9)



{

i=0;


}

}

// Chuong trinh chinh



main()

{

set_tris_b(0b00000001);



set_tris_d(0);

enable_interrupts(global);

enable_interrupts(int_ext);

ext_int_edge(H_to_L);

portd=0b00111111;

while(true)

{

// chi doi ngat nen vong lap nay ko co gi ca !



}

}



5.3. Ngắt ngoài trên RB4-RB7


Còn đây là ứng dụng ngắt ngoài trên RB4 đến RB7 để thay đổi kiểu cũng như tốc độ chớp nháy mấy con led chỉ để....ngắm cho vui mắt !
Ấn sw1, led1 nhấp nháy với delay 250ms
Ấn sw2, led1,2 nhấp nháy với delay 200ms
Ấn sw3, led1,2,3 nhấp nháy với delay 150ms
Ấn sw4, led1,2,3,4 nhấp nháy với delay 100ms

Code:


//*************************************************************************

// Author : nhh

// Date : 03/04/06

// Hardware: PIC16F877A

//*************************************************************************

#include <16F877A.h>

#fuses NOWDT,PUT,XT,NOPROTECT

#use delay(clock=4000000)

#use fast_io(b)

#byte portb=0x06

#byte intcon=0x000B

#bit RB4=portb.4

#bit RB5=portb.5

#bit RB6=portb.6

#bit RB7=portb.7

#bit RBIF=intcon.0 //dinh nghia co ngat RB

#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB

int led=0,speed;

// Chuong trinh ngat

#int_RB


void ngat_RB()

{

if((RBIF)&&(RBIE))



{

//Kiem tra sw1

{

if(RB4==0)



{

led=0b00000001; //led1 sang

speed=250;

}

}



//Kiem tra sw2

{

if(RB5==0)



{

led=0b00000011; //led1,2 sang

speed=200;

}

}



//Kiem tra sw3

{

if(RB6==0)



{

led=0b00000111; //led1,2,3 sang

speed=150;

}

}



//Kiem tra sw4

{

if(RB7==0)



{

led=0b00001111; //led1,2,3,4 sang

speed=100;

}

}



RBIF=0; //Xoa co ngat RB

}

}



// Chuong trinh chinh

main()


{

set_tris_b(0b11110000);

portb=0b00001111;

enable_interrupts(global);

enable_interrupts(int_RB);

ext_int_edge(H_to_L);

while(true)

{

portb=led;



delay_ms(speed);

portb=0;


delay_ms(speed);

}

}



[quote=nhh;2261]Còn đây là ứng dụng ngắt ngoài trên RB4 đến RB7 để thay đổi kiểu cũng như tốc độ chớp nháy mấy con led chỉ để....ngắm cho vui mắt !

Ấn sw1, led1 nhấp nháy với delay 250ms


Ấn sw2, led1,2 nhấp nháy với delay 200ms
Ấn sw3, led1,2,3 nhấp nháy với delay 150ms
Ấn sw4, led1,2,3,4 nhấp nháy với delay 100ms
[code]//************************************************** ***************************
// Author : nhh
// Date : 03/04/06
// Hardware: PIC16F877A
//************************************************** ***************************

Không như trong MPLAB, đã định nghĩa sẵng các thanh ghi và bit tương ứng, còn CCS C chỉ định nghĩa chân PIC, những thanh ghi, những bit mà CCS C cho là cần thiết, ta xem trong file PIC16F887A.h, thanh ghi, bit nào chưa định nghĩa mà muốn sử dụng thì phải định nghĩa nó. Ta có thể viết riêng 1 file.h loại này sao cho mình dễ nhớ nhất, đến khi muốn sử dụng chỉ cần khai báo #include vào là xài thôi!



Em mới vô thôi, huynh giải thích mấy dòng code sau cho em được ko ?
" set_timer0(6) " ; " ++count; " ; "if (count==2000) "
Nó nằm trong ct nháy led dùng interrup và timer0. biến count và a có tác dụng gì ? tại sao phải lùi a "a=a<<1" ?

  • set_timer0(6); đây là phương thức gọi hàm. set_timer0() là một hàm, 6 là tham số. Còn hàm này làm gì thì bạn phải tự tìm hiểu lấy.
    * ++count; là thực hiện tăng biến count lên 1 đơn vị. Nó giống lệnh count=count+1. Còn có một cú pháp nhữa là count++. Hai lệnh lệnh này có sự khác nhau về thứ tự thực hiện khi nằm trong một biểu thức so sánh.
    * if(count==2000) là phép so sánh. Nếu giá trị của biến count bằng 2000 thì kết quả của phép so sánh là True ngược lại là False.
    * a là .. mình chịu thua!?!? Còn dịch trái là để nhân đôi giá trị biết. Bạn hãy xem lại đại số bool có rất nhiều điều hay ở đó.

+Nhân tiện anh cho em hỏi thêm : giả sử em viết một ct nháy led (cho nó chạy như vòng lặp ), đầu tiên kt các khóa để biết ct sẽ nháy led kiểu nào. sau đó thì ct sẽ thực hiện lệnh nháy đèn led, nếu như sau khi ta bấm nút chọn kiểu nháy, ct sẽ tiếp tục thực hiện lệnh tiếp theo mà ta đổi ý bấm nút khác để đổi kiểu thì ct sẽ không nhận vì đang thực hiện các lệnh bật-tắt led. Bài tập này hình như có ở trang 2, 3 dùng interrup và timer0, Tại sao nhỉ ?

Nếu bạn sử dụng vòng lặp thì nút bấm sẽ ko được nhận trong khi vòng lặp đang thực hiện. Cách giải quyết bài toán như sau:


_ Bạn hãy khai báo 1 biến toàn cục. Biến này lưu kiểu chớp. Hàm chớp sẽ dựa vào giá trị biến này mà đổi kiểu chớp.
_ Sử dụng timer0 làm thời gian chuẩn để trì hoãn chớp tắt (vì nếu dùng làm thời gian trì hoãn chớp tắt thì nó quá ngắn ta không thể thấy chớp được).
_ Khai báo một biến toàn cục làm hệ số cho thời gian trì hoãn. Trong ngắt Timer0 bạn sẽ đếm biến này đến một giá trị nào đó thì gọi hàm chớp tắt.
_ Bạn cũng cần khai báo một biến toàn cục để cho hàm chớp tắt biết mình phải làm gì. Hoặc nếu ko bạn có thể truyền tham số cho hàm.
_ Trong chương trình main, bạn dùng vòng lặp để bắt phím nhấn (hoặc dùng ngắt) và thực hiện thay đổi giá trị của biến kiểu chớp.
Trên đây là giải thuật, đó là phương pháp để giải quyết bài toán. Tất nhiên trong quá trình viết bạn có thể khai báo thêm các biến toàn cục hay cục bộ để thực hiện thuật toán. Tốt nhất là bạn nên viết trước và gặp khó khăn thì đưa cả code lên để mọi người giúp bạn giải quyết.

Em mượn tạm đoạn code của nhh anh mổ xẻ nó giùm em nhé
//************************************************** **
// Author : nhh
// Date : 02/04/06
// Hardware: PIC16F877A
//************************************************** **
#include <16F877A.h>
#fuses NOWDT,PUT,XT,NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#byte portb=0x06
#define led pin_B0
int16 count;
int8 a;
//Chuong trinh ngat TMR0
#int_timer0
void interrupt_timer0()
{
set_timer0(6);
++count;
if(count==2000)
{
count=0;
a=a<<1; // dich trai a 1bit
}
if(a==256)
{
a=1;
count=0;
}
}

//Chuong trinh chinh


main()
{
set_tris_b(0);
enable_interrupts(global);
enable_interrupts(int_timer0);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
set_timer0(6);
count=0;
a=1;
while(true)
{
portb=a;
}
}
Anh giải thích mấy cỗ có giùm em. Tại sao phải setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); mà ko Div 3, 4,... hở anh ?


*Dấu thứ nhất:
[CODE:]
a=a<<1; // dich trai a 1bit
[/code]
Như tác giả đã chú thích đó là lệnh dịch trái 1 bit.
VD: trước khi dịch, a có giá trị 0 0 0 0 0 0 0 1 (0x01) thì sau lệnh dịch này giá trị biến a sẽ là 0 0 0 0 0 0 1 0 (0x02).
Vậy lệnh dịch trái sẽ làm tăng giá trị biến bị dịch lên 2 lần: 2 thành 4. Giống như bạn dịch trong hệ thập phân số 0500 thì được 5000 tức tăng 10 lần. Hệ nhị phân (2 số) dịch trái 1 bit sẽ tăng giá trị 2 lần, hệ thập phân (10 số) dịch trái một bit, số sẽ tăng giá trị 10 lần.
Vậy nhiều lệnh dịch sẽ làm cho a thay đổi như sau
0 0 0 0 0 1 0 0
0 0 0 0 1 0 0 0
0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
* Dấu thứ 2:
[CODE:]
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
[/code]
mode may be one or two of the constants defined in the devices .h file. RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L
RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
Bạn hãy đọc Help và các ví dụ của nó thì bạn sẽ hiểu được cách tính.
Bạn hãy tìm hiều kỹ về bộ chia tần trong DataSheet của chip sẽ hiểu tại sao chỉ làm 2 mũ n.
* Dấu thứ 3:
[CODE:]
portb=a;
[/code]
Đây là lệnh xuất giá trị biến a ra PortB. a có 8 bit, PortB có 8 chân B7 đến B0.
Lệnh trên sẽ áp các bit của a vào PortB theo đúng trọng số.

Tôi copy nguyen bai delay1s_RB0 của bác về nạp thử, nhưng không hiểu sao nó không chạy, mà phải cắm chân RB3 (chân PGM) xuống đất thì nó mới chạy, bác có thể cho tôi biết tại sao không?
Cám ơn bác!


Ở một số chip, chân RB3 còn là chân PGM dùng để cấp nguồn cho chế độ nạp chip điện áp thấp (Low-Voltage Programming). Nếu chip của bạn còn mới, có thể nó đang được bật chế độ LVP (mặc định khi xuất xưởng), do đó bạn để hở RB3 sẽ không cho phép chip chạy chương trình, và bạn phải nối RB3 xuống 0V (nên nối qua một điện trở khoảng 1k) thì chip mới không đi vào chế độ LVP và mới chạy được chương trình đã có trong chip.

Bây giờ thì tôi đã hiểu, nhưng khi phải nối mass chân RB3 rồi thì coi như chân đó không thể dùng được nữa hả?

Bạn vẫn có thể dùng chân RB3 như bình thường khi chip đã ở chế độ chạy chương trình bình thường. Nhưng nếu bạn nối thẳng RB3 vào mức 0V và sau đó dùng RB3 như ngõ ra, thì khi bạn xuất mức cao ra RB3 sẽ gây ngắn mạch giữa các chân Vdd và Vss (vì bạn đã nối thẳng RB3 vào Vss, và sau đó lại yêu cầu ngõ ra RB3 được nối lên Vdd trong chương trình). Đó chính là lý do của lời khuyên nên nối RB3 xuống mức 0V thông qua một điện trở khoảng 1k, nếu bạn muốn RB3 khi dùng như ngõ ra được nhẹ tải hơn thì có thể dùng giá trị 4.7k hay 10k cho điện trở kéo xuống 0V đó.

5.4. Giải mã bàn phím

Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.



Ấn sw1, led1 nhấp nháy với delay 250ms


Ấn sw2, led1,2 nhấp nháy với delay 200ms
Ấn sw3, led1,2,3 nhấp nháy với delay 150ms
Ấn sw4, led1,2,3,4 nhấp nháy với delay 100ms

Code:


//*************************************************************************

// Author : nhh

// Date : 03/04/06

// Hardware: PIC16F877A

//*************************************************************************

#include <16F877A.h>

#fuses NOWDT,PUT,XT,NOPROTECT

#use delay(clock=4000000)

#use fast_io(b)

#use fast_io(c)

#byte portb = 0x06

#byte portc = 0x07

#bit RB0 = 0x06.0

#bit RB1 = 0x06.1

#bit RB2 = 0x06.2

#bit RB3 = 0x06.3

#bit RB4 = 0x06.4

#bit RB5 = 0x06.5

#bit RB6 = 0x06.6

#bit RB7 = 0x06.7

#bit RBIF=intcon.0 //dinh nghia co ngat RB

#bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB

int a;

const unsigned char dig[]={0b00111111,0b00000110, 0b01011011,0b01001111,\



0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111,0b01110111,\

0b01111100,0b00111001,0b01011110,0b11111001,0b11110001};

// ma hoa digital duoi dang mang

// Chuong trinh ngat

#int_RB

void ngat_RB()



{

if((RBIF)&&(RBIE))

{

{

if(RB4&&RB0)



a=dig[0];

}

{



if(RB4&&RB1)

a=dig[4];

}

{

if(RB4&&RB2)



a=dig[8];

}

{



if(RB4&&RB3)

a=dig[12];

}

//.......



{

if(RB5&&RB0)

a=dig[1];

}

{



if(RB5&&RB1)

a=dig[5];

}

{

if(RB5&&RB2)



a=dig[9];

}

{



if(RB5&&RB3)

a=dig[13];

}

//........



{

if(RB6&&RB0)

a=dig[2];

}

{



if(RB6&&RB1)

a=dig[6];

}

{

if(RB6&&RB2)



a=dig[10];

}

{



if(RB6&&RB3)

a=dig[14];

}

//........



{

if(RB7&&RB0)

a=dig[3];

}

{



if(RB7&&RB1)

a=dig[7];

}

{

if(RB7&&RB2)



a=dig[11];

}

{



if(RB7&&RB3)

a=dig[15];

}

RBIF=0; //Xoa co ngat RB



}

}

// Chuong trinh chinh



main()

{

set_tris_b(0b11110000);



set_tris_c(0);

enable_interrupts(global);

enable_interrupts(int_RB);

ext_int_edge(H_to_L);

portb=0;

portc=0;


while(true)

{

portb=1;



portb=2;

portb=4;


portb=8;

portc=a;


}

}



anh có thể nói rõ hơn được không a? số: 1,2,4,6,8 nó mặc định cho cổng đấy a?

- Xuất 1 ra PORTA thì chỉ có bit 0 (tức là chân RA0) ở mức 1, các bit (chân) khác là 0.
- Xuất 2 ra PORTA thì chỉ có bit 1 (tức là chân RA1) ở mức 1, các bit (chân) khác là 0.
- Xuất 4 ra PORTA thì chỉ có bit 2 (tức là chân RA2) ở mức 1, các bit (chân) khác là 0.
- Xuất 8 ra PORTA thì chỉ có bit 3 (tức là chân RA3) ở mức 1, các bit (chân) khác là 0.
Bạn nhìn vào sơ đồ mạch của nhh sẽ thấy các chân RA0 .. RA3 nối với các cột của bàn phím.

TL: Không như trong MPLAB, đã định nghĩa sẵng các thanh ghi và bit tương ứng, còn CCS C chỉ định nghĩa chân PIC, những thanh ghi, những bit mà CCS C cho là cần thiết, ta xem trong file PIC16F887A.h, thanh ghi, bit nào chưa định nghĩa mà muốn sử dụng thì phải định nghĩa nó.Ta có thể viết riêng 1 file.h loại này sao cho mình dễ nhớ nhất, đến khi muốn sử dụng chỉ cần khai báo #include vào là xài thôi!

#fuses NOWDT,PUT,HS,NOPROTECT


#use delay(clock=4000000)
Bạn chú ý, clock = 4MHz là chế đọ dao động XT chứ không phải HS.

Bài : Giải mã bàn phím
Mạch quét 16 phím, hiện kết quả lên led 7 đoạn.
Trong chuong trinh thieu dinh nghia
#byte intcon=0x000B
và port xuất ra led 7 đoạn là PORTC không phải portd như hình vẽ.

+Chào bạn mình thay led 7 đoạn bằng LCD thì chương trình chạy không đúng, bạn có thể hướng dẫn cho mình dùng ngắt để giải mã phím xuất ra lcd được không, cám ơn bạn nhiều.

LCD và led 7 đoạn tất nhiên là khác nhau rồi.
Để thực hiện tốt giải mã matrix phím, bác phải có giải pháp chống nhiễu (run phím) bằng phần cứng, hoặc phần mềm, thông thường là dùng phần mềm. Code bên trên chưa có chống nhiễu

5.5. Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

Chương trình gửi ký tự ra 2x16 LCD dùng CCS C

#include "16F877A.h" // PIC16F877A header file
#use delay(clock=4000000) // for 4Mhz crystal
#fuses XT, NOWDT, NOPROTECT, NOLVP // for debug mode

#define WRITE_DATA 0


#define WRITE_COMMAND 1

#define NCHAR_PER_LINE 16 // max char numbers per line


#define MS10 10 // 10 milliseconds
#define US400 400 // 400 microseconds

#define LCD_RS PIN_A1


#define LCD_RW PIN_A2
#define LCD_E PIN_A3
///////////////////////////////////////////////////////////
//
/* private */ void lcd_write(byte dat, int1 option) {
delay_us(US400);
if (option == WRITE_DATA)
output_high(LCD_RS);
else // option == WRITE_COMMAND
output_low(LCD_RS);
output_low(LCD_RW);
output_b(dat);

output_high(LCD_E);


delay_us(US400);
output_low(LCD_E);
}
///////////////////////////////////////////////////////////
//
void lcd_init(void) {
output_low(LCD_E); // Let LCD E line low

lcd_write(0x38, WRITE_COMMAND); // Set LCD 16x2, 5x7, 8bits data


delay_ms(15);
lcd_write(0x01, WRITE_COMMAND); // Clear LCD display
delay_ms(MS10);
lcd_write(0x0f, WRITE_COMMAND); // Open display & current
delay_ms(MS10);
lcd_write(0x06, WRITE_COMMAND); // Window fixed (Character Entry Mode?)
delay_ms(MS10);
}
///////////////////////////////////////////////////////////
//
void lcd_display_char(int8 line, int8 pos, char ch) {
line = (line == 0) ? 0 : 1;
pos = (pos > NCHAR_PER_LINE) ? NCHAR_PER_LINE : pos;

lcd_write(0x80 + 0x40 * line + pos, WRITE_COMMAND);


lcd_write(ch, WRITE_DATA);
}
///////////////////////////////////////////////////////////
void lcd_display_str(int8 line, char str[], int8 nchars) {
int8 i;
for (i = 0; i < nchars; i++)
lcd_display_char(line, i, str[i]);
}
///////////////////////////////////////////////////////////
/**
* Display characters to a 2x16 LCD
*
* (1) LCD1 to GND
* (2) LCD2 to VDD 5 volts
* (3) LCD4 (RS) - LCD5 (RW) - LCD6 (E) to A1, A2, A3
* (4) LCD7-LCD14 to B0-B7 (bus data)
*
* Ref: http://pic16.com/bbs/dispbbs.asp?boa...ID=5879&page=1
*/
void main(void) {
int8 i;
char LINE1[] = { "SGN Tech" };
char LINE2[] = { "Xin chao" };

lcd_init();

// use of lcd_display_char()
for (i = 0; i < 8; i++)
lcd_display_char(0, i, LINE1[i]);

// use of lcd_display_str


lcd_display_str(1, LINE2, 8);
}

+CCS C có một ví dụ hay hơn: Chỉ cần dùng 4 bits D4-D7 của LCD:


Examples\EX_LCDKB.C

5.7. Ví dụ nhỏ về ngắt ngoài

Bình thường thì LED6 sáng, LED7 tối. Khi nhấn phím, LED6 tối, LED7 sáng


trong vòng 0,5 giây, rồi trở về trạng thái ban đầu (LED6 sáng, LED7 tối)

#include <16F877A.h>


#fuses NOWDT, XT
#use delay(clock=4000000)

void high_b6_low_b7() {


output_high(PIN_B6);
output_low(PIN_B7);
}

void low_b6_high_b7() {


output_low(PIN_B6);
output_high(PIN_B7);
}
///////////////////////////////////////////////////////////
#INT_EXT
void RB0_handler() {
low_b6_high_b7();
delay_ms(500);
high_b6_low_b7();
}
///////////////////////////////////////////////////////////
/**
* Keep B6 on and B7 off. Pressing the button causes interrupt:
* B6 off and B7 on, delay half second, then B6 on and B7 off
*
* Wiring (TM Board)
* (1) PIC's B0 to Matrix Key R0
* Matrix Key C0 to GND
* (2) PIC's B6-B7 to LED6-LED7
*
* Ref: Interrupt Mechanism
* http://www.mikroelektronika.co.yu/en...sicbook/06.htm
*/
void main() {
enable_interrupts(GLOBAL); // enable all interrupts
enable_interrupts(INT_EXT); // enable external interrupt from pin RB0/INT

high_b6_low_b7();


while (true) {
// do nothing
}
}


tải về 1.15 Mb.

Chia sẻ với bạn bè của bạn:
1   2   3   4   5   6   7   8   9   ...   15




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương