You are on page 1of 39

Doan Trong Hieu ®

***LED ĐƠN***
1/ Nháy led đơn
void main()
{
while(TRUE)
{
output_high (pin_b0);
delay_ms (500);
output_low (pin_b0);
delay_ms (500);
}
}

2/ 8 led đơn sáng dần

int8 i, y;

void main()
{
while(TRUE)
{
y = 0xff; //1111 1111 tat het
for (i = 0; i <= 8; i++) //Sang tu trai qua
{
output_b(y);
delay_ms (500);
y = y << 1;
}

1
Doan Trong Hieu ®
y = 0xff;
for (i = 0; i <= 8; i++) //Sang tu phai qua
{
output_b(y);
delay_ms (500);
y = y >> 1;
}
}
}

3/ 8 led đơn sáng đuổi


int8 i, y;

void main()
{
while(TRUE)
{
y = 0xfe; //Led dau tien sang (1111 1110)

for (i = 0; i <= 8; i++)


{
output_b (y);
delay_ms (500);
y = (y<<1)|(0x01);
}
}
}

4/ 8 led đơn sáng trong ra ngoài vào


int A [] = {0xff, 0xe7, 0xc3, 0x81, 0x00, 0x81, 0xc3, 0xe7, 0xff};
int i;

void main()
{
while(TRUE)
{
for (i = 0; i < 9; i++)
{
output_b (A[i]);
delay_ms (500);
}
}
}

***LED 7 ĐOẠN***
5/ Led 7 đoạn đếm 0  9
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

2
Doan Trong Hieu ®
int i;

void main()
{
while(TRUE)
{
for (i = 0; i < 10; i++)
{
output_b (Led[i]);
delay_ms (500);
}
}
}

6/ Led 7 đoạn đếm 0  99


int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int i, j;

void main()
{
while(TRUE)
{
for (i = 0; i < 10; i++)
{
output_b (Led[i]);
for (j = 0; j < 10; j++)
{
output_c (Led[j]);
delay_ms (125);
}
}
}
}

7/ Led 7 đoạn đếm 0  99 – Phương pháp quét


int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int i, chuc, donvi, dem = 0;

void hien_thi_2_led () //CT con chiem 5+5=10ms

3
Doan Trong Hieu ®
{
chuc = dem / 10;
donvi = dem % 10;

output_b (Led[chuc]);
output_low (pin_d0);
delay_ms (5);
output_high (pin_d0);

output_b (Led[donvi]);
output_low (pin_d1);
delay_ms (5);
output_high (pin_d1);
}

void main()
{
while(TRUE)
{
for (i = 0; i < 25; i++) //Hien thi 1 so chiem 10ms*25 = 0.25s
{
hien_thi_2_led();
}
dem ++;
if (dem == 100) dem = 0;
}
}

8/ Led 7 đoạn đếm 0  999

int tram, chuc, donvi, i;


int32 dem = 0;
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

4
Doan Trong Hieu ®

void hien_thi_3_led() //chuong trinh nay chiem 3ms


{
tram = dem/100;
chuc = (dem/10) %10;
donvi = dem%10;

output_b(Led[donvi]);
output_low(pin_d2); delay_ms(1); output_high(pin_d2);

output_b(Led[chuc]);
output_low(pin_d1); delay_ms(1); output_high(pin_d1);

output_b(Led[tram]);
output_low(pin_d0); delay_ms(1); output_high(pin_d0);
}

void main()
{
while(TRUE)
{
for (i=0;i<=25;i++) //vong lap nay chiem 3ms*50=0.075s
{
hien_thi_3_led();
}
dem++;
if (dem==1000) dem=0;
}
}

9/ Led 7 đoạn đếm số chẵn


void main()
{
dem = 0;
while(TRUE)
{
if (dem == 102) dem = 0;
for (i = 0; i < 25; i++) //Hien thi 1 so chiem 10ms*25 = 0.25s
{
hien_thi_2_led();
}
dem = dem + 2;
}
}

5
Doan Trong Hieu ®
10/ Led 7 đoạn đếm số lẻ
void main()
{
dem = 1;
while(TRUE)
{
if (dem == 101) dem = 1;
if (dem%2 != 0)
{
for (i = 0; i < 25; i++) //Hien thi 1 so chiem 10ms*25 = 0.25s
{
hien_thi_2_led();
}
}
dem = dem + 2;
}
}

11/ Led 7 đoạn đếm 0  9 – Nút nhấn


#define Nhan input(pin_e0)
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int dem = 0;

void main()
{
while(TRUE)
{
output_b (Led[dem]);
if (Nhan == 0)
{
dem++;
if (dem == 10) dem = 0;
while (Nhan == 0) //Con nhan giu thi chua tang bien dem, hold
output_b (Led[dem]);
}
}
}

6
Doan Trong Hieu ®

12/ Led 7 đoạn đếm 0  99 – Nút nhấn


#define Nhan input(pin_e0)
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int chuc, donvi, dem = 0;

void hien_thi_2_led () //CT con chiem 5+5=10ms


