luat_lib_lcdseg.c 3.1 KB

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