OK!
bạn nhìn chương trình của bạn nhé.
Vòng lặp for (j=0;j<=7;j++) nó sẽ chạy xong mới tới lệnh PortC. Điều đó có nghĩa là nếu bạn để lệnh PORTC=j+8; ở ngoài vòng lặp for thì hiển nhiên luôn luôn PORTC=15 (vì kết thúc vòng lặp for thì j luôn bằng 7). và vì thế cho nên bạn sẽ ko thấy nó quét ở PortC nữa vì quá trình lặp lại là mãi mãi.
Chính vì thế để quét được thì bạn phải để lệnh PORTC=j+8 ở trong vòng lặp for. Nhưng thêm vào đó là đi kèm với lệnh delay. Thời gian delay là tùy ở bạn xem mạch của mình như thế nào để mắt ta có thể nhìn được ma trận led của bạn ko bị nhấp nháy. Với mô phỏng Proteus của bạn vẽ R cho là 1ms thì nhìn được. Nhưng có khi bạn làm mạch thật thì có thể lại ko được vì do linh kiện nữa. nên bạn linh động điều chỉnh sao cho hợp lí
Chương trình của bạn sửa lại như sau:
WHILE(1){
for (j=0;j<=7;j++)
{
if (j&1){
send_595(0x55);
// send_595(0x55);
// send_595(0x55);
}
else{
// send_595(0xAA);
// send_595(0xAA);
send_595(0xAA);}
PORTC=j+8;
delay_ms(1);
}
}
Thêm nữa là cùng 1 chức năng dịch dữ liệu ra led ma trận sao lại phải 3 lệnh send_595(0x55); đi kèm. Điều đó ko cần thiết và chằng logic tí nào
R gửi kèm cả file đã sửa đầy đủ. bạn download về dịch lại rồi nạp vào Proteus là OK
chúc vui!!!
|