{
chuc = dem / 10;
donvi = dem % 10;

output_b (Led[chuc]);
output_low (pin_d0);
delay_ms (5);
output_high (pin_d0);

output_b (Led[donvi]);
output_low (pin_d1);
delay_ms (5);
output_high (pin_d1);
}

void main()
{
while(TRUE)
{
if (dem == 100) dem = 0;
hien_thi_2_led();
if (Nhan == 0)
{
while (Nhan == 0) hien_thi_2_led();
dem++;
}
}
}

7
Doan Trong Hieu ®
***IC 74LS138***
13/ 74LS138 điều khiển 8 Led 7
int8 i;
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void main()
{
while(TRUE)
{
for (i=0; i<8; i++)
{
output_d (i);
output_b (Led[i]);
delay_ms (1);
}
}
}

14/ 74LS138 điều khiển 16 Led 7


int Led [] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xf9,0xc0,0xf9,0xf9,0xf9,0xa4};

int16 i;

void main()
{
while(true)
{
for (i=0; i<16; i++)
{
output_d (i); //Kich hoat tung Led

8
Doan Trong Hieu ®
output_b (Led[i]); //Xuat ma Led tuong ung voi tung Led
delay_ms (1);
}
}
}

15/ 74LS138 điều khiển 16 Led đơn sáng dần


int16 i, y = 0;

void main()
{
set_tris_c(0x00); //dat trang thai cho port C, 0: Output
while(TRUE)
{
for (i = 0; i < 16; i++)
{
output_c (y);
delay_ms(500);
y++;
}
}
}

9
Doan Trong Hieu ®

***IC 74HC595***
16/ 74595 điều khiển 8 Led đơn
int16 Ma[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int t = 250, i;

//595 8 bit------------------------------------------------------------------------------------------
#define SH_CP pin_b0 //XUNG
#define DS pin_b1 //DU LIEU
#define ST_CP pin_b2 //CHOT
void HC595_out_8bit (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua du lieu
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output
}
//------------------------------------------------------------------------------------------------------
void main()
{

10
Doan Trong Hieu ®
while(TRUE)
{
for (i=0; i<15; i++)
{
HC595_out_8bit(Ma[i]);
delay_ms (t);
}
}
}

17/ 74595 điều khiển 16 Led đơn


#define SH_CP pin_d0 //XUNG
#define DS pin_d1 //DU LIEU
#define ST_CP pin_d2 //CHOT

int16 y, i;
int t = 250;
//-----------------------------------------------------------------------------------------------------------
--------
void HC595_out_16bit (int16 data) //Moi lan goi ham nay thi se xuat 16 bit du lieu ra 2 con 595
{
int16 i;
#BIT bit_con = data.15 //Bit DS, .15: Truy xuat dia chi bit thu 15 (MSB) trong du lieu dang xet

for (i=0; i<16; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.14, bit thu 14 duoc day qua bit thu 15 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output

11
Doan Trong Hieu ®
}
//-----------------------------------------------------------------------------------------------------------
--------
void main()
{
set_tris_d (0x00); //port D xuat du lieu

while(TRUE)
{
y = 0x00; //Ban dau tat het led, xuat 1 thi led sang
for (i=0; i<=16; i++)
{
HC595_out_16bit (y);
delay_ms (t);
y = (y<<1)|(0x01);
}
}
}

18/ 74595 điều khiển 8 Led 7


int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int i, y;

//595 8 bit------------------------------------------------------------------------------------------
#define SH_CP pin_c0 //XUNG
#define DS pin_c1 //DU LIEU
#define ST_CP pin_c2 //CHOT

void HC595_out_8bit_active_led (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;

12
Doan Trong Hieu ®
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output
}

#define SH_CP1 pin_c3 //XUNG1


#define DS1 pin_c4 //DU LIEU1
#define ST_CP1 pin_c5 //CHOT1

void HC595_out_8bit_led_code (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS1, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP1); output_high (SH_CP1); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP1); output_high (ST_CP1); //tao xung chot de chuyen du lieu ra output
}
//-------------------------------------------------------------------------------------------------------

void main()
{
while(TRUE)
{
y = 0x01; //Bien de kich hoat tung Led
for (i=0;i<8;i++)
{
HC595_out_8bit_active_led (y); //Kich hoat lan luot tung con Led
HC595_out_8bit_led_code (Led[i]); //Xuat ma Led ra con Led da kich hoat
delay_ms(1);
y = y << 1; //Chuyen sang kich hoat con led tiep theo
}
}
}

13
Doan Trong Hieu ®

19/ 74595 Led 7 đếm 0  9


int i;
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//595 8 bit------------------------------------------------------------------------------------------
#define SH_CP pin_b0 //XUNG
#define DS pin_b1 //DU LIEU
#define ST_CP pin_b2 //CHOT
void HC595_out_8bit (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua du lieu
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output
}
//------------------------------------------------------------------------------------------------------

void main()
{

14
Doan Trong Hieu ®
while(TRUE)
{
for (i = 0; i < 10; i++)
{
HC595_out_8bit (Led[i]);
delay_ms (250);
}
}
}

