本站改版新增arduino频道
micropython键盘输入
这是micropython的键盘输入项目,旨在用micropython语言的ssd1306显示屏上实现用上下左右确认键实现字符的输入。模块名为keyboard.py,可以上传入板子后用import keyboard来导入模块
以下用esp32-s测试
示例
使用前导入相关的模块:
from machine import Pin,SoftI2C
import ssd1306
#以上的模块用于驱动ssd1306屏幕
import keyboard #主模块
创建ssd1306屏幕对象
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000)#创建一个I2C对象,从中指定了scl为gpio引脚22,sda为21
lcd=ssd1306.SSD1306_I2C(128,64,i2c) #创建ssd1306屏幕对象
创建keyboard对象
k=keyboard.keyboard(lcd) #创建keyboard对象,也就是创建键盘对象,然后可以通过对这个对象的操作实现输入
k.init() #初始化键盘(在屏幕上显示26个英文字母的键盘)
随后把内容显示到屏幕上
lcd.show() #把26个字母的键盘显示到屏幕上
最后代码加起来就是这样
from machine import Pin,SoftI2C import ssd1306 import keyboard i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000) lcd=ssd1306.SSD1306_I2C(128,64,i2c) k=keyboard.keyboard(lcd) k.init() lcd.show()
把代码上传至板子上,如果一切正常,显示效果是这样的

同理,你可以把代码换成
from machine import Pin,SoftI2C import ssd1306 import keyboard i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000) lcd=ssd1306.SSD1306_I2C(128,64,i2c) k=keyboard.keyboard(lcd) k.init_num() #这里代码有所修改,方法由init改为了init_num lcd.show()
这时显示的是数字键盘

具体方法
移动
你可以使用以下函数来移动选中的位置(以下简称指针):
k.moveUp()使指针向上移动
k.moveDown()使指针向下移动
k.moveLeft() 使指针向左移动
k.moveRight()使指针向右移动
比方说:这是原先的位置

执行了以下代码之后
k.moveDown() #下移
lcd.show() #刷新屏幕

很显然,指针下移到了"f"
另外三个方向的移动同理,不作解释
模块内有做碰撞算法处理,若移动后指针会离开屏幕,则执行无效(程序不会报错,但是模块不会让指针移动),特殊情况在下一个部分会说
移动特殊情况
为了方便的切换字母输入模式和数字输入模式:
如果在字母输入模式下指针在底部,也就是"z","enter","back"这三个位置,这个时候使指针下移k.moveDown(),这个时候指针会进入数字输入模式,并且指针停留到"1"处,实现换页
同理,如果在数字输入模式下指针在顶部,也就是"1","2","3",这三个位置,这个时候使指针上移k.moveUp(),
这个时候指针会进入字母输入模式,并且指针停留在"z"处
比如这是移动前:

执行了以下代码之后
k.moveDown()
lcd.show()

从数字输入模式切换到字母输入模式同理,不作解释
标签
在一开始的示例中
from machine import Pin,SoftI2C import ssd1306 import keyboard i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000) lcd=ssd1306.SSD1306_I2C(128,64,i2c) k=keyboard.keyboard(lcd) k.init() lcd.show()
把代码修改,运行
from machine import Pin,SoftI2C import ssd1306 import keyboard i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000) lcd=ssd1306.SSD1306_I2C(128,64,i2c) k=keyboard.keyboard(lcd,entry=True) #创建keyboard对象是把entry设置为True,显示标签 k.init() lcd.show()
屏幕

显然,右下角多了一条线,这就是标签
要使用标签,要在创建keyboard对象的时候设置entry为True
你可以通过以下代码来控制标签:
k.ent_append(char) 标签内追加内容,char为追加内容
k.ent_back(count) 标签退格,count为退格字符数
k.ent_clear() 清空标签,无参数,无返回
k.ent_get() 返回标签内容 无参数,返回标签内容
由于屏幕大小限制,只会显示最后5个字符
执行以下代码并运行
from machine import Pin,SoftI2C
import ssd1306
import keyboard
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000)
lcd=ssd1306.SSD1306_I2C(128,64,i2c)
k=keyboard.keyboard(lcd,entry=True) #创建keyboard对象是把entry设置为True,显示标签
k.init()
k.ent_append('hello') #标签内追加内容
lcd.show() #刷新屏幕运行效果:

