# 微處理機期末考 ## 第一題 調整可變電阻可控制兩個燈相互閃爍的快慢,兩個燈分別為LED1與LED3,轉動可變電阻後,再按下藍色(USER)按鈕改變速度。 - 可變電阻順時針(面向旋鈕)為速度最快,反之,逆時針為速度最慢。 - 初始狀態不閃爍 - 使用按鈕中斷 C:\Users\User\Downloads\期末考資料包\實驗07_電壓偵測—ADC\ADC_EX.ioc ![image](https://hackmd.io/_uploads/SynLBvaE1g.png) ![image](https://hackmd.io/_uploads/H1HDBD6E1l.png) ```c= uint32_t adc_value=0; uint8_t flag=0; while (1) { if(flag){ print(adc_value,flag); HAL_GPIO_WritePin(LED1_GPIO_Port, LED3_Pin, 0); HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1); HAL_Delay(adc_value/10); HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, 1); HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0); HAL_Delay(adc_value/10); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == buttom_Pin && HAL_GPIO_ReadPin(buttom_GPIO_Port,buttom_Pin)) { adc_value = HAL_ADC_GetValue(&hadc1); flag = 1; }else{ __NOP(); } } ``` ## 第二題 按下藍色(USER)按鈕會將字元”A”儲存至EEPROM,資料會依序疊加,三秒內未按下則讀取到目前為止儲存的資料並顯示於螢幕一次 - 按下五次則顯示”AAAAA” - 使用I2C傳輸資料 - 使用按鈕中斷 - 計時使用TIMER中斷 將 ioc PB8 改成I2C1_SCL ![image](https://hackmd.io/_uploads/SyXj9I6V1l.png) 開啟 htim6 的 Interrupt ![image](https://hackmd.io/_uploads/SyZ6_2fHyg.png) timer6 設定 ![image](https://hackmd.io/_uploads/ByQJYhGBkg.png) ```c= uint8_t write_data[100]; uint8_t read_data[100]; uint8_t flag = 0; int main(){ HAL_TIM_Base_Start_IT(&htim6); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == B1_Pin && HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) { flag++; __HAL_TIM_SET_COUNTER (&htim6 , 0); HAL_Delay(200); }else{ __NOP(); } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim6){ for(i=0; i<flag; i++){ // 傳資料 write_data[i] = 'A'; // AAA } // 寫入資料到 EEPROM (假設從第 0 頁,第 0 位元組開始) if(flag){ EEPROM_Write(0, 0, write_data, strlen(write_data)); HAL_Delay(100); // 讀取資料從 EEPROM EEPROM_Read(0, 0, read_data, strlen(write_data)); HAL_UART_Transmit(&huart3, read_data, strlen(write_data), 100); HAL_UART_Transmit(&huart3, (uint8_t*)"\r\n", strlen("\r\n"), 100); HAL_Delay(100); } } } ``` ## 考題三 在AccessPort輸入三個字母後傳送至板子,分別”r”、”g”、”b”(不依順序輸入),傳入到板子後,依字母亮LED燈。字母”r”、”g”、”b”分別對應到紅燈、綠燈、藍燈 > 輸入”rgb”後,紅燈呼吸燈一次>綠燈呼吸燈一次>藍燈呼吸燈一次。 輸入”rgg”後,紅燈呼吸燈一次>綠燈呼吸燈一次>綠燈呼吸燈一次。 能進行第一個對應燈的呼吸燈=>5分 輸入”r”,紅燈呼吸一次 能進行三個對應輸入的呼吸燈=>15分 能持續循環=>30分