找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1164|回复: 10
收起左侧

51单片机台灯功能实现,求助

[复制链接]
ID:264640 发表于 2023-4-19 10:41 | 显示全部楼层 |阅读模式
按键1短按开关 长按调节亮度
按键2短按切换LED模式
模式:1.LED1亮 LED2灭
1.LED1灭 LED2亮
1.LED1亮 LED2亮



本人对于键值扫描完全没有头绪,如何区分长短按,求大神指导!!
回复

使用道具 举报

ID:332444 发表于 2023-4-19 15:26 | 显示全部楼层
这么简单的不用矩阵键盘,长按通过计数不同实现,模式也就是二进制而已简单得很.
回复

使用道具 举报

ID:332444 发表于 2023-4-19 16:45 | 显示全部楼层
如果要设计一个单片机控制风扇是依据这一天温度变动预报还是依据体温?
回复

使用道具 举报

ID:264640 发表于 2023-4-19 16:54 | 显示全部楼层
xianfajushi 发表于 2023-4-19 15:26
这么简单的不用矩阵键盘,长按通过计数不同实现,模式也就是二进制而已简单得很.

对于长按连加的键值扫描不是很懂
回复

使用道具 举报

ID:264640 发表于 2023-4-19 16:54 | 显示全部楼层
xianfajushi 发表于 2023-4-19 16:45
如果要设计一个单片机控制风扇是依据这一天温度变动预报还是依据体温?

目前只要LED亮度调节就行
回复

使用道具 举报

ID:857072 发表于 2023-4-19 22:09 来自手机 | 显示全部楼层
如果是真不会的话,可以看看天问51这种,按键应该都做好了直接用。因为他这个也直接支持C,想深入的话以后也可以直接转到C语言。
回复

使用道具 举报

ID:140489 发表于 2023-4-20 11:09 | 显示全部楼层
你要的这些功能,一个按键就可以做到
回复

使用道具 举报

ID:1072921 发表于 2023-4-20 11:22 | 显示全部楼层
用延时计数就行了
回复

使用道具 举报

