Max7219是一种串并转换芯片,故能有效地节省I/O口资源,基于该芯片设计的数码管模块和点阵显示模块就是2款典型的功能模块。 对于PIC18F16Q41这样的小板卡,选择Max7219模块为显示对象是非常合适的。 串行数码管显示模块的功能是以MAX7219芯片来控制8位的7段数码管,在该芯片内部集成了一个B型的BCD码编码多路扫描回路、段字驱动器。而且还含有一个8*8的静态RAM来存储显示数据,且有一个外部寄存器用来设置各LED的段电流。每个数据可以寻址在更新时无需改写其显示,它也同样允许用户对每个数据选择编码或是不编码。在显示过程中,其没有抖动和闪烁现象,支持级联方式进行显示位数的扩展。 该模块的外观如图4所示: 图1 8位串行数码管模块 要使用PIC18F16Q40来驱动Max7219模块,其首要的工作就是通过MCC对所用引脚加以配置。 在建立如下连接关系时,其引脚配置如图2所示: DIN--- RC4 CLK--- RC6 CS ---RC7 其中:DIN为串行数据输入端、CLK为串行时钟输入端、CS为片选引脚。 图2 引脚配置 相应的引脚命名如图3所示,并将3个引脚都设为输出模式。 图3引脚命名 此外,为便于编程还调用了系统的延时函数,见图4所示。 图4 启用延时函数 由于是采用I/O来模拟串行数据发送,其串行数据发送的函数为: void Write_Max7219_byte(char DATA)
{
char i;
CS_SetLow();
for(i=8;i>=1;i--)
{
CLK_SetLow();
if(DATA&0x80)
DIN_SetHigh();
else
DIN_SetLow();
DATA=DATA<<1;
CLK_SetHigh();
}
}
向寄存器写入数据的函数为: void Write_Max7219(char address,char dat)
{
CS_SetLow();
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
}
该模块的初始化函数为: void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x03);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x01);
}
要实现图5的显示效果,其主程序为: void main(void)
{
// Initialize the device
SYSTEM_Initialize();
DELAY_milliseconds(50);
Init_MAX7219();
DELAY_milliseconds(200);
Write_Max7219(0xff,0x00);
Write_Max7219(1,8);
Write_Max7219(2,7);
Write_Max7219(3,6);
Write_Max7219(4,5);
Write_Max7219(5,4);
Write_Max7219(6,3);
Write_Max7219(7,2);
Write_Max7219(8,1);
while (1)
{
// Add your application code
LED_SetHigh();
DELAY_milliseconds(1000);
LED_SetLow();
DELAY_milliseconds(1000);
}
}
相较于常规的数码管显示,该显示方式具有占用引脚资源少,显示亮度高的特点,故适用于工业控制方面。 图5 显示效果
|