其他操作
k.get()
返回现在指针选中的内容,比如显示屏是上图状态,然后运行
k.get()
之后返回'a',说明指针选中"a"
k.goto(x,y)
把指针移动到某个位置,比如运行
k.goto(1,1)
运行后

指针选中"g"
注意:从左上角的坐标是(0,0)
内部调用
k.update()
k.clear()
k.update_num()
k.clear_num()
内部调用,不要使用,否则可能有想象中不一样的结果
联系方式:
zbr20070621zbr@163.com
或者加q:2517889752
严禁倒卖
example.py
from machine import Pin,SoftI2C import ssd1306 import keyboard i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=100000) lcd=ssd1306.SSD1306_I2C(128,64,i2c) k=keyboard.keyboard(lcd,entry=True) k.init() lcd.show()
keyboard.py
class keyboard:
def __init__(self,lcd,entry=False):
self.lcd=lcd
self.zb=[0,0]
self.title=''
self.entry=entry
self.page=0
self.key2=[('1','2','3'),('4','5','6'),('7','8','9'),('back','0','enter')]
self.key=[('a','b','c','d','e'),('f','g','h','i','j'),('k','l','m','n','o'),('p','q','r','s','t'),('u','v','w','x','y'),('z','back','enter')]
def init_num(self):
self.page=1
self.lcd.fill(0)
for xx in range(4):
for x in range(3):
self.lcd.rect(x*42,1+(xx*16),40,14,1)
if xx <=2:
self.lcd.text(self.key2[xx][x],14+(x*42),4+(xx*16))
elif x==0:
self.lcd.text('back',4+(0*42),4+(3*16))
elif x==2:
self.lcd.text('ent',8+(2*42),4+(3*16))
elif x==1:
self.lcd.text(self.key2[3][1],14+(1*42),4+(3*16))
self.update_num()
def update_num(self):
self.lcd.fill_rect(self.zb[0]*42,1+(self.zb[1]*16),40,14,1)
if self.zb[0] <= 2 and self.zb[1] <=2:
self.lcd.text(self.key2[self.zb[1]][self.zb[0]],14+(self.zb[0]*42),4+(self.zb[1]*16),0)
elif self.zb[0] == 0:
self.lcd.text('back',4,4+(3*16),0)
elif self.zb[0] == 1:
self.lcd.text(self.key2[3][1],14+(1*42),4+(3*16),0)
elif self.zb[0] == 2:
self.lcd.text('ent',8+(2*42),4+(3*16),0)
def clear_num(self):
self.lcd.fill_rect(self.zb[0]*42,1+(self.zb[1]*16),40,14,0)
self.lcd.rect(self.zb[0]*42,1+(self.zb[1]*16),40,14,1)
if self.zb[0] <= 2 and self.zb[1] <=2:
self.lcd.text(self.key2[self.zb[1]][self.zb[0]],14+(self.zb[0]*42),4+(self.zb[1]*16),1)
elif self.zb[0] == 0:
self.lcd.text('back',4,4+(3*16),1)
elif self.zb[0] == 1:
self.lcd.text(self.key2[3][1],14+(1*42),4+(3*16),1)
elif self.zb[0] == 2:
self.lcd.text('ent',8+(2*42),4+(3*16),1)
def init(self):
self.page=0
self.lcd.fill(0)
self.zb=[0,0]
for xx in range(5):
for x in range(5):
self.lcd.rect(x*25,1+(xx*10),22,9,1)
self.lcd.text(self.key[xx][x],6+(x*25),1+(xx*10))
self.lcd.rect(0,51,22,9,1) #z
self.lcd.rect(25,51,22,9,1) #back
self.lcd.rect(50,51,22,9,1) #enter
self.lcd.text(self.key[5][0],5,51)
self.lcd.text('en',28,51)
self.lcd.text('ba',53,51)
self.lcd.fill_rect(0,1,22,9,1)
self.lcd.text(self.key[0][0],6,1,0)
if self.entry:
self.lcd.hline(75,60,48,1)
def ent_append(self,char):
self.title=self.title+char
if not self.page:
self.lcd.text(self.title[-5:],78,52)
def ent_back(self,count):
self.title=self.title[:-(count)]
if not self.page:
self.lcd.fill_rect(75,50,48,12,0)
self.lcd.hline(75,60,48,1)
self.lcd.text(self.title[-5:],78,52)
def ent_clear(self):
self.title=''
if not self.page:
self.lcd.fill_rect(75,50,48,12,0)
self.lcd.hline(75,60,48,1)
self.lcd.text(self.title[-5:],78,52)
def ent_get(self):
return self.title
def moveUp(self):
if not self.page:
if self.zb[1] != 0:
self.clear()
self.zb[1]-=1
self.update()
else:
if self.zb[1] != 0:
self.clear_num()
self.zb[1]-=1
self.update_num()
elif self.zb[1] == 0:
self.init()
self.clear()
self.zb=[0,5]
self.update()
def moveDown(self):
if not self.page:
if self.zb[1] != 4 or self.zb[0]==0 or self.zb[0] ==1 or self.zb[0] ==2:
if (self.zb[0] == 0 or self.zb[0] == 1 or self.zb[0] == 2) and self.zb[1] ==4:
self.clear()
self.zb[1]+=1
self.update()
elif self.zb[1] <=4:
self.clear()
self.zb[1]+=1
self.update()
elif self.zb[1] == 5:
self.zb=[0,0]
self.init_num()
self.update_num()
else:
if self.zb[1] !=3:
self.clear_num()
self.zb[1]+=1
self.update_num()
def moveLeft(self):
if not self.page:
if self.zb[0] !=0:
self.clear()
self.zb[0]-=1
self.update()
else:
if self.zb[0] !=0:
self.clear_num()
self.zb[0]-=1
self.update_num()
def moveRight(self):
if not self.page:
if self.zb[1] != 5 or (self.zb[1] == 5 and self.zb[0] !=2):
if self.zb[0] !=4:
self.clear()
self.zb[0]+=1
self.update()
else:
if self.zb[0] !=2:
self.clear_num()
self.zb[0]+=1
self.update_num()
def get(self):
if not self.page:
r=self.key[self.zb[1]][self.zb[0]]
else:
r=self.key2[self.zb[1]][self.zb[0]]
return r
def clear(self):
if self.zb[1] != 5 or (self.zb[0] == 0 and self.zb[1] == 5):
self.lcd.fill_rect(self.zb[0]*25,1+(self.zb[1]*10),22,9,0)
self.lcd.rect(self.zb[0]*25,1+(self.zb[1]*10),22,9,1)
self.lcd.text(self.key[self.zb[1]][self.zb[0]],6+(self.zb[0]*25),1+(self.zb[1]*10))
elif self.zb[0] == 1:
self.lcd.fill_rect(25,51,22,9,0)
self.lcd.rect(25,51,22,9,1)
self.lcd.text('en',28,51,1)
elif self.zb[0] == 2:
self.lcd.fill_rect(50,51,22,9,0)
self.lcd.rect(50,51,22,9,1)
self.lcd.text('ba',53,51,1)
def update(self):
if self.zb[1] != 5 or (self.zb[0] == 0 and self.zb[1] == 5):
self.lcd.fill_rect(self.zb[0]*25,1+(self.zb[1]*10),22,9,1)
self.lcd.text(self.key[self.zb[1]][self.zb[0]],6+(self.zb[0]*25),1+(self.zb[1]*10),0)
elif self.zb[0] == 1:
self.lcd.fill_rect(25,51,22,9,1)
self.lcd.text('en',28,51,0)
elif self.zb[0] == 2:
self.lcd.fill_rect(50,51,22,9,1)
self.lcd.text('ba',53,51,0)
def goto(self,x,y):
if not self.page:
self.clear()
self.zb=[x,y]
self.update()
else:
self.clear_num()
self.zb=[x,y]
self.update_num()开源地址:https://github.com/NBOPD/micropython_keyboad
Copyright © 2014 ESP56.com All Rights Reserved
晋ICP备14006235号-22 晋公网安备14108102001165号
执行时间: 0.0095961093902588 seconds