找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 421|回复: 2
收起左侧

晟矽微MC30P6270C单片机LED的呼吸与渐变程序

[复制链接]
十三丶dream 发表于 2020-12-3 18:42 | 显示全部楼层 |阅读模式
  1. /******************************************************************************
  2. ;  *    @Create Date         : 2020.12.03
  3. ;  *    @Author/Corporation  : 有趣的金鱼
  4. ;  *----------------------Abstract Description---------------------------------
  5.     本程序采用晟矽微6270单片机底层,适用于晟矽微6270系列单片机
  6. ******************************************************************************/
  7. #include "user.h"
  8. /************************************************
  9. ;  *    @Function Name       : CLR_RAM
  10. ;  *    @Description         : 初始化RAM
  11. ;  *    @IN_Parameter        :
  12. ;  *    @Return parameter    :
  13. ;  ***********************************************/  
  14. void CLR_RAM(void)
  15. {               
  16.     __asm
  17.         movai   0x40
  18.         movra   FSR
  19.         movai   48
  20.         movra   0x07
  21.         decr    FSR
  22.         clrr    INDF
  23.         djzr    0x07
  24.         goto    $-3
  25.         clrr    0x07
  26.         clrr    0x05
  27.     __endasm;           
  28. }
  29. /************************************************
  30. ;  *    @Function Name       : ConfigSet
  31. ;  *    @Description         : 初设置io  pwm  定时器等
  32. ;  *    @IN_Parameter        :
  33. ;  *    @Return parameter    :
  34. ;  ***********************************************/
  35. void ConfigSet(void)
  36. {
  37.     P1 = 0x00;
  38.     DDR1 = 0x18;    //1:input 0:output
  39.     PUCON = 0xf7;   //0:Effective 1:invalid
  40.     PDCON = 0xff;   //0:Effective 1:invalid
  41.     ODCON = 0x00;   //0:推挽输出      1:开漏输出
  42.     /*****************定时器0**************************************/
  43.    
  44.     //T0CR = 0x84; //时钟为CPU时钟    定时器64分频  1ms
  45.     //T0CNT = 256 - 125;
  46.     //T0IE = 1;
  47.    
  48.     T0CR=0x00;      //时钟为CPU时钟    定时器2分频  
  49.     T0CNT=256-96;  //50us 进一次中断
  50.     T0IE=1;
  51.    
  52.     /*****************定时器1**************************************/
  53.    
  54.     //T1CR=0x80;      //时钟为CPU时钟    定时器2分频  
  55.     //T1CNT=36;      //125=31KHz
  56.     //T1LOAD=36;     //用于设置 T1 的计数周期
  57.     //T1DATA=18;      //用于设置 PWM1 的占空比
  58.     //PWM1EC=0;
  59.    
  60.     /****************键盘中断**************************************/
  61.    
  62.     P1KBCR=0x08;    //使能键盘中断IO口
  63.    
  64.     /****************键盘中断**************************************/
  65.    
  66.     LVDCR1=0x23;    //LVD电压检测量值选择
  67.     LVDEN=1;        //低电压检测 LVD使能位 0:关闭LVD; 1:开启LVD
  68.     LVDIE=0;        //LVD 中断使能位 0:屏蔽LVD中断; 1:使能LVD中断;
  69.     LVDIF=0;        //LVD 中断标志位 0:未触发LVD中断; 1:已触发LVD中断,需软件清 0;
  70.     /****************变量初始化************************************/
  71.    
  72.     sys_power_flag = 0;
  73.     sys_sleep_flag = 0;
  74.     sys_work_flag = 0;
  75.     sys_led_breathe_direction = 0;
  76.     time1s_flag = 0;
  77.     time10ms_flag = 0;
  78.     timer_count0 = 0;               
  79.     timer_count1 = 0;               
  80.     timer_count2 = 0;               
  81.     function_mode = 0;               
  82.     led_choice = 0;
  83.     led_pwm_red_value = 0;         
  84.     led_pwm_green_value = 0;        
  85.     led_pwm_blue_value = 0;         
  86.     led_breathe_ratio = 0;         
  87.     led_breathe_period = 0;         
  88.     led_breathe_frequency = 0;           
  89.    
  90. }
  91. /************************************************
  92. ;  *    @Function Name       : Key_Scan();
  93. ;  *    @Description         : 按键扫描检测
  94. ;  *    @IN_Parameter        : void
  95. ;  *    @Return parameter    : 确认的按键信息
  96. ;  ***********************************************/
  97. char Key_Scan(void)
  98. {   
  99.     char signal;        //用于得到按键信号的值
  100.     char KeyValue;      //用于返回按键稳定的值
  101.     char i;
  102.     KeyValue = NO_KEY_MSG;
  103.     signal = 0;
  104.     if(!PIN_KEY_ON_OFF)   //低有效
  105.     {
  106.         signal |= 0x01;   
  107.     }
  108.    
  109.     for(i=0;i<KEY_NUMBER;i++)           //确认按键的状态
  110.     {           
  111.         if((signal & 0x01) == 1)            //有按键按下
  112.         {
  113.             if(KeySignalCount[i] <= KEY_LONG_TIMES)
  114.                 KeySignalCount[i]++;
  115.             if(KeySignalCount[i] == KEY_LONG_TIMES)
  116.             {
  117.                 KeyValue = (0x01 | KEY_LONG);//长按按下
  118.             }
  119.         }
  120.         else
  121.         {
  122.             if((KeySignalCount[i] > KEY_SHORT_TIMES)
  123.                 &&(KeySignalCount[i] < KEY_LONG_TIMES))
  124.             {                  
  125.                 KeyValue = 0x01;//短按抬起
  126.             }
  127.             KeySignalCount[i] = 0;  
  128.         }
  129.         
  130.         signal>>=1;
  131.     }               
  132.    
  133.     if(KeyValue != NO_KEY_MSG)  //有按键
  134.     {
  135.         return KeyValue;
  136.     }
  137.     return NO_KEY_MSG;
  138.    
  139. }

  140. /************************************************
  141. ;  *    @Function Name       : Key_Message_Dispose();
  142. ;  *    @Description         : 按键消息处理
  143. ;  *    @IN_Parameter        : void
  144. ;  *    @Return parameter    : void
  145. ;  ***********************************************/
  146. void Key_Message_Dispose(void)
  147. {
  148.     if(KEY_LAMP == key_msg)
  149.     {
  150.         switch(function_mode)
  151.         {
  152.             case 0:led_white;sys_work_flag=1;function_mode++;break;
  153.             case 1:led_red;function_mode++;break;
  154.             case 2:led_green;function_mode++;break;
  155.             case 3:led_blue;function_mode++;break;
  156.             case 4:led_green;function_mode++;break;
  157.             case 5:led_black;sys_work_flag=0;function_mode=0;break;
  158.         }
  159.     }   
  160. }
  161. /************************************************
  162. ;  *    @Function Name       : LED_Detection();
  163. ;  *    @Description         :
  164. ;  *    @IN_Parameter        : void
  165. ;  *    @Return parameter    : void
  166. ;  ***********************************************/
  167. void LED_Detection(void)
  168. {
  169.     //第五个模式
  170.     if(5 == function_mode)
  171.     {
  172.         //呼吸灯
  173.         led_breathe_period++;
  174.         if(LAMP_PERIOD_VALUE <= led_breathe_period)
  175.         {
  176.             led_breathe_period=0;
  177.             led_breathe_frequency++;
  178.             if(LAMP_PERIOD_VALUE <= led_breathe_frequency)//周期时间*频率时间*2=总变化时间
  179.             {
  180.                 led_breathe_frequency=0;
  181.             
  182.                 if(sys_led_breathe_direction)
  183.                 {
  184.                     //亮
  185.                     if(LAMP_PERIOD_VALUE >= led_breathe_ratio)
  186.                         led_breathe_ratio++;
  187.                     else
  188.                         sys_led_breathe_direction=0;
  189.                 }
  190.                 else
  191.                 {
  192.                     //灭
  193.                     if(1 <= led_breathe_ratio)
  194.                         led_breathe_ratio--;
  195.                     else
  196.                         sys_led_breathe_direction=1;
  197.                 }
  198.             }
  199.         }
  200.         if(led_breathe_ratio <= led_breathe_period)//亮灭
  201.         {
  202.             PIN_LED_RED=0;
  203.             PIN_LED_GREEN=0;
  204.             PIN_LED_BLUE=0;
  205.         }
  206.         else
  207.         {
  208.             PIN_LED_RED=1;
  209.             PIN_LED_GREEN=1;
  210.             PIN_LED_BLUE=1;
  211.         }
  212.         /*
  213.         //渐变灯
  214.         led_breathe_period++;
  215.         if(LAMP_PERIOD_VALUE <= led_breathe_period)
  216.         {
  217.             led_breathe_period=0;
  218.             led_breathe_frequency++;
  219.             if(LAMP_PERIOD_VALUE <= led_breathe_frequency)
  220.             {
  221.                 led_breathe_frequency=0;
  222.                
  223.                 switch(led_choice)
  224.                 {
  225.                     case 0:led_pwm_red_value++;if(LAMP_PERIOD_VALUE <= led_pwm_red_value){led_choice++;}break;
  226.                     case 1:led_pwm_blue_value--;if(0 >= led_pwm_blue_value){led_choice++;}break;
  227.                     case 2:led_pwm_green_value++;if(LAMP_PERIOD_VALUE <= led_pwm_green_value){led_choice++;}break;
  228.                     case 3:led_pwm_red_value--;if(0 >= led_pwm_red_value){led_choice++;}break;
  229.                     case 4:led_pwm_blue_value++;if(LAMP_PERIOD_VALUE <= led_pwm_blue_value){led_choice++;}break;
  230.                     case 5:led_pwm_green_value--;if(0 >= led_pwm_green_value){led_choice=0;}break;
  231.                     default:led_choice=0;break;
  232.                 }
  233.             }
  234.         }
  235.         
  236.         if(led_pwm_red_value <= led_breathe_period)
  237.             PIN_LED_RED=0;
  238.         else
  239.             PIN_LED_RED=1;
  240.         if(led_pwm_green_value <= led_breathe_period)
  241.             PIN_LED_GREEN=0;
  242.         else
  243.             PIN_LED_GREEN=1;
  244.         if(led_pwm_blue_value <= led_breathe_period)
  245.             PIN_LED_BLUE=0;
  246.         else
  247.             PIN_LED_BLUE=1;
  248.         */
  249.     }   
  250. }

  251. /************************************************
  252. ;  *    @Function Name       : Sleep_Mode();
  253. ;  *    @Description         : 低功耗模式检测
  254. ;  *    @IN_Parameter        : void
  255. ;  *    @Return parameter    : void
  256. ;  ***********************************************/
  257. void Sleep_Mode(void)
  258. {
  259.    
  260.     if(0 == sys_work_flag)//没有在工作
  261.     {
  262.         sys_sleep_flag=1;
  263.         PIN_LED_RED=0;
  264.         PIN_LED_GREEN=0;
  265.         PIN_LED_BLUE=0;
  266.         PIN_LED_WHITE=0;
  267.     }
  268.    
  269.     if(1 == sys_sleep_flag)
  270.     {   
  271.         sys_sleep_flag=0;
  272.         GIE=0;      //总中断使能位
  273.         KBIF=0;     //键盘中断位清零
  274.         KBIE=1;     //键盘中断使能位
  275.         T0IE=0;     //定时器 T0 中断使能位
  276.         T1EN=0;     //定时器 T1 中断使能位
  277.         WDTEN=0;    //看门狗使能位
  278.         ClrWdt();
  279.         Nop();  
  280.         Nop();
  281.         Stop();     //程序运行到低功耗模式,只有发生中断请求或者复位才能退出该模式   
  282.         Nop();
  283.         Nop();
  284.         Nop();
  285.         ClrWdt();
  286.         KBIE=0;
  287.         T0IE=1;
  288.         T1EN=1;
  289.         WDTEN=1;
  290.         GIE=1;
  291.     }
  292.    
  293. }
  294. /************************************************
  295. ;  *    @Function Name       : Sys_Init
  296. ;  *    @Description         : 系统初始化
  297. ;  *    @IN_Parameter        :
  298. ;  *    @Return parameter    :
  299. ;  ***********************************************/  
  300. void  Sys_Init(void)
  301. {
  302.     GIE = 0;
  303.     CLR_RAM();
  304.     ConfigSet();
  305.     GIE  = 1;        
  306. }
  307. /************************************************
  308. ;  *    @Function Name       : main
  309. ;  *    @Description         :
  310. ;  *    @IN_Parameter        :
  311. ;  *    @Return parameter    :
  312. ;  ***********************************************/  
  313. void main (void)
  314. {
  315.     Sys_Init();
  316.     while(1)
  317.     {     
  318.         ClrWdt();
  319.         
  320.         if(time10ms_flag)
  321.         {
  322.             time10ms_flag=0;
  323.             key_msg = Key_Scan();//按键扫描
  324.             Key_Message_Dispose();//按键处理
  325.         }
  326.         if(time1s_flag)
  327.         {
  328.             time1s_flag=0;
  329.             Sleep_Mode(); //低功耗模式
  330.         }
  331.     }   
  332. }
  333. /************************************************
  334. ;  *    @Function Name       : Interrupt
  335. ;  *    @Description         : The interrupt function
  336. ;  *    @IN_Parameter        :
  337. ;  *    @Return parameter    :
  338. ;  ***********************************************/        
  339. void int_isr(void)__interrupt
  340. {
  341. __asm
  342.     movra   _abuf
  343.     swapar  _STATUS
  344.     movra   _statusbuf
  345. __endasm;
  346.     if((T0IF)&&(T0IE))
  347.     {
  348.         T0CNT=256-96;//50us
  349.         T0IF = 0;
  350.         
  351.         timer_count0++;
  352.         timer_count1++;
  353.         if(20000 <= timer_count0)//1s
  354.         {
  355.             timer_count0=0;
  356.             time1s_flag=1;
  357.         }
  358.         
  359.         if(200 <= timer_count1)//10ms
  360.         {
  361.             timer_count1=0;
  362.             time10ms_flag=1;
  363.         }
  364.         LED_Detection();
  365.     }
  366. __asm
  367.     swapar  _statusbuf
  368.     movra   _STATUS
  369.     swapr   _abuf
  370.     swapar  _abuf
  371. __endasm;
  372. }

  373. /**************************** end of file *********************************************/
复制代码
全部资料51hei下载地址:
MC30P6270C.zip (42.33 KB, 下载次数: 11)

评分

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

查看全部评分

回复

使用道具 举报

stonenth 发表于 2021-4-8 08:42 | 显示全部楼层
很不错,看看低功耗的设计
回复

使用道具 举报

nahaishinima 发表于 2021-3-31 22:13 | 显示全部楼层
你好,请问这个芯片能写低电压检测的吗?在3.3V与3V实现灯闪烁,3 V关机,如果可以的话,能说一下大致思路吗?我理解的是只能实现一种电压检测,像这种的,我就不知道了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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