LED模块
发布:2024-01-11 13:33
更新:2024-01-21 14:15
作者:   juliez
浏览:   473
字数:5292

LED灯自动闪烁

使用CH582M实现

  1. int main()
  2. {
  3. uint8_t len;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. GPIOA_SetBits(GPIO_Pin_8);//LED灯
  6. GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_20mA);
  7. while(1){
  8. GPIOA_SetBits(GPIO_Pin_8);
  9. DelayMs(1000);
  10. GPIOA_ResetBits(GPIO_Pin_8);
  11. DelayMs(1000);
  12. }
  13. }

用按钮控制LED灯开关

使用CH582M实现

  1. int main()
  2. {
  3. uint8_t len;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. GPIOA_SetBits(GPIO_Pin_8);//LED灯
  6. GPIOB_SetBits(GPIO_Pin_5);//按钮
  7. GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);
  8. GPIOB_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
  9. GPIOA_InverseBits(GPIO_Pin_8);
  10. while(1){
  11. int newstates=GPIOB_ReadPort();
  12. if(!(newstates & GPIO_Pin_5)){
  13. GPIOA_InverseBits(GPIO_Pin_8);
  14. DelayMs(1000);
  15. }
  16. }
  17. }

使用树莓派 pico实现

  1. from machine import Pin
  2. from time import sleep
  3. leds = Pin(0,Pin.OUT) # 定义LED管脚
  4. up_button = Pin(1, Pin.IN, Pin.PULL_UP) # 设置up_button管脚为输入模式,上拉至高电平(3.3V)
  5. leds.value(0)
  6. makerobo_up_status = 1#初始化状态,1为高电平,即未按下状态
  7. while True:
  8. makerobo_up_tmp = up_button.value() #获取管脚当前状态
  9. if makerobo_up_tmp != makerobo_up_status: #判断状态是否与初始化状态相同
  10. if makerobo_up_tmp == 0: #判断是否被按下
  11. leds.value(1)
  12. sleep(0.05)
  13. makerobo_up_status = makerobo_up_tmp #松开按键时自动弹开断开,状态被置为高电平状态回到初始化状态
  14. sleep(0.05)
  15. leds.value(0)

根据光敏的强度来控制LED的亮度

  1. int main()
  2. {
  3. uint8_t len;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. GPIOA_SetBits(GPIO_Pin_8);//设置传感器io
  6. GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
  7. while(1){
  8. int newstates=GPIOA_ReadPort();
  9. if(!(newstates & GPIO_Pin_8)){
  10. printf("状态为1");
  11. DelayMs(1000);
  12. }else{
  13. printf("状态为0");
  14. DelayMs(1000);
  15. }
  16. }
  17. }

输出的内容不会显示,只有后期通过串口发送给另一个能显示的芯片获得调试信息,如:树莓派 pico。

  1. from machine import Pin,PWM,ADC
  2. from time import sleep
  3. makerobo_flame = 0 # ADC0复用管脚为GP26
  4. makerobo_R =2 # 定义LED管脚
  5. makerobo_DO = 3 # 光敏传感器数字IO口
  6. # 初始化程序
  7. def makerobo_setup():
  8. global p_R
  9. global flame_ADC
  10. global flame_DO
  11. flame_DO = Pin(makerobo_DO,Pin.IN) # 设置光敏传感器数字IO口为输入模式
  12. flame_ADC = ADC(makerobo_flame)
  13. p_R = PWM(Pin(makerobo_R)) # 定义红色LED PWM
  14. p_R.freq(2000) # 设置频率为2KHz
  15. # 打印信息,打印出光敏传感器的状态值
  16. def makerobo_Show(x):
  17. if x == 1: # 安全
  18. print ('')
  19. print (' *******************')
  20. print (' * Makerobo Safe~ *')
  21. print (' *******************')
  22. print ('')
  23. if x == 0: # 有火焰
  24. print ('')
  25. print (' ******************')
  26. print (' * Makerobo Fire! *')
  27. print (' ******************')
  28. print ('')
  29. # 循环函数
  30. def makerobo_loop():
  31. makerobo_status = 1 # 状态值
  32. # 无限循环
  33. while True:
  34. # 读取光敏传感器数字IO口
  35. makerobo_tmp = flame_DO.value()
  36. if makerobo_tmp != makerobo_status: # 判断状态发生改变
  37. makerobo_Show(makerobo_tmp) # 打印出光敏传感器的提示信息
  38. p_R.duty_u16(flame_ADC.read_u16()) # 改变占空比
  39. makerobo_status = makerobo_tmp # 当前状态值作为下次状态值进行比较,避免重复打印
  40. sleep(0.5) # 延时200ms
  41. # 程序入口
  42. if __name__ == "__main__":
  43. makerobo_setup() # 初始化设置函数
  44. makerobo_loop() # 循环显示信息

