发新帖本帖赏金 35.00元(功能说明)我要提问
返回列表
打印
[应用]

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

[复制链接]
1656|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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---gpio375
CS ---GP7---gpio374
CLK---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,其内容如下:
123
456
789
然后编写一个脚本程序,其内容为:
count=1
cat test.txt | while read line
do
  echo "Line $count:$line"
  let count=$count+1
done

这样在执行该脚本程序时,就可得到如下的输出结果,即数据文件中的数据就按行被提取出来。
Line 1: 123
Line 2: 456
Line 3: 789

3)混合处理方式

为便于更好地利用字模提取软件所输出的数据,可采用混合处理的方法来解决,即按行来从数据文件中读取数据,再以字符截取的方式来提取各项数据,即可达到使用二维数组的功效。
图6 提取结果


当我们以该处理方式来进行显示时,就可将字库中的内容循环地显示处理,相应的显示程序为:

所实现的显示效果如图7和图8所示,这样就完美地突破了数组的限制!
图7 数字显示效果

图8 字符显示效果



使用特权

评论回复

打赏榜单

21小跑堂 打赏了 35.00 元 2023-08-30
理由:恭喜通过原创审核!期待您更多的原创作品~

相关帖子

发新帖 本帖赏金 35.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2678

帖子

37

粉丝