本打算用GPIO口实现一个I2C接口OLED屏的显示,在几经调试无果的情况下,只好先放弃这个选择。
于是选取了串行数码管显示模块作为突破口,经测试其显示效果良好。
该显示模块以MAX7219为主控芯片,可显示8位数值,并支持级联使用。除电源外,它只需3个GPIO口,故十分节省引脚资源。
图1 串行数码管显示模块
该显示模块与开发板的连接关系为:
SCL---GPIO2_2
SDA---GPIO2_3
CS---GPIO2_4
为便于向串行数码管显示模块提供高低电平的输出,所定义的语句为:
#define CLK_SetLow GPIO_WritePin(GPIO2, GPIO_PIN_02, RESET)
#define CLK_SetHigh GPIO_WritePin(GPIO2, GPIO_PIN_02, SET)
#define DIN_SetLow GPIO_WritePin(GPIO2, GPIO_PIN_03, RESET)
#define DIN_SetHigh GPIO_WritePin(GPIO2, GPIO_PIN_03, SET)
#define CS_SetLow GPIO_WritePin(GPIO2, GPIO_PIN_04, RESET)
#define CS_SetHigh GPIO_WritePin(GPIO2, GPIO_PIN_04, SET)
由于该串行数码管显示模块所使用的关键芯片为MAX7219,故为它配置了一个串行发送字节数据的函数,其内容为:
static 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=(char)(DATA<<1);
CLK_SetHigh;
delay(10);
}
}
以函数Write_Max7219_byte()为基础,向指定地址发送数据的函数为:
static void Write_Max7219(char address,char dat)
{
CS_SetLow;
Write_Max7219_byte(address);
Write_Max7219_byte(dat);
CS_SetHigh;
}
对于串行数码管显示模块,其初始化函数为:
static 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)
{
EVB_LEDInit();
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)
{
GPIO_TogglePin(GPIO_LED_PORT, GPIO_LED_PIN);
__Delay(0x5FFFFF);
}
}
经程序编译与运行,其效果如图2所示。
图2 显示效果图
这样,就实现了串行数码管模块的显示驱动,后面再有数值显示的需要就可以交它来完成。
|