R7F0C809显示板套件主要完成处理按键识别、数码管显示以及串口通信三个功能的实现。三个功能具体内容如下:
(1) 按键识别:识别按键的状态
(2) 数码管显示:根据按键状态,数码管能够切换显示控制速度、转弯速度
(3) 串口通信:串口定时向遥控板(stm32f103开发板)输出控制信息(速度、转弯)
为了三项功能分一下几点进行程序编写:
定时器:
实现三个功能同时工作,设计中分别采用三个定时器中断,根据中断状态从而调度不同的功能予以运行。
- /******************************************************************************
- * Function Name : TAU0_Init
- * Description : This function initialize TAU0 module.
- * Arguments : none
- * Return Value : none
- ******************************************************************************/
- void TAU0_Init(void)
- {
- TAU0EN = 1; /*supply input clock*/
- TPS0 = 0x05; /*CK00, fMCLK = fCLK/(2^5) = 625kHz╢CLK=20MHz*/
-
- /* channel 0 and 1 used as interval timer */
- TMR00H = 0; /*only software trigger*/
- TMR00L = 0;
- TMR01H = 0; /*only software trigger*/
- TMR01L = 0;
- TMR02H = 0; /*only software trigger*/
- TMR02L = 0;
-
- TDR00H = 0x0a; /*4.17ms*/
- TDR00L = 0x2b;
- TDR01H = 0x04; /*2ms*/
- TDR01L = 0xE1;
- TDR03H = 0xf4; /*100ms*/
- TDR03L = 0x23;
-
- TMIF00 = 0; /*Clear channel0 interrupt flag */
- TMIF01 = 0; /*Clear channel1 interrupt flag */
- TMIF02 = 0; /*Clear channel1 interrupt flag */
-
- TMMK00 = 0; /* Enables INTTM00 interrupt */
- TMPR100 = 0; /* Sets INTTM00 low priority */
- TMPR000 = 1;
-
- TMMK01 = 1; /* Disables INTTM01 interrupt */
- TMPR101 = 1; /* Sets INTTM01 low priority */
- TMPR001 = 0;
-
- TMMK02 = 0; /* Enables INTTM02 interrupt */
- TMPR102 = 1; /* Sets INTTM00 low priority */
- // TMPR002 = 1;
- }
-
- void TAU0_Start(void)
- {
- TS0 |= 0x05; /* Start TAU00 TAU02 timer */
- }
- /******************************************************************************
- End of function TAU0_Init
- ******************************************************************************/
- __interrupt void TAU0_Channel0_Interrupt(void)
- {
- LED_Display(); /* Executive the LED_Display function*/
- TS0 |= 0x02;
- TMMK01 = 0; /* Enables INTTM01 interrupt */
- }
-
- __interrupt void TAU0_Channel1_Interrupt(void)
- {
- Key_Scan(); /* Executive the Key_Scan function*/
- LED_Mode(); /* Executive the Led_Mode function*/
- TMMK01 = 1; /* Disables INTTM01 interrupt */
- TT0 |= 0x02;
- }
-
- __interrupt void TAU0_Channel2_Interrupt(void)
- {
- send_timer=1;
- }
串口:
由于串口发送(R_UART0_Send(message,8))会产生延时,所以在时间中断中不能调用该函数,只能先设置发送标志(send_timer),再在主程序中进行发送。
- void main(void)
- {
- /* Start user code. Do not edit comment generated here */
- MD_STATUS status;
- /* UART0 receive buffer setting */
- status = R_UART0_Receive(&g_Uart0RxBuf, 1);
-
- /* Start the UART0 Tx/Rx operation */
- R_UART0_Start();
-
- TAU0_Start();
-
- /* Main loop */
- while (1U)
- {
- if(send_timer)
- {
- message[2] = (speed_send & 0x00ff);
- message[3] = (speed_send & 0xff00)>>8;
- message[4] = (turn_send & 0x00ff);
- message[5] = (turn_send & 0xff00)>>8;
- g_Uart0TxEnd = R_UART0_Send(message, 8);
- while(g_Uart0TxEnd == 0){} /* wait for final transmit */
- send_timer=0;
- }
-
- if(g_Uart0RxEnd)
- {
- }
- }
- /* End user code. Do not edit comment generated here */
- }
在使用串口时,涉及到端口复用功能,首先需要先设定PIOR寄存器,而后再对所使用的端口进行设定。本设计中串口使用的是P01、P137口,PIOR设定如下:
PIOR &= 0x0FU;
PIOR |= 0x10U;
再设定端口状态:
P0 |= 0x02U;
PM0 &= ~0x02U;
键盘扫描:原先的键盘扫描,只能识别单一按键,而作为小车遥控器应具备同时运动方向和转弯的按键同时按下的要求,所以将代码进行了重新更改。
至此,基本功能已经完成编写,下面进行程序测试:
串口输出从测试:
按键功能测试视频:
小车遥控测试视频:
代码:
本帖最后由 shiyongzhu 于 2015-11-22 14:30 编辑