上次尝试利用扩展接口对GPIO口的使用,这次就利用其中的GPIO口来为开发板配置一个串行数码管显示模块,以实现数据显示的作用。
该串行数码管模块如图1所示,其主控芯片为MAX7219,是一种将串行信号转换为并行信号的芯片。
该显示模块共有5个引脚,除电源占用的2个引脚外,其余3个引脚的作用及连接关系为:
DIN----数据引脚---P5.2
CLK----时钟引脚---P5.3
CS ----片选引脚---P5.5
图1 串行数码管模块
为实现高低电平信号的输出,所做的语句定义为:
#defineDIN_SetHigh() Cy_GPIO_Set(P5_2_PORT, P5_2_NUM)
#defineDIN_SetLow() Cy_GPIO_Clr(P5_2_PORT, P5_2_NUM)
#defineCLK_SetHigh() Cy_GPIO_Set(P5_3_PORT, P5_3_NUM)
#defineCLK_SetLow() Cy_GPIO_Clr(P5_3_PORT, P5_3_NUM)
#defineCS_SetHigh() Cy_GPIO_Set(P5_5_PORT, P5_5_NUM)
#defineCS_SetLow() Cy_GPIO_Clr(P5_5_PORT, P5_5_NUM)
为保证输出信号的稳定和可靠,所配置的延时函数为:
void delay_ns(unsignedint n)
{
unsignedint i;
unsignedint count=4;
for(i=0;i<n; i++)
{
count=4;
while(count--);
}
}
实现字节数据串行发送的函数为:
void Write_Max7219_byte(char DATA)
{
char i;
CS_SetLow();
delay_ns(100);
for(i=8;i>=1;i--)
{
CLK_SetLow();
delay_ns(100);
if(DATA&0x80)
DIN_SetHigh();
else
DIN_SetLow();
delay_ns(100);
DATA=DATA<<1;
CLK_SetHigh();
delay_ns(100);
}
}
向指定单元发送数据的函数为:
void Write_Max7219(char address,char dat)
{
CS_SetLow();
delay_ns(100);
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
delay_ns(100);
}
对串行数码管模块进行初始化的函数为:
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xff);
Write_Max7219(0x0a, 0x02);
Write_Max7219(0x0b, 0x07);
Write_Max7219(0x0c, 0x01);
Write_Max7219(0x0f, 0x00);
}
实现串行数码管驱动测试的主程序为:
int main(void)
{
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);
}
经程序的编译和下载,其运行的显示效果如图2所示。
图2 串行数码管测试效果