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 ^^.
Cần ACE giúp đỡ về ic 74hc595
Collapse
X
-
Tags: None
-
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
dự án của bạn Tra theo mã, xem datasheet và đặt hàng trực tuyến. MicrochipROHMEpsonTaejin
Đặt hàng & tư vấn
Hà Nội024.3640 8561
TP.HCM028.3811 9870
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Quét mã hoặc bấm để chat Zalo với R&PChat Zalo
Bài viết mới nhất
Collapse
-
Trả lời cho Hỏi về biến áp xungbởi nhathung1101Ngày xưa cô giáo bảo: Để chống nhiễu cao tần thì bọc lớp đồng mỏng quanh biến áp.
Ngày nay có lẽ do keo lởm, nên người ta buộc dây cho nó khỏi long ra....

















-
Channel: Điện tử dành cho người mới bắt đầu
09-11-2026, 20:51 -
-
-
bởi lamvu0677chào mọi người, trong con biến áp xung người ta hay quấn thêm mấy vòng dây thiếc quanh lõi từ thì e không hiểu nó có ý nghĩa hay tác dụng là gì , bác nào chuyên môn thông cho e phát.như ảnh dưới1 Photo
-
Channel: Điện tử dành cho người mới bắt đầu
-
Comment