# 微處理機期末考
## 第一題
調整可變電阻可控制兩個燈相互閃爍的快慢,兩個燈分別為LED1與LED3,轉動可變電阻後,再按下藍色(USER)按鈕改變速度。
- 可變電阻順時針(面向旋鈕)為速度最快,反之,逆時針為速度最慢。
- 初始狀態不閃爍
- 使用按鈕中斷
C:\Users\User\Downloads\期末考資料包\實驗07_電壓偵測—ADC\ADC_EX.ioc


```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

開啟 htim6 的 Interrupt

timer6 設定

```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分