用按钮控制双色LED灯颜色变化

  1. int main()
  2. {
  3. uint8_t len;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. GPIOA_SetBits(GPIO_Pin_8);//LED灯G
  6. GPIOA_SetBits(GPIO_Pin_9);//LED灯R
  7. GPIOB_SetBits(GPIO_Pin_5);//按钮
  8. GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_5mA);
  9. GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
  10. GPIOB_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
  11. GPIOA_InverseBits(GPIO_Pin_8);
  12. GPIOA_InverseBits(GPIO_Pin_9);
  13. int num=0;
  14. while(1){
  15. int newstates=GPIOB_ReadPort();
  16. if(!(newstates & GPIO_Pin_5)){
  17. if(num%2==0){
  18. GPIOA_SetBits(GPIO_Pin_8);
  19. DelayMs(1000);
  20. GPIOA_InverseBits(GPIO_Pin_8);}
  21. else{
  22. GPIOA_SetBits(GPIO_Pin_9);
  23. DelayMs(1000);
  24. GPIOA_InverseBits(GPIO_Pin_9);}
  25. }
  26. num++;
  27. }
  28. }

ing
以下代码是欲用中断实现按钮控制LED灯的构想,目前并未实现

  1. int main()
  2. {
  3. uint8_t len;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. GPIOA_SetBits(GPIO_Pin_8);//LED灯G
  6. GPIOA_SetBits(GPIO_Pin_9);//LED灯R
  7. GPIOB_SetBits(GPIO_Pin_5);//轻触按钮
  8. GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_20mA);
  9. GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_20mA);
  10. GPIOB_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU);
  11. //GPIOA_InverseBits(GPIO_Pin_8);//初始为G
  12. GPIOA_ResetBits(GPIO_Pin_9);
  13. while(1){
  14. void GPIOB_ITModeCfg(PB5, GPIO_ITMode_LowLevel);
  15. // if(!(GPIOB_ReadITFlagPort())){
  16. GPIOA_InverseBits(GPIO_Pin_8);
  17. GPIOA_InverseBits(GPIO_Pin_9);
  18. DelayMs(1000);
  19. GPIOB_ClearITFlagBit(GPIO_Pin_5);}
  20. // }
  21. }

实现双色LED颜色自动变化

  1. int main()
  2. {
  3. uint8_t len;
  4. SetSysClock(CLK_SOURCE_PLL_60MHz);
  5. GPIOA_SetBits(GPIO_Pin_8);//LED灯G
  6. GPIOA_SetBits(GPIO_Pin_9);//LED灯R
  7. GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeOut_PP_20mA);
  8. GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_20mA);
  9. GPIOA_ResetBits(GPIO_Pin_9);
  10. while(1){
  11. GPIOA_InverseBits(GPIO_Pin_8);
  12. GPIOA_InverseBits(GPIO_Pin_9);
  13. DelayMs(1000);
  14. }
  15. }
-- 完结 --