本打算先使用GPIO口实现一个I2C接口OLED屏的显示,在几经调试无果的情况下,只好先放弃这个选择。 为了确保能有所收获,就选取了串行数码管显示模块作为突破口,其实现的显示效果如下图所示。 显示效果图
该串行数码管显示模块与开发板的连接关系为: SCL---PA27 SDA---PA26 CS---PA13
也就是说它借用了RGB_LED所使用的引脚,这也再次体现了开发板所采用的设计方式的好处。
为便于向串行数码管显示模块提供高低电平的输出,其定义的语句为: #define CLK_SetHigh() DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_27) #define CLK_SetLow() DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_27)
#define DIN_SetHigh() DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_26) #define DIN_SetLow() DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_26)
#define CS_SetHigh() DL_GPIO_setPins(GPIOA, DL_GPIO_PIN_13) //CS #define CS_SetLow() DL_GPIO_clearPins(GPIOA, DL_GPIO_PIN_13)
为确保输出信号的稳定与可靠,特配置了一个短时的延时函数,其内容为: void delay(unsignedint n)
{
unsignedint uci;
unsignedint count=2;
for(uci=0;uci<n;uci++)
{
count=4;
while(count--);
}
}
由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为: void Write_Max7219_byte(char DATA)
{
char i;
CS_SetLow();
delay(10);
for(i=8;i>=1;i--)
{
CLK_SetLow();
if(DATA&0x80)
DIN_SetHigh();
else
DIN_SetLow();
delay(10);
DATA=DATA<<1;
CLK_SetHigh();
delay(10);
}
}
以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为: voidWrite_Max7219(char address,char dat)
{
CS_SetLow();
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh();
}
对于串行数码管显示模块,其初始化函数为: voidInit_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)
{
SYSCFG_DL_init();
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);
while(1);
}
这样,就实现了串行数码管显示模块的驱动,后面再有数值显示的任务就可以交给它来解决了。
|