AQM1248Aにまだ取り組んでいる。
2次元のリストの取り扱いがどうもうまくできないので、リストを使用しないでできる方法を考えてみたがこれがなかなかうまくいかない。
仕方がないので、うまく扱えそうな1次元のリストを使用して、VRAMのように使用することにしてみた。64*128ビット分の長さとなる1次元のリストで、各ピクセルの1,0をあらわしてみることで何とかうまくいった。
VRAMに見立てたリストの内容から、最後は、全面のディスプレイを表示しなおす形とした。
本当は、ページごとに書き直すようにしないと後々苦労しそうだが今回使用したフリーフォントは、縦16ビット、横8ビットのビットマップフォントだったので、3ページにまたがったり、2ページで済んだりするので、この辺のプログラミングがどうもうまくいかなくて断念している状態だ。
とりあえずの通過点として、ディスプレイの好きな位置に数字を表示するところまではできるようになった。BDFのフォントを読み込めるとよいのだが、今回は、力技で、フォントをプログラム内にデータとして表記した。
Micropythonでは、f=openが通用しないようなので、力技で入れるか、あらかじめNVRAMに入れ込んでおくかしないとできなさそうだ。
freq=1234567890
x=10
y=10
f_display(freq,x,y)
という形で呼び出せるようになった。
使用したコードは、下記だ。
#RaspberryPi pico AQM1248A practice 1 draw sine wave
from machine import SPI, Pin
import time
import math
spi = SPI(0, baudrate=8000000, polarity=1, phase=1, bits=8, firstbit=SPI.MSB,sck=Pin(18),mosi=Pin(19))
cs=Pin(17,Pin.OUT)
rs=Pin(15,Pin.OUT)
def lcd_cmd_write(cmd):
cs.value(0)
rs.value(0)
spi.write(cmd.to_bytes(1,"big"))
cs.value(1)
def lcd_data_write(data):
cs.value(0)
rs.value(1)
spi.write(data.to_bytes(1,"big"))
rs.value(0)
cs.value(1)
def lcd_reset():
i=0
j=0
data=0xe1#colum address increment when write
lcd_cmd_write(data)
while i<8:
data=0xb0+i#Page address set 0xb0+Page
lcd_cmd_write(data)
#print(i,data.to_bytes(1,"big"))
data=0x10#colum address set upperbit
lcd_cmd_write(data)
data=0x00#colum address set lowerbit
lcd_cmd_write(data)
j=0
while j<128:
data=0x00
lcd_data_write(data)
j+=1
i+=1
def init_lcd():
#data=0xe2#Reset
#lcd_cmd_write(data)
#time.sleep_ms(2)
data=0xae#Display OFF ON:0xaf OFF:0xae
lcd_cmd_write(data)
data=0xa0#ADC=normal normal:0xa0 reverse:0xa1
lcd_cmd_write(data)
data=0xc8#Command output=reverse nornal:0xc8 reverse:0xc0
lcd_cmd_write(data)
data=0xa3#bias=1/7 1/9:0xc2 1/7(ST7565R):0xc3
lcd_cmd_write(data)
#regurator settings
data=0x2c#power control 1
lcd_cmd_write(data)
time.sleep_ms(2)
data=0x2e#power control 2
lcd_cmd_write(data)
time.sleep_ms(2)
data=0x2f#power control 3
lcd_cmd_write(data)
time.sleep_ms(2)
#data=0x2c#power control 1
#lcd_cmd_write(data)
#time.sleep_ms(2)
#Contrast setting
data=0x23#Vo voltage resistor ratio set
lcd_cmd_write(data)
data=0x81#Electronic volume mode set
lcd_cmd_write(data)
data=0x1c#Electronic volume value set
lcd_cmd_write(data)
#Display setting
data=0xa4#display all point=normal
lcd_cmd_write(data)
data=0x40#display start line=0
lcd_cmd_write(data)
data=0xa6#Display normal/reverse=normal
lcd_cmd_write(data)
lcd_reset()
data=0xaf#Dosplay =ON
lcd_cmd_write(data)
#lcd_reset()
def colum_set(colum):
colum_upper=int(colum/0x100)
colum_lower=colum % 0x100
data=0x10+colum_upper#colum address set upperbit
lcd_cmd_write(data)
data=0x00+colum_lower#colum address set lowerbit
lcd_cmd_write(data)
def incr_set():
data=0xe1#colum address increment when write
lcd_cmd_write(data)
def f_display(freq,x,y):
f_dat=[]
i=0
while i<0x80:
f_dat.append([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00])
i+=1
f_dat[0x30]=[0x00,0x18,0x24,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x24,0x18,0x00,0x00]#font char 0
f_dat[0x31]=[0x00,0x18,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00]#font char 1
f_dat[0x32]=[0x00,0x18,0x24,0x42,0x42,0x02,0x04,0x04,0x08,0x10,0x20,0x40,0x40,0x7e,0x00,0x00]#font char 2
f_dat[0x33]=[0x00,0x18,0x24,0x42,0x42,0x02,0x04,0x1c,0x04,0x02,0x42,0x42,0x24,0x18,0x00,0x00]#font char 3
f_dat[0x34]=[0x00,0x02,0x06,0x06,0x0a,0x0a,0x12,0x12,0x22,0x22,0x7f,0x02,0x02,0x02,0x00,0x00]#font char 4
f_dat[0x35]=[0x00,0x3e,0x20,0x20,0x40,0x40,0x78,0x44,0x02,0x02,0x42,0x42,0x24,0x18,0x00,0x00]#font char 5
f_dat[0x36]=[0x00,0x08,0x08,0x10,0x10,0x20,0x38,0x24,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00]#font char 6
f_dat[0x37]=[0x00,0x7e,0x02,0x02,0x02,0x04,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x10,0x00,0x00]#font char 7
f_dat[0x38]=[0x00,0x18,0x24,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x24,0x18,0x00,0x00]#font char 8
f_dat[0x39]=[0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x24,0x1c,0x04,0x08,0x08,0x10,0x10,0x00,0x00]#font char 9
f_dat[0x2e]=[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00]#font char .
f_dat[0x48]=[0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x42,0x42,0x00,0x00]#font char H
f_dat[0x7a]=[0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x02,0x04,0x08,0x10,0x20,0x40,0x7e,0x00,0x00]#font char z
i=0
j=0
k=0
#x=20
#y=10
image0_lists=[0]*128*64
font_size_t=16
font_size_w=8
#freq=7012345.0
fchar=str(freq)+'Hz'
init_lcd()
lcd_reset()
#cmd=0xe0
#lcd_cmd_write(cmd)#no increment setting
while i<font_size_t:
a=0
while j<font_size_w*len(fchar):
fchar_ord=ord(fchar[int(j/font_size_w)])
a=f_dat[fchar_ord][i]
a=(a<<j%font_size_w)%0x100
a=a>>(font_size_w-1)
image0_lists[x+j+(i+y)*128]=a
#print(i,j,f_dat[fchar_ord][i],a)
a=0
j+=1
j=0
i+=1
#print(image0_lists)
i=0
while i<8:
cmd=0xb0+i
lcd_cmd_write(cmd)
colum_set(0)
j=0
while j<128:
a=0
b=0
k=0
while k<8:
a=image0_lists[j+(i*8+k)*128]
b=b+a*2**k
k+=1
lcd_data_write(b)
#print(i,j,b)
j+=1
i+=1
freq=1234567890
x=10
y=10
f_display(freq,x,y)