1640334195688350
本帖最后由 HonestQiao 于 2021-12-27 14:45 编辑
这次的合宙Air820开发板,还带了一个扩展盖板。
该扩展盖板上,包括:
而官方提供的演示程序,screen-cover,其中就包含该显示屏的使用,以及按键的使用。
进过一番探索,将其中的显示屏字符显示的部分,和按键处理的部分,独立提取出来,可以很方便在自己的项目中使用。
最终代码的结构如下:
- color_lcd_spi_st7735.lua:驱动
- gc9306x.lua:驱动
- st7789.lua:驱动,针对本盖板进行调整的
- keycfg.lua:按键处理
- lcd.lua:显示函数
- main.lua:主代码
我们对main.lua进行讲解,其他部分的代码,并不复杂,可以查看其具体内容了解。
- --必须在这个位置定义PROJECT和VERSION变量
- --PROJECT:ascii string类型,可以随便定义,只要不使用,就行
- --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
- PROJECT = "X_MAGIC_BOX_LCD"
- VERSION = "1.0.0"
- --根据固件判断模块类型
- moduleType = string.find(rtos.get_version(), "8955") and 2 or 4
- require "log"
- LOG_LEVEL = log.LOGLEVEL_TRACE
- require "os"
- require "sys"
- require "misc"
- require "pm"
- require "utils"
- require "math"
- -- LCD方向控制,数据永久存储
- require"nvm"
- nvm.set("xoffset", 0)
- nvm.set("yoffset", 0)
- nvm.set("screen",0)
- -- LCD驱动调用
- require "lcd"
- require "st7789"
- --require"gc9306x"
- -- 按键
- require"keycfg"
- -- 显示任务
- sys.taskInit(function()
- sys.waitUntil("LCD_START")
- sys.wait(200)
- lcd.wake(1)
- lcd.setcharwidth(16)
- disp.setfontheight(32)
- # 显示的实际内容
- for n=0,1000 do
- math.randomseed(os.time())
- for i=1,51 do
- local c = i*5
- disp.clear()
- lcd.putStringCenter("好不好用",120,130+i,math.random(50,200),math.random(50,200),c)
- lcd.putStringCenter("跑个马试试",120,90+i,math.random(50,200),c,math.random(50,200))
- lcd.putStringCenter(i,c,40+i,c,math.random(50,200),math.random(50,200))
- disp.update()
- sys.wait(100)
- end
- for i=51,1,-1 do
- local c = i*5
- disp.clear()
- lcd.putStringCenter("好不好用",120,130+i,math.random(50,200),math.random(50,200),c)
- lcd.putStringCenter("跑个马试试",120,90+i,math.random(50,200),c,math.random(50,200))
- lcd.putStringCenter(i,c,40+i,c,math.random(50,200),math.random(50,200))
- disp.update()
- sys.wait(100)
- end
- end
- end)
- --订阅按键事件
- sys.subscribe("KEY_EVENT", function(k,e)
- if not e then return end
- if k == "OK" then
- local scr = nvm.get("screen")
- if scr == 0 then
- scr = 0x60
- nvm.set("xoffset",0)
- nvm.set("yoffset",0)
- elseif scr == 0x60 then
- scr = 0xc0
- nvm.set("xoffset",0)
- nvm.set("yoffset",80)
- elseif scr == 0xc0 then
- scr = 0xa0
- nvm.set("xoffset",80)
- nvm.set("yoffset",0)
- elseif scr == 0xa0 then
- scr = 0
- nvm.set("xoffset",0)
- nvm.set("yoffset",0)
- end
- nvm.set("screen",scr)
- disp.close()
- if st7789 then
- st7789.init()
- else
- gc9306x.init()
- end
- end
- end)
- -- 启动显示
- sys.publish("LCD_START")
- --启动系统框架
- sys.init(0, 0)
- sys.run()
复制代码
以上代码中,重点部分的说明:
1. 显示任务:
sys.taskInit(function()
sys.waitUntil("LCD_START")
...
end)
此处等待 LCD_START 消息,待后续代码触发该消息,就能正式运行了。
其中的重点,为lcd部分的函数:
lcd.wake(1):唤醒显示屏
lcd.setcharwidth(16):设置字符宽度
disp.setfontheight(32):设置字体大小
disp.clear():清屏
lcd.putStringCenter("字符串",x,y,r,g,b):在指定位置,用指定颜色,显示字符串
2. 按键处理:
sys.subscribe("KEY_EVENT", function(k,e)
if not e then return end
if k == "OK" then
......
end
end)
此处订阅了一个KEY_EVENT消息,当按键时,会触发该消息,从而调用上述代码。
按键消息具体注册的部分,可以看keycfg.lua,包含了可以用到的所有按键。
这个例子中,我们只使用到了OK按键,按下后,屏幕的方向将会改变。
3. 消息触发
sys.publish("LCD_START")
通过sys.publish发送LCD_START消息,订阅或者等待该消息的代码,就会得到执行。
4. 随机函数:
math.random(m, n)
使用到了lua自带的math.random,表示生成m,n内的随机数。
完整的代码,请查看附件:
以上代码,写到开发板以后,具体的效果如下:
实际效果,可以查看视频:
1640333224341035
|