- Đây là ảnh mô phỏng protues.
- Trong hình hình trên mình sử dụng PORTD dùng làm PORT điều khiển ! Sử dụng 8 LED màu vàng và 8 điện trở từ 270 - 330 là ok !
- 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
3 nhận xét
Write nhận xétad giải thích cái định cấu hình PIC đi?
Reply#fuses NOMCLR INTRC_IO
#use delay(clock=8000000)
setup_oscillator(OSC_8MHZ);??
cam on ad
Đây là mấy cấu hình cơ bản, khai báo thạnh anh, delay thôi !
Replycho em hỏi là dịch phải tại sao lại dùng lệnh: a=a<<1.em cảm ơn
ReplyEmoticonEmoticon