Keyboard firmwares for Atmel AVR and Cortex-M
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

backlight.c 1.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // http://blog.saikoled.com/post/43165849837/secret-konami-cheat-code-to-high-resolution-pwm-on
  2. #include <avr/io.h>
  3. #include "backlight.h"
  4. #define FET OCR1A
  5. uint8_t led_counter = 0;
  6. uint8_t led_level = 0;
  7. void backlight_init_ports()
  8. {
  9. DDRB |= (1<<5);
  10. PORTB &= ~(1<<5);
  11. TCCR1A = _BV(COM1A1) | _BV(WGM11); // = 0b10000010;
  12. TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); // = 0b00011001;
  13. ICR1 = 0xFFFF;
  14. FET = 0x0000;
  15. backlight_init();
  16. }
  17. void backlight_set(uint8_t level)
  18. {
  19. if ( level == 0 )
  20. {
  21. // Turn off PWM control on PB5, revert to output low.
  22. TCCR1A &= ~(_BV(COM1A1));
  23. FET = 0x0000;
  24. // Prevent backlight blink on lowest level
  25. PORTB &= ~(_BV(PORTB5));
  26. }
  27. else if ( level == BACKLIGHT_LEVELS )
  28. {
  29. // Prevent backlight blink on lowest level
  30. PORTB &= ~(_BV(PORTB5));
  31. // Turn on PWM control of PB5
  32. TCCR1A |= _BV(COM1A1);
  33. // Set the brightness
  34. FET = 0xFFFF;
  35. }
  36. else
  37. {
  38. // Prevent backlight blink on lowest level
  39. PORTB &= ~(_BV(PORTB5));
  40. // Turn on PWM control of PB5
  41. TCCR1A |= _BV(COM1A1);
  42. // Set the brightness
  43. FET = 0xFFFF >> ((BACKLIGHT_LEVELS - level) * ((BACKLIGHT_LEVELS + 1) / 2));
  44. }
  45. }