Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về I/O của PIC18F4550 rồi cụ thể là chớp tắt LED, trong bài này mình sẽ hướng dẫn các bạn tiếp tục với I/O đó là tạo 1 số hiệu ứng LED đơn giản !
- Đây là ảnh mô phỏng protues.
- Code chương trình.
#include <18F4550.h>
#fuses NOMCLR INTRC_IO
#use delay(clock=8000000)
void main()
{
int i=0,a;
setup_oscillator(OSC_8MHZ);
while(TRUE)
{
a = 0x01;
for(i=0;i<=7;i++)
{
output_d(a);
delay_ms(200);
a = a<<1;
}
// right
a = 0x80;
for(i=0;i<=7;i++)
{
output_d(a);
delay_ms(200);
a = a>>1;
}
// chase left
a = 0X00;
for(i=0;i<=8;i++)
{
output_d(a);
delay_ms(200);
a = a<<1;
a = a | 0X01;
}
// chase right
delay_ms(200);
a = 0X00;
for(i=0;i<=8;i++)
{
output_d(a);
delay_ms(200);
a = a>>1;
a = a | 0X80;
}
// sang dan and tat dan
delay_ms(200);
a = 0X00;
for(i=0;i<=7;i++)
{
output_d(a);
delay_ms(200);
a = a<<1 | 0x01;
}
delay_ms(200);
for(i=0;i<=7;i++)
{
output_d(a);
delay_ms(100);
a = a<<1;
}
}
}
- Giải thích chương trình trên như sau :
a. Dịch phải.
a = 0x01;
for(i=0;i<=7;i++)
{
output_d(a);
delay_ms(200);
a = a<<1;
}
Ban đầu a = 0x01; LED ở chân RD0 sáng sau đó ta sử dụng lệnh dịch trái là a = a<< 1; vì PORTD có 8 chân nên vòng for được lặp lại từ 0 - 7. Tương tự như lệnh dịch phải lệnh dịch trái chỉ thây đổi chỗ a = a >> 1; hai lệnh này chỉ khác nhau chỗ đó thôi.
b. Sáng dồn
a = 0X00;
for(i=0;i<=8;i++)
{
output_d(a);
delay_ms(200);
a = a<<1;
a = a | 0X01;
}
Giống như lệnh dịch trái, dịch phải thôi nhưng có khác 1 chỗ là khi dịch xong 1 bít nó sẽ OR với 0x01 bằng lệnh này a = a | 0X01; như các bạn biết một số bất kỳ OR với 1 điều bằng 1 lệnh trên nó là như vậy tương tự lệnh sáng dồn bên phải cũng vậy chỉ khác nhau là nó OR với 0x80. Xem bản dưới các bạn sẽ rõ :
- Link download project Click here
EmoticonEmoticon