返回列表 发新帖我要提问本帖赏金: 35.00元(功能说明)

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

[复制链接]
14139|2
 楼主| jinglixixi 发表于 2023-8-29 20:43 | 显示全部楼层 |阅读模式
本帖最后由 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.jpg
图1 开发板正面

2.jpg
图2开发板背面

在安装固件后,系统就可提供一个进行开发和测试的LINUX环境。
3.jpg
图3  进入系统后

1. 显示驱动
为了能快速地解决8*8点阵模块的显示驱动问题,这里是采用脚本编程的方式。
所用的8*8点阵模块是以MAX7219为功能处理芯片,从而将GPIO口所输出的串行信号转化并行信号来控制点阵模块。
点阵模块与开发板的具体连接关系为:
DIN---GP6---gpio375
CS ---GP7---gpio374
CLK---GP8---gpio373

4.jpg
图4  所用引脚

将所用引脚配置为输出工作模式的程序为:
  1. din_GPIO=/sys/class/gpio/gpio375

  2. cs_GPIO=/sys/class/gpio/gpio374

  3. clk_GPIO=/sys/class/gpio/gpio373

  4. if test -d $din_GPIO; then

  5.     echo "GPIO375 already exported"

  6. else

  7.     echo 375 > /sys/class/gpio/export

  8.     echo 374 > /sys/class/gpio/export

  9.     echo 373 > /sys/class/gpio/export

  10. fi

  11. echo out > $din_GPIO/direction

  12. echo out > $cs_GPIO/direction

  13. echo out > $clk_GPIO/direction

实现串行信号模拟输出程序为:
  1. function max7219_byte {
  2. i=8
  3. let s=$i
  4. echo 0 > $cs_GPIO/value
  5. while [ $s -gt 0 ]
  6. do
  7.     let p=$dat/128
  8.     echo 0 > $clk_GPIO/value
  9.     if [ $p -eq 1 ] ; then
  10.     echo 1 > $din_GPIO/value
  11.     else
  12.     echo 0 > $din_GPIO/value
  13.     fi
  14.     let dat=$dat*2
  15.     let dat=$dat%256
  16.     let s=$i-1
  17.     let i=$s
  18.     echo 1 > $clk_GPIO/value
  19. done
  20. }

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

实现点阵模块初始化的函数为:
  1. function int_max7219 {
  2.     add1=11
  3.     dat1=7
  4.     write_max7219
  5.     add1=12
  6.     dat1=1
  7.     write_max7219
  8.     add1=15
  9.     dat1=0
  10.     write_max7219
  11. }

通过程序实现指定汉字“中”的显示程序为:
  1. function look {
  2.     # 0x8,0x7F,0x49,0x49,0x7F,0x8,0x8,0x8
  3.     int_max7219
  4.     add1=1
  5.     dat1=0x8
  6.     write_max7219
  7.     add1=2
  8.     dat1=0x7F
  9.     write_max7219
  10.     add1=3
  11.     dat1=0x49
  12.     write_max7219
  13.     add1=4
  14.     dat1=0x49
  15.     write_max7219
  16.     add1=5
  17.     dat1=0x7F
  18.     write_max7219
  19.     add1=6
  20.     dat1=0x8
  21.     write_max7219
  22.     add1=7
  23.     dat1=0x8
  24.     write_max7219
  25.     add1=8
  26.     dat1=0x8
  27.     write_max7219
  28. }

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

5.jpg
图5汉字显示效果

2. 字库构建及使用
由于此时的LINUX系统没有提供对数组的支持,因此给程序设计带来了较大的制约。
那如何来解决这个问题呢?
方法有2个,当数据量较小的情况下,可通过字符串截取的方式来解决;而在数据量较大的情况下,则可通过文本文件的读取来解决。

1)字符截取方式
在该处理方式下,是将多个数据以字符串的方式存放到一个变量中,例如:
m="0x21,0x23"
然后使用指令echo ${m:0:4},即可获得第一项数据“0x21”。
若使用指令 echo ${m:5:4},则可获得第二项数据“0x23”。

2)文件读取方式
在该处理方式下,首先是创建一个文本文件test.txt,其内容如下:
123
456
789
然后编写一个脚本程序,其内容为:
  1. count=1
  2. cat test.txt | while read line
  3. do
  4.   echo "Line $count:$line"
  5.   let count=$count+1
  6. done

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

3)混合处理方式

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


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

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

8.jpg
图8 字符显示效果



打赏榜单

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

电子烂人 发表于 2025-1-4 11:01 | 显示全部楼层
牛的,给大佬点赞
 楼主| jinglixixi 发表于 2025-1-4 11:25 | 显示全部楼层
感谢支持!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部