首次接觸 stm8 用的是 IAR fo stm8 軟件
主要功能
1,全搖控控制,只用到搖控器的 開關鍵 + Mode + 上一曲 + 下一曲 + (VOL-) + (VOL+ )。
Mode 進入設置頁面和從設置頁面退出并保存數據,上/下一曲改變要設置項,VOL-/+ 改變數值,開關鍵打開和關閉 LED。
2,硬件是一個 stm8s103f4p6小板,4 個 74hc595,32 個 LED,等,其他關于功放,風扇,信號采樣等不多作介紹。
3,主要設置項有,LED 跳動樣式,LED 亮度,LED 顯示刷新速度,ADC 采樣間隔時間,最高點懸停時間,最高點下落間隔時間等。
4,程序只要用到 ADC,定時器,中斷等。
5,其它
歡迎指正。
制作出來的實物圖如下:
微信圖片_20181202161132.jpg (61.3 KB, 下載次數: 69)
下載附件
2018-12-2 16:34 上傳
微信圖片_20181202161139.jpg (73.81 KB, 下載次數: 71)
下載附件
2018-12-2 16:34 上傳
微信圖片_20181202161146.jpg (100.51 KB, 下載次數: 61)
下載附件
2018-12-2 16:34 上傳
微信圖片_20181202161301.jpg (159.52 KB, 下載次數: 58)
下載附件
2018-12-2 16:34 上傳
微信圖片_20181202161458.jpg (57.01 KB, 下載次數: 68)
下載附件
2018-12-2 16:34 上傳
微信圖片_20181202161150.jpg (83.15 KB, 下載次數: 60)
下載附件
2018-12-2 16:34 上傳
stm8s103單片機源程序如下:
- /*
- HC595*4 音量指示
- 1:SPI 驅動 HC595
- */
- #include "iostm8s103f3.h"
- //#include <stdlib.h>
- #include "math.h"
- #define u16 unsigned int
- #define u8 unsigned char
- #define u32 unsigned long
- #define uchar u8
- #define uint u16
- #define ulng u32
- //#define page(n) Page ## n
- #define LED PB_ODR_ODR5
- #define SPI_STCP PD_ODR_ODR1
- #define SPI_DS PC_ODR_ODR6
- #define SPI_SCLK PC_ODR_ODR5
- //#define SPI_OE PD_ODR_ODR4
- #define IR_IN PC_ODR_ODR3
- //紅外搖控鍵值
- #define IR_ADD 0x09 //加
- #define IR_SUB 0x15 //減
- #define IR_UPP 0x40 //上
- #define IR_LOW 0x43 //下
- #define IR_LEFT IR_UPP //左
- #define IR_RIGHT IR_LOW //右
- #define IR_MODE 0x46 //模式
- #define IR_SWITCH 0x45 //開關
- #define CH_L ADC_DB3RH //左聲道采樣結果
- #define CH_R ADC_DB4RH //右聲道采樣結果
- #define CH_VOL ADC_DB5RH //電壓采樣結果
- #define CH_TEMP ADC_DB6RH //溫度采樣結果
- #define FAN_START 4 //風扇最低啟動值
- #define EEPROM_MODE 0x4000 //頻譜顯示樣式
- #define EEPROM_BRIGHTNESS 0x4001 //LED 亮度存儲地址
- #define EEPROM_REFRESH 0x4002 //LED 刷新存儲地址
- #define EEPROM_SAMPLING 0x4003 //ADC 采樣存儲地址
- #define EEPROM_HOVER 0x4004 //懸念計時存儲地址
- #define EEPROM_FALL 0x4005 //下落間隔時間存儲地址
- #define EEPROM_SENS 0x4006 //靈敏度校準時間存儲地址
- #define EEPROM_TEMP 0x4007 //啟動風扇溫度值地址
- u8 ch_lh,ch_ll,ch_rh,ch_rl; //左右聲道采樣高低位數據
- u16 SYS_TimeBase = 0; //系統計時
- u8 IR_TimeBase = 0; //紅外計時
- u32 IR_Code = 0x00000000; //紅外編碼
- u16 fall_l = 0,fall_r = 0; //自由下落數據
- u8 page_num = 0; //頁面編號
- u8 IR_num = 0; //紅外定時計數
- u16 HC595_TimeBase = 0; //HC595 刷新計時
- u16 ADC_TimeBase = 0; //ADC 采樣計時
- u16 HOVER_TimeBaseL = 0; //左懸停計時
- u16 HOVER_TimeBaseR = 0; //右懸停計時
- u16 FALL_TimeBase = 0; //下落計時
- u16 SENS_TimeBase = 0; //靈敏度校準計時
- u8 spectrum_inc = 1; //采樣靈敏度遞增數
- u8 spectrum_dat = 1; //采樣自動修正值
- u8 timing = 0; //定時退出設置頁面
- u8 mode; //頻譜樣式
- u8 brightness; //LED 亮度
- u8 refresh; //LED 刷新間隔時間 (5ms * 1-30)
- u8 sampling; //ADC 采樣間隔時間
- u8 hover; //懸停時間
- u8 fall; //下落間隔時間
- u8 sensitivity; //靈敏度
- u8 temp_val; //風扇啟動溫度值
- u8 OutOff_Flag = 0; //關機標記
- u16 refreshs; //LED 刷新間隔時間 (5ms * refresh)
- void Delay(u16 xms)
- {
- volatile u16 i;
- for(; xms>0; xms--)
- for(i=1300; i>0; i--);
- }
- void SYSClockSet_Init(void)
- {
- CLK_CKDIVR_HSIDIV = 0; //內部高速時鐘設置為不分頻
- CLK_PCKENR1 = 0X00; //關閉不用的外設時鐘
- CLK_PCKENR2 = 0X00; //關閉不用的外設時鐘
- }
- void IWDG_Init(void) //獨立看門狗初始化
- {
- CLK_ICKR_LSIEN = 1; //使能內部低速時鐘
- while(!CLK_ICKR_LSIRDY); //等待 LSI 就緒
-
- IWDG_KR = 0xcc; //啟動獨立看門狗
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- IWDG_KR = 0x55; //可更改預分頻值和重裝載值
- IWDG_PR_PR = 6; //256 預分頻
- IWDG_RLR = 250; //重裝載值 = 250
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- }
- u8 EEPROM_UnLock(void) //EEPROM 解鎖
- {
- FLASH_DUKR = 0xae; //第一密鑰
- FLASH_DUKR = 0x56; //第二密鑰
- while(!FLASH_IAPSR_DUL); //等待解密
- if(1 == FLASH_IAPSR_DUL) return 0; //解鎖成功
- else return 1; //解鎖失敗
- }
- void EEPROM_Lock(void) //EEPROM 鎖定
- {
- FLASH_IAPSR_DUL = 0;
- }
- void FLASH_EraseByte(u32 address) //擦除指定 FLASH 位置字節
- {
- *(__near u8*)(u16)address = 0x00;
- while(!FLASH_IAPSR_EOP); //等待操作完成
- }
- void FLASH_ProgramByte(u32 address, u8 Data) //指定 FLASH 位置寫入數據
- {
- *(__near u8*)(u16)address = Data;
- while(!FLASH_IAPSR_EOP); //等待操作完成
- }
- u8 FLASH_ReadByte(u32 address) //讀取指定 FLASH 位置數據
- {
- return(*(__near u8*)(u16)address);
- }
- void LED_Init(void)
- {
- PB_DDR_DDR5 = 1; // 輸出
- PB_CR1_C15 = 1;
- PB_CR2_C25 = 1;
- PB_ODR_ODR5 = 1; //輸出高電平關閉 LED
- }
- void TIME4_Init(void) //產生 0.1ms 基數
- {
- CLK_PCKENR1 |= 1<<4; //使能 TIM4 時鐘
- // TIM4_CR1_ARPE = 0; //預裝載禁用 /
- TIM4_PSCR_PSC = 4; //預分頻器 16 分頻
- TIM4_ARR = 100; //自動重裝載值
- TIM4_IER_UIE = 1; //更新中斷使能
- TIM4_CR1_CEN = 1; //計數器使能
- // SYS_TimeBase = 0; //復位時間計數器 (0.1ms) /
- }
- void FAN_Init(void) //軸流風機調速
- {
- PA_DDR_DDR3 = 1; // 輸出
- PA_CR1_C13 = 1;
- PA_CR2_C23 = 1;
-
- CLK_PCKENR1 |= 1<<5; //使能 TIM2 時鐘
- TIM2_CCMR3_OC3M = 6; // PWM 模式 1
- TIM2_CCMR3_OC3PE = 1; //輸出比較 3 預裝載使能 (PWM 模式必須置位)
- // TIM2_CCMR3_CC3S = 0; //CC3 通道被配置為輸出 /
- // TIM2_CCER2_CC3P = 0; //OC3 高電平有效 /
- TIM2_CCER2_CC3E = 1; //OC3 信號輸出到對應的輸出引腳
- // TIM2_PSCR_PSC = 0; //預分頻器 0-15 fCK_PSC/2((PSC[3:0])指數) /
- TIM2_ARRH = 100/256; //自動重裝載值高位
- TIM2_ARRL = 100%256; //自動重裝載值低位
- // TIM2_CCR3H = 0x00; //捕獲/比較寄存器 3 高位 /
- // TIM2_CCR3L = 0x00; //捕獲/比較寄存器 3 低位 /
- // TIM2_CNTRH = 0x00; //計數器值高位 /
- // TIM2_CNTRL = 0x00; //計數器值低位 /
- TIM2_CR1_CEN = 1; //使能計數器
- }
- void FAN_OUT(u8 per) //更改風扇輸出比例值 百分之幾
- {
- // TIM2_CCR3H = per / 256; //捕獲/比較寄存器 3 高位 /
- TIM2_CCR3L = per % 256; //捕獲/比較寄存器 3 低位
- }
- void FAN_Temp(void) //溫控風扇
- {
- if(CH_TEMP > 166 || CH_TEMP == 0) FAN_OUT(100);// 75 度以上,風扇全速運行
- else if(CH_TEMP > temp_val)
- {
- if(CH_TEMP - temp_val > (FAN_START << 1))
- FAN_OUT((CH_TEMP - temp_val) >> 1);
- else FAN_OUT(FAN_START);
- }
- else if(temp_val - CH_TEMP > 4) FAN_OUT(0); // 低 2 度停
- }
- void IR_Init(void) //外中斷采樣
- {
- // PC_DDR_DDR3 = 0; //IR 紅外輸入 /
- PC_CR1_C13 = 1; //上拉
- PC_CR2_C23 = 1; //外中斷
-
- EXTI_CR1_PCIS = 2; //僅下降沿觸發
- // ITC_SPR2_VECT5SPR = 1; //設置最高優先級
- }
- u8 IR_Decode(void) //紅外解碼
- {
- u8 t32 = (IR_Code >> 24) & 0xff;
- u8 t24 = (IR_Code >> 16) & 0xff;
- u16 t16 = IR_Code & 0xffff;
- if(IR_num)
- {
- if((0xff00 == t16) && (t32 ^ t24 == 0))
- {
- return t24;
- }
- else IR_num = 0; //解碼出錯
- }
- return 0;
- }
- void ADC_Init(void)
- {
- // PD_DDR_DDR2 = 0; //左聲道 模擬輸入 ADC CH3 /
- // PD_CR1_C12 = 0; /
- // PD_CR2_C22 = 0; /
- //
- // PD_DDR_DDR3 = 0; //右聲道 模擬輸入 ADC CH4 /
- // PD_CR1_C13 = 0; /
- // PD_CR2_C23 = 0; /
- //
- // PD_DDR_DDR5 = 0; //溫度傳感器 模擬輸入 ADC CH5 /
- // PD_CR1_C15 = 0; /
- // PD_CR2_C25 = 0; /
- //
- // PD_DDR_DDR6 = 0; //風扇輸出電壓 模擬輸入 ADC CH6 /
- // PD_CR1_C16 = 0; /
- // PD_CR2_C26 = 0; /
-
- CLK_PCKENR2 |= 1<<3; //使能 ADC 時鐘
- // ADC_TDRH |= 0XFF; //禁止施密特觸發器高位(降低功耗)
- ADC_TDRL |= 0X78; //禁止施密特觸發器低位(ch 3,4,5,6)
- ADC_CSR_CH = 6; //設置轉換通道為 0-15
- // ADC_CR1_SPSEL = 0; //分頻因數 0-7 /
- ADC_CR1_CONT = 0; //禁用連續轉換
- // ADC_CR2_ALIGN = 0; //數據左對齊 /
- ADC_CR2_SCAN = 1; //掃描模式開
- ADC_CR3_DBUF = 1; //數據緩存開
- ADC_CR1_ADON = 1; //首次喚醒 ADC
- // Delay(1); /
- // ADC_CSR_EOC = 0; //清除結束中斷標志 /
- // ADC_CSR_EOCIE = 0; //禁用轉換結束中斷 /
- ADC_CR1_ADON = 1; //開啟 ADC 轉換
- }
- void Brightness_Init(void) //燈光亮度
- {
- PD_DDR_DDR4 = 1; // 輸出
- PD_CR1_C14 = 1;
- PD_CR2_C24 = 1;
-
- CLK_PCKENR1 |= 1<<5; //使能 TIM2 時鐘
- TIM2_CCMR1_OC1M = 6; // PWM 模式 1
- TIM2_CCMR1_OC1PE = 1; //輸出比較 1 預裝載使能 (PWM 模式必須置位)
- // TIM2_CCMR1_CC1S = 0; //CC1 通道被配置為輸出 /
- TIM2_CCER1_CC1P = 1; //OC1 低電平有效
- TIM2_CCER1_CC1E = 1; //OC1 信號輸出到對應的輸出引腳
- // TIM2_PSCR_PSC = 0; //預分頻器 0-15 fCK_PSC/2((PSC[3:0])指數) /
- // TIM2_ARRH = 100/256; //自動重裝載值高位 /
- TIM2_ARRL = 100%256; //自動重裝載值低位
- // TIM2_CCR1H = 0x00; //捕獲/比較寄存器 3 高位 /
- // TIM2_CCR1L = 0x00; //捕獲/比較寄存器 3 低位 /
- // TIM2_CNTRH = 0x00; //計數器值高位 /
- // TIM2_CNTRL = 0x00; //計數器值低位 /
- TIM2_CR1_CEN = 1; //使能計數器
- }
- void Brightness_Chang(u8 per) //亮度調節
- {
- // TIM2_CCR1H = per / 256; //捕獲/比較寄存器 3 高位 /
- TIM2_CCR1L = per % 256; //捕獲/比較寄存器 3 低位
- }
- void SPI_Init(void)
- {
- PC_DDR_DDR5 = 1; //SCLK 輸出
- PC_CR1_C15 = 1;
- PC_CR2_C25 = 1;
-
- PC_DDR_DDR6 = 1; //DS 輸出
- PC_CR1_C16 = 1;
- PC_CR2_C26 = 1;
-
- PD_DDR_DDR1 = 1; //鎖存輸出 STCP
- PD_CR1_C11 = 1;
- PD_CR2_C21 = 1;
- SPI_STCP = 1;
- /* 硬件 SPI
- CLK_PCKENR1 |= 1<<1; //使能 SPI 時鐘
- // SPI_CR1_BR = 0; //設置波特率 /
- SPI_CR1_MSTR = 1; //主設備
- SPI_CR1_CPOL = 1; //時鐘閑時電平
- SPI_CR1_CPHA = 1; //有效起始邊沿(時鐘相位)
- // SPI_CR1_LSBFIRST = 0; //幀格式(先發送高位) /
- SPI_CR1_SPE = 1; //使能 SPI */
- Brightness_Init(); //亮度調節
- }
- u16 Spectrum_1(u16 dat) //頻譜樣式 1
- {
- u8 t_l;
- u16 val;
- if(0 == dat) val = 0;
- else
- {
- t_l = (u8)sqrt(dat);
- val = (1<<t_l)-1;
- }
- return val;
- }
- u16 Spectrum_2(u16 dat)
- {
- u8 temp = dat;
- u16 val;
- if(0 == temp) val = 0x0000;
- else if(temp < spectrum_inc * 1 ) val = 0x0001;
- else if(temp < spectrum_inc * 2 ) val = 0x0003;
- else if(temp < spectrum_inc * 3 ) val = 0x0007;
- else if(temp < spectrum_inc * 4 ) val = 0x000f;
- else if(temp < spectrum_inc * 6 ) val = 0x001f;
- else if(temp < spectrum_inc * 8 ) val = 0x003f;
- else if(temp < spectrum_inc * 10 ) val = 0x007f;
- else if(temp < spectrum_inc * 12 ) val = 0x00ff;
- else if(temp < spectrum_inc * 15 ) val = 0x01ff;
- else if(temp < spectrum_inc * 18 ) val = 0x03ff;
- else if(temp < spectrum_inc * 21 ) val = 0x07ff;
- else if(temp < spectrum_inc * 24 ) val = 0x0fff;
- else if(temp < spectrum_inc * 28 ) val = 0x1fff;
- else if(temp < spectrum_inc * 33 ) val = 0x3fff;
- else if(temp < spectrum_inc * 40 ) val = 0x7fff;
- else val = 0xffff;
- return val;
- }
- u16 Spectrum_3(u16 dat)
- {
- u8 temp = dat;
- u16 val;
- if(0 == temp) val = 0x0000;
- else if(temp < spectrum_inc * 1 ) val = 0x0180;
- else if(temp < spectrum_inc * 2 ) val = 0x03c0;
- else if(temp < spectrum_inc * 4 ) val = 0x07e0;
- else if(temp < spectrum_inc * 8 ) val = 0x0ff0;
- else if(temp < spectrum_inc * 14 ) val = 0x1ff8;
- else if(temp < spectrum_inc * 21 ) val = 0x3ffc;
- else if(temp < spectrum_inc * 30 ) val = 0x7ffe;
- else if(temp < spectrum_inc * 40 ) val = 0x7fff;
- else val = 0xffff;
- return val;
- }
- u16 Spectrum_4(u16 dat)
- {
- u16 val;
- if(0 == dat) val = 0;
- else val = (Spectrum_2(dat)>>1)+1;
- return val;
- }
- void SPI_U8(u8 dat) //模擬 SPI
- {
- u8 i;
- for(i=8; i>0; i--)
- {
- if(dat & 0x80) SPI_DS = 1;
- else SPI_DS = 0;
- dat <<= 1;
- SPI_SCLK = 0;
- SPI_SCLK = 1;
- }
- }
- void SPI_OUT(u16 l_dat,u16 r_dat)
- {
- /* while(!SPI_SR_TXE); //硬件 SPI
- SPI_DR = r_dat >> 8;
- while(!SPI_SR_TXE);
- SPI_DR = r_dat & 0xff;
- while(!SPI_SR_TXE);
- SPI_DR = l_dat >> 8;
- while(!SPI_SR_TXE);
- SPI_DR = l_dat & 0xff;
- while(!SPI_SR_TXE); */
-
- SPI_U8(r_dat >> 8);
- SPI_U8(r_dat & 0xff);
- SPI_U8(l_dat >> 8);
- SPI_U8(l_dat & 0xff);
- SPI_STCP = 0;
- SPI_STCP = 1;
- SPI_STCP = 0;
- }
- void HC595_Spectrum(u8 category,u16 l,u16 r)
- {
- u16 t_l = 0,t_r = 0;
- switch(category)
- {
- case 1: //普通 + 指數
- t_l = Spectrum_1(l);
- t_r = Spectrum_1(r);
- SPI_OUT(t_l,t_r);
- break;
- case 2: //普通 + 懸停 + 自由下落
- t_l = Spectrum_2(l);
- t_r = Spectrum_2(r);
- if(t_l >= fall_l)
- {
- fall_l = t_l;
- if(0 == HOVER_TimeBaseL) HOVER_TimeBaseL = hover * 200; //左懸停
- }
- else t_l |= (fall_l>>1)+1;
- if(t_r >= fall_r)
- {
- fall_r = t_r;
- if(0 == HOVER_TimeBaseR) HOVER_TimeBaseR = hover * 200; //右懸停
- }
- else t_r |= (fall_r>>1)+1;
- SPI_OUT(t_l,t_r);
- break;
- case 3: //中間向上下擴展
- t_l = Spectrum_3(l);
- t_r = Spectrum_3(r);
- SPI_OUT(t_l,t_r);
- break;
- case 4: //單點
- t_l = Spectrum_4(l);
- t_r = Spectrum_4(r);
- SPI_OUT(t_l,t_r);
- break;
- default : mode = 0; break;
- }
- }
- void Water_Drop(void) //水滴
- {
- u8 i;
- u16 dat = 0x8000;
- Brightness_Chang(0);
- SPI_OUT(dat,dat);
- for(i=1; i!=0x00; i<<=1) //累積
- {
- Delay(100);
- Brightness_Chang(i);
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- }
- for(i=0; i<15; i++) //滴水
- {
- dat >>= 1;
- SPI_OUT(dat,dat);
- Delay(30);
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- }
- for(dat=0x0001,i=0; i<4; i++) //濺水
- {
- SPI_OUT(dat,dat);
- Delay(50);
- dat = (dat << 1) + 1;
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- }
- for(i=30; i>0; i--) //濺水到消失
- {
- Brightness_Chang(i);
- Delay(20);
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- }
- Brightness_Chang(0);
- Delay(50);
- SPI_OUT(0,0);
- Brightness_Chang(brightness); //亮度調節
- }
- void LED_Test(void) //LED 測試
- {
- SPI_OUT(0xffff,0xffff);
- Delay(500);
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- SPI_OUT(0x0000,0x0000);
- Delay(500);
- IWDG_KR = 0xaa; //獨立看門狗重裝載
- }
- void EEPROM_Data_Init(void) //數據初始化
- {
- u8 temp;
- temp = FLASH_ReadByte(EEPROM_MODE); //樣式
- if(temp < 5 && temp != 0) mode = temp;
- else
- {
- mode = 1;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_MODE);
- FLASH_ProgramByte(EEPROM_MODE,0x00);
- EEPROM_Lock();
- }
- }
-
- temp = FLASH_ReadByte(EEPROM_BRIGHTNESS); //亮度
- if(temp < 101 && temp != 0) brightness = temp;
- else
- {
- brightness = 10;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_BRIGHTNESS);
- FLASH_ProgramByte(EEPROM_BRIGHTNESS,10);
- EEPROM_Lock();
- }
- }
-
- temp = FLASH_ReadByte(EEPROM_REFRESH); //顯示刷新
- if(temp < 31 && temp != 0) refresh = temp;
- else
- {
- refresh = 2;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_REFRESH);
- FLASH_ProgramByte(EEPROM_REFRESH,2);
- EEPROM_Lock();
- }
- }
- refreshs = refresh * 50;
-
- temp = FLASH_ReadByte(EEPROM_SAMPLING); //采樣刷新
- if(temp < 51 && temp != 0) sampling = temp;//
- else
- {
- refresh = 10;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_SAMPLING);
- FLASH_ProgramByte(EEPROM_SAMPLING,10);
- EEPROM_Lock();
- }
- }
-
- temp = FLASH_ReadByte(EEPROM_HOVER); //懸停時間
- if(temp < 51 && temp != 0) hover = temp;
- else
- {
- hover = 20;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_HOVER);
- FLASH_ProgramByte(EEPROM_HOVER,10);
- EEPROM_Lock();
- }
- }
-
- temp = FLASH_ReadByte(EEPROM_FALL); //下落間隔時間
- if(temp < 21 && temp != 0) fall = temp;
- else
- {
- refresh = 10;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_FALL);
- FLASH_ProgramByte(EEPROM_FALL,10);
- EEPROM_Lock();
- }
- }
-
- temp = FLASH_ReadByte(EEPROM_SENS); //靈敏度
- if(temp < 8 && temp != 0) sensitivity = temp;
- else
- {
- sensitivity = 7;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_SENS);
- FLASH_ProgramByte(EEPROM_SENS,7);
- EEPROM_Lock();
- }
- }
- if(7 != sensitivity) spectrum_inc = sensitivity;
-
- temp = FLASH_ReadByte(EEPROM_TEMP); //啟動風扇溫度值
- if(temp <= 140 && temp >= 80) temp_val = temp;
- else
- {
- temp_val = 80;
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_TEMP);
- FLASH_ProgramByte(EEPROM_TEMP,80);
- EEPROM_Lock();
- }
- }
- }
- void Init(void)
- {
- SYSClockSet_Init();
- EEPROM_Data_Init();
- LED_Init();
- SPI_Init();
- ADC_Init();
- IR_Init();
- FAN_Init();
- TIME4_Init();
- IWDG_Init();
- asm("rim"); //使能總中斷
- }
- u16 PageSetDisplayDatR(void) //設置顯示右聲道頁面顯示的數據
- {
- u16 t_r = (ch_rh << 2);
- t_r |= ch_rl;
- t_r %= (spectrum_inc * 17);
- switch(mode)
- {
- case 1:
- t_r = Spectrum_1(t_r);
- break;
- case 2:
- t_r = Spectrum_2(t_r);
- if(t_r >= fall_r)
- {
- fall_r = t_r;
- if(0 == HOVER_TimeBaseR) HOVER_TimeBaseR = hover * 200; //右懸停
- }
- else t_r |= (fall_r>>1)+1;
- break;
- case 3:
- t_r = Spectrum_3(t_r);
- break;
- case 4:
- t_r = Spectrum_4(t_r);
- break;
- }
- return t_r;
- }
- void Page0(void) //主頁
- {
- u8 decode = IR_Decode();
- if(IR_MODE == decode)
- {
- page_num = 1; //進入設置頁面
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- }
- if(HC595_TimeBase > refreshs)
- {
- HC595_Spectrum(mode,(ch_lh<<2)|ch_ll,(ch_rh<<2) | ch_rl); //頻譜
- HC595_TimeBase -= refreshs;
- }
- }
- void Page1(void) //頻譜樣式設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_MODE) != mode)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_MODE);
- FLASH_ProgramByte(EEPROM_MODE,mode);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num = 10;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--mode == 0) mode = 4;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++mode > 4) mode = 1;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x1000 | mode, PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page2(void) //LED 亮度設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_BRIGHTNESS) != brightness)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_BRIGHTNESS);
- FLASH_ProgramByte(EEPROM_BRIGHTNESS,brightness);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--brightness == 0) brightness = 100;
- Brightness_Chang(brightness); //亮度調節
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++brightness > 100) brightness = 1;
- Brightness_Chang(brightness); //亮度調節
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x2000|brightness,PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page3(void) //LED 顯示刷新速度設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_REFRESH) != refresh)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_REFRESH);
- FLASH_ProgramByte(EEPROM_REFRESH,refresh);
- EEPROM_Lock();
- }
- refreshs = refresh * 50;
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--refresh == 0) refresh = 30;
- refreshs = refresh * 50;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++refresh > 30) refresh = 1;
- refreshs = refresh * 50;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x3000|refresh,PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page4(void) //ADC 采樣間隔時間設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_SAMPLING) != sampling)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_SAMPLING);
- FLASH_ProgramByte(EEPROM_SAMPLING,sampling);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--sampling == 0) sampling = 50;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++sampling > 50) sampling = 1;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x4000|sampling,PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page5(void) //懸停時間設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_HOVER) != hover)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_HOVER);
- FLASH_ProgramByte(EEPROM_HOVER,hover);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--hover == 0) hover = 50;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++hover > 50) hover = 1;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x5000|hover,PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page6(void) //下落間隔時間設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_FALL) != fall)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_FALL);
- FLASH_ProgramByte(EEPROM_FALL,fall);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--fall == 0) fall = 20;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++fall > 20) fall = 1;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x6000|fall,PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page7(void) //靈敏度設置頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_SENS) != sensitivity)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_SENS);
- FLASH_ProgramByte(EEPROM_SENS,sensitivity);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--sensitivity == 0) sensitivity = 7;
- if(7 != sensitivity) spectrum_inc = sensitivity;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++sensitivity > 7) sensitivity = 1;
- if(7 != sensitivity) spectrum_inc = sensitivity;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x7000|(spectrum_inc<<4)|sensitivity,PageSetDisplayDatR());
- HC595_TimeBase -= refreshs;
- }
- }
- void Page8(void) //啟動風扇溫度值設置 + 查詢風扇電壓 + 查詢溫度 頁
- {
- u8 val;
- u8 temp;
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(FLASH_ReadByte(EEPROM_TEMP) != temp_val)
- {
- asm("sim"); //關總中斷
- if(!EEPROM_UnLock())
- {
- FLASH_EraseByte(EEPROM_TEMP);
- FLASH_ProgramByte(EEPROM_TEMP,temp_val);
- EEPROM_Lock();
- }
- asm("rim"); //開總中斷
- }
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--temp_val < 80) temp_val = 140;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++temp_val > 140) temp_val = 80;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- val = CH_VOL; //風扇電壓(輸出電壓 : val * 0.8)
- temp = CH_TEMP; //采樣的溫度
- SPI_OUT(0x8000|temp_val,val << 8 | temp);
- HC595_TimeBase -= refreshs;
- }
- }
- void Page9(void) //紅外解碼顯示頁
- {
- u8 decode = IR_Decode();
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_num = 0;
- timing = 0;
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_num = 0;
- timing = 0;
- page_num ++;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- SPI_OUT(0x9000 | decode,IR_Code >> 16);
- HC595_TimeBase -= refreshs;
- }
- }
- void Page10(void) //顯示測試頁
- {
- u8 decode = IR_Decode();
- u8 static mode9 = 0;
- switch(decode)
- {
- case IR_MODE: //退出設置頁面
- page_num = 0;
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- break;
- case IR_UPP:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num --;
- break;
- case IR_LOW:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- page_num = 1;
- break;
- case IR_SUB:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(--mode9 > 1) mode9 = 1;
- break;
- case IR_ADD:
- HC595_TimeBase = refreshs;
- IR_Code = 0;
- IR_num = 0;
- timing = 0;
- if(++mode9 > 1) mode9 = 0;
- break;
- }
- if(HC595_TimeBase > refreshs)
- {
- switch(mode9)
- {
- case 0: Water_Drop(); break; //水滴
- case 1: LED_Test(); break; //測試
- }
- HC595_TimeBase -= refreshs;
- }
- }
- void PageWindows(void) //頁面窗口
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
20181018.rar
(573.07 KB, 下載次數: 38)
2018-12-2 16:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|