#include "stm32f10x.h" //STM32頭文件
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "buzzer.h"
#include "usart.h"
#include "rtc.h"
#include "NVIC.h"
#include "adc.h"
#include "oled.h"
extern vu16 ADC_DMA_IN4; //聲明外部變量
extern u8 INT_MARK;//中斷標志?
extern u32 ui;//用于遙控變量
extern u8 q;
u16 d=0;
u8 w;
void key(){
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //讀按鍵接口的電平
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
delay_ms(20); //延時去抖動
if(!GPIO_ReadInputDataBit(KEYPORT,KEY1)){ //讀按鍵接口的電平
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
while(!GPIO_ReadInputDataBit(KEYPORT,KEY1)); //等待按鍵松開
if(q==3){q=0;}
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
} }
}
void key2(){
if(GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //讀按鍵接口的電平
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
if(GPIO_ReadInputDataBit(KEYPORT,KEY2)){ //讀按鍵接口的電平
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
while(GPIO_ReadInputDataBit(KEYPORT,KEY2)); //等待按鍵松開
if(q==3){q=0;}
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
} }
}
void key3(){
if(GPIO_ReadInputDataBit(KEYPORT,KEY3)){ //讀按鍵接口的電平
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
if(GPIO_ReadInputDataBit(KEYPORT,KEY3)){ //讀按鍵接口的電平
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
while(GPIO_ReadInputDataBit(KEYPORT,KEY3)); //等待按鍵松開
if(q==3){q=0;}
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
} }
}
void key4(){
if(GPIO_ReadInputDataBit(KEYPORT,KEY4)){ //讀按鍵接口的電平
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
if(GPIO_ReadInputDataBit(KEYPORT,KEY4)){ //讀按鍵接口的電平
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
while(GPIO_ReadInputDataBit(KEYPORT,KEY4)); //等待按鍵松開
if(q==3){q=0;}
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
} }
}
void key5(){
if(GPIO_ReadInputDataBit(KEYPORT,KEY5)){ //讀按鍵接口的電平
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(1)); //蜂鳴器接口輸出高電平1
if(GPIO_ReadInputDataBit(KEYPORT,KEY5)){ //讀按鍵接口的電平
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(q++));
while(GPIO_ReadInputDataBit(KEYPORT,KEY5)); //等待按鍵松開
if(q==3){q=0;}
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
} }
}
int main (void){//主程序
u8 bya;
// w=0;
INT_MARK=0;//中斷標志位
ui=0;
q=0;
RCC_Configuration(); //系統時鐘初始化
RTC_Config(); //實時時鐘初始化
LED_Init();//LED初始化
KEY_Init();//按鍵初始化
BUZZER_Init();//蜂鳴器初始化
USART1_Init(115200); //串口初始化,參數中寫波特率
// USART1_Init(9600); //串口初始化,參數中寫波特率
USART1_RX_STA=0xC000; //初始值設為有回車的狀態,即顯示一次歡迎詞
// KEY_INT_INIT();
TIMENVIC_INT_INIT ();
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //使能電源PWR時鐘
// RTC_Set(2021,8,8,20,59,00);
// RTC_Alarm_Set(2020,12,13,00,00,10);
// MIDI_PLAY();
ADC_Configuration(); //ADC初始化設置
OLED_Init(); //初始化OLED
OLED_Clear();
while(1){
GPIO_WriteBit(BUZZERPORT,BUZZER,(BitAction)(0)); //蜂鳴器接口輸出高電平1
d=(ADC_DMA_IN4-120)/71.428571428571*100;
// if(ADC_DMA_IN4<880){
// GPIO_WriteBit(LEDPORT,LED2,(BitAction)(0));GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));
// GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(0));
// }
if(ui==0xa1){q=1;printf("打開路由器 \r\n");ui=0;}
if(ui==0xa2){q=2;printf("打開燈光 \r\n");ui=0;}
if(ui==0xa0){q=0;printf("關閉所有 \r\n");ui=0;}else{ui=0;}
// OLED_ShowNum(48,6,rsec,3,16);//顯示ASCII字符
// OLED_ShowNum(103,6,rmin,3,16);//顯示ASCII字符的碼值
// PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);//進入停機模式
// RCC_Configuration(); //系統時鐘初始化(停機喚醒后會改用HSI時鐘,需要重新對時鐘初始化)
// delay_ms(500);
if(q==1){q=2;}
if(q==0){GPIO_WriteBit(LEDPORT,LED2,(BitAction)(0));OLED_ShowCHinese(54,0,17);GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));OLED_ShowCHinese(54,2,17);}
if(q==1){GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));OLED_ShowCHinese(54,0,16);GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));OLED_ShowCHinese(54,2,17);}
if(q==2){GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));OLED_ShowCHinese(54,0,16);GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));OLED_ShowCHinese(54,2,16);}
key();key2();key3();key4();key5();
if(USART1_RX_STA&0xC000){ //如果標志位是0xC000表示收到數據串完成,可以處理。
if((USART1_RX_STA&0x3FFF)==0){ //單獨的回車鍵再顯示一次歡迎詞
if(RTC_Get()==0){ //讀出時間值,同時判斷返回值是不是0,非0時讀取的值是錯誤的。
printf(" 洋桃開發板STM32實時時鐘測試程序 \r\n");
printf(" 現在實時時間:%d-%d-%d %d:%d:%d ",ryear,rmon,rday,rhour,rmin,rsec);//顯示日期時間
if(rweek==0)printf("星期日 \r\n");//rweek值為0時表示星期日
if(rweek==1)printf("星期一 \r\n");
if(rweek==2)printf("星期二 \r\n");
if(rweek==3)printf("星期三 \r\n");
if(rweek==4)printf("星期四 \r\n");
if(rweek==5)printf("星期五 \r\n");
if(rweek==6)printf("星期六 \r\n");
printf(" 單按回車鍵更新時間。輸入字母C初始化時鐘 \r\n");
printf(" 請輸入設置時間,格式20170806120000,按回車鍵確定! \r\n");
}else{
printf("讀取失!\r\n");
}
}else if((USART1_RX_STA&0x3FFF)==1){ //判斷數據是不是2個
if(USART1_RX_BUF[0]=='c' || USART1_RX_BUF[0]=='C'){
RTC_First_Config(); //鍵盤輸入c或C,初始化時鐘
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//配置完成后,向后備寄存器中寫特殊字符0xA5A5
printf("初始化成功! \r\n");//顯示初始化成功
}else{
printf("指令錯誤! \r\n"); //顯示指令錯誤!
}
}
else if((USART1_RX_STA&0x3FFF)==14){ //判斷數據是不是14個
//將超級終端發過來的數據換算并寫入RTC
ryear = (USART1_RX_BUF[0]-0x30)*1000+(USART1_RX_BUF[1]-0x30)*100+(USART1_RX_BUF[2]-0x30)*10+USART1_RX_BUF[3]-0x30;
rmon = (USART1_RX_BUF[4]-0x30)*10+USART1_RX_BUF[5]-0x30;//串口發來的是字符,減0x30后才能得到十進制0~9的數據
rday = (USART1_RX_BUF[6]-0x30)*10+USART1_RX_BUF[7]-0x30;
rhour = (USART1_RX_BUF[8]-0x30)*10+USART1_RX_BUF[9]-0x30;
rmin = (USART1_RX_BUF[10]-0x30)*10+USART1_RX_BUF[11]-0x30;
rsec = (USART1_RX_BUF[12]-0x30)*10+USART1_RX_BUF[13]-0x30;
bya=RTC_Set(ryear,rmon,rday,rhour,rmin,rsec); //將數據寫入RTC計算器的程序
if(bya==0)printf("寫入成功! \r\n");//顯示寫入成功
else printf("寫入失敗! \r\n"); //顯示寫入失敗
}else{ //如果以上都不是,即是錯誤的指令。
printf("指令錯誤! \r\n"); //如果不是以上正確的操作,顯示指令錯誤!
}
USART1_RX_STA=0; //將串口數據標志位清0
}
if(RTC_Get()==0){ //讀出時間值,同時判斷返回值是不是0,非0時讀取的值是錯誤的。
// OLED_ShowString(20,4,ryear/rmon/rday,16);
OLED_ShowCHinese(0,0,10); //路
OLED_ShowCHinese(18,0,11);//由
OLED_ShowCHinese(36,0,12);//器
// OLED_ShowCHinese(54,0,16);//開
OLED_ShowCHinese(0,2,13); //照
OLED_ShowCHinese(18,2,14);//明
OLED_ShowCHinese(36,2,15);//燈
// OLED_ShowCHinese(54,2,17);//關
// OLED_ShowNum(80,0,d,6,16); //10.95v=900 13v=1050 82.19178082
OLED_ShowNum(82,0,(d/100),2,16);
OLED_ShowString(98,0,".",16);
OLED_ShowNum(100,0,(d%100),2,16);
OLED_ShowString(120,0,"v",16);
OLED_ShowNum(0,4,ryear,5,16);
OLED_ShowString(40,4,"/",16);
OLED_ShowNum(47,4,rmon,3,16);
OLED_ShowString(73,4,"/",16);
OLED_ShowNum(80,4,rday,3,16);
OLED_ShowNum(0,6,rhour,3,16);
OLED_ShowString(23,6,":",16);
OLED_ShowNum(28,6,rmin,3,16);
OLED_ShowString(51,6,":",16);
OLED_ShowNum(56,6,rsec,3,16);
OLED_ShowCHinese(102,6,18);//周
// OLED_ShowString(95,6,"NO:",16);
if(rweek!=0){w=rweek;}//rweek值為0時表示星期日
if(rweek==0){w=7;}//rweek值為0時表示星期日
OLED_ShowNum(120,6,w,1,16);
// GPIO_WriteBit(LEDPORT,LED2,(BitAction)(rmin%2)); //LED2接口
if(ADC_DMA_IN4>890){ if(rhour==20){if(rmin==30){if(rsec==1){q=2;}}}}
if(rhour==0){if(rmin==30){if(rsec==1){q=0;}}}
if(rhour==2){if(rmin==00){if(rsec==1){q=0;}}}
if(rhour==8){if(rmin==30){if(rsec==1){q=0;}}}
if(rhour==0){if(rmin==29){if(rsec==1){
if(GPIO_ReadInputDataBit(LEDPORT,LED3)){
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));delay_ms(500);
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));delay_ms(500);
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));delay_ms(500);
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));delay_ms(500);
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(0));delay_ms(500);
GPIO_WriteBit(LEDPORT,LED3,(BitAction)(1));
}
}
}
}
if(ADC_DMA_IN4<890){GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(rsec%2));}
if(ADC_DMA_IN4>900){GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(1));}
key();key2();key3();key4();key5();
}
// GPIO_WriteBit(LEDPORT1,LED4,(BitAction)(0));
}
}
|