jinglixixi 发表于 2023-8-29 20:43

以Milk-V Duo开发板实现8*8点阵模块的显示驱动

本帖最后由 jinglixixi 于 2023-8-29 20:48 编辑

#申请原创# @21小跑堂


Milk-V Duo是一款基于算能 CV1800B芯片的MPU,它能够运行基于LINUX和RTOS的操作系统。Milk-V Duo为专业人士、工业OEM企业、物联网爱好者、业余爱好者、DIYers和创作者提供了一个可靠、低成本且极具功能的平台。Milk-V Duo开发板的外观如图1和图2所示,在使用前需借助板载的TF卡座来连接装有固件的TF卡。图1 开发板正面
‘’图2开发板背面
在安装固件后,系统就可提供一个进行开发和测试的LINUX环境。
图3进入系统后
1. 显示驱动为了能快速地解决8*8点阵模块的显示驱动问题,这里是采用脚本编程的方式。所用的8*8点阵模块是以MAX7219为功能处理芯片,从而将GPIO口所输出的串行信号转化并行信号来控制点阵模块。点阵模块与开发板的具体连接关系为:DIN---GP6---gpio375CS ---GP7---gpio374CLK---GP8---gpio373
图4所用引脚
将所用引脚配置为输出工作模式的程序为:din_GPIO=/sys/class/gpio/gpio375

cs_GPIO=/sys/class/gpio/gpio374

clk_GPIO=/sys/class/gpio/gpio373

if test -d $din_GPIO; then

    echo "GPIO375 already exported"

else

    echo 375 > /sys/class/gpio/export

    echo 374 > /sys/class/gpio/export

    echo 373 > /sys/class/gpio/export

fi

echo out > $din_GPIO/direction

echo out > $cs_GPIO/direction

echo out > $clk_GPIO/direction
实现串行信号模拟输出程序为:function max7219_byte {
i=8
let s=$i
echo 0 > $cs_GPIO/value
while [ $s -gt 0 ]
do
    let p=$dat/128
    echo 0 > $clk_GPIO/value
    if [ $p -eq 1 ] ; then
    echo 1 > $din_GPIO/value
    else
    echo 0 > $din_GPIO/value
    fi
    let dat=$dat*2
    let dat=$dat%256
    let s=$i-1
    let i=$s
    echo 1 > $clk_GPIO/value
done
}

实现MAX7219向指定地址发送数据的函数为:function write_max7219 {
    echo 0 > $cs_GPIO/value
    let dat=$add1
    max7219_byte
    let dat=$dat1
    max7219_byte
    echo 1 > $cs_GPIO/value
}

实现点阵模块初始化的函数为:function int_max7219 {
    add1=11
    dat1=7
    write_max7219
    add1=12
    dat1=1
    write_max7219
    add1=15
    dat1=0
    write_max7219
}

通过程序实现指定汉字“中”的显示程序为:function look {
    # 0x8,0x7F,0x49,0x49,0x7F,0x8,0x8,0x8
    int_max7219
    add1=1
    dat1=0x8
    write_max7219
    add1=2
    dat1=0x7F
    write_max7219
    add1=3
    dat1=0x49
    write_max7219
    add1=4
    dat1=0x49
    write_max7219
    add1=5
    dat1=0x7F
    write_max7219
    add1=6
    dat1=0x8
    write_max7219
    add1=7
    dat1=0x8
    write_max7219
    add1=8
    dat1=0x8
    write_max7219
}

在运行程序后,其显示效果如图5所示。
图5汉字显示效果

2. 字库构建及使用由于此时的LINUX系统没有提供对数组的支持,因此给程序设计带来了较大的制约。那如何来解决这个问题呢?方法有2个,当数据量较小的情况下,可通过字符串截取的方式来解决;而在数据量较大的情况下,则可通过文本文件的读取来解决。
1)字符截取方式在该处理方式下,是将多个数据以字符串的方式存放到一个变量中,例如:m="0x21,0x23"然后使用指令echo ${m:0:4},即可获得第一项数据“0x21”。若使用指令 echo ${m:5:4},则可获得第二项数据“0x23”。
2)文件读取方式在该处理方式下,首先是创建一个文本文件test.txt,其内容如下:123456789然后编写一个脚本程序,其内容为:count=1
cat test.txt | while read line
do
echo "Line $count:$line"
let count=$count+1
done
这样在执行该脚本程序时,就可得到如下的输出结果,即数据文件中的数据就按行被提取出来。Line 1: 123Line 2: 456Line 3: 789
3)混合处理方式
为便于更好地利用字模提取软件所输出的数据,可采用混合处理的方法来解决,即按行来从数据文件中读取数据,再以字符截取的方式来提取各项数据,即可达到使用二维数组的功效。图6 提取结果

当我们以该处理方式来进行显示时,就可将字库中的内容循环地显示处理,相应的显示程序为:
所实现的显示效果如图7和图8所示,这样就完美地突破了数组的限制!图7 数字显示效果
图8 字符显示效果


电子烂人 发表于 2025-1-4 11:01

牛的,给大佬点赞

jinglixixi 发表于 2025-1-4 11:25

感谢支持!!!
页: [1]
查看完整版本: 以Milk-V Duo开发板实现8*8点阵模块的显示驱动