(二) 胸牌点亮逻辑图
通过万用表测量,胸牌共11行,55列,GPIO点亮逻辑图如下:
从辑逻图中可以看出,每二列由一个GPIO控制。
所以驱动时序如下
1,先将要点亮的列GPIO设置为Push_Pull 输出高,其它输出低。
2,对选中列的11行进行扫描,每次扫描输出一行中二个灯的状态。
主要点亮函数代码附上:
void LED_Open(uint8_t x, uint8_t y)
{
if(x >= LED_COL || y >= LED_ROW)return;
Clear_All_LED();
Write_One_LED_Pin(Led_GPIO_Port_Arrange[x / 2], Led_GPIO_Pin_Arrange[x / 2], 1); //ÁÐѡͨ
if (y <= 4){
if(x % 2 == 0)
{
if(x <= 4 * y ) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2], Led_GPIO_Pin_Arrange[y * 2], 0);
}else{
if(x <= 4 * y + 3) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 2], Led_GPIO_Pin_Arrange[y * 2 + 2], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 2 + 1], Led_GPIO_Pin_Arrange[y * 2 + 1], 0);
}
}else{
if(x % 2 == 0)
{
if(x <= 6 * y - 10) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 4], Led_GPIO_Pin_Arrange[y * 3 - 4], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 5], Led_GPIO_Pin_Arrange[y * 3 - 5], 0);
}else{
if(x <= 6 * y - 7) Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 2], Led_GPIO_Pin_Arrange[y * 3 - 2], 0);
else Write_One_LED_Pin(Led_GPIO_Port_Arrange[y * 3 - 4], Led_GPIO_Pin_Arrange[y * 3 - 4], 0);
}
}
}
|