Tình hình là mình đã đọc vài bài viết trên diễn đàn về con ic 74hc595 nhưng vẫn chưa hình dung được hết cách truyền dữ liệu 2 byte trở lên vào con này thế nào.Ví dụ như mình muốn điều khiển 2 led matrix 8x8 dùng 2 con 74hc595 đưa dữ liệu từ 89c51 hiển thị ra led ma trận.Ở đây mình muốn hiển thị 2 chử A và B chạy ngang .Mong các anh chị diễn đàn giúp đỡ về code và giải thuật thế nào.Mình đang học code c nên chỉ biết code C và chưa tìm hiểu về timer và ngắt nên chỉ dùng được hàm delay ^^.
Thông báo
Collapse
No announcement yet.
Cần ACE giúp đỡ về ic 74hc595
Collapse
X
-
Vào mà đọc nguyên lý của 595
IC ghi dịch 74HC595
Matrix có số cột lớn người ta sẽ quét hàng để đảm bảo độ sáng của led lớn hơn 50%
-
Cảm ơn anh chung nha nhưng thực sự mình chỉ biết cách đưa dữ liệu 1 byte vào đó thôi còn 2 byte thì chưa biết cách làm sao để chốt để có thể đưa tiếp byte tiếp theo.Anh có thể viết 1 ví dụ bằng code c về cách dịch 2 byte không ?.Cám ơn anh nhiều ^^.Nguyên văn bởi chung1608 Xem bài viếtVào mà đọc nguyên lý của 595
IC ghi dịch 74HC595
Matrix có số cột lớn người ta sẽ quét hàng để đảm bảo độ sáng của led lớn hơn 50%
Comment
-
khi kết nối nhiều 595, ta quang tâm số lượng cổng ra cảu tất cả 595. Ví dụ: nếu bạn kết nối 2 con 595 ta sẽ dịch 16 bit ra cho 595.Nguyên văn bởi phanthienvu Xem bài viếtCảm ơn anh chung nha nhưng thực sự mình chỉ biết cách đưa dữ liệu 1 byte vào đó thôi còn 2 byte thì chưa biết cách làm sao để chốt để có thể đưa tiếp byte tiếp theo.Anh có thể viết 1 ví dụ bằng code c về cách dịch 2 byte không ?.Cám ơn anh nhiều ^^.
4 con 595 thì i<32 cứ như thế. Mỗi lần dịch nó sẽ tràn đẩy hết giá trị của lần dịch trước nên ko cần xóa trước khi dịchCode:for(i=0;i<16;i++){ DATAS=cái gì đó; CLOCK=0; CLOCK=1; } LATCH=0; LACTH=1;
Comment
-
HI.Cuối cùng thì mình cũng hình dung ra được.Không ngờ nó đơn giản vậy.Mình có code này mong anh Chung xem nhé.Nguyên văn bởi chung1608 Xem bài viếtkhi kết nối nhiều 595, ta quang tâm số lượng cổng ra cảu tất cả 595. Ví dụ: nếu bạn kết nối 2 con 595 ta sẽ dịch 16 bit ra cho 595.
4 con 595 thì i<32 cứ như thế. Mỗi lần dịch nó sẽ tràn đẩy hết giá trị của lần dịch trước nên ko cần xóa trước khi dịchCode:for(i=0;i<16;i++){ DATAS=cái gì đó; CLOCK=0; CLOCK=1; } LATCH=0; LACTH=1;
#include"regx52.h"
sbit DATA = P2^1;
sbit SCK = P2^0;
sbit SCL = P2^2;
void quet(unsigned char x)
{int i,temp;
for(i=0;i<8;i++)
{temp=x;//gan bien
temp=temp&0x80;//lay ra bit dau tien (bit 7)
if(temp==0x80)//so sanh bit
DATA=1; //bang 1 thi xuat vao chip =1
else
DATA=0; //nguoc lai bang 0
x*=2; //dich bit lay bit trong so thap
SCK=0; //tao xung tren chan 11
SCK=1; //1 xung dua vào 1 bít
}SCL=0; //xuat du lieu ra output
SCL=1;}
Như vậy để có thể xuất 16 bit thì mình sẽ đổi số 8 bằng số 16 và 0x80 bằng 0x8000 phải không anh?
Comment
-
led ma trận nếu từ 8x16 trở lên bạn nên quét hàng vì nếu quét cột số cột nhiều thì thời gian tích cực của 1 cột quá ngắn ko thể làm led sáng thậm chí là có thể led sẽ ko sáng.Nguyên văn bởi phanthienvu Xem bài viếtHI.Cuối cùng thì mình cũng hình dung ra được.Không ngờ nó đơn giản vậy.Mình có code này mong anh Chung xem nhé.
#include"regx52.h"
sbit DATA = P2^1;
sbit SCK = P2^0;
sbit SCL = P2^2;
void quet(unsigned char x)
{int i,temp;
for(i=0;i<8;i++)
{temp=x;//gan bien
temp=temp&0x80;//lay ra bit dau tien (bit 7)
if(temp==0x80)//so sanh bit
DATA=1; //bang 1 thi xuat vao chip =1
else
DATA=0; //nguoc lai bang 0
x*=2; //dich bit lay bit trong so thap
SCK=0; //tao xung tren chan 11
SCK=1; //1 xung dua vào 1 bít
}SCL=0; //xuat du lieu ra output
SCL=1;}
Như vậy để có thể xuất 16 bit thì mình sẽ đổi số 8 bằng số 16 và 0x80 bằng 0x8000 phải không anh?
- Để quét hàng thì bạn sử dụng 1 phần mềm dịch mã ma trận và dịch ra 1 bảng tra theo cột.
- Tiếp theo, ví dụ bạn có 16 cột, bạn sẽ nạp vào 1 vùng RAM 16 giá trị của bảng mã. Khi dịch, bạn dịch 16 bit ra cho 595 với các bit theo vị trí theo hàng. Ví dụ bảng 16 giá trị thì bạn dịch hết bit đầu tiên của 16 giá trị vào hàng 1, rồi bạn dịch bit thứ 2 của 16 giá trị vào hàng 2 cứ thế cho cả 8 bit.
Bạn có thể xem ví dụ dưới mình viết cho ATmega 8x40
Code:#include "tableMT.c" sfr io unsigned short ROW absolute 0x38; //PORTB sbit SH at PORTC0_bit; sbit DS at PORTC1_bit; sbit EO at PORTC2_bit; const int lens=400; char m; unsigned int start_addr; char tempR[100] absolute 500; void shift595(); void copy_to_ram(); void main() { DDRC=0b00010111; PORTC=0xFF; DDRB=0xFF; ROW=0xFF; delay_ms(500); while(1){ start_addr=0; while(start_addr<lens){ for(m=0;m<2;m++){ copy_to_ram(); shift595(); } start_addr++; } } } void shift595(){char i,j; SH=0;EO=0; j=0x80; while(j!=0){ for(i=0;i<40;i++){ DS=tempR[i]; SH=1; SH=0; tempR[i]=tempR[i]>>1; } EO=1;EO=0; ROW=j; j=j>>1; delay_ms(2); ROW=0; } } void copy_to_ram(){short i;unsigned int L; L=start_addr; for(i=0;i<40;i++) tempR[i]=table[L++]; }Attached Files
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamCa sĩ AI cũng có vài loại, có ca sĩ chuyên và không chuyên.Ca sỉ chuyên thì là Synthesizer V, còn không chuyên thì là Suno. Ca sĩ chuyên thì mệt với nó lắm, phải biết nhạc và biết cả ngôn ngữ của nó để điều khiển, còn ca sĩ không chuyên thì...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 21:33 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Chúc mừng bác có ca khúc hay tặng bà xã nhé! Nếu muốn hát đúng ý mình thì bác chịu khó... thuê ca sĩ nha!!!!😁😁😁...
-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 15:43 -
-
bởi dinhthuong92Trong các công thức không có mặt L bạn. Trước mình nghĩ cứ phải có L cơ....
-
Channel: Nguồn!
Hôm qua, 15:35 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamCháu nghe thử trên youtube xem sao? : https://www.youtube.com/watch?v=Opm0BszTmFQ...
-
Channel: Tâm tình dân kỹ thuật
02-05-2026, 21:23 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92Cháu không vào được để nghe thử. Mời bác nghe thử bản phối điệu Techno này xem thế nào nhé! Chúc bác vui.
( Cháu nhìn lyrics và cứ thế một mmạch hát demo rồi đưa vào suno. nó hát đạt 80% melody!)...-
Channel: Tâm tình dân kỹ thuật
27-04-2026, 17:00 -

Comment