ID:140489 发表于 2023-4-20 12:39 | 显示全部楼层
我这里有个实例,用的STC8H1K16,两路pwm驱动两个NMOS管控制双色灯带
  1. /*************  功能说明    **************
  2. 按键短按开灯,开灯后3秒内,短按开关切换色温(白光,黄光,自然光;切换色温功率不变);
  3. 长按调亮度;超过3秒短按关灯。
  4. 设置的参数掉电保存;

  5. 高级PWM定时器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每个通道都可独立实现PWM输出,
  6. 或者两两互补对称输出.

  7. MCU: STC8H1K16  LQFP-32封装
  8. P1.1 P1.2驱动两路LED

  9. 2023/4/14 调试成功
  10. ******************************************/

  11. //#include    "reg51.h"       //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
  12. #include    <stc8h.h>
  13. #include    "intrins.h"

  14. #define     MAIN_Fosc       11059200L   //定义主时钟

  15. #define PWM_PSCR    3     //设置分频        频率计算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)边沿对齐
  16. #define PWM_ARR  1023    //设置周期值          频率2.7KHz

  17. //#define PWM_PSCR  15     //设置分频        频率计算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)
  18. //#define PWM_ARR  254    //设置周期值          频率2.7KHz


  19. #define uchar unsigned char
  20. #define uint unsigned int
  21. typedef     unsigned char   u8;
  22. typedef     unsigned int    u16;
  23. typedef     unsigned long   u32;

  24. /****************************** 用户定义宏 ***********************************/

  25. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒
  26. /*****************************************************************************/

  27. #define PWM1_1      0x00        //P:P1.0  N:P1.1
  28. #define PWM1_2      0x01        //P:P2.0  N:P2.1
  29. #define PWM1_3      0x02        //P:P6.0  N:P6.1

  30. #define PWM2_1      0x00        //P:P1.2/P5.4  N:P1.3
  31. #define PWM2_2      0x04        //P:P2.2  N:P2.3
  32. #define PWM2_3      0x08        //P:P6.2  N:P6.3

  33. #define PWM3_1      0x00        //P:P1.4  N:P1.5
  34. #define PWM3_2      0x10        //P:P2.4  N:P2.5
  35. #define PWM3_3      0x20        //P:P6.4  N:P6.5

  36. #define PWM4_1      0x00        //P:P1.6  N:P1.7
  37. #define PWM4_2      0x40        //P:P2.6  N:P2.7
  38. #define PWM4_3      0x80        //P:P6.6  N:P6.7
  39. #define PWM4_4      0xC0        //P:P3.4  N:P3.3

  40. #define ENO1P       0x01
  41. #define ENO1N       0x02
  42. #define ENO2P       0x04
  43. #define ENO2N       0x08
  44. #define ENO3P       0x10
  45. #define ENO3N       0x20
  46. #define ENO4P       0x40
  47. #define ENO4N       0x80

  48. /*************  本地变量声明    **************/
  49. bit B_1ms;          //1ms标志

  50. u16 PWM1_Duty;
  51. u16 PWM2_Duty;
  52. u16 PWM2_Dutyv;
  53. u16 PWM1_Dutyv;

  54. //u16 PWM3_Duty;
  55. //u16 PWM4_Duty;

  56. uchar PWM2_Dutyv_L;
  57. uchar PWM2_Dutyv_M;

  58. uchar temp_PWM2_Dutyv_L;
  59. uchar temp_PWM2_Dutyv_M;


  60. bit PWM1_Flag;
  61. bit PWM2_Flag;
  62. bit PWM3_Flag;
  63. bit PWM4_Flag;

  64. void UpdatePwm(void);

  65. sbit k2=P3^2;//灯开关
  66. sbit led=P1^2;//灯
  67. uint k1_cont,k2_cont;//按键消抖计时
  68. uchar k1_lock,k2_lock;//按键锁
  69. uchar count1=10,count2=10;
  70. uint Long_cont=400;
  71. uint Long_cont1=200;
  72. uint Long_cont2=200;
  73. uchar PWM_Value;           //占空比 变量
  74. bit PWM_UP_Down_Flag;  //调光方向标志
  75. bit flag_short_k1,flag_short_k2;//按键短按标志
  76. bit flag_led_onoff;//led灯开关标志
  77. bit SaveFlag;                         //数据存储标志

  78. bit flag_qh,flag_qh1;//色温切换计时标志
  79. uint hcount,hcount1,hcount2;
  80. uchar led_qhcount;
  81. /////////////////////////
  82. void delay(uint ms)
  83. {
  84.         uint i,j;
  85.         for(i=0; i<ms; i++)
  86.                 for(j=0; j<930; j++);
  87. }
  88. //////////////////////
  89. /////////////////
  90. void IapIdle()        //禁用IAP功能
  91. {
  92.     IAP_CONTR = 0;                              //关闭IAP功能
  93.     IAP_CMD = 0;                                //清除命令寄存器
  94.     IAP_TRIG = 0;                               //清除触发寄存器
  95.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  96.     IAP_ADDRL = 0;
  97. }

  98. char IapRead(int addr) //读EEPROM
  99. {
  100.     char dat;

  101.     IAP_CONTR = 0x80;                           //使能IAP
  102.     IAP_TPS = 12;                               //设置等待参数12MHz
  103.     IAP_CMD = 1;                                //设置IAP读命令
  104.     IAP_ADDRL = addr;                           //设置IAP低地址
  105.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  106.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  107.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  108.     _nop_();
  109.     dat = IAP_DATA;                             //读IAP数据
  110.     IapIdle();                                  //关闭IAP功能

  111.     return dat;
  112. }

  113. void IapProgram(int addr, char dat)        //写EEPROM
  114. {
  115.     IAP_CONTR = 0x80;                           //使能IAP
  116.     IAP_TPS = 12;                               //设置等待参数12MHz
  117.     IAP_CMD = 2;                                //设置IAP写命令
  118.     IAP_ADDRL = addr;                           //设置IAP低地址
  119.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  120.     IAP_DATA = dat;                             //写IAP数据
  121.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  122.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  123.     _nop_();
  124.     IapIdle();                                  //关闭IAP功能
  125. }

  126. void IapErase(int addr)          //擦除EEPROM
  127. {
  128.     IAP_CONTR = 0x80;                           //使能IAP
  129.     IAP_TPS = 12;                               //设置等待参数12MHz
  130.     IAP_CMD = 3;                                //设置IAP擦除命令
  131.     IAP_ADDRL = addr;                           //设置IAP低地址
  132.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  133.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  134.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  135.     _nop_();                                    //
  136.     IapIdle();                                  //关闭IAP功能
  137. }
  138. ///////////////////
  139. void keyscan()
  140. {
  141. //        if(tes_flag==0)        //非时钟设置状态
  142.         {
  143.        
  144.                 if(k2)
  145.                 {
  146.                         k2_lock=0;
  147.                         k2_cont=0;
  148.                         if(flag_short_k2)
  149.                         {
  150. //                                cmled2=!cmled2;//按键指示灯取反
  151.                                 flag_short_k2=0;//清零k2短按标志
  152. //                                flag_led_onoff=!flag_led_onoff;//开关灯标志取反
  153.                                 flag_qh1=1;

  154.                                 if(flag_qh)
  155.                                 {
  156.                                         flag_led_onoff=1;
  157.                                         led_qhcount++;
  158.                                         if(led_qhcount==3)
  159.                                         {
  160.                                                 led_qhcount=0;
  161.                                         }

  162. //                                        if(led_qhcount==0)        //两路亮
  163. //                                        {
  164. //                                        //        PWM2_Dutyv=PWM2_Dutyv>>1; //两路都亮的亮度是一路一半的亮度
  165. //                                                PWM2_Dutyv=PWM2_Dutyv/2;
  166. //                                        }
  167. //                                        if(led_qhcount==1)
  168. //                                        {
  169. //                                        //        PWM2_Dutyv=PWM2_Dutyv<<1; //单路亮度是双路亮度的2倍
  170. //                                                PWM2_Dutyv=PWM2_Dutyv*2;
  171. //                                        }
  172. //                                        if(led_qhcount==2)
  173. //                                        {
  174. //                                                PWM2_Dutyv=PWM2_Dutyv;
  175. //                                        }
  176.                                        

  177.                                         IapErase(0x1000);  //擦除EEPROM
  178.                                         IapProgram(0x1000, led_qhcount);//保存亮灯路数值


  179.                                         hcount=0;
  180.                                         hcount1=0;       
  181.                                 }
  182.                                 else
  183.                                 {
  184.                                         flag_led_onoff=!flag_led_onoff;//开关灯标志取反
  185.                                 }

  186.                         }

  187.                         if(SaveFlag)  //长按松手后,保存pwm数据
  188.                         {
  189.                                 PWM_UP_Down_Flag=!PWM_UP_Down_Flag;//调光方向标志取反
  190.                                 PWM2_Dutyv_L=PWM2_Dutyv%256;//将大于255的占空比值拆分成两个uchar的数值再保存
  191.                                 PWM2_Dutyv_M=PWM2_Dutyv/256;
  192.                                 IapErase(0x0001);  //擦除EEPROM
  193.                                 IapProgram(0x0001, PWM2_Dutyv_L);//将PWM_Value写入EEPROM
  194.                                 IapProgram(0x0002, PWM2_Dutyv_M);//将PWM_Value写入EEPROM

  195.                                 SaveFlag = 0;//保存数据后,保存标志清零       
  196.                         }       
  197.                                
  198.                 }
  199.                 else if(k2_lock==0)        //短按
  200.                 {
  201.                         k2_cont++;
  202.                 //        flag_k2=1;
  203.                         if(k2_cont>count2)
  204.                         {
  205.                                 k2_cont=0;
  206.                                 k2_lock=1;
  207.                                 flag_short_k2=1;
  208. //                                if(flag_qh)
  209. //                                {
  210. //                                        led_qhcount++;
  211. //                                        if(led_qhcount==3)
  212. //                                        {
  213. //                                                led_qhcount=0;
  214. //                                        }
  215. //                                        hcount=0;
  216. //                                        hcount1=0;       
  217. //                                }
  218.                         }       
  219.                 }
  220.                 else if(k2_cont<Long_cont2)        //长按
  221.                 {
  222.                         k2_cont++;
  223.                         if(k2_cont==Long_cont2)
  224.                         {
  225.                                 k2_cont=196;
  226.                                 flag_short_k2=0;//进入长按必须清短按标志,否则会触发一次短按
  227.                                 SaveFlag = 1;//进入长按,保存标志置1
  228.                                 if(flag_led_onoff)//开灯状态
  229.                                 {
  230.                                         if(PWM_UP_Down_Flag == 1) //亮度++
  231.                                         {
  232.                                                
  233.                                                
  234. //                                                if(PWM2_Dutyv < 1023)       
  235. //                                                {
  236. //                                                //        PWM2_Dutyv +=5;
  237. //                                                        if(led_qhcount==0)
  238. //                                                        {        PWM2_Dutyv +=3;
  239. //                                                                if(PWM2_Dutyv > 511)
  240. //                                                                {
  241. //                                                                        PWM2_Dutyv = 511;
  242. //                                                                }
  243. //                                                        }
  244. //                                                        else
  245. //                                                        {       
  246. //                                                                PWM2_Dutyv +=6;
  247. //                                                                if(PWM2_Dutyv > 1022)
  248. //                                                                {
  249. //                                                                        PWM2_Dutyv = 1022;
  250. //                                                                }
  251. //                                                        }
  252. //                                                }
  253. //                                       
  254. //                                        }
  255. //                                       
  256. //                                        if(PWM_UP_Down_Flag == 0)   //亮度--
  257. //                                        {
  258. //                               
  259. //                                       
  260. //                                                if(PWM2_Dutyv > 0)
  261. //                                                {
  262. //                                                        if(led_qhcount==0)
  263. //                                                        {PWM2_Dutyv -=3;}
  264. //                                                        else
  265. //                                                        {PWM2_Dutyv -=6;}
  266. //                                                        if(PWM2_Dutyv < 100)
  267. //                                                        {
  268. //                                                                PWM2_Dutyv = 100;                               
  269. //                                                        }
  270. //                                       
  271. //                                                }
  272. //                                        }                                       
  273.                                                 if(PWM2_Dutyv < 1023)        //亮度++
  274.                                                 {
  275.                                                                 PWM2_Dutyv +=5;
  276.                                                                 if(PWM2_Dutyv > 1022)
  277.                                                                 {
  278.                                                                         PWM2_Dutyv = 1022;
  279.                                                                 }
  280.                                                        
  281.                                                 }
  282.                                           
  283.                                         }
  284.                                        
  285.                                         if(PWM_UP_Down_Flag == 0)   //亮度--
  286.                                         {
  287.                                
  288.                                        
  289.                                                 if(PWM2_Dutyv > 0)
  290.                                                 {

  291.                                                         PWM2_Dutyv -=5;
  292.                                                         if(PWM2_Dutyv < 100)
  293.                                                         {
  294.                                                                 PWM2_Dutyv = 100;                               
  295.                                                         }
  296.                                        
  297.                                                 }
  298.                                         }                                       
  299.                                                                        
  300.                                 }                               
  301.                         }               
  302.                
  303.                 }
  304.         }
  305. }
  306. //////////////////////////
  307. void Timer0Init(void)                //2毫秒@11.0592MHz
  308. {
  309.         AUXR |= 0x80;                //定时器时钟1T模式
  310.         TMOD &= 0xF0;                //设置定时器模式 16位自动重载
  311.         TL0 = 0x9A;                //设置定时初始值
  312.         TH0 = 0xA9;                //设置定时初始值
  313.         TF0 = 0;                //清除TF0标志
  314.         TR0 = 1;                //定时器0开始计时
  315.         ET0=1;
  316.         EA=1;
  317. }


  318. //////////////////////////

  319. /******************** 主函数 **************************/
  320. void main(void)
  321. {

  322.         Timer0Init();
  323.     P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  324.     P1M1 = 0x00;   P1M0 = 0x07;   //设置为准双向口 p12设为推挽输出
  325.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  326.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  327.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  328.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  329.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  330.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

  331.                 PWM1_Flag = 0;
  332.                 PWM2_Flag = 0;
  333.                 PWM3_Flag = 0;
  334.                 PWM4_Flag = 0;
  335.        
  336. //                PWM1_Duty = 512;
  337. //                PWM2_Duty = 256;
  338. //                PWM2_Dutyv=2046;
  339. //                PWM3_Duty = 512;
  340. //                PWM4_Duty = 1024;

  341.    
  342.         PWM2_Dutyv_L=IapRead(0x0001);  //读出占空比值
  343.         PWM2_Dutyv_M=IapRead(0x0002);
  344.         if(PWM2_Dutyv_M==255)PWM2_Dutyv_M=3; //第一次上电读出的值是255,就给占空比赋初值
  345.         if(PWM2_Dutyv_L==255)PWM2_Dutyv_L=255;
  346.                                                                                          //占空比最大为PWM_ARR的值
  347.         PWM2_Dutyv=PWM2_Dutyv_M*256+PWM2_Dutyv_L;//两个uchar合并成uint,初始最大亮度值1024

  348.         led_qhcount=IapRead(0x1000);
  349.         if(led_qhcount==255)led_qhcount=2;

  350.                 P_SW2 |= 0x80;
  351.                
  352.     PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
  353.     PWMA_CCER2 = 0x00;
  354.     PWMA_CCMR1 = 0x60; //通道模式配置 设置CC1为PWMA输出模式,方向为输出
  355.     PWMA_CCMR2 = 0x60;
  356.     PWMA_CCMR3 = 0x60;
  357.     PWMA_CCMR4 = 0x60;
  358.     PWMA_CCER1 = 0x55; //配置通道输出使能和极性
  359.     PWMA_CCER2 = 0x55;

  360.         PWMA_PSCRH = (u8)(PWM_PSCR>>8);     //设置分频
  361.     PWMA_PSCRL = (u8)(PWM_PSCR);

  362. //    PWMA_ARRH = (u8)(PWM_ARR >> 8);  //设置周期时间
  363. //    PWMA_ARRL = (u8)PWM_ARR;
  364.     PWMA_ARRH = PWM_ARR/256;  //设置周期时间  右移8位等同256求模
  365.     PWMA_ARRL = PWM_ARR%256;
  366. /*
  367. 通俗的说,位移的实现是将数据转换成二进制后,进行左右移动的。如果左移,则右边补零,如果是右移,
  368. 则是左边补零,后边溢出的则去掉。因此,左移可以理解为整数的乘法,
  369. 而右移则是理解为整数的取整除法。

  370.   左移 (<<)

  371.   将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
  372.   左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。

  373.   x<<1= x*2
  374.   x<<2= x*4
  375.   x<<3= x*8
  376.   x<<4= x*16

  377.   同理, 右移即相反:

  378.   右移 (>>)
  379.   将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。

  380.   右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。
  381.   右移四位相当于除以16;右移8位相当于除以256.
  382.   x>>1= x/2
  383.   x>>2= x/4
  384.   x>>3= x/8
  385.   x>>4= x/16
  386. */

  387. //    PWMA_ARRH = 0x03; //设置周期时间  自动重装载高8位
  388. //    PWMA_ARRL = 0xff;//自动重装载低8位

  389.     PWMA_ENO = 0x00;
  390. //    PWMA_ENO |= ENO1P; //使能输出
  391.     PWMA_ENO |= ENO1N; //使能输出
  392.     PWMA_ENO |= ENO2P; //使能输出
  393. //    PWMA_ENO |= ENO2N; //使能输出
  394. //    PWMA_ENO |= ENO3P; //使能输出
  395. //    PWMA_ENO |= ENO3N; //使能输出
  396. //    PWMA_ENO |= ENO4P; //使能输出
  397. //    PWMA_ENO |= ENO4N; //使能输出

  398.                 PWMA_PS = 0x00;  //高级 PWM 通道输出脚选择位
  399.     PWMA_PS |= PWM1_1; //选择 PWM1_2 通道
  400.     PWMA_PS |= PWM2_1; //选择 PWM2_1 通道 p12口
  401. //    PWMA_PS |= PWM3_3; //选择 PWM3_3 通道
  402. //    PWMA_PS |= PWM4_3; //选择 PWM4_3 通道

  403.     PWMA_BKR = 0x80; //使能主输出
  404.     PWMA_CR1 |= 0x01; //开始计时
  405.                 P_SW2 &= 0x7f;
  406.     while (1)
  407.     {
  408.                 keyscan();
  409.                 delay(4);


  410.                
  411.                 if(flag_led_onoff==1)        //开灯
  412.                 {
  413.                         switch(led_qhcount)
  414.                         {
  415. //                                case 0: PWM2_Duty = PWM2_Dutyv; PWM1_Duty = PWM2_Dutyv; break;
  416. //
  417. //                                case 1: PWM2_Duty = 0; PWM1_Duty = PWM2_Dutyv; break;
  418. //
  419. //                                case 2: PWM2_Duty = PWM2_Dutyv; PWM1_Duty = 0; break;
  420.                                 case 0: PWM2_Duty = PWM2_Dutyv/2; PWM1_Duty = PWM2_Dutyv/2; break;

  421.                                 case 1: PWM2_Duty = 0; PWM1_Duty = PWM2_Dutyv; break;

  422.                                 case 2: PWM2_Duty = PWM2_Dutyv; PWM1_Duty = 0; break;
  423.                                 default: break;
  424.                         }
  425.                 }
  426.                 else //关灯
  427.                 {
  428.                         PWM2_Duty=0;
  429.                         PWM1_Duty = 0;
  430.                         flag_qh1=0;         //关灯将flag_qh1,hcount2这两个变量清零
  431.                         hcount2=0;         //否则关灯后再快速开灯会误切换色温
  432.                 }
  433.                
  434.                 UpdatePwm();
  435.                        
  436.         }
  437. }


  438. /********************** Timer0 1ms中断函数 ************************/
  439. void timer0(void) interrupt 1
  440. {
  441.         if(flag_qh1)
  442.         {
  443.                 hcount2++;
  444.                 if(hcount2==100)//0.2秒
  445.                 {
  446.                         hcount2=0;
  447.                         flag_qh1=0;
  448.                         flag_qh=1;       
  449.                 }       
  450.         }

  451.         if(flag_qh)
  452.         {
  453.                 hcount++;
  454.                 if(hcount==500)        //1秒
  455.                 {
  456.                         hcount=0;
  457.                         hcount1++;
  458.                         if(hcount1==3)
  459.                         {
  460.                                 hcount1=0;
  461.                                 flag_qh=0;
  462.                         }
  463.                 }
  464.         }       

  465. }


  466. //========================================================================
  467. // 函数: UpdatePwm(void)
  468. // 描述: 更新PWM占空比.
  469. // 参数: none.
  470. // 返回: none.
  471. // 版本: V1.0, 2012-11-22
  472. //========================================================================
  473. void UpdatePwm(void)
  474. {
  475.                 P_SW2 |= 0x80;
  476.           PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
  477.     PWMA_CCR1L = (u8)(PWM1_Duty);
  478.           PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
  479.     PWMA_CCR2L = (u8)(PWM2_Duty);
  480. //          PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //设置占空比时间
  481. //    PWMA_CCR3L = (u8)(PWM3_Duty);
  482. //          PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //设置占空比时间
  483. //    PWMA_CCR4L = (u8)(PWM4_Duty);
  484.                 P_SW2 &= 0x7f;
  485. }

复制代码
回复

使用道具 举报

ID:587810 发表于 2023-4-20 13:35 | 显示全部楼层
可以吧按键1和2接到P1.0和P1.1上,led1与led2接到P1.2与P1.3上,然后判断这两个引脚的按下的状态,在通过程序判断从而控制三个灯的亮灭
回复

使用道具 举报

ID:123289 发表于 2023-4-20 15:16 | 显示全部楼层
太为难你了。没事换个东西玩玩,别玩这个灯,烦人。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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