本帖最后由 jinglixixi 于 2021-5-28 17:00 编辑
#申请原创#
在构建了开发环境及具备了下载功能的前提下,可以由GPIO口的学习来控制开发板的实用功能。
本次所介绍的内容是用GPIO口来模拟SPI接口,以驱动一个串行输入的8位数码管模块,该模块如图1所示。
图1 8位串行数码管模
该数码管的基本内容是:它采用MAX7219是串行输入/并行输出的显示驱动芯片,可连接一个8位的7段数码管,也可连接64个独立的LED。在该芯片内部集成了一个B型的BCD码编码多路扫描回路、段字驱动器。而且还含有一个8*8的静态RAM来存储显示数据,且有一个外部寄存器用来设置各LED的段电流。该芯片的串行接口可连接各种通用的微处理器,每个数据可以寻址在更新时无需改写其显示,它也同样允许用户对每个数据选择编码或是不编码。该芯片包含一个150uA的低功耗关闭模式,模拟和数字亮度控制,扫描限制寄存器允许用户显示1-8位数据,且有一个让所有LED发光的检测模式。在显示过程中,无抖动和闪烁现象,支持级联方式进行显示位数的扩展。除2个电源引脚外,另3个引脚为:串行数据输入端DIN、串行时钟输入端CLK及片选引脚CS在使用过程中,串行数码管引脚与开发板的连接关系为:VCC---5VGND---GNDDIN---RC4CLK--- RC6CS --- RC7相应的引脚在MCC中的配置情况如图2
所示,此外为便于编程还调用了系统的延时函数。
图2 引脚配置
在PIC18F16Q40下,实现串行数据发送的函数为: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();
}
实现芯片X7219初始化的函数为:
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219_2(0x09, 0xff);
Write_Max7219(0x0a, 0x02);
Write_Max7219_2(0x0a, 0x02);
Write_Max7219(0x0b, 0x07);
Write_Max7219_2(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219_2(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
Write_Max7219_2(0x0f, 0x00);
}
实现图3所示显示效果的主程序为:
void main(void)
{
SYSTEM_Initialize();
Init_MAX7219();
Write_Max7219(1,1);
Write_Max7219(2,2);
Write_Max7219(3,3);
Write_Max7219(4,4);
Write_Max7219(5,5);
Write_Max7219(6,6);
Write_Max7219(7,7);
Write_Max7219(8,8);
Write_Max7219_2(1,8);
Write_Max7219_2(2,7);
Write_Max7219_2(3,6);
Write_Max7219_2(4,5);
Write_Max7219_2(5,4);
Write_Max7219_2(6,3);
Write_Max7219_2(7,2);
Write_Max7219_2(8,1);
while (1)
{
IO_RC1_SetHigh();
DELAY_milliseconds(1000);
IO_RC1_SetLow();
DELAY_milliseconds(1000);
}
}
有了数码管的显示功能,再有数值显示的问题就可以交给它了,相较于常规的数码管显示,它具有占用引脚资源少的优势,且显示的亮度高,适于用在工业控制中。
|