20/ 74595 Led 7 đếm 0  99


int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int i, chuc, donvi, dem = 0;

//595 8 bit------------------------------------------------------------------------------------------
#define SH_CP pin_b0 //XUNG
#define DS pin_b1 //DU LIEU
#define ST_CP pin_b2 //CHOT
void HC595_out_8bit (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0

15
Doan Trong Hieu ®
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output
}
//-------------------------------------------------------------------------------------------------------
void Hien_thi_2_led () //chuong trinh nay chiem 5ms+5ms=10ms
{
chuc = dem/10;
donvi=dem%10;

HC595_out_8bit (Led[chuc]);
output_low (pin_d0);
delay_ms (5);
output_high (pin_d0);

HC595_out_8bit (Led[donvi]);
output_low (pin_d1);
delay_ms (5);
output_high (pin_d1);
}
//----------------------------------------------------------------------------

void main()
{
while(TRUE)
{
for(i=0;i<=25;i++) //vong lap for chiem 10ms*25=0.25s
{
Hien_thi_2_led();
}
dem++;
if (dem==100) dem=0;
}
}

16
Doan Trong Hieu ®

21/ 74595 Led 7 đếm 0  9 – Nút nhấn


int8 Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int8 dem = 0;

#define Nhan input(pin_e0)

//595 8 bit------------------------------------------------------------------------------------------
#define SH_CP pin_b0 //XUNG
#define DS pin_b1 //DU LIEU
#define ST_CP pin_b2 //CHOT
void HC595_out_8bit (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output

17
Doan Trong Hieu ®
}
//-------------------------------------------------------------------------------------------------------

void main()
{
while(TRUE)
{
HC595_out_8bit (Led[dem]);
if (Nhan==0)
{
dem++;
if (dem==10) dem=0;
while (Nhan==0)
{
HC595_out_8bit (Led[dem]);
}
}
}
}

22/ 74595 Led 7 – 2 chế độ – Ngắt ngoài


int8 Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int Push = 0; //Trang thai ban dau cua nut nhan = 0 (Noi GND)
//_____________________________________________________________________________
#int_ext
void ngat_ngoai ()

18
Doan Trong Hieu ®
{
Push++;
if (Push==2) Push=0;
}
//_____________________________________________________________________________
void active_ngat_ngoai ()
{
enable_interrupts (int_ext); //Kich hoat ngat ngoai
enable_interrupts (global); //Kich hoat ngat toan cuc
ext_int_edge (H_to_L); //Chon ngat canh xuong
}
//595 8 bit____________________________________________________________________
#define SH_CP pin_C0 //XUNG
#define DS pin_C1 //DU LIEU
#define ST_CP pin_C2 //CHOT

void HC595_out_8bit (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int8 i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output
}
//____________________________________________________________________________
void Mode1() //Dem so le, 1 3 5 7 9
{
int i;
for(i=1;i<=9;i=i+2)
{
HC595_out_8bit(Led[i]);
delay_ms(500);
if(Push==1) break;
}
}
//_____________________________________________________________________________
void Mode2() //Dem so chan, 0 2 4 6 8
{
int i;
for(i=0;i<=8;i=i+2)
{
HC595_out_8bit(Led[i]);

19
Doan Trong Hieu ®
delay_ms(500);
if(Push==0) break;
}
}
//_____________________________________________________________________________
void main()
{
set_tris_b(0x01); set_tris_c(0x00);
active_ngat_ngoai ();
while(TRUE)
{
if (Push==0) Mode1();
if (Push==1) Mode2();
}
}

***LED MATRIX***
Học thêm tại: http://iot47.com/category/ma-tran-led/

23/ Led matrix – 1


int i;

int16 row; //Bien quet hang

int Col [] = {0xff, 0x03, 0xed, 0xee, 0xee, 0xed, 0x03, 0xff}; //'A'

//595 Row____________________________________________________________________

#define SH_CP pin_b0 //XUNG

20
Doan Trong Hieu ®
#define DS pin_b1 //DU LIEU

#define ST_CP pin_b2 //CHOTk

