BÀI 1Ví dụ mở đầu :
#include <16f887.h>
#FUSES HS, NOWDT, NOPROTECT //HS : Thach anh
#use delay (clock = 20mhz)
int i,j; //Bien toan cuc
int tinh-trung-binh (char x, char y); // chuong trinh con
void init();
void main (void) //Chuong trinh chinh
{
init();
While (1);
}
void init()
{
}
Output : Xuất một mức logic cho ngõ ra
• Output_x (Giá trị);
Ex: Output_a (0b11110000); (A0 -> A3 : 0 ; A4 -> A7 : 1)
0b : Binary
0x : Hex
Char x= 100;
Char y = 99;
(unsigned int) x*y = 9900 (ép kiểu do char <9900)
• Output_bit (PIN_X, value);
output_bit (PIN_B4, 1);
output_bit (PIN_C1, 0);
• Output_high (PIN_X);
Output_high (PIN_B4);
• Output_low (PIN_X);
Output_high (PIN_C1);
• Output_toggle (PIN_X);
Output_toggle (PIN_C1);
• Ví dụ 1:
Viết chương trình :
Sáng chân C1
Delay_ms (2000);
Tắt
#include <16f887.h>
#FUSES HS, NOWDT, NOPROTECT
//HS : Thach anh
#use delay (clock = 20M)
void main (void) //Chuong trinh chinh
{
output_high (PIN_C1);
delay_ms(2000);
output_low (PIN_C1);
}
Note : Để biên dịch phải chuột vào Source Files -> Add Files : Chọn file đang sử dụng. Sau đó vào Project -> Build All (Hoặc click vào icon Build All)
Vào proteus chọn pic16f887 rồi thiết lập 2 thông số : Processor Clock Frequency & Program File.
Ở Processor Clock Frequency chọn 20MHz.
ProgramFile chọn file hex đang sử dụng.
Ráp mạch Proteus như hình vẽ
• Ví dụ 2: (Về nhà)
Viết chương trình :
Sáng chân C1
Chớp tắt trong 500ms
BÀI 2 Input
• input_x(); Kiểm tra trạng thái ngõ vào các chân port x
• input(PIN_X); Kiểm tra giá trị ngõ vào chân x
Ex: input(PIN_B4)
Ví dụ :
Nhấn nút lần 1 đèn sáng, nhấn lần nữa đèn tắt.
#include <16f887.h>
#FUSES HS, NOWDT, NOPROTECT
#use delay (clock = 20M)
short nutnhan;
void main (void) //Chuong trinh chinh
{
while(1)
{
if (!input(PIN_B4)&&(nutnhan==0))
{
output_toggle(PIN_C1);
nutnhan=1;
}
if (input(PIN_B4))
nutnhan=0;
}
} Ngắt ngoài (RB0)
• Ngắt trên chân BO tác động ở cạnh xuống.
• Khai báo ngắt : #INT_EXT
Ex: void ngat()
{
Output_high (PIN_C1);
}
void main()
{
Enable_interrupts(INT_EXT);
Enable_interrupts(GLOBAL);
While(1);
}
• Lệnh cho phép ngắt
enable_interrupts (INT_EXT);
enable_interrupts(GLOBAL);
• Lệnh khóa ngắt
disable_interrupts (INT_EXT);
disable_interrupts (GLOBAL);
• Ví dụ :
Bình thường : Đèn RC1 chớp tắt
Nhấn RB0 : đèn đổi trạng thái
#include <16f887.h>
#FUSES HS, NOWDT, NOPROTECT
#use delay (clock = 20M)
#INT_EXT
void ngat()
{
output_toggle(PIN_A0);
}
void main()
{
output_low(PIN_A3);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{
output_toggle(PIN_C1);
delay_ms(500);
}
} BÀI 3• ON CHANGE PORT B (B4 – B7)
• Ví dụ : Khi có sự thay đổi trên các chân từ B4 – B7 thì ngắt xảy ra.
Khai báo ngắt : INT_RB (INT_EXT)
B4 : Chớp tắt xen kẽ
B5 : Chớp đồng thời
B6 : Tắt tất cả
Khoảng thời gian chớp tắt là 1000ms
#include <16f887.h>
#FUSES HS, NOWDT, NOPROTECT
#use delay (clock = 20M)
char kieu_led;
#INT_RB
void ngat()
{
if(!input(PIN_B4))
kieu_led=1;
else if(!input(PIN_B5))
kieu_led=2;
else if(!input(PIN_B6))
kieu_led=0;
}
void main()
{
output_low(PIN_A0);
output_high(PIN_A1);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
while(1)
{
switch (kieu_led)
{
case 0 :
output_low(PIN_A0);
output_high(PIN_A1);
break;
case 1 :
output_toggle(PIN_A0);
output_bit(PIN_A1, input(PIN_A0));
break;
case 2 :
output_toggle(PIN_A0);
output_bit(PIN_A1, !input(PIN_A0));
break;
}
}
delay_ms(1000);
} LCD
• Kết nối chân với vi điều khiển
Linh kiện PROTEUS : LCD -> LM016L
Mở PICC->Drivers->lcd.c
Thay đổi chân :
// D0 enable -> unused
// D1 rs
// D2 rw
// D3 Enable
// D4 D4
// D5 D5
// D6 D6
// D7 D7
Thay đổi struct :
struct lcd_pin_map {
BOOLEAN enable;
BOOLEAN rs;
BOOLEAN rw;
BOOLEAN unused;
->
BOOLEAN unused;
BOOLEAN rs;
BOOLEAN rw;
BOOLEAN enable;
Output : Xuất một mức logic cho ngõ ra
• Các lệnh dùng lcd
- #include <lcd.c> (Phải để sau delay)
- Thiết lập ban đầu cho lcd
Lcd_init();
- Đến vị trí x,y để hiển thị
Lcd_gotoxy (x,y);
Ex:
Lcd_gotoxy(1,1);
Lcd_gotoxy (8,2);
- Hiển thị chuỗi : lcd_putc (“Chuỗi…”);
Lcd_putc(“\f”); (Xóa màn hình + Chuỗi gõ (Gần giống lệnh Write))
- Hiển thị giá trị được lưu trong biến : value -> int
o Printf (lcd_putc, “value = %d quả”, value);
Value = 10 quả
- Hiển thị tên lên giữa màn hình lcd
#include <16f887.h>
#FUSES HS, NOWDT, NOPROTECT
#use delay (clock = 20M)
#include <lcd.c>
void main()
{
while(1)
{
lcd_init();
lcd_gotoxy (1,1);
lcd_putc ("\f LE HONG QUANG ");
delay_ms(500);
lcd_putc ("\f PIC ");
delay_ms(500);
}
}