thuc hanh vxl
Trang 11
Bài 1 : LED đơn trang 2
Bài 2 : ĐÈN GIAO THÔNG HIỂN THỊ THỜI GIAN trang 3 Bài 3 : ĐẾM TỪ 1 SỐ XXXX à 1 SỐ XXXX .trang 5
Bài 4 : HIỂN THỊ 1 SỐ XXXX LÊN LED 7 trang 7
Bài 5 : HIỂN THỊ MATRIX 8x16 ( nối trực tiếp ) trang 8 Bài 6 : HIỂN THỊ LCD 20x4 trang 13
Trang 2Bài 1 : LED đơn
(LED SÁNG MỨC ‘ 0 ‘)
#include <16f877a.h>
#use delay (clock=4000000) //khai báo thông s ố của thạch anh
#fuses xt // khai báo dùng th ạch anh
#use fast_io(b) //khai báo dùng portb ( quan tr ọng : khi dùng port nào thì khai báo tên port đó )
#use fast_io(c) //khai báo dùng portc
#byte portb=0x06 // địa chỉ của portb trong PIC ( xem datasheet)
#byte portc=0x07 // địa chỉ của portc trong PIC
int8 i; //khai báo bi ến i là biến 8bit
int8 effect01[17]={0b11111111,0b01111111,0b00111111,0b00011111,0b00001111,
0b00000111,0b00000011,0b00000001,0b00000000,0b10000000,
0b11000000,0b11100000,0b11110000,0b11111000,0b11111100,
0b11111110,0b11111111}; //hi ệu ứng chạy đèn sáng dần à tắt dần
int8 effect02[17]={0b11111111,0b01111111,0b00111111,0b00011111,0b00001111,
0b00000111,0b00000011,0b00000001,0b00000000,0b11111110,
0b11111100,0b11111000,0b11110000,0b11100000,0b11000000,
0b10000000,0b00000000}; //hi ệu ứng sáng đèn từ dưới lên à từ trên xuống
void main() // hàm chính ( dùng th ực thi các lệnh chính )
{
set_tris_b(0x00); //khai báo portb xu ất (0) hay nhập (1) , tại đây tất cả portb đều xuất nên tất cả = 0
set_tris_c(0x00); //khai báo portc xu ất (0) hay nhập (1) , tại đây tất cả portc đều xuất nên tất cả = 0
while (true) //hàm l ặp vô hạn các lệnh trong ngoặc { }
{
for(i=0;i<17;i++) //hàm FOR là hàm lặp theo số lần quy định , ở đây hàm for dùng làm để thay đổi thứ tự
{ //hiển thị đèn ứng với các effect bên trên , i lần lượt đếm từ 0à16 ứng với 17 giá trị trong effect
output_b(effect01[i]); //sau khi i chọn giá trị nào trong effect được hiển thị thì lệnh này sẽ xuất ra đèn theo
output_c(effect02[i]); //port mình chọn , tại đây dùng port b&c nên ghi lệnh vậy , nếu đổi port thì sửa lại delay_ms(200); //th ời gian trễ để thực hiện lệnh tiếp theo
}
}
}
Trang 33
Bài 2 : ĐÈN GIAO THÔNG HIỂN THỊ THỜI GIAN
Thứ tự cắm chân
B0 à chân G C0 à chân chọn LED 4 cắm LED giao thông theo port d ,
B6 à chân A C3 à chân chọn LED 1 cắm chiều nào cũng OK
(P/S: B0 , C0 là ký hiệu tên của các port VD : B0 là portb.0 ; C0 là portc.0 )
P/S: Để ý chiều của 2 port b và port c , nếu thấy chữ sáng ngược thứ tự thì đổi chiều cắm chân chọn LED , nếu đèn sáng theo thứ tự chọn LED nhưng sáng ko ra số thì thử đổi chiều port b điều khiển LED
Còn phần LED giao thông của port d thì cắm sao cũng dc , nếu cắm ngược trên hình thì chỉ thay đổi thứ thứ tự của 2 hệ thống đèn giao thông
NẾU DÙNG CODE NÀY TRONG PROTEUS THÌ GẮN THÊM CỔNG LOGIC NOT TRƯỚC KHI GẮN DÂY VÀO LED GIAO THÔNG GIỐNG NHƯ GẮN Ở CÁC CHÂN ABCDEFG ( DO ĐÈN GIAO THÔNG TRONG PROTEUS SÁNG MỨC ‘ 1 ‘ )
Có thể thay đổi thời gian tùy ý nhưng phải theo công thức nếu ko sẽ hiển thị sai
ĐỎ 1 = XANH 2 + VÀNG 2
ĐỎ 2 = XANH 1 + VÀNG 1
CODE
#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt
#use fast_io(b) //dùng port b cho 7 chân LED 7 đoạn
#use fast_io(c) //dùng port c cho phần chọn LED 7
#use fast_io(d) //dùng port d cho ph ần hiển thị đèn LED giao thông
#byte portb=0x06 //địa chỉ của 3 port trong PIC ( datasheet )
#byte portc=0x07
Trang 4#byte portd=0x08
int8 so[10]={0b00000001,0b11001111,0b10010010,0b10000110,0b11001100,
0b10100100,0b10100000,0b10001111,0b10000000,0b10000100}; // mức ‘ 0 ‘ thì LED 7 sáng
int8 i,j,k,chuci,chucj,dvi,dvj; //các biến 8 bit dùng trong code
Void doibcd(); //khai báo hàm con
Void hienthi(); //khai báo hàm con
void main() //hàm chính
{
set_tris_b(0x00); //cực kỳ quan trọng , xem phần này kỹ , lệnh này dùng để khai báo xem port đó dùng để
Set_tris_c(0x00); //xuất hay nhập , ở đây 3 port đều xuất cho nên khai báo tất cả đều ‘ 0 ‘
Set_tris_d(0x00); //không có phần này thì mạch sẽ ko chạy
While(true)
{
for(i=33,j=30;j>0;j ,i ) // ĐỎ 1 = 33s , XANH 2 = 30s // hàm for đếm xuống dùng để cấp giá trị cho hàm // doibcd làm việc // thay đổi thời gian hiển thị đèn giao thông ở đây
// quy ước : i là của hệ thống đèn giao thông 1 , j là của hệ thống đèn giao thông 2
{
output_d(0b00110111); //theo hình thì chân nào = 0 thì chân đó làm đèn sáng
doibcd(); //c ăn cứ theo giá trị i , j để đổi ra giá trị cần hiển thị cho LED 7
For(k=0;k<50;k++) //lenh này làm cho LED 7 đếm nhanh hay chậm ( tăng k lên thì chậm )
Hienthi(); //hiển thị ra LED 7 đoạn các giá trị tương ứng
}
for(i=3,j=3;j>0,i>0;j ,i ) // ĐỎ 1 = 3s , VÀNG 2 = 3s // thay đổi thời gian hiển thị đèn giao thông ở đây
{
output_d(0b01010111);
doibcd();
For(k=0;k<50;k++)
Hienthi();
}
for(i=25,j=28;i>0;j ,i ) // XANH 1 = 25s , ĐỎ 2 = 28 // thay đổi thời gian hiển thị đèn giao thông ở đây
{
output_d(0b11101100);
doibcd();
For(k=0;k<50;k++)
Hienthi();
}
for(i=3,j=3;j>0,i>0;j ,i ) // VÀNG 1 = 3s , ĐỎ 2 = 28 // thay đổi thời gian hiển thị đèn giao thông ở đây
{
output_d(0b11101010);
doibcd();
For(k=0;k<50;k++)
Hienthi();
}
}
}
Void doibcd() // lấy các giá trị i , j phía trên để đổi ra giá trị cho phần hàm hienthi() hoạt động
{
dvi=i%10; // làm tròn các giá trị i
chuci=i/10;
Trang 55
dvj=j%10; // làm tròn các giá tr ị j
Chucj=j/10;
}
Void hienthi() lấy giá trị từ phần đổi bcd để hiển thị ra LED 7
{
output_c(0b11111101); // chon LED 7 thứ 2 à ứng với hàng chục của hệ thống đèn giao thông 1
Output_b(so[chuci]); // xuất giá trị hiển thị ra LED 7 ứng với giá trị chuci do hàm doibcd() cung cấp
Delay_ms(2);
output_c(0b11111110); // chon LED 7 th ứ 1 à ứng với hàng đơn vị của hệ thống đèn giao thông 1
Output_b(so[dvi]); // xu ất giá trị hiển thị ra LED 7 ứng với giá trị dvi do hàm doibcd() cung cấp
Delay_ms(2);
output_c(0b11110111); // chon LED 7 th ứ 4 à ứng với hàng chục của hệ thống đèn giao thông 2
Output_b(so[chucj]); // xu ất giá trị hiển thị ra LED 7 ứng với giá trị chucj do hàm doibcd() cung cấp
Delay_ms(2);
output_c(0b11111011); // chon LED 7 th ứ 3 à ứng với hàng đơn vị của hệ thống đèn giao thông 2
Output_b(so[dvj]); // xu ất giá trị hiển thị ra LED 7 ứng với giá trị dvj do hàm doibcd() cung cấp
Delay_ms(2);
}
Bài 3 : ĐẾM TỪ 1 SỐ XXXX à 1 SỐ XXXX
Phần nối dây và lưu ý tương tự phần LED 7 đoạn của ĐÈN GIAO THÔNG
CODE
#include <16f877a.h>
Trang 6#use delay(clock=4000000)
#fuses xt
#use fast_io(b)
#use fast_io(c)
#byte portb=0x06
#byte portc=0x07
int8 so[10]={0b00000001,0b11001111,0b10010010,0b10000110,0b11001100,0b10100100,
0b10100000,0b10001111,0b10000000,0b10000100}; // LED 7 sáng m ức ‘ 0 ‘
int8 donvi,chuc,tram,ngan; //các bi ến 8 bit dùng trong code
int16 sodem; // vì sodem có giá trị =1000 , nên phải khai báo bằng int16
// nếu <= 255 thì khai báo là int8
// nếu <=65535 thì khai báo là int16
Void Main()
{
Set_tris_b(0x00); //quan tr ọng
Set_tris_c(0x00);
While(true)
{
For(sodem=0;sodem<10000;sodem++) // ĐẾM LÊN // xem P/S bên dưới // cần thay đổi chỉ cần sửa dòng này
{
Donvi=sodem%10; // t ương tự như phần doibcd() của đèn giao thông , dùng cung cấp giá trị cho LED 7
Chuc=(sodem/10)%10; // làm vi ệc
Tram=(sodem/100)%10;
Ngan=(sodem/1000)%10;
output_c(0b11111110);;//chon led don vi
Output_b(so[donvi]);
Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )
output_c(0b11111101);;//chon led chuc
Output_b(so[chuc]);
Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )
output_c(0b11111011);;//chon led tram
Output_b(so[tram]);
Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )
output_c(0b11110111);//chon led ngan
Output_b(so[ngan]);
Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )
}
}
}
P/S: hàm for có nhiệm vụ cung cấp giá trị cho phần đổi ra đơn vị , chục , trăm , ngàn làm việc
Với hàm trên là hàm đếm lên từ 0 à 9999 , để thay đổi giá trị đếm theo ý thích thì làm khai báo theo hàm tổng quát như sau :
Nếu đếm lên
Trang 77
For(sodem=xxxx;sodem<yyyy;sodem+ +)
Với xxxx: số lúc đầu
yyyy: số cần đếm đếm + 1
VD:
1) Đếm từ 0 à 1234 ( tương ứng xxxx=0 ; yyyy=1235 )
For(sodem=0;sodem<1235;sodem+ +)
2)Đếm từ 542 à 2145 ( tương ứng xxxx=542 ; yyyy=2146 )
For(sodem=542;sodem<2146;sodem+ +)
Nếu đếm xuống
For(sodem=xxxx;sodem>yyyy;sodem- -)
Với xxxx: số lúc đầu
yyyy: số cần đếm đến - 1
VD:
1)Đếm từ 999 à 0 ( tương ứng xxxx=999 ; yyyy=0 )
For(sodem=999;sodem>0;sodem- -)
2)Đếm từ 4512 à 123 ( tương ứng xxxx= 4512; yyyy=122)
For(sodem=4512;sodem>122;sodem- -)
Bài 4 : HIỂN THỊ 1 SỐ XXXX LÊN LED 7
Hình & nối dây & mức sáng đèn như của bài 3
CODE:
#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt
#use fast_io(b)
#use fast_io(c)
#byte portb=0x06
#byte portc=0x07
int8 so[10]={0b00000001,0b11001111,0b10010010,0b10000110,0b11001100,
0b10100100,0b10100000,0b10001111,0b10000000,0b10000100};
void main()
{
set_tris_b(0);
Set_tris_c(0);
While(true)
{
output_c(0b11110111); // hàng ngàn
Output_b(so[4]); // thay đổi giá trị hiển thị hàng ngàn thì thay đổi số ‘4’ thành số theo ý thích
delay_ms(4);
output_c(0b11111011); // hàng tr ăm
Output_b(so[3]); // thay đổi giá trị hiển thị hàng trăm thì thay đổi số ‘3’ thành số theo ý thích
delay_ms(4);
output_c(0b11111101); // hàng ch ục
Output_b(so[2]); // thay đổi giá trị hiển thị hàng chục thì thay đổi số ‘2’ thành số theo ý thích
delay_ms(4);
Trang 8output_c(0b11111110); // hàng đơn vị
Output_b(so[1]); // thay đổi giá trị hiển thị hàng đơn vị thì thay đổi số ‘1’ thành số theo ý thích
delay_ms(4);
}
}
Bài 5 : HIỂN THỊ MATRIX 8x16 ( nối trực tiếp )
Phần nối dây cũng tương tự các phần trước , nếu khi nối thấy hiệu ứng đèn ngược với khi test trên protues thì đổi chiều dây cắm
Để ý phần port sữ dụng , đặc biệt là port hàng ( port b ) , vì nếu sai port này thì đèn matrix sẽ ko hoạt động
Sau đây là 1 vài hiệu ứng cơ bản , tuy nhiên các hiệu ứng này là hiệu ứng tĩnh , cho nên chỉ duy trỉ duy nhất 1 trạng thái nhất định và ko thay đổi
Trang 99
EFFECT 01
output_b(hang[1]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[2]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
output_b(hang[3]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[4]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
output_b(hang[5]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[6]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
output_b(hang[7]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[8]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
EFFECT 02
output_b(hang[1]);
output_c(0b10101111);
output_d(0b11110101);
delay_ms(1);
output_b(hang[2]);
output_c(0b10101000);
output_d(0b00010101);
delay_ms(1);
output_b(hang[3]);
output_c(0b10101011);
output_d(0b11010101);
delay_ms(1);
output_b(hang[4]);
output_c(0b10101010);
output_d(0b01010101);
delay_ms(1);
output_b(hang[5]);
output_c(0b10101010);
output_d(0b01010101);
delay_ms(1);
output_b(hang[6]);
output_c(0b10101011);
output_d(0b11010101);
delay_ms(1);
output_b(hang[7]);
output_c(0b10101000);
output_d(0b00010101);
delay_ms(1);
output_b(hang[8]);
output_c(0b10101111);
output_d(0b11110101);
delay_ms(1);
EFFECT 03
output_b(hang[1]);
output_c(0b00011011); output_d(0b11101110); delay_ms(1);
output_b(hang[2]);
output_c(0b10111011); output_d(0b11101110); delay_ms(1);
output_b(hang[3]);
output_c(0b10111011); output_d(0b11101110); delay_ms(1);
output_b(hang[4]);
output_c(0b10111011); output_d(0b11101110); delay_ms(1);
output_b(hang[5]);
output_c(0b10111011); output_d(0b11101110); delay_ms(1);
output_b(hang[6]);
output_c(0b10111011); output_d(0b11101110); delay_ms(1);
output_b(hang[7]);
output_c(0b10111011); output_d(0b11101110); delay_ms(1);
output_b(hang[8]);
output_c(0b00011000); output_d(0b01100000); delay_ms(1);
Trang 10EFFECT 01 ( ‘ 0 ‘ là đèn sáng ) Hiệu ứng sáng xen kẽ
EFFECT 02
EFFECT 03
Trang 1111
CODE
#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt
#use fast_io(b) //dùng điều khiển hàng chung của 2 matrix 8x8
#use fast_io(c) //dùng cho matrix thứ 1
#use fast_io(d) //dùng cho matrix th ứ 2
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
int8 hang[9]={0b11111111,0b01111111,0b10111111,0b11011111,0b11101111,
0b11110111,0b11111011,0b11111101,0b11111110}; //phần này dùng để chọn hàng thay
vì ta ghi lệnh [ output_b(0b01111111) ] để chọn hàng 1 thì ta ghi [ output_b(hang[1]) ] , 2 lệnh này tương tự nhau làm cái nào cũng được , trong bài thì dùng cái thứ 2 )
void main()
{
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
while (true)
{
// ghi vào phần code của EFFECT 01 hay EFFECT 02 hay EFFECT 03 vào đây thì sẽ ra xuất ra matrix 8x16 hiệu ứng tương tự //
}
}
Nguyên tắc hoạt động của code hiệu ứng
Vì cách chọn data theo từng hàng như nhau cho nên ta chỉ phân tích 1 hàng còn các hàng còn lại như nhau:
output_b(hang[1]); //cái này là chọn hàng tương ứng từ 1 đến 8, ta muốn hàng nào sáng thì thay 1 bằng // số hàng tương ứng
output_c(0b01010101); // giá trị hiển thị của đèn , port nào có giá trị = o , thì cột led nối với chân port đó // sẽ sáng ( vì đang chọn hàng 1 nên các đèn thuộc hàng 1 sẽ sáng )
output_d(0b01010101); //tương tự port c
delay_ms(1); thời gian trễ để thực hiện lệnh kế tiếp
Vậy nếu muốn có code chạy hiệu ứng EFFECT 01 thì ta sẽ có code như sau :
#include <16f877a.h>
#use delay(clock=4000000)
#fuses xt
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
Trang 12#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
int8 hang[9]={0b11111111,0b01111111,0b10111111,0b11011111,0b11101111,
0b11110111,0b11111011,0b11111101,0b11111110};
void main()
{
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
while (true)
{
output_b(hang[1]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[2]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
output_b(hang[3]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[4]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
output_b(hang[5]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[6]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
output_b(hang[7]);
output_c(0b01010101);
output_d(0b01010101);
delay_ms(1);
output_b(hang[8]);
output_c(0b10101010);
output_d(0b10101010);
delay_ms(1);
}
}
Trang 1313
Bài 6 : HIỂN THỊ LCD 20x4
Phần nối dây đặc biệt cẩn thận , bởi vì trong mạch dùng 2 port để sử dụng , bất cứ port nào nối dây sai hay sai chiều đều làm cho LCD ko thể hiển thị đúng hay thậm chí ko thể hiển thị được
Sau khi kiểm tra dây đúng và nạp code nếu bắm reset mà vẫn ko hiển thị đúng thì tắt nguồn của KIT thí
nghiệm và mở lên lại
Nếu ko thấy rõ thì chỉnh tương phản của LCD , đó là cái biến trở đặt dưới LCD
Vị trí trong LCD:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3
94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7