void HC595_out_row (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595

int8 i;

#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)

output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat

output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0

data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra

output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output

//____________________________________________________________________________

//595 Col____________________________________________________________________

#define SH_CP1 pin_b3 //XUNG

#define DS1 pin_b4 //DU LIEU

#define ST_CP1 pin_b5 //CHOT

void HC595_out_col (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595

int8 i;

#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)

output_bit (DS1, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat

output_low (SH_CP1); output_high (SH_CP1); //tao xung canh len de dich du lieu, dua vao Q0

data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra

output_low (ST_CP1); output_high (ST_CP1); //tao xung chot de chuyen du lieu ra output

//____________________________________________________________________________

void main()

21
Doan Trong Hieu ®
{

row = 0x01;

while(TRUE)

for (i = 0; i < 8; i++)

if (row == 0x100) row = 0x01;

HC595_out_row (row);

HC595_out_col (Col[i]);

delay_ms (1);

row = row << 1; //Sau khi quet xong hang thu n thi quet hang thu n+1

22
Doan Trong Hieu ®
24/ Led matrix – 2

int16 i;

int16 row; //Bien quet hang

int16 Col [] = {0xff, 0x03, 0xed, 0xee, 0xee, 0xed, 0x03, 0xff

0xFF, 0x00, 0x7E, 0x7E, 0x7E, 0x66, 0x99, 0xFF}; //'A','B'

//595 Row____________________________________________________________________

#define SH_CP pin_b0 //XUNG

#define DS pin_b1 //DU LIEU

#define ST_CP pin_b2 //CHOT

void HC595_out_row (int16 data) //Moi lan goi ham nay thi se xuat 16 bit du lieu ra 2 con 595

int16 i;

#BIT bit_con = data.15 //Bit DS, .15: Truy xuat dia chi bit thu 15 (MSB) trong du lieu dang xet

for (i=0; i<16; i++)

output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat

output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0

data = data << 1; //dich data.14, bit thu 14 duoc day qua bit thu 7 de tiep tuc kiem tra

23
Doan Trong Hieu ®
}

output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output

//____________________________________________________________________________

//595 Col____________________________________________________________________

#define SH_CP1 pin_b3 //XUNG

#define DS1 pin_b4 //DU LIEU

#define ST_CP1 pin_b5 //CHOT

void HC595_out_col (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595

int i;

#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)

output_bit (DS1, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat

output_low (SH_CP1); output_high (SH_CP1); //tao xung canh len de dich du lieu, dua vao Q0

data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra

output_low (ST_CP1); output_high (ST_CP1); //tao xung chot de chuyen du lieu ra output

//____________________________________________________________________________

void main()

while(TRUE)

row = 0x0001;

for (i = 0; i < 16; i++)

HC595_out_row (row);

HC595_out_col (Col[i]);

delay_ms (1);

row = row << 1; //Sau khi quet xong hang thu n thi quet hang thu n+1

24
Doan Trong Hieu ®
25/ Led matrix – 4

int32 i;
int32 row;

char Col [] = {
0xFF, 0x81, 0xEF, 0xEF, 0xEF, 0xEF, 0x81, 0xFF //H
0xFF, 0xBD, 0xBD, 0x81, 0x81, 0xBD, 0xBD, 0xFF //I
0xFF, 0x81, 0xB5, 0xB5, 0xB5, 0xB5, 0xB5, 0xFF //E
0xFF, 0xC1, 0xBF, 0xBF, 0xBF, 0xBF, 0xC1, 0xFF //U
};
//595 Row____________________________________________________________________
#define SH_CP pin_b0 //XUNG
#define DS pin_b1 //DU LIEU
#define ST_CP pin_b2 //CHOT

void HC595_out_row (int32 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int32 i;
#BIT bit_con = data.31 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<32; i++)


{
output_bit (DS, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP); output_high (SH_CP); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP); output_high (ST_CP); //tao xung chot de chuyen du lieu ra output
}

25
Doan Trong Hieu ®
//____________________________________________________________________________
//595 Col____________________________________________________________________
#define SH_CP1 pin_b3 //XUNG
#define DS1 pin_b4 //DU LIEU
#define ST_CP1 pin_b5 //CHOT

void HC595_out_col (int8 data) //Moi lan goi ham nay thi se xuat 8 bit du lieu ra 1 con 595
{
int i;
#BIT bit_con = data.7 //Bit DS, .7: Truy xuat dia chi bit thu 7 (MSB) trong du lieu dang xet

for (i=0; i<8; i++)


{
output_bit (DS1, bit_con); //xuat ra chan DS gia tri MSB cua byte xuat
output_low (SH_CP1); output_high (SH_CP1); //tao xung canh len de dich du lieu, dua vao Q0
data = data << 1; //dich data.6, bit thu 6 duoc day qua bit thu 7 de tiep tuc kiem tra
}
output_low (ST_CP1); output_high (ST_CP1); //tao xung chot de chuyen du lieu ra output
}
//____________________________________________________________________________

void main()
{

while(TRUE)
{
row = 0x00000001;
for (i = 0; i < 32; i++)
{
HC595_out_row (row);
HC595_out_col (Col[i]);
delay_ms (1);
row = row << 1; //Sau khi quet xong hang thu n thi quet hang thu n+1
}
}
}

26
Doan Trong Hieu ®
26/ 3 Led matrix – Chạy chữ

#define SH_CP(x) output_bit(pin_c0,x)


#define DS(x) output_bit(pin_c1,x)
#define ST_CP(x) output_bit(pin_c2,x)

const unsigned char font [] =


{
255,129,189,189,189,219,231,255,255,129,189,189,189,189,129,255,255,131,
245,245,245,245,131,255,255,129,251,247,239,223,129,255 //DOAN
255,253,253,129,129,253,253,255,255,129,237,237,237,205,179,255,255,129,
189,189,189,189,129,255,255,129,251,247,239,223,129,255,255,195,189,189,189,173,141,255 //TRONG
255,129,231,231,231,231,129,255,255,189,189,129,129,189,189,255,255,129,
165,165,165,165,165,255,255,193,191,191,191,191,193,255 //HIEU
};
void main()
{
unsigned rol, delay, col;

while(TRUE)
{
for (rol = 0 ; rol < 85 ; rol++)
{//font. 23x8[8x8 matrix] = 112
for(delay = 0 ; delay < 5 ; delay++) //Toc do chay chu
{
DS(1);
SH_CP(0); SH_CP(1); ST_CP(0); ST_CP(1);
for (col = 0 ; col < 24 ; col++) //24 Cot
{
output_B( font[col + rol]);
delay_ms(1);
DS(0);
SH_CP(0); SH_CP(1); ST_CP(0); ST_CP(1);
}
}
}
}
}

27
Doan Trong Hieu ®

***TIMER***
 Tần số thạch anh/xung: f OSC =20 MHz ;T OSC =50ms
f OSC
 f PIC = =5 MHz (Bộ chia cứng: /4)
4
 Chọn bộ chia mềm là x 1
f 1
 f Timer = PIC →T Timer = (Chu kỳ Timer: Khoảng thời gian để Timer tăng lên 1 đơn vị)
x1 f Timer
 Cho tổng thời gian tràn mong muốn: x 2. Có: x 2=T Timer . x 3  Tìm ra x 3 (Sau x 3 chu kỳ thì Timer tràn)
(Muốn chia xung trong 1 chu kỳ thành mấy phần? Mỗi phần rộng x 2)
 Đặt giá trị ban đầu cho Timer: x 4 =2Số bitTimer −x3
PIC18F4550
 Timer 0, 1, 3: 16 bit Timer 2: 8 bit
16 bit = 2 =65536
16
8 bit = 28=256
 D: Phần trăm thời gian xung ở mức cao trong 1 chu kỳ
Khi Timer tràn thì chương trình kiếm tới #int_timern

27/ Timer 0 – Duty cycle 50%


D = 50% (Mức cao 50%); Tần số 20Hz  T = 50ms (Cao 25ms, thấp 25ms)  Chia 1 chu kỳ ra
thành 2 khúc bằng nhau (Mỗi khúc 25ms)
 f OSC =20 MHz ; T OSC =50ms
f OSC
 f PIC = =5 MHz
4
 Chọn bộ chia mềm: 8
f PIC 1
 f Timer = =0,625 MHz →T Timer = =1,6 μs
8 f Timer
 Đặt tổng thời gian tràn mong muốn: 25 ms . Có: 25 ms=1,6 μs . x 3
→ x3 =15625 (Sau 15625 chu kỳ thì timer tràn)

 Đặt giá trị ban đầu cho Timer: x 4 =65536−15625=49911

28
Doan Trong Hieu ®

int16 Value = 49911; //Dat gia tri ban dau cho Timer

#INT_TIMER0 //Diem nhap chuong trinh chay Timer


void Timer0 (void)
{
set_timer0 (Value); //Tranh viec Timer tran va chay ve 0
output_toggle (pin_c0); //Thay doi trang thai chan C0
}

void main()
{
set_tris_c (0x00);
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_8); //Su dung Timer noi, bo chia 8
set_timer0 (Value); //Dat gia tri thoi gian ban dau cho Timer
enable_interrupts (int_timer0); //Cho phep chuong trinh ngat Timer
enable_interrupts (global); //Cho phep ngat toan cuc

while(TRUE) {}
}

28/ Timer 0 – Duty cycle 80%


D = 80% (Mức cao 80%); Tần số 20Hz  T = 50ms (Cao 40ms, thấp 10ms)  Chia 1 chu kỳ ra
thành 5 phần bằng nhau (Mỗi phần 10ms)
 f OSC =20 MHz ; T OSC =50ms
f OSC
 f PIC = =5 MHz
4
 Chọn bộ chia mềm: 8
f PIC 1
 f Timer = =0,625 MHz →T Timer = =1,6 μs
8 f Timer
 Đặt tổng thời gian tràn mong muốn: 10 ms . Có: 10 ms=1,6 μs . x 3
→ x3 =6250 (Sau 6250 chu kỳ thì timer tràn)

 Đặt giá trị ban đầu cho Timer: x 4 =65536−x 3=59286

int Count = 0; //Khai bao bien dem


int16 Value = 59286; //Dat gia tri ban dau cho Timer

void Duty_80 () //CT chay voi Duty 80%


{
if (Count == 0) output_low (pin_c0);

29
Doan Trong Hieu ®
if (Count>= 1 && Count<=4) output_high (pin_c0);
}

#INT_TIMER0 //Diem nhap chuong trinh chay Timer


void Timer0 (void) //Sau 1 chu ky ngat thi Timer tang Count them 1 don vi
{
set_timer0 (Value); //Tranh viec Timer tran va chay ve 0
Count++;
if (Count == 5) Count = 0;
}

void main()
{
set_tris_c (0x00);
setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_8); //Su dung Timer noi, bo chia 8
set_timer0 (Value); //Dat gia tri thoi gian ban dau cho Timer
enable_interrupts (int_timer0); //Cho phep chuong trinh ngat Timer
enable_interrupts (global); //Cho phep ngat toan cuc

while(TRUE) Duty_80 ();


}

29/ Timer 1 – Duty cycle 60%


D = 60% (Mức cao 60%); Tần số 20Hz  T = 50ms (Cao 30ms, thấp 20ms)  Chia 1 chu kỳ ra
thành 5 khúc bằng nhau (Mỗi khúc 10ms)
 f OSC =20 MHz ; T OSC =50ms
f OSC
 f PIC = =5 MHz
4
 Chọn bộ chia mềm: 8
f PIC 1
 f Timer = =0,625 MHz →T Timer = =1,6 μs
8 f Timer
 Đặt tổng thời gian tràn mong muốn: 10 ms . Có: 10 ms=1,6 μs . x 3
→ x3 =6250 (Sau 6250 chu kỳ thì timer tràn)

 Đặt giá trị ban đầu cho Timer: x 4 =65536−x 3=59286

int Count = 0; //Khai bao bien dem


int16 Value = 59286; //Dat gia tri ban dau cho Timer

void Duty_60 () //Chuong trinh chay voi Duty 60%


{
if (Count == 0 || Count == 1) output_low (pin_c0);
if (Count == 2 || Count == 3 || Count == 4) output_high (pin_c0);
}

#INT_TIMER1 //Diem nhap chuong trinh chay Timer


void Timer1 (void) //Sau 1 chu ky ngat thi tang bien Count len 1 don vi
{
set_timer1 (Value); //Tranh viec Timer tranx` va chay ve 0
Count++;
if (Count == 5) Count = 0;
}

void main()
{
set_tris_c (0x00);
setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Su dung Timer noi, bo chia 8
set_timer1 (Value); //Dat gia tri thoi gian ban dau cho Timer
enable_interrupts (int_timer1); //Cho phep chuong trinh ngat Timer

30
Doan Trong Hieu ®
enable_interrupts (global); //Cho phep ngat toan cuc

while(TRUE) Duty_60 ();


}

30/ Timer 2 – Duty cycle 60%


D = 70%, T xung=50 ms , Chia làm 10 phần (Mỗi lần tràn 5ms)
 f OSC =20 MHz ; T OSC =50ms
f OSC
 f PIC = =5 MHz
4
 Chọn bộ chia mềm: 16 (n1 )
f PIC 1
 f Timer = →T Timer = =3,2 μs
16 f Timer
 Chọn bộ chia sau Timer2: 16 (n 2)
 Đặt tổng thời gian tràn mong muốn: 5 ms . Có: 5 ms=3,2 μs . x 3 . 16 → x 3=97,65625
Sau 97,65625 chu kỳ thì timer tràn
8
 Đặt giá trị ban đầu cho Timer: x 4 =2 −x 3=158,34375
setup_timer_2 (T2_DIV_BY_n1 , x 4 ,n2 )

int Count = 0; //Khai bao bien dem


float Value = 158.34375; //Dat gia tri ban dau cho Timer

void Duty_70 () //Chuong trinh chay voi Duty 70%


{
if (Count >= 0 && Count <= 2) output_low (pin_c0);
if (Count >= 3 && Count <= 9) output_high (pin_c0);
}

#INT_TIMER2 //Diem nhap chuong trinh chay Timer


void Timer2 (void) //Sau 1 chu ky ngat thi tang bien Count len 1 don vi
{
set_timer2 (Value); //Tranh viec Timer tran va chay ve 0
Count++;
if (Count == 10) Count = 0;
}

void main()
{
set_tris_c (0x00);
setup_timer_2 (T2_DIV_BY_16, Value, 16); //Su dung Timer 2, bo chia 16, bo chia sau 16
set_timer2 (Value); //Dat gia tri thoi gian ban dau cho Timer
enable_interrupts (int_timer2); //Cho phep chuong trinh ngat Timer
enable_interrupts (global); //Cho phep ngat toan cuc

while(TRUE) Duty_70 ();


}

NHỚ LÀM BÀI CỜ TRÀN TIMER


***LCD***
THƯ VIỆN CỦA LCD [LCD.c]
#define LCD_RS pin_b0

31
Doan Trong Hieu ®
#define LCD_RW pin_b1
#define LCD_E pin_b2
#define output_LCD output_d

#define FUNCTION_SET 0x38 //Giao tiep 8 bit, 2 hang


#define DISPLAY_CONTROL 0x0F
#define CLEAR_DISPLAY 0x01
#define ENTRY_MODE 0x06
#define SHIFT_LEFT 0x18
#define SHIFT_RIGHT 0x1C
#define ADDR_LINE1 0x80 //Dia chi cua ky tu dau tien o hang 1
#define ADDR_LINE2 0XC0 //Dia chi cua ky tu dau tien o hang 2

void LCD_COMMAND (unsigned char x) //RS = 0 //Gui lenh ra LCD


{
output_low (LCD_RS); output_LCD (x); //Output low: Lua chon thanh ghi DIA CHI; Xuat gia
tri dia chi
output_high (LCD_E); delay_us (20); //Cho phep hien thi gia tri dia chi
output_low (LCD_E); delay_us (20);
}

void LCD_DATA (unsigned char x) //RS = 1 //Gui du lieu ra LCD de hien thi
{
output_high (LCD_RS); output_LCD (x); //Output high: Lua chon thanh ghi hien thi GIA TRI
output_high (LCD_E); delay_us (20);
output_low (LCD_E); delay_us (20);
}

void LCD_SETUP () //Khoi tao LCD


{
output_low (LCD_E); output_low (LCD_RS); output_low (LCD_RW);
LCD_COMMAND (FUNCTION_SET); delay_ms (1);
LCD_COMMAND (DISPLAY_CONTROL);
LCD_COMMAND (CLEAR_DISPLAY); delay_ms (2);
LCD_COMMAND (ENTRY_MODE);
}

31/ Hiển thị 2 hàng

#include <LCD.c>
void main ()
{
set_tris_e (0x00); set_tris_d (0x00); LCD_SETUP (); //Khoi tao cac port & LCD

32
Doan Trong Hieu ®
LCD_COMMAND (ADDR_LINE1); delay_us (10); //Khoi tao dia chi hang 1 (Lua chon vi tri hien thi)
LCD_DATA ("DH Ton Duc Thang");

LCD_COMMAND (ADDR_LINE2); delay_us (10); //Khoi tao dia chi hang 2


LCD_DATA (" Dien - Dien tu");

while (TRUE) {} //Nhay tai cho


}

32/ Hiển thị thời gian

#include <LCD.c>
unsigned char gio, phut, giay;
//Hien thi thoi gian___________________________________________________________
void display_time ()
{
LCD_COMMAND (0xc7); delay_us (10); //Chon vi tri de bat dau hien thi thoi gian
LCD_DATA ((gio/10) + 0x30); LCD_DATA ((gio%10) + 0x30); //LCD chi hien thi so BCD nen +0x30
LCD_DATA (":");
LCD_DATA ((phut/10) + 0x30); LCD_DATA ((phut%10) + 0x30); //Hien thi Phut
LCD_DATA (":");
LCD_DATA ((giay/10) + 0x30); LCD_DATA ((giay%10) + 0x30); //Hien thi Giay
}

void lcd_display_time ()
{
LCD_COMMAND (ADDR_LINE2); delay_us (10); //Khoi tao dia chi hang 2
LCD_DATA ("Clock: ");

for (gio = 0; gio < 24; gio++) //Gio = 24 thi reset ve 0


{
for (phut = 0; phut < 60; phut++) //Phut = 60 thi Gio tang len 1
{
for (giay = 0; giay < 60; giay++) //Giay = 60 thi Phut tang len 1
{
display_time ();
delay_ms (50);
}
}
}
}
//_____________________________________________________________________________
void main ()

33
Doan Trong Hieu ®
{
set_tris_d (0x00); LCD_SETUP (); //Khoi tao cac port & LCD

LCD_COMMAND (ADDR_LINE1); delay_us (10); //Khoi tao dia chi hang 1 (Lua chon vi tri hien thi)
LCD_DATA ("Doan Trong Hieu");
lcd_display_time ();
while (TRUE) {}
}

33/ Đo nhiệt độ
Tính toán độ phân giải
−¿
V ref
+¿− =4,887mV ¿
Độ phân giải (Step Size): SS=V 10
2 −1
¿ (2 : ADC 10 bit)
10
ref

10 mV
Tỷ lệ chênh lệch: =2,046 (10 mV =1o C : Độ phân giải của cảm biến LM35)
4,887 mV

1- Đo nhiệt độ hiển thị trên LCD

#include <LCD.c>
//#device ADC = 10
int8 i;
int16 k_qua;

void doc_nhiet_do ()
{
k_qua = 0;
for (i=0; i<100; i++) //Do 100 lan de lay trung binh
{
k_qua = k_qua + read_adc (); //
delay_ms (1);
}
k_qua = k_qua/100/2.046; //Chia kq cho 100 lan, chia tiep cho do chenh lech phan giai
}

void main()
{

34
Doan Trong Hieu ®
LCD_SETUP (); //Khoi tao LCD
setup_adc (ADC_CLOCK_INTERNAL);
setup_adc_ports (AN0);
set_adc_channel (0);

while(TRUE)
{
doc_nhiet_do ();
LCD_COMMAND (ADDR_LINE1);
LCD_DATA ("Do nhiet do LM35: ");

LCD_COMMAND (ADDR_LINE2);
LCD_DATA ("Ket qua: ");
LCD_DATA (k_qua/10 + 0x30); LCD_DATA (k_qua%10 + 0x30);
}
}
2- Đo nhiệt độ hiển thị trên LCD; Nhấp nháy Led với điều khiển
Yêu cầu: Đo nhiệt độ, nếu nhiệt độ nằm trong giới hạn giữa High & Low (h & l) thì Led chớp tắt; <
Low thì Led sáng; > High thì Led tắt; Thay đổi giới hạn High & Low bằng nút nhấn.

#include <LCD.c>
//_____________________________________________________________________________
#define Mode pin_c0
#define Tang pin_c1
#define Giam pin_c2

int8 i, h, l, modee;
int16 kq;

void Hien_thi ()
{
LCD_COMMAND (ADDR_LINE1); //Truy cap vi tri thu 1, hang 1
LCD_DATA ("T=");
LCD_DATA (kq/10 + 0x30); LCD_DATA (kq%10 + 0x30);
LCD_DATA (0xdf); //Do
LCD_DATA ("C");

35
Doan Trong Hieu ®
LCD_COMMAND (0x8c);
LCD_DATA ("H=");
LCD_DATA (h/10 + 0x30); LCD_DATA (h%10 + 0x30);

LCD_COMMAND (0x87);
LCD_DATA ("L=");
LCD_DATA (l/10 + 0x30); LCD_DATA (l%10 + 0x30);
}
//Chong doi___________________________________________________________________
void chong_doi_mode ()
{
if (input(Mode) == 0) //Test xem co nhan phim khong
{
delay_ms (20); //Khoang thoi gian bi doi
if (input(Mode) == 0) //Test xem co con nhan phim hay khong
{ //Xu ly chuc nang phim
modee++;
if (modee==3) modee = 0;
}
while (input(Mode) == 0); //Cho nha phim
}
}

void chong_doi_tang ()
{
if (input(Tang) == 0)
{
delay_ms (20);
if (input(Tang) == 0)
{
switch (modee)
{
case 1: l++;
if (l<25) l=25;
else if (l>29) l=29;
Hien_thi (); break;
case 2: h++;
if (h<26) h=26;
else if (h>30) h=30;
Hien_thi (); break;
}
}
while (input(Tang) == 0);
}
}

void chong_doi_giam ()
{
if (input(Giam) == 0)
{
delay_ms (20);
if (input(Giam) == 0)
{
switch (modee)
{
case 1: l--;
if (l<25) l=25;
else if (l>29) l=29;
Hien_thi (); break;
case 2: h--;
if (h<26) h=26;
else if (h>30) h=30;
Hien_thi (); break;

36
Doan Trong Hieu ®
}
}
while (input(Giam) == 0);
}
}
//____________________________________________________________________________
//Doc nhiet do________________________________________________________________
void read_temp ()
{
kq = 0;
for (i=0; i<100; i++) //Do 100 lan de lay trung binh
{
kq = kq + read_adc (); //
delay_ms (1);
}
kq = kq/100/2.046; //Chia kq cho 100 lan, chia tiep cho do chenh lech phan giai
}
//____________________________________________________________________________
void main()
{
LCD_SETUP (); //Khoi tao LCD
h=30; l=25;

setup_adc (ADC_CLOCK_INTERNAL); //Khoi tao ADC, Lay mau tu dong dung xung noi
setup_adc_ports (an0); //Khai bao cong ADC, dung kenh 0
set_adc_channel (0);

while(TRUE)
{
read_temp ();
chong_doi_mode (); chong_doi_tang (); chong_doi_giam ();

if (kq<l) output_bit (pin_c5, 1); //Ket qua < Min thi den sang
else if (kq<h) //Ket qua nam trong pham vi cho phep
{ //Den chop tat
output_bit (pin_c5, 1); delay_ms (100); output_bit (pin_c5, 0);
}
else output_bit (pin_c5, 0); //Ket qua > Max thi den tat

Hien_thi ();
LCD_COMMAND (ADDR_LINE2);
LCD_DATA (" DO NHIET DO ");
}
}

37
Doan Trong Hieu ®
3- Đo nhiệt độ hiển thị trên Led 7 đoạn – Quét

#device adc=10
int16 k_qua, k_qua_tb;
int8 i, ma_don_vi, ma_chuc, ma_tram;
int Led [10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void giai_ma ()
{
ma_tram = Led [k_qua_tb/100]; if (ma_tram==0xc0) ma_tram = 0xff; //Xoa so 0 vo nghia
ma_chuc = Led [(k_qua_tb/10) % 10];
ma_don_vi = Led [k_qua_tb%10];
}

void hien_thi ()
{
output_b (ma_don_vi);
output_low (pin_d0); delay_ms (1); output_high (pin_d0);
output_b (ma_chuc);
output_low (pin_d1); delay_ms (1); output_high (pin_d1);
output_b (ma_tram);
output_low (pin_d2); delay_ms (1); output_high (pin_d2);
}

void doc_nhiet_do ()
{
k_qua = 0; //Ban dau cho ket qua = 0
for (i=0; i<100; i++)
{
k_qua = k_qua + read_adc ();
hien_thi (); //Cho led sang lien tuc
}
k_qua_tb = k_qua/100/2.046;
giai_ma ();
}

void main()
{
set_tris_b (0x00); set_tris_d (0x00); set_tris_a (0x01);
setup_adc (ADC_CLOCK_INTERNAL);
setup_adc_ports (AN0); //Khai bao cong ADC, dung kenh 0
set_adc_channel (0);

while(TRUE)

38
Doan Trong Hieu ®
{
doc_nhiet_do ();
}
}

39

You might also like