Vấn đề này trên 4rum đã có nhiều rồi, mình đưa ra mục này cho các bác newbie tiện tham khảo.
Phần cứng:
8 chân data (A, B, C, D, E, F, G, dot) của các LED7 đấu chung với nhau và đấu về 1 port của uC. Mức logic 0 để điều khiển từng đoạn sáng.
Phần điều khiển cấp nguồn cho từng LED7 (trong ví dụ này tối đa 16 LED) đấu về 2 port của uC. Tại một thời điểm chỉ có 1 trong các LED7 này được cấp nguồn, các LED7 còn lại tắt. Output logic 1 để điều khiển cấp nguồn.
Nguyên lý:
Lần lượt cấp nguồn cho từng LED7, đối với LED7 thứ n, xuất dữ liệu của LED7 thứ n (lưu trong buffer). -> tại một thời điểm chỉ có 1 LED7 sáng với dữ liệu của nó. Delay một khoảng thời gian, sau đó chuyển sang LED7 khác.
Theo nguyên lý lưu ảnh 24h/s (đối với uC thì nên nhanh hơn khoảng 50h/s) ta sẽ thấy giá trị của từng LED7.
File Led7.h
File Led7.c
Phần cứng:
8 chân data (A, B, C, D, E, F, G, dot) của các LED7 đấu chung với nhau và đấu về 1 port của uC. Mức logic 0 để điều khiển từng đoạn sáng.
Phần điều khiển cấp nguồn cho từng LED7 (trong ví dụ này tối đa 16 LED) đấu về 2 port của uC. Tại một thời điểm chỉ có 1 trong các LED7 này được cấp nguồn, các LED7 còn lại tắt. Output logic 1 để điều khiển cấp nguồn.
Nguyên lý:
Lần lượt cấp nguồn cho từng LED7, đối với LED7 thứ n, xuất dữ liệu của LED7 thứ n (lưu trong buffer). -> tại một thời điểm chỉ có 1 LED7 sáng với dữ liệu của nó. Delay một khoảng thời gian, sau đó chuyển sang LED7 khác.
Theo nguyên lý lưu ảnh 24h/s (đối với uC thì nên nhanh hơn khoảng 50h/s) ta sẽ thấy giá trị của từng LED7.
File Led7.h
Code:
#ifndef _LED7_H_
#define _LED7_H_
//---------------------------------------------------//
#define L7_COUNT 16
// Define LED7 control pin
#define L7_P1_PORT PORTC
#define L7_P1_DDR DDRC
#define L7_P2_PORT PORTB
#define L7_P2_DDR DDRB
//---------------------------------------------------//
// Define LED7 data pin
#define L7_DATA_PORT PORTA
#define L7_DATA_DDR DDRA
#define L7_a 0
#define L7_b 1
#define L7_c 2
#define L7_d 3
#define L7_e 4
#define L7_g 6
#define L7_o 7
//---------------------------------------------------//
// Define LED character
#define La (1 << L7_a)
#define Lb (1 << L7_b)
#define Lc (1 << L7_c)
#define Ld (1 << L7_d)
#define Le (1 << L7_e)
#define Lf (1 << L7_f)
#define Lg (1 << L7_g)
#define Lo (1 << L7_o)
#define NUM_0 ~(La|Lb|Lc|Ld|Le|Lf)
#define NUM_1 ~(Lb|Lc)
#define NUM_2 ~(La|Lb|Ld|Le|Lg)
#define NUM_3 ~(La|Lb|Lc|Ld|Lg)
#define NUM_4 ~(Lb|Lc|Lf|Lg)
#define NUM_5 ~(La|Lc|Ld|Lf|Lg)
#define NUM_6 ~(La|Lc|Ld|Le|Lf|Lg)
#define NUM_7 ~(La|Lb|Lc)
#define NUM_8 ~(La|Lb|Lc|Ld|Le|Lf|Lg)
#define NUM_9 ~(La|Lb|Lc|Ld|Lf|Lg)
#define NUM_A ~(La|Lb|Lc|Le|Lf|Lg)
#define NUM_C ~(La|Ld|Le|Lf)
#define NUM_E ~(La|Ld|Le|Lf|Lg)
#define NUM_F ~(La|Le|Lf|Lg)
#define NUM_H ~(Lb|Lc|Le|Lf|Lg)
#define NUM_L ~(Ld|Le|Lf)
#define NUM_P ~(La|Lb|Le|Lf|Lg)
#define NUM_U ~(Lb|Lc|Ld|Le|Lf)
#define NUM_0d (NUM_0&(~Lo))
#define NUM_1d (NUM_1&(~Lo))
#define NUM_2d (NUM_2&(~Lo))
#define NUM_3d (NUM_3&(~Lo))
#define NUM_4d (NUM_4&(~Lo))
#define NUM_5d (NUM_5&(~Lo))
#define NUM_6d (NUM_6&(~Lo))
#define NUM_7d (NUM_7&(~Lo))
#define NUM_8d (NUM_8&(~Lo))
#define NUM_9d (NUM_9&(~Lo))
#define NUM_Ad (NUM_A&(~Lo))
#define NUM_Cd (NUM_C&(~Lo))
#define NUM_Ed (NUM_E&(~Lo))
#define NUM_Fd (NUM_F&(~Lo))
#define NUM_Hd (NUM_H&(~Lo))
#define NUM_Ld (NUM_L&(~Lo))
#define NUM_Pd (NUM_P&(~Lo))
#define NUM_Ud (NUM_U&(~Lo))
//---------------------------------------------------//
unsigned char L7_CHARS[36] =
{NUM_0, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9,
NUM_0d, NUM_1d, NUM_2d, NUM_3d, NUM_4d, NUM_5d, NUM_6d, NUM_7d, NUM_8d, NUM_9d,
NUM_A, NUM_C, NUM_E, NUM_F, NUM_H, NUM_L, NUM_P, NUM_U,
NUM_Ad, NUM_Cd, NUM_Ed, NUM_Fd, NUM_Hd, NUM_Ld, NUM_Pd, NUM_Ud};
#endif
File Led7.c
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "led7.h"
unsigned char L7_DataBuffer[L7_COUNT] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
//-------------------------------------------------------------------//
main (void)
{
unsigned char L7_Index;
unsigned int L7_CtrlMask;
L7_P1_PORT = 0xFF; L7_P2_PORT = 0xFF;
L7_P1_DDR = 0xFF; L7_P2_DDR = 0xFF;
L7_P1_PORT = 0x00; L7_P2_PORT = 0x00;
L7_DATA_PORT = 0xFF; L7_DATA_DDR = 0xFF;
while (1)
{
// Scan LED7
for (L7_Index=0; L7_Index<=L7_COUNT; L7_Index++)
{
L7_CtrlMask = (1<<L7_Index);
L7_DATA_PORT = L7_CHARS[L7_DataBuffer[L7_Index]];
L7_P1_PORT = (unsigned char)(L7_CtrlMask & 0x00FF);
if (L7_COUNT > 8) {
L7_P2_PORT = (L7_CtrlMask>>8);
}
_delay_ms(1);
L7_P1_PORT = 0x00;
L7_P2_PORT = 0x00;
}
}
}
Comment