Trích:
Nguyên văn bởi Option
em thấy khi viết xong code và chạy thì giả sử giá trị (read adc) em cho xuất ra portc của 16f877, thì giá trị đó là nhị phân thì phải. vậy khi đó em phải làm thế nà để chuyển giá trị đó ra mã led 7 đoạn đây ạ. hic. giúp em cái này với.
|
Như thế này nhé!
Nếu ADC của bạn 10 bit (tương tự cũng làm được trên ADC 8bit)
Như vậy, led 7 đoạn anod chung ta có mã
dp g f e d c b a mã thập phân
1 1 1 1 1 1 0 0 1 --> 249
2 1 0 1 0 0 1 0 0 --> 164
3 .............
4 .............
5 .............
6 .............
7 .............
8 .............
9 .............
////////////////////////////////////////////////////////////////////////////////////////////////////
PORTD ---------> du lieu cho led 7 doan (D.0 --> D.7 tương ứng với a --> dp)
PORTC ---------> Quet cot (C.3 --> C0 tương ứng với led từ led 7 đoạn từ trái qua phải)
Tham khảo đoạn code nha: (chỉ viết thuật toán tính, không viết đoạn cấu hình)
unsigned char DATA[10]={249,164,...,...,...,...,...,...,...,...};
unsigned char ng, tr, ch, dv;
unsigned int temp;
....
....
temp = read_ADC(1);// Đọc ADC kênh 1
ng = temp/1000;
tr = (temp - 1000*ng)/100;
ch = (temp - (1000*ng + 100*tr))/10;
dv = temp - (1000*ng + 100*tr + 10*ch);
//////////////////////////////////////////////////////
Dùng biến ng,tr,ch,dv làm tham số truy xuất vào mảng DATA[] lấy dữ liệu xuất ra Led.
PORTC = 0b1000; PORTD = DATA[ng]; delay_ms(10);
PORTC = 0b0100; PORTD = DATA[tr]; delay_ms(10);
PORTC = 0b0010; PORTD = DATA[ch]; delay_ms(10);
PORTC = 0b0001; PORTD = DATA[dv]; delay_ms(10);
Thế là xong.
Lưu ý: Cách này đòi hỏi phải hiểu nguyên lý, và làm tạm thôi. Chạy tốt đã thử rồi, nhưng theo đánh giá thì không được tối ưu lắm. Nếu bạn có thời gian, trên cơ sở đó mà làm cái cho riêng mình nhé.
Thân!