luat_lib_lcdseg.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. @module lcdseg
  3. @summary 段式lcd
  4. @version 1.0
  5. @date 2021.10.22
  6. @tag LUAT_USE_LCDSEG
  7. */
  8. #include "luat_base.h"
  9. #include "luat_lcdseg.h"
  10. /**
  11. 初始化lcdseg库
  12. @api lcdseg.setup(bias, duty, vlcd, com_number, fresh_rate, com_mark, seg_mark)
  13. @int bias值,通常为 1/3 bias, 对应 lcdseg.BIAS_ONETHIRD
  14. @int duty值,通常为 1/4 duty, 对应 lcdseg.DUTY_ONEFOURTH
  15. @int 电压, 单位100mV, 例如2.7v写27. air103支持的值有 27/29/31/33
  16. @int COM脚的数量, 取决于具体模块, air103支持1-4
  17. @int 刷新率,通常为60, 对应60HZ
  18. @int COM启用与否的掩码, 默认为0xFF,全部启用.若只启用COM0/COM1, 则0x03
  19. @int seg启用与否的掩码, 默认为0xFFFFFFFF,即全部启用. 若只启用前16个, 0xFFFF
  20. @return bool 成功返回true,否则返回false
  21. @usage
  22. -- 初始化lcdseg
  23. if lcdseg.setup(lcdseg.BIAS_ONETHIRD, lcdseg.DUTY_ONEFOURTH, 33, 4, 60) then
  24. lcdseg.enable(1)
  25. lcdseg.seg_set(0, 1, 1)
  26. lcdseg.seg_set(2, 0, 1)
  27. lcdseg.seg_set(3, 31, 1)
  28. end
  29. */
  30. static int l_lcdseg_setup(lua_State* L) {
  31. luat_lcd_options_t opts = {0};
  32. opts.bias = luaL_checkinteger(L, 1);
  33. opts.duty = luaL_checkinteger(L, 2);
  34. opts.vlcd = luaL_checkinteger(L, 3);
  35. opts.com_number = luaL_checkinteger(L, 4);
  36. opts.fresh_rate = luaL_checkinteger(L, 5);
  37. opts.com_mark = luaL_optinteger(L, 6, 0xFF);
  38. opts.seg_mark = luaL_optinteger(L, 7, 0xFFFFFFFF);
  39. lua_pushboolean(L, luat_lcdseg_setup(&opts) == 0 ? 1 : 0);
  40. return 1;
  41. }
  42. /**
  43. 启用或禁用lcdseg库
  44. @api lcdseg.enable(en)
  45. @int 1启用,0禁用
  46. @return bool 成功与否
  47. */
  48. static int l_lcdseg_enable(lua_State* L) {
  49. uint8_t enable = luaL_checkinteger(L, 1);
  50. lua_pushboolean(L, luat_lcdseg_enable(enable) == 0 ? 1 : 0);
  51. return 1;
  52. }
  53. /**
  54. 启用或禁用lcdseg的输出
  55. @api lcdseg.power(en)
  56. @int 1启用,0禁用
  57. @return bool 成功与否
  58. */
  59. static int l_lcdseg_power(lua_State* L) {
  60. uint8_t enable = luaL_checkinteger(L, 1);
  61. lua_pushboolean(L, luat_lcdseg_power(enable) == 0 ? 1 : 0);
  62. return 1;
  63. }
  64. /**
  65. 设置具体一个段码的状态
  66. @api lcdseg.seg_set(com, seg, en)
  67. @int COM号
  68. @int seg号 要更改的字段的位索引
  69. @int 1启用,0禁用
  70. @return bool 成功与否
  71. */
  72. static int l_lcdseg_seg_set(lua_State* L) {
  73. uint8_t com = luaL_checkinteger(L, 1);
  74. uint8_t seg = luaL_checkinteger(L, 2);
  75. uint8_t enable = luaL_checkinteger(L, 3);
  76. lua_pushboolean(L, luat_lcdseg_seg_set(com, seg, enable) == 0 ? 1 : 0);
  77. return 1;
  78. }
  79. #include "rotable2.h"
  80. static const rotable_Reg_t reg_lcdseg[] = {
  81. { "setup", ROREG_FUNC(l_lcdseg_setup)},
  82. { "enable", ROREG_FUNC(l_lcdseg_enable)},
  83. { "power", ROREG_FUNC(l_lcdseg_power)},
  84. { "seg_set", ROREG_FUNC(l_lcdseg_seg_set)},
  85. //@const BIAS_STATIC number 没偏置电压(bias)
  86. { "BIAS_STATIC", ROREG_INT(0)},
  87. //@const BIAS_ONEHALF number 1/2偏置电压(bias)
  88. { "BIAS_ONEHALF", ROREG_INT(2)},
  89. //@const BIAS_ONETHIRD number 1/3偏置电压(bias)
  90. { "BIAS_ONETHIRD", ROREG_INT(3)},
  91. //@const BIAS_ONEFOURTH number 1/4偏置电压(bias)
  92. { "BIAS_ONEFOURTH", ROREG_INT(4)},
  93. //@const DUTY_STATIC number 100%占空比(duty)
  94. { "DUTY_STATIC", ROREG_INT(0)},
  95. //@const DUTY_ONEHALF number 1/2占空比(duty)
  96. { "DUTY_ONEHALF", ROREG_INT(2)},
  97. //@const DUTY_ONETHIRD number 1/3占空比(duty)
  98. { "DUTY_ONETHIRD", ROREG_INT(3)},
  99. //@const DUTY_ONEFOURTH number 1/4占空比(duty)
  100. { "DUTY_ONEFOURTH", ROREG_INT(4)},
  101. //@const DUTY_ONEFIFTH number 1/5占空比(duty)
  102. { "DUTY_ONEFIFTH", ROREG_INT(5)},
  103. //@const DUTY_ONESIXTH number 1/6占空比(duty)
  104. { "DUTY_ONESIXTH", ROREG_INT(6)},
  105. //@const DUTY_ONESEVENTH number 1/7占空比(duty)
  106. { "DUTY_ONESEVENTH", ROREG_INT(7)},
  107. //@const DUTY_ONEEIGHTH number 1/8占空比(duty)
  108. { "DUTY_ONEEIGHTH", ROREG_INT(8)},
  109. };
  110. LUAMOD_API int luaopen_lcdseg( lua_State *L ) {
  111. luat_newlib2(L, reg_lcdseg);
  112. return 1;
  113. }