IC 74HC595 giúp mở rộng Port cho các loiạ vi điều khiển , mục đích sử dụng lớn cho các Project đòi hỏi số lượng I/O nhiều.
Nhiệm vụ của IC 74HC595 là lấy 3 chân của VĐK ( chân dịch dữ liệu DS, chân phát hiện xung dữ liệu SH_CP, và chân tạo xung chốt dữ liệu ST_CP). Các IO từ Q0 đến Q7 có chức năng cũng giống như 1 port của VĐK VCC nối lên 5V , GND nối mass, MR nối chung với VCC tạo reset, OE giúp cấu hình ngõ ra nối chung GND.
Để thấy rõ sự hoạt động của IC này ta sẽ tham khảo đoạn code sau cho vđk 16f877a :
#define data_pin PIN_B0
#define clock_pin PIN_B1
#define latch_pin PIN_B2
#include <16f877a .h="">
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 8000000)
#use fast_io(B) // dinh che do io thu cong
#use fast_io(D)
/*khai bao ham con*/
void cauhinhport();
unsigned int seg(unsigned int num);
void kiemtranutnhan();
void write_data(unsigned int number);
void quetled7doan();
/*khai bao bien toan cuc*/
short s;
unsigned int j,nghin,tram,chuc,donvi ;
unsigned long i = 0;
/*ham con chau hinh port*/
void cauhinhport()
{
port_b_pullups(TRUE); // bat dien tro keo port B
output_b(0); // PORTB khoi tao cong
set_tris_b(0x18); // Cau hinh RB3 & RB4 nhu la input
output_d(0); // PORTD khoi tao cong
set_tris_d(0);
}
/*ham con hien thi led 7 doan anode chung*/
unsigned int seg(unsigned int num) {
switch (num) {
case 0 : return 0xc0;
case 1 : return 0xf9;
case 2 : return 0xa4;
case 3 : return 0xb0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}
/*ham con dich bit data*/
void write_data(unsigned int number){
for(j = 0x80; j > 0; j = j >> 1)
{
if(number & j){
output_high(data_pin); // xung cao
}
else
{
output_low(data_pin); //xung thap
}
/*tao xung clock day data*/
output_high(clock_pin);
output_low(clock_pin);
}
/*tao xung ket thuc day data*/
output_high(latch_pin);
output_low(latch_pin);
}
/*ham con kiem tra nut nhan*/
void kiemtranutnhan()
{
if(input(PIN_B3) && input(PIN_B4))
s = 1;
if(s == 1) {
if(input(PIN_B3) == 0) {
s = 0;
i++;
if(i > 9999)
i = 0;
}
if(input(PIN_B4) == 0) {
s = 0;
if(i < 1)
i = 1;
i--;
}
}
nghin = seg(i/1000); // hang nghin
tram = seg((i %1000) /100); // hang tram
chuc = seg(((i %1000)%100)/10); // hang chuc
donvi = seg(i% 10); // hang don vi
}
void quetled7doan()
{
/*quet led thu nhat*/
output_high(PIN_D0);
write_data(nghin);
delay_ms(1);
output_low(PIN_D0);
/*quet led thu hai*/
output_high(PIN_D1);
write_data(tram);
delay_ms(1);
output_low(PIN_D1);
/*quet led thu ba*/
output_high(PIN_D2);
write_data(chuc);
delay_ms(1);
output_low(PIN_D2);
/*quet led thu tu*/
output_high(PIN_D3);
write_data(donvi);
delay_ms(1);
output_low(PIN_D3);
}
/*ham chinh xu ly*/
void main(){
cauhinhport(); // Cau hinh port nhu la output
while(TRUE)
{
/* kiem tra phim nhat*/
kiemtranutnhan();
/*tien hanh quet led*/
quetled7doan();
}
}
16f877a>
0 nhận xét:
Đăng nhận xét