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 显示效果
|