Hôm nay mình sẽ giới thiệu các bạn lập trình led 7 đoạn với max7219

1. Miêu tả:

MAX7219 là module nhỏ ngọn;  Dùng để điều khiển 8 ký tự của led 7 thanh, or điều khiển led matrix 8×8 ….

IC MAX7219 được hãng MAXIM thiết kế và sản xuất, thuận tiện sử dụng để điều khiển LED ma trận và LED 7 thanh (1 chip có thể điều khiển LED ma trận 8×8 hoặc LED 7 thanh 8 chữ số) và chỉ cần 1 điện trở để hạn dòng cho tất cả các led (so với các IC khác hầu như phải có 1 điện trở cho mỗi led). Trên mỗi chip đã được tích hợp bộ giải mã BCD, mạch quét dồn kênh, thanh ghi dịch, …

Giống như với 74HC595, để điều khiển LED ma trận ta sử dụng MAX7219 hoạt động giống như một thanh ghi dịch khi bạn cần nhập dữ liệu vào nối tiếp theo từng bit. Tổng cộng có 16 bit được nhập vào tại một thời điểm. MAX7219 chỉ cần 3 chân từ Vi điều khiển để kết nối với các chân DIN, LOAD và CLK của IC.

2. Các tính năng chính:

Tốc độ giao tiếp đạt tới 10MHz

Điều khiển phân đoạn led;

Có thể giải mã hoặc không giải mã ký tự được chọn;

150uA Ở chế độ ngủ (Dữ liệu gửi lại);

Có thể điều khiển độ sáng tự động hoặc thủ công;

Điều khiển màn hình cathode chung;

max

Trên đây là sơ đồ kết nối của MAX7219;

Như đã thấy max7219 có thể hoạt động ở mức + 5V, Có thể hoạt động ở mức  3.3V;

Với các ứng dụng yêu cầu 3V, các bạn có thể sử dụng MAX6951

II. Các linh kiện cần thiết để làm trong bài viết này:

F1

  • KIT STM32F103C8T6 ;
  • MAX7219- 8 Digit Display module;

Kết nối với thiết bị:

MAX7219 STM32F1xx Description
VCC 5V Positive voltage
GND GND Ground
DIN PA1 GPIO
CS PA2 GPIO
CLK PA0 GPIO

dưới đây code dùng board stm32f103c8t6

#include “user_max7219.h”
#include “user_delay.h”
#define MAX7219_CLK GPIO_Pin_0 //PORTA
#define MAX7219_DIN GPIO_Pin_1 //PORTA
#define MAX7219_CS GPIO_Pin_2 //PORTA

unsigned char const LEDcode[]=
{
0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b, //0..9
0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff //a..f,P,U,all_on
};
void MCU_Init_Max7219(void)
{ GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC , ENABLE);
//TM1637
GPIO_InitStructure.GPIO_Pin = MAX7219_CLK | MAX7219_DIN | MAX7219_CS;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void MAX7219_SendByte (unsigned char dat)
{
unsigned char i;
for (i=0;i<8;i++)
{
if((dat&0x80)==0x80) GPIO_SetBits(GPIOA, MAX7219_DIN);
else GPIO_ResetBits(GPIOA, MAX7219_DIN);
GPIO_ResetBits(GPIOA, MAX7219_CLK);
// delay_ms(1);
GPIO_SetBits(GPIOA, MAX7219_CLK);
dat<<=1;
}
}
void MAX7219_SendAddrDat (unsigned char addr,unsigned char dat)
{
GPIO_ResetBits(GPIOA, MAX7219_CS);
MAX7219_SendByte (addr);
MAX7219_SendByte (dat);
GPIO_SetBits(GPIOA, MAX7219_CS);
}

void MAX7219_Init (void)
{
MAX7219_SendAddrDat (0x0c,0x01); //normal operation
MAX7219_SendAddrDat (0x0a,0x09); //intensity
MAX7219_SendAddrDat (0x0b,0x07); //all digits on
MAX7219_SendAddrDat (0x09,0x00); //decoding
MAX7219_SendAddrDat (0x0f,0x00); //display test off
}
void MAX7219_Clear(void)
{
unsigned char i;
for(i=8;i>0;i–) MAX7219_SendAddrDat(i,0x00);
}

void MAX7219_DisplayInt (long int val)
{
long int a;
a=val;
MAX7219_SendAddrDat(0x08,LEDcode[(a/10000000)]);
a=a%10000000;
MAX7219_SendAddrDat(0x07,LEDcode[(a/1000000)]);
a=a%1000000;
MAX7219_SendAddrDat(0x06,LEDcode[(a/100000)]);
a=a%100000;
MAX7219_SendAddrDat(0x05,LEDcode[(a/10000)]);
a=a%10000;
MAX7219_SendAddrDat(0x04,LEDcode[(a/1000)]);
a=a%1000;
MAX7219_SendAddrDat(0x03,LEDcode[(a/100)]);
a=a%100;
MAX7219_SendAddrDat(0x02,LEDcode[(a/10)]);
a=a%10;
MAX7219_SendAddrDat(0x01,LEDcode[a]);
}

Bình luận

Bình luận