找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4004|回复: 0
收起左侧

stm8s103单片机功放音乐指示程序设计与制作

[复制链接]
ID:162136 发表于 2018-12-2 16:34 | 显示全部楼层 |阅读模式
首次接触 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 微信图片_20181202161139.jpg 微信图片_20181202161146.jpg 微信图片_20181202161301.jpg 微信图片_20181202161458.jpg 微信图片_20181202161150.jpg

stm8s103单片机源程序如下:
  1. /*
  2.   HC595*4 音量指示
  3.   1:SPI 驱动 HC595
  4. */
  5. #include "iostm8s103f3.h"
  6. //#include <stdlib.h>
  7. #include "math.h"
  8. #define u16 unsigned int
  9. #define u8  unsigned char
  10. #define u32 unsigned long
  11. #define uchar u8
  12. #define uint u16
  13. #define ulng u32

  14. //#define page(n) Page ## n

  15. #define LED             PB_ODR_ODR5
  16. #define SPI_STCP        PD_ODR_ODR1
  17. #define SPI_DS          PC_ODR_ODR6
  18. #define SPI_SCLK        PC_ODR_ODR5
  19. //#define SPI_OE          PD_ODR_ODR4

  20. #define IR_IN           PC_ODR_ODR3

  21. //红外摇控键值
  22. #define IR_ADD          0x09            //加
  23. #define IR_SUB          0x15            //减
  24. #define IR_UPP          0x40            //上
  25. #define IR_LOW          0x43            //下
  26. #define IR_LEFT         IR_UPP          //左
  27. #define IR_RIGHT        IR_LOW          //右
  28. #define IR_MODE         0x46            //模式
  29. #define IR_SWITCH       0x45            //开关

  30. #define CH_L            ADC_DB3RH       //左声道采样结果
  31. #define CH_R            ADC_DB4RH       //右声道采样结果
  32. #define CH_VOL          ADC_DB5RH       //电压采样结果
  33. #define CH_TEMP         ADC_DB6RH       //温度采样结果
  34. #define FAN_START       4               //风扇最低启动值

  35. #define EEPROM_MODE             0x4000          //频谱显示样式
  36. #define EEPROM_BRIGHTNESS       0x4001          //LED 亮度存储地址
  37. #define EEPROM_REFRESH          0x4002          //LED 刷新存储地址
  38. #define EEPROM_SAMPLING         0x4003          //ADC 采样存储地址
  39. #define EEPROM_HOVER            0x4004          //悬念计时存储地址
  40. #define EEPROM_FALL             0x4005          //下落间隔时间存储地址
  41. #define EEPROM_SENS             0x4006          //灵敏度校准时间存储地址
  42. #define EEPROM_TEMP             0x4007          //启动风扇温度值地址

  43. u8 ch_lh,ch_ll,ch_rh,ch_rl;     //左右声道采样高低位数据
  44. u16 SYS_TimeBase = 0;           //系统计时
  45. u8 IR_TimeBase = 0;             //红外计时
  46. u32 IR_Code = 0x00000000;       //红外编码
  47. u16 fall_l = 0,fall_r = 0;      //自由下落数据
  48. u8 page_num = 0;                //页面编号
  49. u8 IR_num = 0;                  //红外定时计数
  50. u16 HC595_TimeBase = 0;         //HC595 刷新计时
  51. u16 ADC_TimeBase = 0;           //ADC 采样计时
  52. u16 HOVER_TimeBaseL = 0;        //左悬停计时
  53. u16 HOVER_TimeBaseR = 0;        //右悬停计时
  54. u16 FALL_TimeBase = 0;          //下落计时
  55. u16 SENS_TimeBase = 0;          //灵敏度校准计时

  56. u8 spectrum_inc = 1;            //采样灵敏度递增数
  57. u8 spectrum_dat = 1;            //采样自动修正值
  58. u8 timing = 0;                  //定时退出设置页面

  59. u8 mode;                        //频谱样式
  60. u8 brightness;                  //LED 亮度
  61. u8 refresh;                     //LED 刷新间隔时间 (5ms * 1-30)
  62. u8 sampling;                    //ADC 采样间隔时间
  63. u8 hover;                       //悬停时间
  64. u8 fall;                        //下落间隔时间
  65. u8 sensitivity;                 //灵敏度
  66. u8 temp_val;                    //风扇启动温度值
  67. u8 OutOff_Flag = 0;             //关机标记

  68. u16 refreshs;                   //LED 刷新间隔时间 (5ms * refresh)

  69. void Delay(u16 xms)
  70. {
  71.   volatile u16 i;
  72.   for(; xms>0; xms--)
  73.     for(i=1300; i>0; i--);
  74. }
  75. void SYSClockSet_Init(void)
  76. {
  77.   CLK_CKDIVR_HSIDIV = 0;        //内部高速时钟设置为不分频
  78.   CLK_PCKENR1 = 0X00;           //关闭不用的外设时钟
  79.   CLK_PCKENR2 = 0X00;           //关闭不用的外设时钟
  80. }
  81. void IWDG_Init(void)    //独立看门狗初始化
  82. {
  83.   CLK_ICKR_LSIEN = 1;   //使能内部低速时钟
  84.   while(!CLK_ICKR_LSIRDY);      //等待 LSI 就绪
  85.   
  86.   IWDG_KR = 0xcc;       //启动独立看门狗
  87.   IWDG_KR = 0xaa;       //独立看门狗重装载
  88.   IWDG_KR = 0x55;       //可更改预分频值和重装载值
  89.   IWDG_PR_PR = 6;       //256 预分频
  90.   IWDG_RLR = 250;       //重装载值 = 250
  91.   IWDG_KR = 0xaa;       //独立看门狗重装载
  92. }
  93. u8 EEPROM_UnLock(void)  //EEPROM 解锁
  94. {
  95.   FLASH_DUKR = 0xae;    //第一密钥
  96.   FLASH_DUKR = 0x56;    //第二密钥
  97.   while(!FLASH_IAPSR_DUL);              //等待解密
  98.   if(1 == FLASH_IAPSR_DUL) return 0;    //解锁成功
  99.   else return 1;                        //解锁失败
  100. }
  101. void EEPROM_Lock(void)  //EEPROM 锁定
  102. {
  103.   FLASH_IAPSR_DUL = 0;
  104. }
  105. void FLASH_EraseByte(u32 address)       //擦除指定 FLASH 位置字节
  106. {
  107.   *(__near u8*)(u16)address = 0x00;
  108.   while(!FLASH_IAPSR_EOP);              //等待操作完成
  109. }
  110. void FLASH_ProgramByte(u32 address, u8 Data)    //指定 FLASH 位置写入数据
  111. {
  112.   *(__near u8*)(u16)address = Data;
  113.   while(!FLASH_IAPSR_EOP);              //等待操作完成
  114. }
  115. u8 FLASH_ReadByte(u32 address)          //读取指定 FLASH 位置数据
  116. {
  117.   return(*(__near u8*)(u16)address);
  118. }
  119. void LED_Init(void)
  120. {
  121.   PB_DDR_DDR5 = 1;      // 输出
  122.   PB_CR1_C15 = 1;
  123.   PB_CR2_C25 = 1;
  124.   PB_ODR_ODR5 = 1;      //输出高电平关闭 LED
  125. }
  126. void TIME4_Init(void)   //产生 0.1ms 基数
  127. {
  128.   CLK_PCKENR1 |= 1<<4;  //使能 TIM4 时钟
  129. //  TIM4_CR1_ARPE = 0;    //预装载禁用                       /
  130.   TIM4_PSCR_PSC = 4;    //预分频器 16 分频
  131.   TIM4_ARR = 100;       //自动重装载值
  132.   TIM4_IER_UIE = 1;     //更新中断使能
  133.   TIM4_CR1_CEN = 1;     //计数器使能
  134. //  SYS_TimeBase = 0;     //复位时间计数器 (0.1ms)            /
  135. }
  136. void FAN_Init(void)     //轴流风机调速
  137. {
  138.   PA_DDR_DDR3 = 1;      // 输出
  139.   PA_CR1_C13 = 1;
  140.   PA_CR2_C23 = 1;
  141.   
  142.   CLK_PCKENR1 |= 1<<5;  //使能 TIM2 时钟
  143.   TIM2_CCMR3_OC3M = 6;  // PWM 模式 1
  144.   TIM2_CCMR3_OC3PE = 1; //输出比较 3 预装载使能 (PWM 模式必须置位)
  145. //  TIM2_CCMR3_CC3S = 0;  //CC3 通道被配置为输出                        /
  146. //  TIM2_CCER2_CC3P = 0;  //OC3 高电平有效                              /
  147.   TIM2_CCER2_CC3E = 1;  //OC3 信号输出到对应的输出引脚
  148. //  TIM2_PSCR_PSC = 0;    //预分频器 0-15 fCK_PSC/2((PSC[3:0])指数)     /
  149.   TIM2_ARRH = 100/256;  //自动重装载值高位
  150.   TIM2_ARRL = 100%256;  //自动重装载值低位
  151. //  TIM2_CCR3H = 0x00;    //捕获/比较寄存器 3 高位                       /
  152. //  TIM2_CCR3L = 0x00;    //捕获/比较寄存器 3 低位                       /
  153. //  TIM2_CNTRH = 0x00;    //计数器值高位                                 /
  154. //  TIM2_CNTRL = 0x00;    //计数器值低位                                 /
  155.   TIM2_CR1_CEN = 1;     //使能计数器
  156. }
  157. void FAN_OUT(u8 per)   //更改风扇输出比例值 百分之几
  158. {
  159. //  TIM2_CCR3H = per / 256;       //捕获/比较寄存器 3 高位       /
  160.   TIM2_CCR3L = per % 256;       //捕获/比较寄存器 3 低位
  161. }
  162. void FAN_Temp(void)     //温控风扇
  163. {
  164.   if(CH_TEMP > 166 || CH_TEMP == 0) FAN_OUT(100);// 75 度以上,风扇全速运行
  165.   else if(CH_TEMP > temp_val)
  166.   {
  167.     if(CH_TEMP - temp_val > (FAN_START << 1))
  168.       FAN_OUT((CH_TEMP - temp_val) >> 1);
  169.     else FAN_OUT(FAN_START);
  170.   }
  171.   else if(temp_val - CH_TEMP > 4) FAN_OUT(0);   // 低 2 度停
  172. }
  173. void IR_Init(void)      //外中断采样
  174. {
  175. //  PC_DDR_DDR3 = 0;      //IR 红外输入                     /
  176.   PC_CR1_C13 = 1;       //上拉
  177.   PC_CR2_C23 = 1;       //外中断
  178.   
  179.   EXTI_CR1_PCIS = 2;   //仅下降沿触发
  180. //  ITC_SPR2_VECT5SPR = 1;        //设置最高优先级
  181. }
  182. u8 IR_Decode(void)      //红外解码
  183. {
  184.   u8 t32 = (IR_Code >> 24) & 0xff;
  185.   u8 t24 = (IR_Code >> 16) & 0xff;
  186.   u16 t16 = IR_Code & 0xffff;
  187.     if(IR_num)
  188.     {
  189.       if((0xff00 == t16) && (t32 ^ t24 == 0))
  190.       {
  191.         return t24;
  192.       }
  193.       else IR_num = 0;           //解码出错
  194.     }
  195.     return 0;
  196. }
  197. void ADC_Init(void)
  198. {  
  199. //  PD_DDR_DDR2 = 0;      //左声道 模拟输入 ADC CH3            /
  200. //  PD_CR1_C12 = 0;                                             /
  201. //  PD_CR2_C22 = 0;                                             /
  202. //  
  203. //  PD_DDR_DDR3 = 0;      //右声道 模拟输入 ADC CH4             /
  204. //  PD_CR1_C13 = 0;                                             /
  205. //  PD_CR2_C23 = 0;                                            /
  206. //  
  207. //  PD_DDR_DDR5 = 0;      //温度传感器 模拟输入 ADC CH5          /
  208. //  PD_CR1_C15 = 0;                                             /
  209. //  PD_CR2_C25 = 0;                                             /
  210. //  
  211. //  PD_DDR_DDR6 = 0;      //风扇输出电压 模拟输入 ADC CH6         /
  212. //  PD_CR1_C16 = 0;                                              /
  213. //  PD_CR2_C26 = 0;                                             /
  214.   
  215.   CLK_PCKENR2 |= 1<<3;  //使能 ADC 时钟
  216. //  ADC_TDRH |= 0XFF;     //禁止施密特触发器高位(降低功耗)
  217.   ADC_TDRL |= 0X78;     //禁止施密特触发器低位(ch 3,4,5,6)
  218.   ADC_CSR_CH = 6;       //设置转换通道为 0-15
  219. //  ADC_CR1_SPSEL = 0;    //分频因数 0-7                            /
  220.   ADC_CR1_CONT = 0;     //禁用连续转换                             
  221. //  ADC_CR2_ALIGN = 0;    //数据左对齐                               /
  222.   ADC_CR2_SCAN = 1;     //扫描模式开
  223.   ADC_CR3_DBUF = 1;     //数据缓存开
  224.   ADC_CR1_ADON = 1;     //首次唤醒 ADC
  225. //  Delay(1);                                                       /
  226. //  ADC_CSR_EOC = 0;      //清除结束中断标志                         /                           
  227. //  ADC_CSR_EOCIE = 0;    //禁用转换结束中断                         /                           
  228.   ADC_CR1_ADON = 1;     //开启 ADC 转换
  229. }
  230. void Brightness_Init(void)      //灯光亮度
  231. {
  232.   PD_DDR_DDR4 = 1;      // 输出
  233.   PD_CR1_C14 = 1;
  234.   PD_CR2_C24 = 1;
  235.   
  236.   CLK_PCKENR1 |= 1<<5;  //使能 TIM2 时钟
  237.   TIM2_CCMR1_OC1M = 6;  // PWM 模式 1
  238.   TIM2_CCMR1_OC1PE = 1; //输出比较 1 预装载使能 (PWM 模式必须置位)
  239. //  TIM2_CCMR1_CC1S = 0;  //CC1 通道被配置为输出                        /
  240.   TIM2_CCER1_CC1P = 1;  //OC1 低电平有效
  241.   TIM2_CCER1_CC1E = 1;  //OC1 信号输出到对应的输出引脚
  242. //  TIM2_PSCR_PSC = 0;    //预分频器 0-15 fCK_PSC/2((PSC[3:0])指数)    /
  243. //  TIM2_ARRH = 100/256;     //自动重装载值高位                         /
  244.   TIM2_ARRL = 100%256;     //自动重装载值低位
  245. //  TIM2_CCR1H = 0x00;    //捕获/比较寄存器 3 高位                       /
  246. //  TIM2_CCR1L = 0x00;    //捕获/比较寄存器 3 低位                       /
  247. //  TIM2_CNTRH = 0x00;    //计数器值高位                              /
  248. //  TIM2_CNTRL = 0x00;    //计数器值低位                              /
  249.   TIM2_CR1_CEN = 1;     //使能计数器
  250. }
  251. void Brightness_Chang(u8 per)   //亮度调节
  252. {
  253. //  TIM2_CCR1H = per / 256;       //捕获/比较寄存器 3 高位       /
  254.   TIM2_CCR1L = per % 256;       //捕获/比较寄存器 3 低位
  255. }
  256. void SPI_Init(void)
  257. {
  258.   PC_DDR_DDR5 = 1;      //SCLK 输出
  259.   PC_CR1_C15 = 1;
  260.   PC_CR2_C25 = 1;
  261.   
  262.   PC_DDR_DDR6 = 1;      //DS 输出
  263.   PC_CR1_C16 = 1;
  264.   PC_CR2_C26 = 1;
  265.   
  266.   PD_DDR_DDR1 = 1;      //锁存输出 STCP
  267.   PD_CR1_C11 = 1;
  268.   PD_CR2_C21 = 1;
  269.   SPI_STCP = 1;
  270. /*  硬件 SPI
  271.   CLK_PCKENR1 |= 1<<1;  //使能 SPI 时钟
  272. //  SPI_CR1_BR = 0;       //设置波特率               /
  273.   SPI_CR1_MSTR = 1;     //主设备
  274.   SPI_CR1_CPOL = 1;     //时钟闲时电平
  275.   SPI_CR1_CPHA = 1;     //有效起始边沿(时钟相位)
  276. //  SPI_CR1_LSBFIRST = 0; //帧格式(先发送高位)      /
  277.   SPI_CR1_SPE = 1;      //使能 SPI     */   
  278.   Brightness_Init();    //亮度调节
  279. }
  280. u16 Spectrum_1(u16 dat)         //频谱样式 1
  281. {
  282.   u8 t_l;
  283.   u16 val;
  284.   if(0 == dat) val = 0;
  285.   else
  286.   {
  287.     t_l = (u8)sqrt(dat);
  288.     val = (1<<t_l)-1;
  289.   }
  290.   return val;
  291. }
  292. u16 Spectrum_2(u16 dat)
  293. {
  294.   u8 temp = dat;
  295.   u16 val;
  296.   if(0 == temp) val = 0x0000;
  297.   else if(temp < spectrum_inc * 1 )     val = 0x0001;
  298.   else if(temp < spectrum_inc * 2 )     val = 0x0003;
  299.   else if(temp < spectrum_inc * 3 )     val = 0x0007;
  300.   else if(temp < spectrum_inc * 4 )     val = 0x000f;
  301.   else if(temp < spectrum_inc * 6 )     val = 0x001f;
  302.   else if(temp < spectrum_inc * 8 )     val = 0x003f;
  303.   else if(temp < spectrum_inc * 10 )    val = 0x007f;
  304.   else if(temp < spectrum_inc * 12 )    val = 0x00ff;
  305.   else if(temp < spectrum_inc * 15 )    val = 0x01ff;
  306.   else if(temp < spectrum_inc * 18 )    val = 0x03ff;
  307.   else if(temp < spectrum_inc * 21 )    val = 0x07ff;
  308.   else if(temp < spectrum_inc * 24 )    val = 0x0fff;
  309.   else if(temp < spectrum_inc * 28 )    val = 0x1fff;
  310.   else if(temp < spectrum_inc * 33 )    val = 0x3fff;
  311.   else if(temp < spectrum_inc * 40 )    val = 0x7fff;
  312.   else val = 0xffff;
  313.   return val;
  314. }
  315. u16 Spectrum_3(u16 dat)
  316. {
  317.   u8 temp = dat;
  318.   u16 val;
  319.   if(0 == temp) val = 0x0000;
  320.   else if(temp < spectrum_inc * 1 )     val = 0x0180;
  321.   else if(temp < spectrum_inc * 2 )     val = 0x03c0;
  322.   else if(temp < spectrum_inc * 4 )     val = 0x07e0;
  323.   else if(temp < spectrum_inc * 8 )     val = 0x0ff0;
  324.   else if(temp < spectrum_inc * 14 )    val = 0x1ff8;
  325.   else if(temp < spectrum_inc * 21 )    val = 0x3ffc;
  326.   else if(temp < spectrum_inc * 30 )    val = 0x7ffe;
  327.   else if(temp < spectrum_inc * 40 )    val = 0x7fff;
  328.   else val = 0xffff;
  329.   return val;
  330. }
  331. u16 Spectrum_4(u16 dat)
  332. {
  333.   u16 val;
  334.   if(0 == dat) val = 0;
  335.   else val = (Spectrum_2(dat)>>1)+1;
  336.   return val;
  337. }
  338. void SPI_U8(u8 dat)             //模拟 SPI
  339. {
  340.   u8 i;
  341.   for(i=8; i>0; i--)
  342.   {
  343.     if(dat & 0x80) SPI_DS = 1;
  344.     else SPI_DS = 0;
  345.     dat <<= 1;
  346.     SPI_SCLK = 0;
  347.     SPI_SCLK = 1;
  348.   }
  349. }
  350. void SPI_OUT(u16 l_dat,u16 r_dat)
  351. {
  352. /*  while(!SPI_SR_TXE);         //硬件 SPI
  353.   SPI_DR = r_dat >> 8;
  354.   while(!SPI_SR_TXE);
  355.   SPI_DR = r_dat & 0xff;
  356.   while(!SPI_SR_TXE);
  357.   SPI_DR = l_dat >> 8;
  358.   while(!SPI_SR_TXE);
  359.   SPI_DR = l_dat & 0xff;
  360.   while(!SPI_SR_TXE);   */
  361.   
  362.   SPI_U8(r_dat >> 8);
  363.   SPI_U8(r_dat & 0xff);
  364.   SPI_U8(l_dat >> 8);
  365.   SPI_U8(l_dat & 0xff);
  366.   SPI_STCP = 0;
  367.   SPI_STCP = 1;
  368.   SPI_STCP = 0;
  369. }
  370. void HC595_Spectrum(u8 category,u16 l,u16 r)
  371. {
  372.   u16 t_l = 0,t_r = 0;
  373.   switch(category)
  374.   {
  375.     case 1:                       //普通 + 指数
  376.       t_l = Spectrum_1(l);
  377.       t_r = Spectrum_1(r);
  378.       SPI_OUT(t_l,t_r);
  379.       break;
  380.     case 2:                       //普通 + 悬停 + 自由下落
  381.       t_l = Spectrum_2(l);
  382.       t_r = Spectrum_2(r);
  383.       if(t_l >= fall_l)
  384.       {
  385.         fall_l = t_l;
  386.         if(0 == HOVER_TimeBaseL) HOVER_TimeBaseL = hover * 200; //左悬停
  387.       }
  388.       else t_l |= (fall_l>>1)+1;
  389.       if(t_r >= fall_r)
  390.       {
  391.         fall_r = t_r;
  392.         if(0 == HOVER_TimeBaseR) HOVER_TimeBaseR = hover * 200; //右悬停
  393.       }
  394.       else t_r |= (fall_r>>1)+1;
  395.       SPI_OUT(t_l,t_r);
  396.       break;
  397.     case 3:                       //中间向上下扩展
  398.       t_l = Spectrum_3(l);
  399.       t_r = Spectrum_3(r);
  400.       SPI_OUT(t_l,t_r);
  401.       break;
  402.     case 4:                       //单点
  403.       t_l = Spectrum_4(l);
  404.       t_r = Spectrum_4(r);
  405.       SPI_OUT(t_l,t_r);
  406.       break;
  407.     default : mode = 0; break;
  408.   }
  409. }
  410. void Water_Drop(void)   //水滴
  411. {
  412.   u8 i;
  413.   u16 dat = 0x8000;
  414.   Brightness_Chang(0);
  415.   SPI_OUT(dat,dat);
  416.   for(i=1; i!=0x00; i<<=1)      //累积
  417.   {
  418.     Delay(100);
  419.     Brightness_Chang(i);
  420.     IWDG_KR = 0xaa;             //独立看门狗重装载
  421.   }
  422.   for(i=0; i<15; i++)           //滴水
  423.   {
  424.     dat >>= 1;
  425.     SPI_OUT(dat,dat);
  426.     Delay(30);
  427.     IWDG_KR = 0xaa;             //独立看门狗重装载
  428.   }
  429.   for(dat=0x0001,i=0; i<4; i++) //溅水
  430.   {
  431.     SPI_OUT(dat,dat);
  432.     Delay(50);
  433.     dat = (dat << 1) + 1;
  434.     IWDG_KR = 0xaa;             //独立看门狗重装载
  435.   }
  436.   for(i=30; i>0; i--)           //溅水到消失
  437.   {
  438.     Brightness_Chang(i);
  439.     Delay(20);
  440.     IWDG_KR = 0xaa;             //独立看门狗重装载
  441.   }
  442.   Brightness_Chang(0);
  443.   Delay(50);
  444.   SPI_OUT(0,0);
  445.   Brightness_Chang(brightness);             //亮度调节
  446. }
  447. void LED_Test(void)     //LED 测试
  448. {
  449.   SPI_OUT(0xffff,0xffff);
  450.   Delay(500);
  451.   IWDG_KR = 0xaa;             //独立看门狗重装载
  452.   SPI_OUT(0x0000,0x0000);
  453.   Delay(500);
  454.   IWDG_KR = 0xaa;             //独立看门狗重装载
  455. }
  456. void EEPROM_Data_Init(void)    //数据初始化
  457. {
  458.   u8 temp;
  459.   temp = FLASH_ReadByte(EEPROM_MODE);           //样式
  460.   if(temp < 5 && temp != 0) mode = temp;
  461.   else
  462.   {
  463.     mode = 1;
  464.     if(!EEPROM_UnLock())
  465.     {
  466.       FLASH_EraseByte(EEPROM_MODE);
  467.       FLASH_ProgramByte(EEPROM_MODE,0x00);
  468.       EEPROM_Lock();
  469.     }
  470.   }
  471.   
  472.   temp = FLASH_ReadByte(EEPROM_BRIGHTNESS);     //亮度
  473.   if(temp < 101 && temp != 0) brightness = temp;
  474.   else
  475.   {
  476.     brightness = 10;
  477.     if(!EEPROM_UnLock())
  478.     {
  479.       FLASH_EraseByte(EEPROM_BRIGHTNESS);
  480.       FLASH_ProgramByte(EEPROM_BRIGHTNESS,10);
  481.       EEPROM_Lock();
  482.     }
  483.   }
  484.   
  485.   temp = FLASH_ReadByte(EEPROM_REFRESH);        //显示刷新
  486.   if(temp < 31 && temp != 0) refresh = temp;
  487.   else
  488.   {
  489.     refresh = 2;
  490.     if(!EEPROM_UnLock())
  491.     {
  492.       FLASH_EraseByte(EEPROM_REFRESH);
  493.       FLASH_ProgramByte(EEPROM_REFRESH,2);
  494.       EEPROM_Lock();
  495.     }
  496.   }
  497.   refreshs = refresh * 50;
  498.   
  499.   temp = FLASH_ReadByte(EEPROM_SAMPLING);       //采样刷新
  500.   if(temp < 51 && temp != 0) sampling = temp;//
  501.   else
  502.   {
  503.     refresh = 10;
  504.     if(!EEPROM_UnLock())
  505.     {
  506.       FLASH_EraseByte(EEPROM_SAMPLING);
  507.       FLASH_ProgramByte(EEPROM_SAMPLING,10);
  508.       EEPROM_Lock();
  509.     }
  510.   }
  511.   
  512.   temp = FLASH_ReadByte(EEPROM_HOVER);           //悬停时间
  513.   if(temp < 51 && temp != 0) hover = temp;
  514.   else
  515.   {
  516.     hover = 20;
  517.     if(!EEPROM_UnLock())
  518.     {
  519.       FLASH_EraseByte(EEPROM_HOVER);
  520.       FLASH_ProgramByte(EEPROM_HOVER,10);
  521.       EEPROM_Lock();
  522.     }
  523.   }
  524.   
  525.   temp = FLASH_ReadByte(EEPROM_FALL);           //下落间隔时间
  526.   if(temp < 21 && temp != 0) fall = temp;
  527.   else
  528.   {
  529.     refresh = 10;
  530.     if(!EEPROM_UnLock())
  531.     {
  532.       FLASH_EraseByte(EEPROM_FALL);
  533.       FLASH_ProgramByte(EEPROM_FALL,10);
  534.       EEPROM_Lock();
  535.     }
  536.   }
  537.   
  538.   temp = FLASH_ReadByte(EEPROM_SENS);           //灵敏度
  539.   if(temp < 8 && temp != 0) sensitivity = temp;
  540.   else
  541.   {
  542.     sensitivity = 7;
  543.     if(!EEPROM_UnLock())
  544.     {
  545.       FLASH_EraseByte(EEPROM_SENS);
  546.       FLASH_ProgramByte(EEPROM_SENS,7);
  547.       EEPROM_Lock();
  548.     }
  549.   }
  550.   if(7 != sensitivity) spectrum_inc = sensitivity;
  551.   
  552.   temp = FLASH_ReadByte(EEPROM_TEMP);           //启动风扇温度值
  553.   if(temp <= 140 && temp >= 80) temp_val = temp;
  554.   else
  555.   {
  556.     temp_val = 80;
  557.     if(!EEPROM_UnLock())
  558.     {
  559.       FLASH_EraseByte(EEPROM_TEMP);
  560.       FLASH_ProgramByte(EEPROM_TEMP,80);
  561.       EEPROM_Lock();
  562.     }
  563.   }
  564. }
  565. void Init(void)
  566. {
  567.   SYSClockSet_Init();
  568.   EEPROM_Data_Init();
  569.   LED_Init();
  570.   SPI_Init();
  571.   ADC_Init();
  572.   IR_Init();
  573.   FAN_Init();
  574.   TIME4_Init();
  575.   IWDG_Init();
  576.   asm("rim");           //使能总中断
  577. }
  578. u16 PageSetDisplayDatR(void)        //设置显示右声道页面显示的数据
  579. {
  580.   u16 t_r = (ch_rh << 2);
  581.   t_r |= ch_rl;
  582.   t_r %= (spectrum_inc * 17);
  583.   switch(mode)
  584.   {
  585.     case 1:
  586.       t_r = Spectrum_1(t_r);
  587.       break;
  588.     case 2:
  589.       t_r = Spectrum_2(t_r);
  590.       if(t_r >= fall_r)
  591.       {
  592.         fall_r = t_r;
  593.         if(0 == HOVER_TimeBaseR) HOVER_TimeBaseR = hover * 200; //右悬停
  594.       }
  595.       else t_r |= (fall_r>>1)+1;
  596.       break;
  597.     case 3:
  598.       t_r = Spectrum_3(t_r);
  599.       break;
  600.     case 4:
  601.       t_r = Spectrum_4(t_r);
  602.       break;
  603.   }
  604.   return t_r;
  605. }
  606. void Page0(void)        //主页
  607. {
  608.   u8 decode = IR_Decode();
  609.   if(IR_MODE == decode)
  610.   {
  611.     page_num = 1;                       //进入设置页面
  612.     HC595_TimeBase = refreshs;
  613.     IR_Code = 0;
  614.     IR_num = 0;
  615.   }
  616.   if(HC595_TimeBase > refreshs)
  617.   {              
  618.     HC595_Spectrum(mode,(ch_lh<<2)|ch_ll,(ch_rh<<2) | ch_rl);   //频谱
  619.     HC595_TimeBase -= refreshs;
  620.   }
  621. }
  622. void Page1(void)        //频谱样式设置页
  623. {
  624.   u8 decode = IR_Decode();
  625.   switch(decode)
  626.   {
  627.     case IR_MODE:                   //退出设置页面
  628.       page_num = 0;
  629.       HC595_TimeBase = refreshs;
  630.       IR_Code = 0;
  631.       IR_num = 0;
  632.       timing = 0;
  633.       if(FLASH_ReadByte(EEPROM_MODE) != mode)
  634.       {
  635.         asm("sim");                 //关总中断
  636.         if(!EEPROM_UnLock())
  637.         {
  638.           FLASH_EraseByte(EEPROM_MODE);
  639.           FLASH_ProgramByte(EEPROM_MODE,mode);
  640.           EEPROM_Lock();
  641.         }
  642.         asm("rim");                 //开总中断
  643.        }
  644.       break;
  645.     case IR_UPP:
  646.       HC595_TimeBase = refreshs;
  647.       IR_Code = 0;
  648.       IR_num = 0;
  649.       timing = 0;
  650.       page_num = 10;
  651.       break;
  652.     case IR_LOW:
  653.       HC595_TimeBase = refreshs;
  654.       IR_Code = 0;
  655.       IR_num = 0;
  656.       timing = 0;
  657.       page_num ++;
  658.       break;
  659.     case IR_SUB:
  660.       HC595_TimeBase = refreshs;
  661.       IR_Code = 0;
  662.       IR_num = 0;
  663.       timing = 0;
  664.       if(--mode == 0) mode = 4;
  665.       break;
  666.     case IR_ADD:
  667.       HC595_TimeBase = refreshs;
  668.       IR_Code = 0;
  669.       IR_num = 0;
  670.       timing = 0;
  671.       if(++mode > 4) mode = 1;
  672.       break;
  673.   }
  674.   if(HC595_TimeBase > refreshs)
  675.   {   
  676.     SPI_OUT(0x1000 | mode, PageSetDisplayDatR());
  677.     HC595_TimeBase -= refreshs;
  678.   }
  679. }
  680. void Page2(void)        //LED 亮度设置页
  681. {
  682.   u8 decode = IR_Decode();
  683.   switch(decode)
  684.   {
  685.     case IR_MODE:                   //退出设置页面
  686.       page_num = 0;
  687.       HC595_TimeBase = refreshs;
  688.       IR_Code = 0;
  689.       IR_num = 0;
  690.       timing = 0;
  691.       if(FLASH_ReadByte(EEPROM_BRIGHTNESS) != brightness)
  692.       {
  693.         asm("sim");                 //关总中断
  694.         if(!EEPROM_UnLock())
  695.         {
  696.           FLASH_EraseByte(EEPROM_BRIGHTNESS);
  697.           FLASH_ProgramByte(EEPROM_BRIGHTNESS,brightness);
  698.           EEPROM_Lock();
  699.         }
  700.         asm("rim");                 //开总中断
  701.        }
  702.       break;
  703.     case IR_UPP:
  704.       HC595_TimeBase = refreshs;
  705.       IR_Code = 0;
  706.       IR_num = 0;
  707.       timing = 0;
  708.       page_num --;
  709.       break;
  710.     case IR_LOW:
  711.       HC595_TimeBase = refreshs;
  712.       IR_Code = 0;
  713.       IR_num = 0;
  714.       timing = 0;
  715.       page_num ++;
  716.       break;
  717.     case IR_SUB:
  718.       HC595_TimeBase = refreshs;
  719.       IR_Code = 0;
  720.       IR_num = 0;
  721.       timing = 0;
  722.       if(--brightness == 0) brightness = 100;
  723.       Brightness_Chang(brightness);             //亮度调节
  724.       break;
  725.     case IR_ADD:
  726.       HC595_TimeBase = refreshs;
  727.       IR_Code = 0;
  728.       IR_num = 0;
  729.       timing = 0;
  730.       if(++brightness > 100) brightness = 1;
  731.       Brightness_Chang(brightness);             //亮度调节
  732.       break;
  733.   }
  734.   if(HC595_TimeBase > refreshs)
  735.   {
  736.     SPI_OUT(0x2000|brightness,PageSetDisplayDatR());
  737.     HC595_TimeBase -= refreshs;
  738.   }
  739. }
  740. void Page3(void)        //LED 显示刷新速度设置页
  741. {
  742.   u8 decode = IR_Decode();
  743.   switch(decode)
  744.   {
  745.     case IR_MODE:                   //退出设置页面
  746.       page_num = 0;
  747.       HC595_TimeBase = refreshs;
  748.       IR_Code = 0;
  749.       IR_num = 0;
  750.       timing = 0;
  751.       if(FLASH_ReadByte(EEPROM_REFRESH) != refresh)
  752.       {
  753.         asm("sim");                 //关总中断
  754.         if(!EEPROM_UnLock())
  755.         {
  756.           FLASH_EraseByte(EEPROM_REFRESH);
  757.           FLASH_ProgramByte(EEPROM_REFRESH,refresh);
  758.           EEPROM_Lock();
  759.         }
  760.         refreshs = refresh * 50;
  761.         asm("rim");                 //开总中断
  762.        }
  763.       break;
  764.     case IR_UPP:
  765.       HC595_TimeBase = refreshs;
  766.       IR_Code = 0;
  767.       IR_num = 0;
  768.       timing = 0;
  769.       page_num --;
  770.       break;
  771.     case IR_LOW:
  772.       HC595_TimeBase = refreshs;
  773.       IR_Code = 0;
  774.       IR_num = 0;
  775.       timing = 0;
  776.       page_num ++;
  777.       break;
  778.     case IR_SUB:
  779.       HC595_TimeBase = refreshs;
  780.       IR_Code = 0;
  781.       IR_num = 0;
  782.       timing = 0;
  783.       if(--refresh == 0) refresh = 30;
  784.       refreshs = refresh * 50;
  785.       break;
  786.     case IR_ADD:
  787.       HC595_TimeBase = refreshs;
  788.       IR_Code = 0;
  789.       IR_num = 0;
  790.       timing = 0;
  791.       if(++refresh > 30) refresh = 1;
  792.       refreshs = refresh * 50;
  793.       break;
  794.   }
  795.   if(HC595_TimeBase > refreshs)
  796.   {
  797.     SPI_OUT(0x3000|refresh,PageSetDisplayDatR());
  798.     HC595_TimeBase -= refreshs;
  799.   }
  800. }
  801. void Page4(void)        //ADC 采样间隔时间设置页
  802. {
  803.   u8 decode = IR_Decode();
  804.   switch(decode)
  805.   {
  806.     case IR_MODE:                   //退出设置页面
  807.       page_num = 0;
  808.       HC595_TimeBase = refreshs;
  809.       IR_Code = 0;
  810.       IR_num = 0;
  811.       timing = 0;
  812.       if(FLASH_ReadByte(EEPROM_SAMPLING) != sampling)
  813.       {
  814.         asm("sim");                 //关总中断
  815.         if(!EEPROM_UnLock())
  816.         {
  817.           FLASH_EraseByte(EEPROM_SAMPLING);
  818.           FLASH_ProgramByte(EEPROM_SAMPLING,sampling);
  819.           EEPROM_Lock();
  820.         }
  821.         asm("rim");                 //开总中断
  822.        }
  823.       break;
  824.     case IR_UPP:
  825.       HC595_TimeBase = refreshs;
  826.       IR_Code = 0;
  827.       IR_num = 0;
  828.       timing = 0;
  829.       page_num --;
  830.       break;
  831.     case IR_LOW:
  832.       HC595_TimeBase = refreshs;
  833.       IR_Code = 0;
  834.       IR_num = 0;
  835.       timing = 0;
  836.       page_num ++;
  837.       break;
  838.     case IR_SUB:
  839.       HC595_TimeBase = refreshs;
  840.       IR_Code = 0;
  841.       IR_num = 0;
  842.       timing = 0;
  843.       if(--sampling == 0) sampling = 50;
  844.       break;
  845.     case IR_ADD:
  846.       HC595_TimeBase = refreshs;
  847.       IR_Code = 0;
  848.       IR_num = 0;
  849.       timing = 0;
  850.       if(++sampling > 50) sampling = 1;
  851.       break;
  852.   }
  853.   if(HC595_TimeBase > refreshs)
  854.   {
  855.     SPI_OUT(0x4000|sampling,PageSetDisplayDatR());
  856.     HC595_TimeBase -= refreshs;
  857.   }
  858. }
  859. void Page5(void)        //悬停时间设置页
  860. {
  861.   u8 decode = IR_Decode();
  862.   switch(decode)
  863.   {
  864.     case IR_MODE:                   //退出设置页面
  865.       page_num = 0;
  866.       HC595_TimeBase = refreshs;
  867.       IR_Code = 0;
  868.       IR_num = 0;
  869.       timing = 0;
  870.       if(FLASH_ReadByte(EEPROM_HOVER) != hover)
  871.       {
  872.         asm("sim");                 //关总中断
  873.         if(!EEPROM_UnLock())
  874.         {
  875.           FLASH_EraseByte(EEPROM_HOVER);
  876.           FLASH_ProgramByte(EEPROM_HOVER,hover);
  877.           EEPROM_Lock();
  878.         }
  879.         asm("rim");                 //开总中断
  880.        }
  881.       break;
  882.     case IR_UPP:
  883.       HC595_TimeBase = refreshs;
  884.       IR_Code = 0;
  885.       IR_num = 0;
  886.       timing = 0;
  887.       page_num --;
  888.       break;
  889.     case IR_LOW:
  890.       HC595_TimeBase = refreshs;
  891.       IR_Code = 0;
  892.       IR_num = 0;
  893.       timing = 0;
  894.       page_num ++;
  895.       break;
  896.     case IR_SUB:
  897.       HC595_TimeBase = refreshs;
  898.       IR_Code = 0;
  899.       IR_num = 0;
  900.       timing = 0;
  901.       if(--hover == 0) hover = 50;
  902.       break;
  903.     case IR_ADD:
  904.       HC595_TimeBase = refreshs;
  905.       IR_Code = 0;
  906.       IR_num = 0;
  907.       timing = 0;
  908.       if(++hover > 50) hover = 1;
  909.       break;
  910.   }
  911.   if(HC595_TimeBase > refreshs)
  912.   {
  913.     SPI_OUT(0x5000|hover,PageSetDisplayDatR());
  914.     HC595_TimeBase -= refreshs;
  915.   }
  916. }
  917. void Page6(void)        //下落间隔时间设置页
  918. {
  919.   u8 decode = IR_Decode();
  920.   switch(decode)
  921.   {
  922.     case IR_MODE:                   //退出设置页面
  923.       page_num = 0;
  924.       HC595_TimeBase = refreshs;
  925.       IR_Code = 0;
  926.       IR_num = 0;
  927.       timing = 0;
  928.       if(FLASH_ReadByte(EEPROM_FALL) != fall)
  929.       {
  930.         asm("sim");                 //关总中断
  931.         if(!EEPROM_UnLock())
  932.         {
  933.           FLASH_EraseByte(EEPROM_FALL);
  934.           FLASH_ProgramByte(EEPROM_FALL,fall);
  935.           EEPROM_Lock();
  936.         }
  937.         asm("rim");                 //开总中断
  938.        }
  939.       break;
  940.     case IR_UPP:
  941.       HC595_TimeBase = refreshs;
  942.       IR_Code = 0;
  943.       IR_num = 0;
  944.       timing = 0;
  945.       page_num --;
  946.       break;
  947.     case IR_LOW:
  948.       HC595_TimeBase = refreshs;
  949.       IR_Code = 0;
  950.       IR_num = 0;
  951.       timing = 0;
  952.       page_num ++;
  953.       break;
  954.     case IR_SUB:
  955.       HC595_TimeBase = refreshs;
  956.       IR_Code = 0;
  957.       IR_num = 0;
  958.       timing = 0;
  959.       if(--fall == 0) fall = 20;
  960.       break;
  961.     case IR_ADD:
  962.       HC595_TimeBase = refreshs;
  963.       IR_Code = 0;
  964.       IR_num = 0;
  965.       timing = 0;
  966.       if(++fall > 20) fall = 1;
  967.       break;
  968.   }
  969.   if(HC595_TimeBase > refreshs)
  970.   {
  971.     SPI_OUT(0x6000|fall,PageSetDisplayDatR());
  972.     HC595_TimeBase -= refreshs;
  973.   }
  974. }
  975. void Page7(void)        //灵敏度设置页
  976. {
  977.   u8 decode = IR_Decode();
  978.   switch(decode)
  979.   {
  980.     case IR_MODE:                   //退出设置页面
  981.       page_num = 0;
  982.       HC595_TimeBase = refreshs;
  983.       IR_Code = 0;
  984.       IR_num = 0;
  985.       timing = 0;
  986.       if(FLASH_ReadByte(EEPROM_SENS) != sensitivity)
  987.       {
  988.         asm("sim");                 //关总中断
  989.         if(!EEPROM_UnLock())
  990.         {
  991.           FLASH_EraseByte(EEPROM_SENS);
  992.           FLASH_ProgramByte(EEPROM_SENS,sensitivity);
  993.           EEPROM_Lock();
  994.         }
  995.         asm("rim");                 //开总中断
  996.        }
  997.       break;
  998.     case IR_UPP:
  999.       HC595_TimeBase = refreshs;
  1000.       IR_Code = 0;
  1001.       IR_num = 0;
  1002.       timing = 0;
  1003.       page_num --;
  1004.       break;
  1005.     case IR_LOW:
  1006.       HC595_TimeBase = refreshs;
  1007.       IR_Code = 0;
  1008.       IR_num = 0;
  1009.       timing = 0;
  1010.       page_num ++;
  1011.       break;
  1012.     case IR_SUB:
  1013.       HC595_TimeBase = refreshs;
  1014.       IR_Code = 0;
  1015.       IR_num = 0;
  1016.       timing = 0;
  1017.       if(--sensitivity == 0) sensitivity = 7;
  1018.       if(7 != sensitivity) spectrum_inc = sensitivity;
  1019.       break;
  1020.     case IR_ADD:
  1021.       HC595_TimeBase = refreshs;
  1022.       IR_Code = 0;
  1023.       IR_num = 0;
  1024.       timing = 0;
  1025.       if(++sensitivity > 7) sensitivity = 1;
  1026.       if(7 != sensitivity) spectrum_inc = sensitivity;
  1027.       break;
  1028.   }
  1029.   if(HC595_TimeBase > refreshs)
  1030.   {
  1031.     SPI_OUT(0x7000|(spectrum_inc<<4)|sensitivity,PageSetDisplayDatR());
  1032.     HC595_TimeBase -= refreshs;
  1033.   }
  1034. }
  1035. void Page8(void)        //启动风扇温度值设置 + 查询风扇电压 + 查询温度 页
  1036. {
  1037.   u8 val;
  1038.   u8 temp;
  1039.   u8 decode = IR_Decode();
  1040.   switch(decode)
  1041.   {
  1042.     case IR_MODE:                   //退出设置页面
  1043.       page_num = 0;
  1044.       HC595_TimeBase = refreshs;
  1045.       IR_Code = 0;
  1046.       IR_num = 0;
  1047.       timing = 0;
  1048.       if(FLASH_ReadByte(EEPROM_TEMP) != temp_val)
  1049.       {
  1050.         asm("sim");                 //关总中断
  1051.         if(!EEPROM_UnLock())
  1052.         {
  1053.           FLASH_EraseByte(EEPROM_TEMP);
  1054.           FLASH_ProgramByte(EEPROM_TEMP,temp_val);
  1055.           EEPROM_Lock();
  1056.         }
  1057.         asm("rim");                 //开总中断
  1058.        }
  1059.       break;
  1060.     case IR_UPP:
  1061.       HC595_TimeBase = refreshs;
  1062.       IR_Code = 0;
  1063.       IR_num = 0;
  1064.       timing = 0;
  1065.       page_num --;
  1066.       break;
  1067.     case IR_LOW:
  1068.       HC595_TimeBase = refreshs;
  1069.       IR_Code = 0;
  1070.       IR_num = 0;
  1071.       timing = 0;
  1072.       page_num ++;
  1073.       break;
  1074.     case IR_SUB:
  1075.       HC595_TimeBase = refreshs;
  1076.       IR_Code = 0;
  1077.       IR_num = 0;
  1078.       timing = 0;
  1079.       if(--temp_val < 80) temp_val = 140;
  1080.       break;
  1081.     case IR_ADD:
  1082.       HC595_TimeBase = refreshs;
  1083.       IR_Code = 0;
  1084.       IR_num = 0;
  1085.       timing = 0;
  1086.       if(++temp_val > 140) temp_val = 80;
  1087.       break;
  1088.   }
  1089.   if(HC595_TimeBase > refreshs)
  1090.   {
  1091.     val = CH_VOL;       //风扇电压(输出电压 : val * 0.8)
  1092.     temp = CH_TEMP;     //采样的温度
  1093.     SPI_OUT(0x8000|temp_val,val << 8 | temp);
  1094.     HC595_TimeBase -= refreshs;
  1095.   }
  1096. }
  1097. void Page9(void)        //红外解码显示页
  1098. {
  1099.   u8 decode = IR_Decode();
  1100.   switch(decode)
  1101.   {
  1102.     case IR_MODE:                   //退出设置页面
  1103.       page_num = 0;
  1104.       HC595_TimeBase = refreshs;
  1105.       IR_num = 0;
  1106.       timing = 0;
  1107.       break;
  1108.     case IR_UPP:
  1109.       HC595_TimeBase = refreshs;
  1110.       IR_num = 0;
  1111.       timing = 0;
  1112.       page_num --;
  1113.       break;
  1114.     case IR_LOW:
  1115.       HC595_TimeBase = refreshs;
  1116.       IR_num = 0;
  1117.       timing = 0;
  1118.       page_num ++;
  1119.       break;
  1120.   }
  1121.   if(HC595_TimeBase > refreshs)
  1122.   {
  1123.     SPI_OUT(0x9000 | decode,IR_Code >> 16);
  1124.     HC595_TimeBase -= refreshs;
  1125.   }
  1126. }
  1127. void Page10(void)       //显示测试页
  1128. {
  1129.   u8 decode = IR_Decode();
  1130.   u8 static mode9 = 0;
  1131.   switch(decode)
  1132.   {
  1133.     case IR_MODE:                   //退出设置页面
  1134.       page_num = 0;
  1135.       HC595_TimeBase = refreshs;
  1136.       IR_Code = 0;
  1137.       IR_num = 0;
  1138.       timing = 0;
  1139.       break;
  1140.     case IR_UPP:
  1141.       HC595_TimeBase = refreshs;
  1142.       IR_Code = 0;
  1143.       IR_num = 0;
  1144.       timing = 0;
  1145.       page_num --;
  1146.       break;
  1147.     case IR_LOW:
  1148.       HC595_TimeBase = refreshs;
  1149.       IR_Code = 0;
  1150.       IR_num = 0;
  1151.       timing = 0;
  1152.       page_num = 1;
  1153.       break;
  1154.     case IR_SUB:
  1155.       HC595_TimeBase = refreshs;
  1156.       IR_Code = 0;
  1157.       IR_num = 0;
  1158.       timing = 0;
  1159.       if(--mode9 > 1) mode9 = 1;
  1160.       break;
  1161.     case IR_ADD:
  1162.       HC595_TimeBase = refreshs;
  1163.       IR_Code = 0;
  1164.       IR_num = 0;
  1165.       timing = 0;
  1166.       if(++mode9 > 1) mode9 = 0;
  1167.       break;
  1168.   }
  1169.   if(HC595_TimeBase > refreshs)
  1170.   {
  1171.     switch(mode9)
  1172.     {
  1173.       case 0:   Water_Drop();   break;  //水滴
  1174.       case 1:   LED_Test();     break;  //测试
  1175.     }
  1176.     HC595_TimeBase -= refreshs;
  1177.   }
  1178. }
  1179. void PageWindows(void)  //页面窗口
  1180. {
  1181. ……………………

  1182. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
20181018.rar (573.07 KB, 下载次数: 36)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表