打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】串行数码管显示

[复制链接]
5706|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 显示效果

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