參考例程講解
一、 Display顯示DEMO:
1、 硬體:

圖1.1 數碼管模塊原理圖
由圖1.1可知MCU通過DAT&CLK(I2C)兩個引腳去控制數碼管驅動IC,從而達到控制數碼管的顯示;打開TM1650/AIP650規格書,

圖1.2 控制命令
我們知道TM1650/AIP650可以通過顯示命令控制控制數碼管的顯示,

圖1.3顯存地址
通過往顯存地址里面寫資料可以就可以實作數字&字母在數碼管的顯示效果,

圖1.3完整的寫顯示時序
完整的寫顯示時序如圖1.3所示,這就MCU& TM1650/AIP650的通信協議,也就是說,通過軟體實作寫顯示時序,我們就能實作我們所要的顯示效果,接下來請看軟體部分
2、 軟體:
/** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ u16 number=0; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ delay_init(72); /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ delay_ms(500); TM1650_Init(); printf("TM1650 Test Demo!\r\n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(++number>9999) { number=0; } DisplayNumber_4BitDig(number); DigitalScan(); printf("TM1650 Running:%d\r\n",number); delay_ms(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
打開我們的例程Display,找到main函式,while之前都是函式的初始化程序,while里面是我們實作的功能:通過數碼管顯示從0~9999變數number,并通過串口列印出來;要實作這樣的一個功能,我們就需要初始化I2C介面和UART,我們的I2C是通過IO模擬的,所以我們初始化IO口即可,這部分代碼不做講解,不同MCU各有不同
我們的IO口定義如下
#define TM_DAT_Pin GPIO_PIN_0 #define TM_DAT_GPIO_Port GPIOB #define TM_CLK_Pin GPIO_PIN_1 #define TM_CLK_GPIO_Port GPIOB
接下來我們實作完整的寫顯示時序:
void TM1650_Init(void){ IIC_SCL=1; IIC_SDA=1; TM1650_SendCommand(0x48,0x71); } void TM1650_SendCommand(u8 CMD1,u8 CMD2) { IIC_Start(); IIC_Send_Byte(CMD1); IIC_Wait_Ack(); IIC_Send_Byte(CMD2); IIC_Wait_Ack(); IIC_Stop(); }
這個初始化程序是寫顯示時序中Commant1和Commant2,再接下來我們實作寫顯示時序中的往ADDRESS發送DATA即可:
我們通過DisplayNumber_4BitDig給四位數碼管變數賦值(碼表)
void DisplayNumber_4BitDig(u16 num) { Dig1_Data=Digital_Table[num/1000]; Dig2_Data=Digital_Table[num/100%10]; Dig3_Data=Digital_Table[num/10%10]; Dig4_Data=Digital_Table[num%10]; }
如需要顯示小數點,如個位的小數點則Dig1_Data=https://www.cnblogs.com/Li-Share/p/Digital_Table[num/1000]&0x08;
碼表是通過共陰極數碼管的碼表得來,我們的驅動IC可以直接驅動數碼管,這里我們可以通過附件中的數碼管工具得來,然后我們呼叫DigitalScan,通過Aip650_SendDigData函式給驅動IC的地址ADDRESS(DIG0~ DIG3)發送DATA(Dig1_Data~ Dig4_Data)
void DigitalScan( void ) { Aip650_SendDigData(DIG0,Dig1_Data); Aip650_SendDigData(DIG1,Dig2_Data); Aip650_SendDigData(DIG2,Dig3_Data); Aip650_SendDigData(DIG3,Dig4_Data); }
void Aip650_SendDigData(u8 Dig,u8 Dat) { IIC_Start(); IIC_Send_Byte(Dig); IIC_Wait_Ack(); IIC_Send_Byte(Dat); IIC_Wait_Ack(); IIC_Stop(); }
至此軟體部分到此結束;
3、 下載驗證:(略)
二、 KEY按鍵掃描DEMO:(略)
1、 硬體:(略)
2、 軟體:(略)
3、 下載驗證:(略)
略略略:不是不講,有時間再更
代碼&模塊資料完全公開,大家自行下載
鏈接:https://pan.baidu.com/s/1PbtRHr5zBTxIJVryTuwXqQ
提取碼:yw0h
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13779.html
標籤:C
上一篇:C 實戰練習題目40
下一篇:C語言連接Mysql資料庫,執行mysql_query()或mysql_real_query()時出錯,即回傳值為1解決辦法
