from machine import Pin
from time import sleep, sleep_ms
# 定义LCD数据引脚
D7 = Pin(0, Pin.OUT)
D6 = Pin(1, Pin.OUT)
D5 = Pin(2, Pin.OUT)
D4 = Pin(3, Pin.OUT)
D3 = Pin(4, Pin.OUT)
D2 = Pin(5, Pin.OUT)
D1 = Pin(6, Pin.OUT)
D0 = Pin(7, Pin.OUT)
port_d8 = [D0, D1, D2, D3, D4, D5, D6, D7]
# 定义LCD控制引脚
RS = Pin(13, Pin.OUT)
RW = Pin(12, Pin.OUT)
EN = Pin(11, Pin.OUT)
# 向LCD发送命令
def write_cmd(cmd):
EN.value(0)
sleep_ms(1)
RS.value(0) # 选择命令寄存器
x = cmd
for i in range(8):
bit = x & 0x01
port_d8[i].value(bit)
x = x >> 0x01
sleep_ms(1)
EN.value(1) # 使能脉冲
sleep_ms(1)
EN.value(0)
# 初始化LCD
def lcd_init():
write_cmd(0x38) # 8位数据接口,两行显示,5x7点阵
write_cmd(0x08) # 关闭显示
write_cmd(0x01) # 清屏
write_cmd(0x06) # 显示光标移动设置
sleep_ms(5)
write_cmd(0x0f) # 打开显示,光标闪烁
# 向LCD发送数据
def write_data(data):
EN.value(0)
sleep_ms(1)
RS.value(1) # 选择数据寄存器
x = data
for i in range(8):
bit = x & 0x01
port_d8[i].value(bit)
x = x >> 0x01
sleep_ms(1)
EN.value(1) # 使能脉冲
sleep_ms(1)
EN.value(0)
# 在指定位置写一个字符
def write_ch(x, y, ch):
if y == 0:
write_cmd(0x80 + x) # 第一行
else:
write_cmd(0xc0 + x) # 第二行
write_data(ord(ch))
# 在指定位置写一个字符串
def write_str(x, y, string):
for i, char in enumerate(string):
write_ch(x + i, y, char)
# 清屏
def lcd_clear():
write_cmd(0x01)
sleep_ms(5)
# 清除第二行
def clear_second_line():
write_cmd(0xC0) # 移动光标到第二行开始
for _ in range(16): # 假设第二行有16个字符
write_data(0x20) # 写空格清除字符
# 定义键盘行引脚
pin_r = [
Pin(26, Pin.IN, Pin.PULL_DOWN),
Pin(22, Pin.IN, Pin.PULL_DOWN),
Pin(21, Pin.IN, Pin.PULL_DOWN),
Pin(20, Pin.IN, Pin.PULL_DOWN)
]
# 定义键盘列引脚
pin_c = [
Pin(19, Pin.OUT),
Pin(18, Pin.OUT),
Pin(17, Pin.OUT),
Pin(16, Pin.OUT)
]
# 定义键盘按键映射
key_n = [
['1', '2', '3', '+'],
['4', '5', '6', '-'],
['7', '8', '9', '*'],
['C', '0', '=', '/']
]
# 扫描键盘并返回按下的按键
def key_s():
for i in range(4):
pin_c[i].value(1)
for j in range(4):
if pin_r[j].value():
sleep_ms(10)
if pin_r[j].value():
if key_n[j][i] == 'C':
clear_second_line()
return None
else:
return key_n[j][i]
pin_c[i].value(0)
return None
# 计算表达式
def calculate(expression):
try:
return str(eval(expression))
except:
return "Error"
if __name__ == "__main__":
sleep_ms(15)
lcd_init()
write_str(0, 0, "SimpleCalculator")
write_str(0, 1, " huang yu")
expression = ""
while True:
k = key_s()
if k is not None:
if k == 'C':
clear_second_line()
expression = ""
elif k == '=':
result = calculate(expression)
clear_second_line()
write_str(0, 1, result)
expression = ""
else:
expression += k
write_ch(len(expression) - 1, 1, k)
sleep_ms(75)