鱼C论坛

 找回密码
 立即注册
查看: 1521|回复: 3

[学习笔记] 树莓 Raspberry Pi PICO - LCD 1602 - Python(未完成)

[复制链接]
发表于 2023-1-29 12:05:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
LCD1602 液晶显示器是广泛使用的一种字符型液晶显示模块。

很多单片机、开发板等都有它的踪影,语言中无论是 C/C++、Python、Arduino 等都已经有许多大佬帮它写了初始化、SDK、头文件、模块... 只需下载直接就能调用,不用理解显示器内部运作方式。
在这里我想试试自己写
以下代码(未完成),因为怕忘记,所以先笔记。
  1. from machine import Pin, PWM
  2. from micropython import const
  3. from time import sleep_us

  4. LOW = const(0)
  5. HIGH = const(1)

  6. # 将数据 (二进制) 写入八位引脚
  7. def setting(D: "引脚", data: "二进制数据") -> None:
  8.     res = list()
  9.     i = 8
  10.     while i:
  11.         i -= 1
  12.         res.append(data & 1)
  13.         data >>= 1
  14.     for i, d in res[::-1]:
  15.         D[i].high() if d else D[i].low()

  16. class LCD1602:   
  17.     def __init__(self, GND, VCC, VO, RS, RW, EN, A, K, *D):
  18.         # 电源控制引脚
  19.         self.GND = GND
  20.         self.VCC = VCC
  21.         self.GND.value(LOW)
  22.         self.VCC.value(HIGH)
  23.         
  24.         # 液晶显示控制引脚
  25.         self.VO = VO # LCD 对比度 - 脉冲引脚
  26.         self.A = A   # LCD 背光 - Anode
  27.         self.K = K   # LCD 背光 - Cathode
  28.         self.A.value(HIGH)
  29.         self.K.value(LOW)
  30.         
  31.         self.VO.duty_16(65535 >> 1)               # 将占空比设为 50%
  32.         self.VO.init(freq = 5000, duty_ns = 5000) # 重新初始化,周期为 200us,占空比为 5us
  33.         self.VO.duty_ns(3000)                     # 设置脉冲宽度为 3us
  34.         
  35.         # 数据控制引脚
  36.         self.RS = RS # 寄存器选择
  37.         self.RW = RW # 读 / 写数据
  38.         self.EN = EN # enable 启用
  39.         self.D = D   # 8 bits (0000 0000)
  40.    
  41.     def __del__(self):
  42.         self.VO.deinit() # 结束脉冲信号
  43.    
  44.     # 清屏指令 (clear display) # RS RW 0 0 0 0 0 0 0 1
  45.     def Clear(self):
  46.         """
  47.             清除液晶显示器,即将 DDRAM 中的内容全部填入 20H (空白字符)
  48.             光标撤回显示屏左上方
  49.             将地址计数器 (AC) 设为 0
  50.             光标移动方向为从左向右,并且 DDRAM 的自增量为 1 (ID = 1)
  51.         """
  52.         self.RS.low()
  53.         self.RW.low()
  54.         setting(self.D, 0x01) # 8bits 0000 0001
  55.    
  56.     # 光标归位指令 (Return Home) # RS RW 0 0 0 0 0 0 1 X
  57.     def Home(self):
  58.         """
  59.             将地址计数器 (AC) 设为 00H
  60.             DDRAM 内容保持不变
  61.             光标移至左上脚
  62.             
  63.             ** DB0: X (未知逻辑电平)
  64.         """
  65.         self.RS.low()
  66.         self.RW.low()
  67.         pin.value(LOW) for pin in self.D[2:]
  68.         self.D[1].value(HIGH)
  69.    
  70.     # 进入模式设置指令 (Entry Mode Set) RS RW 0 0 0 0 0 1 ID SH
  71.     def Entry(self, ID = LOW, SH = HIGH):
  72.         """ 设定每次定入 1 位数据后,光标移位方向并且设定次写入一个字符是否移动
  73.             ID = 0 光标左移,DDRAM 地址自增 1
  74.             ID = 1 光标右移,DDRAM 地址自增 1 (当从 CGRAM 中读取或写入数据时,CGRAM 操作与 DDRAM 相同)
  75.             SH = 0 且 DDRAM是读操作(CGRAM读或写),整个屏幕不移动
  76.             SH = 1 且 DDRAM 是写操作,整个屏幕移动,移动方向由I/D决定
  77.             
  78.             ** ID: Increment / decrement of DDRAM address (cursor or blink)
  79.             ** SH: Shift of entire display
  80.         """
  81.         self.RS.low()
  82.         self.RW.low()
  83.         setting(self.D, 0b100 | ID << 1 | SH)
  84.    
  85.     # 显示开关控制 (Display ON/OFF Control)
  86.     def OnOff(self, D = HIGH, C = HIGH, B = LOW): # RS RW 0 0 0 0 1 D C B
  87.         """
  88.             D = 1 显示功能开
  89.             D = 0 显示功能关,但是 DDRAM 中的数据依然保留
  90.             C = 1 有光标
  91.             C = 0 没有光标
  92.             B = 1 光标闪烁
  93.             B = 0 光标不闪烁
  94.             
  95.             ** D: Display ON/OFF control bit
  96.             ** C: Cursor ON/OFF control bit
  97.             ** B: Cursor Blink ON/OFF control bit
  98.         """
  99.         self.RS.low()
  100.         self.RW.low()
  101.         setting(self.D, 0b1000 | D << 2 | C << 1 | B)
  102.    
  103.     # 设置显示屏或光标移动方向的指令 RS RW 0 0 0 1 SC RL X X
  104.     def Shift(self, SC = HIGH, RL = HIGH):
  105.         """ 整屏的移动或光标移动
  106.             S/C = 0 R/L = 0 光标左移,地址计数器减 1 (即显示内容和光标一起左移)
  107.             S/C = 0 R/L = 1 光标右移,地址计数器加 1 (即显示内容和光标一起右移)
  108.             S/C = 1 R/L = 0 显示内容左移,光标不移动
  109.             S/C = 1 R/L = 1 显示内容右移,光标不移动
  110.             
  111.             ** S/C: Screen / Cursor
  112.             ** R/L: Right / Left
  113.         """
  114.         self.RS.low()
  115.         self.RW.low()
  116.         self.D[pin].value(state) for pin, state in enumerate([RL, SC, HIGH, LOW, LOW, LOW], start = 2)
  117.         
  118.     # 功能设定指令 RS RW 0 0 1 DL N F XX
  119.     def Set(self, DL = HIGH, N = HIGH, F = HIGH):
  120.         """ 设定数据总线位数、显示的行数及字形
  121.             DL = 1 数据总线是 8 位
  122.             DL = 0 数据总线是 4 位
  123.             N = 0 显示一行
  124.             N = 1 显示两行
  125.             F = 0 5x8 点阵/字符
  126.             F = 1 5x11 点阵/字符
  127.             
  128.             ** DL: Interface data length control bit
  129.             ** N: Display line number control bit
  130.             ** F: Display font type control bit
  131.         """
  132.         self.RS.low()
  133.         self.RW.low()
  134.         self.D[pin].value(state) for pin, state in enumerate([F, N, DL, HIGH, LOW, LOW], start = 2)
  135.    
  136.     # 设定 DDRAM 地址指令 RS RW 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0
  137.     # 设定 CGRAM 地址指令 RS RW 0  1  AC5 AC4 AC3 AC2 AC1 AC0
  138.     def Write(self, data):
  139.         """ 设定下一个要存入数据的 CGRAM 地址
  140.             DB5 DB4 DB3 为字符号,即将显示该字符用到的字符地址 8 bits
  141.             DB2 DB1 DB0 为行号 111 / 000
  142.             
  143.             ** CGRAM: Character generate RAM            自定义的字符或图形,存储在 CGRAM 中
  144.             ** CGROM: Character generate ROM            常用字符原本就已经存储在 CGROM 中,可以直接调用
  145.             ** DDRAM: Display Data Random Access Memory 显示用的地址
  146.             
  147.             DDRAM 地址与显示位置对应关系如下:
  148.             00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 10H 11H 12H 13H 14H 15H
  149.             40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH

  150.              -----------------------------------------------------------------------------------
  151.             |  command  |                                                           |  running  |
  152.             |  function |                    instruction encoding                   |   time    |
  153.              -----------------------------------------------------------------------------------
  154.             |    set    | RS  | RW  | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |           |
  155.             |   DDRAM   |-----------------------------------------------------------    40us    |
  156.             |  address  |  0  |  0  |  1  |          CGRAM address (7 bits)         |           |
  157.              -----------------------------------------------------------------------------------
  158.              ###################################################################################
  159.              -----------------------------------------------------------------------------------
  160.             |  command  |                                                           |  running  |
  161.             |  function |                    instruction encoding                   |   time    |
  162.              -----------------------------------------------------------------------------------
  163.             |    set    | RS  | RW  | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |           |
  164.             |   CGRAM   |-----------------------------------------------------------    40us    |
  165.             |  address  |  0  |  0  |  0  |  1  |      CGRAM address (6 bits)       |           |  
  166.              -----------------------------------------------------------------------------------
  167.             
  168.              """
  169.         self.RS.low()
  170.         self.RW.low()
  171.         setting(self.D, address)
  172.         sleep_us(100) # 延迟 100毫秒,以确保数据接受完毕 (数据接收至少需要 40us)
  173.         
  174.         "编写中..."
  175.         pass
  176.    
  177.     def Read(self, data):
  178.         "编写中..."
  179.         pass
  180.         
  181. if __name__ == "__main__":
  182.    
  183.     # 引脚 GPIO 0 ~ 15
  184.     GND = Pin(0, Pin.OUT)
  185.     VCC = Pin(1, Pin.OUT)
  186.     VO  = PWM(2)
  187.     RS  = Pin(3, Pin.OUT)
  188.     RW  = Pin(4, Pin.OUT)
  189.     EN  = Pin(5, Pin.OUT)
  190.     D   = Pin(i, Pin.OUT) for i in range(6, 14)
  191.     A   = Pin(14, Pin.OUT)
  192.     K   = Pin(15, Pin.OUT)

  193.     lcd = LCD1602(GND, VCC, VO, RS, RW, EN, A, K, D)

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-29 13:07:08 | 显示全部楼层
虽然对这方面一窍不通啊,但是还是加油了

另外可以像@元豪 做植物大战僵尸的时候开一个栏目,容易被评分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-29 13:15:29 | 显示全部楼层
hziyan 发表于 2023-1-29 13:07
虽然对这方面一窍不通啊,但是还是加油了

另外可以像@元豪 做植物大战僵尸的时候开一个栏目, ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-12 13:43:02 | 显示全部楼层
hziyan 发表于 2023-1-29 13:07
虽然对这方面一窍不通啊,但是还是加油了

另外可以像@元豪 做植物大战僵尸的时候开一个栏目, ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 14:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表