ja1yaz’s diary

感動したいおやじの備忘録的ブログ 

AQM1248Aを使いこなしたい。(3)

AQM1248Aにまだ取り組んでいる。

2次元のリストの取り扱いがどうもうまくできないので、リストを使用しないでできる方法を考えてみたがこれがなかなかうまくいかない。

仕方がないので、うまく扱えそうな1次元のリストを使用して、VRAMのように使用することにしてみた。64*128ビット分の長さとなる1次元のリストで、各ピクセルの1,0をあらわしてみることで何とかうまくいった。

VRAMに見立てたリストの内容から、最後は、全面のディスプレイを表示しなおす形とした。

本当は、ページごとに書き直すようにしないと後々苦労しそうだが今回使用したフリーフォントは、縦16ビット、横8ビットのビットマップフォントだったので、3ページにまたがったり、2ページで済んだりするので、この辺のプログラミングがどうもうまくいかなくて断念している状態だ。

とりあえずの通過点として、ディスプレイの好きな位置に数字を表示するところまではできるようになった。BDFのフォントを読み込めるとよいのだが、今回は、力技で、フォントをプログラム内にデータとして表記した。

Micropythonでは、f=openが通用しないようなので、力技で入れるか、あらかじめNVRAMに入れ込んでおくかしないとできなさそうだ。

 

AQM1248A Char Display

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)