单片机可以驱动液晶屏,但在实际应用领域中,数码管仍然是主流的显示器件。
当提到多位数码管的显示时,通常谈论的是每位按顺序显示的动态显示技术。
该方法可以节省单片机的输出接口,但单片机软件负担较重,程序必须保证不间断的显示。 否则,就会出现亮度不均、闪烁或发光停止的现象。
MAX7219是一种专用的LED显示驱动芯片,能够动态驱动8位数字显示器。
也可以通过n个MAX7219级联以驱动8 * n位数字显示。
MAX7219和数字显示器之间的电路极其简单,甚至很少使用限流电阻。
MAX7219和单片机之间也只需要连接三根导线。
当单片机将数据发送到MAX7219时,它可以独立地进行动态扫描显示,单片机无需进一步干预。
对于单片机来说,所有这些数字显示器看起来都是静态显示的。
MAX7219可以说是驱动多位数码显示器的最佳选择。
DIP封装的MAX7219芯片如下:
MAX7219必须初始化。 根据规则,设定一些东西。
要用数字代码显示数字,可以设置解码和非解码两种方式。
用MAX7219驱动数码管的显示电路如下。
图片链接: http://Xiang ce.Baidu.com/picture/detail/feed f64 b 49 D2 e 5192469 b 151 b 556780582 b 97ee 9
MAX7219还可以驱动8 * 8点模块。 模拟的屏幕截图如下。
图片链接: http://Xiang ce.Baidu.com/picture/detail/BC 7297044 E6 f 36 DBC 04 ab 92b 5b 9e 00 dfdf 5d 30 e 9
在上面的位图中,运行着驱动数码管的程序,数码管的各段显示在各点上。
仔细查看点阵的显示,是否知道是标记为“51--7219”的段代码?
要在MAX7219中驱动点阵图形,只需采用非解码形式,仔细制作要显示的点阵图形,然后输出到MAX7219即可。
显示“I love U”的点阵画面如下。
为了显示上述画面而需要创建的点数据如下图所示。
明白了吗? 有一行。 必须从最下面移动到最上面,写点。
上面电路的显示步骤如下。
//====================================
#include reg52.h //引用标准库的头文件
#include intrins.h
#define uchar unsigned char
#定义uint unsigned int
#define DecodeMode0x09 //解码模式寄存器
#定义intensity0x0a//亮度寄存器
#定义扫描限制0 x0b//扫描位数寄存器
#define ShutDown0x0c //低功耗模式寄存器
#define DisplayTest0x0f //显示测试寄存器
#define ShutdownMode0x00 //低功耗方式
#定义常规操作0x 01//常规操作方法
#define ScanDigit0x07 //扫描位数设定,显示8位数码管
#define DecodeDigit0xff //解码设置,8位均为BCD码
#定义intensity grade0x0a//亮度级别设置
#define TestMode0x01 //显示测试模式
#define TextEnd0x00 //表示测试结束,返回正常动作模式
sbit DIN=P2^0; //MAX7219串行数据输入
sbit CLK=P2^2; //MAX7219串行时钟
sbit LOAD=P2^1; //MAX7219显示数据锁存控制
uchar disp _ buff [8]={ 9,1,2,7,10,10,1,5 }; //定义图形内存
/*******延迟时间t毫秒* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Void Delay (单元) )。
{
uint i;
while(t----for ) I=0; i 125; I
++);}
//**********向MAX7219写入一字节*****************
void SendChar (char ch)
{
char i, temp;
for (i = 0; i < 8; i++) { //8位
temp = ch & 0x80; //取最高位
CLK = 0; //时钟线置低
if(temp) DIN = 1;
else DIN = 0;
ch = ch << 1; //左移一位
CLK = 1; //上升沿,DIN的数据写入到7219
}
}
//**********向MAX7219寄存器写入数据*************
void WriteWord (char addr, char num)
{
LOAD = 0; _nop_();
SendChar(addr); _nop_();
SendChar(num); _nop_();
LOAD = 1; //锁存
}
//**********把显存内容写入MAX7219***************
void Write7219 (void)
{
char i;
for (i = 0; i < 8; i++) WriteWord(i + 1, Disp_Buff[i]);
//7219的数据寄存器编号: 1~8
}
//**********MAX7219初始化***********************
void InitDisplay (void)
{
WriteWord(ScanLimit, ScanDigit); //设置扫描界限
WriteWord(DecodeMode, DecodeDigit); //设置译码模式
WriteWord(Intensity, IntensityGrade); //设置亮度
WriteWord(ShutDown, NormalOperation); //设置为正常工作模式
}
//----------------------------------------------
void main(void)
{
uchar i, j, k;
uchar code data_ilu[4][8] = { //I love U !
0x00,0x00,0xc0,0xff,0xff,0xc0,0x00,0x00, // I
0x1c,0x3e,0x3f,0x9f,0x9f,0x3f,0x3e,0x1c, //桃心
0x00,0x7f,0xff,0x81,0x81,0xff,0x7f,0x00, // U
0x00,0x00,0x00,0xfd,0xfd,0x00,0x00,0x00}; // !
InitDisplay(); //MAX7219初始化
WriteWord(DisplayTest, TestMode); //显示测试,点亮所有LED
delay(1000); //延时约1s
WriteWord(DisplayTest, TextEnd); //退出显示测试
WriteWord(DecodeMode, 0x00); //8位皆为非译码
for (k = 0; k < 8; k++) Disp_Buff[k] = 255;
Write7219(); //将缓存内容写入7219
while(1) {
for (i = 0; i < 4; i++) {
for (j = 0; j < 8; j++) {
for (k = 7; k > 0; k--) Disp_Buff[k] = Disp_Buff[k - 1];
Disp_Buff[0] = data_ilu[i][j];
Write7219(); //将缓存内容写入7219
delay(300); //延时约300ms
}
if (j == 8 && i != 3) delay(1000);
} }
}
//================================================