thuc hanh vxl
1 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 2 Bà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 } } } 3 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 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; 5 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> 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 7 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); 8 output_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. 9 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); 10 EFFECT 01 ( ‘ 0 ‘ là đèn sáng ) Hiệu ứng sáng xen kẽ EFFECT 02 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 EFFECT 03 0 0 0 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 . để đế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. để đế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