Micropython学习交流群 学习QQ群:786510434 提供多种固件下载和学习交流。

Micropython-扇贝物联 QQ群:31324057 扇贝物联是一个让你与智能设备沟通更方便的物联网云平台

Micropython学习交流群 学习QQ群:468985481 学习交流ESP8266、ESP32、ESP8285、wifi模块开发交流、物联网。

Micropython老哥俩的IT农场分享QQ群:929132891 为喜欢科创制作的小白们分享一些自制的计算机软硬件免费公益课程,由两位多年从事IT研发的中年大叔发起。

Micropython ESP频道

micropython esp32 ssd1306显示屏上实现用上下左右确认键实现字符的输入


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()

把代码上传至板子上,如果一切正常,显示效果是这样的

1.jpg


同理,你可以把代码换成

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()

这时显示的是数字键盘

2.jpg

具体方法

移动

你可以使用以下函数来移动选中的位置(以下简称指针):


k.moveUp()使指针向上移动

k.moveDown()使指针向下移动

k.moveLeft() 使指针向左移动

k.moveRight()使指针向右移动

比方说:这是原先的位置

3.jpg

执行了以下代码之后


k.moveDown() #下移

lcd.show() #刷新屏幕

4.jpg


很显然,指针下移到了"f"


另外三个方向的移动同理,不作解释


模块内有做碰撞算法处理,若移动后指针会离开屏幕,则执行无效(程序不会报错,但是模块不会让指针移动),特殊情况在下一个部分会说


移动特殊情况

为了方便的切换字母输入模式和数字输入模式:


如果在字母输入模式下指针在底部,也就是"z","enter","back"这三个位置,这个时候使指针下移k.moveDown(),这个时候指针会进入数字输入模式,并且指针停留到"1"处,实现换页


同理,如果在数字输入模式下指针在顶部,也就是"1","2","3",这三个位置,这个时候使指针上移k.moveUp(),


这个时候指针会进入字母输入模式,并且指针停留在"z"处


比如这是移动前:


4.jpg

执行了以下代码之后


k.moveDown()

lcd.show()

5.jpg


从数字输入模式切换到字母输入模式同理,不作解释


标签

在一开始的示例中

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()

屏幕

6.jpg

显然,右下角多了一条线,这就是标签

要使用标签,要在创建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() #刷新屏幕

运行效果:

7.jpg



其他操作

k.get()

返回现在指针选中的内容,比如显示屏是上图状态,然后运行

k.get()

之后返回'a',说明指针选中"a"

k.goto(x,y)

把指针移动到某个位置,比如运行

k.goto(1,1)

运行后

8.jpg



指针选中"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

执行时间: 0.010957956314087 seconds