Các a xem dùm e đoạn code ccs này bị lỗi gì với, em muốn điên rồi !
2 Attachment(s)
E ĐANG LÀM ĐỀ TÀI QUANG BÁO, THỬ VIẾT HÀM GỬI DỮ LIỆU CHO 74595, HÀM THÌ CHẠY TỐT RỒI, NHƯNG EM LỒNG VÔ HÀM FOR THÌ NÓ CỨ BỊ LỖI, KHÔNG HIỆN GÌ LÊN LED MA TRẬN HẾT. EM DÙNG 74138 QUÉT HÀNG. 74595 3 CON NỐI TIẾP ĐƯA DỮ LIỆU RA CỘT. CODE E BỊ LỖI PHẦN 74138 MÔ PHỎNG KHÔNG CÓ TÍN HIỆU GÌ HẾT, CHỖ LỆNH PORTC=J+8 ẤY. CÁC A GIÚP DÙM E PHÁT VỚI, MẤY NGÀY NAY MÒ HOÀI MÀ KHÔNG BIẾT BỊ GÌ, MUỐN ĐIÊN RỒI. HIC. EM CHÂN THÀNH CẢM ƠN RẤT NHIỀU !
ĐÂY LÀ CODE CỦA E, E CÓ GỬI LUÔN FILE MÔ PHỎNG PROTUES CHO CÁC A XEM GIÚP. #include<18f4431.h> #include<def_4431.h> #fuses hs,nowdt,nolvp #use delay(clock=12M) #define DATA RB1 #define CLOCK RB2 #define LATCH RB4 int8 send,i,j; void send_595(int8 send){ // HÀM GỬI DỮ LIỆU RA 74595 for(i=0;i<=7;i++) { if(bit_test(send,7)) DATA=1; else DATA=0; CLOCK=0; // TAO XUNG CLOCK DICH DATA VAO 74595 CLOCK=1; send=send<<1; } LATCH=0; // CHOT DU LIEU RA 74595 LATCH=1; } void main(void) { TRISB=0x00; TRISC=0x00; CLOCK = 1; LATCH = 1; 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; // BỊ LỖI CHỖ NÀY, ĐÁNG LẼ PHẢI ĐƯA DỮ LIỆU RA PORT C MÀ NÓ KHÔNG ĐƯA GÌ RA CẢ. } } MỤC ĐÍCH EM MUỐN NÓ HIỆN NHƯ HÌNH BÊN DƯỚI, NHƯNG KHÔNG DÙNG HÀM FOR THÌ LÀM ĐƯỢC, CÒN LỒNG VÔ LÀM FOR THÌ NÓ KHÔNG ĐƯA DỮ LIỆU RA 74138. |
bạn gửi lại kèm theo cả file def_4431.h nhé. Ai lại bắt mọi người viết lại cái file này nữa.
Tốt nhất là bạn gửi là file ccs bạn viết ấy |
Trích:
Code:
#include<18f4431.h> |
1 Attachment(s)
Trích:
|
Trích:
|
1 Attachment(s)
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!!! |
1 Attachment(s)
Trích:
Code:
#include<18f4431.h> |
Trích:
|
Trích:
|
Trích:
thanks bạn ! bạn hiểu ý của mình, mong được bạn giúp đỡ tiếp tục nhe! hihi ! |
hj.OK!
Nếu bạn muốn 3 ma trận của mình hiện cùng 1 hình ảnh như nhau thì ko hiển nhiên là ko cần phải 3 lệnh. Bạn thử bỏ 2 lệnh đi xem chương trình có chạy ko nhé. file mình gửi mình bỏ cả 2 lệnh đi vẫn chạy đó thôi còn về ý tưởng 3 ma trận hiện được 3 dữ liệu khác nhau thì chương trình của bạn cần thêm 1 chân chọn chip 74HC595 nữa. Và chương trình ghi dịch bạn phải viết lại. tóm lại sơ đồ nối của bạn và cả chương trình CCS ko đáp ứng được yêu cầu về ý tưởng đó |
Múi giờ GMT. Hiện tại là 12:03 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam