本打算先使用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);
- }
这样,就实现了串行数码管显示模块的驱动,后面再有数值显示的任务就可以交给它来解决了。
|