树莓派上MAX7219的字符驱动程序编写

树莓派上MAX7219的字符驱动程序编写,第1张

1.认识MAX7219

拿到MAX7219驱动的LED矩阵,第一件事是先连接并尝试显示图案。使用MAX7219除了需要提供GND以及VCC外,只需要再提供三根引脚即可点亮矩阵。其中,DIN引脚输入数据,CS(LOAD)引脚控制数据输入,CLK引脚用于区分每个bit。

树莓派上MAX7219的字符驱动程序编写,树莓派上MAX7219的字符驱动程序编写,第2张

MAX的整个写入流程为,首先CS引脚置0,表示允许写入。而后从高位顺序写入16个bit。每个bit的写入方式为首先DIN置为要写入的bit值,而后CLK产生一个下降沿(图中为上升沿,不知道为何有差别)即被读入。最后CS引脚置1表示写入结束。

时序图如下:

树莓派上MAX7219的字符驱动程序编写,树莓派上MAX7219的字符驱动程序编写,第3张

在运行之前,需要进行一次初始化,其行为是向某几个特定的地址写入特定的值。至少需要写入两个地址,第一个是0x0b,写入0x07表示扫描显示所有行。第二个是0x0c,写入1表示进入工作模式。

而后点阵上每一行都有其地址,如第一行是0x01到第八行是0x08,每次向固定行的地址写入一个8位二进制数即可在指定行上显示图案。

2. 树莓派对GPIO的访问——虚拟文件系统访问

Linux可以通过访问sys/class/gpio下的一些文件,通过对这些文件的读写来实现对于GPIO的访问。

!/bin/bash

# DIN, CS, CLK的GPIO口位置

DIN=4

CS=3

CLK=2

# 一些文件路径

GPIO_BASE=/sys/class/gpio

GPIO_EXPORT=${GPIO_BASE}/export

GPIO_UNEXPORT=${GPIO_BASE}/unexport

BIN=(00000001 00000010 00000011 00000100 00000101 00000110 00000111 00001000)

# 生成指定GPIO引脚的文件夹位置

funcTIon GPIO(){

echo ${GPIO_BASE}/gpio$1

}

# 将某个引脚export到用户态

funcTIon GPIO_export(){

if [ -d `GPIO $1` ]; then

echo GPIO pin $1 found in folder.

else

echo $1 》 ${GPIO_EXPORT}

fi

}

# unexport某个引脚

funcTIon GPIO_unexport(){

if [ -d `GPIO $1` ]; then

echo $1 》 ${GPIO_UNEXPORT}

else

echo GPIO pin $1 not found.

fi

}

# 改变某个引脚的方向

funcTIon GPIO_direction(){

echo $2 》 `GPIO $1`/direction

}

# 改变某个引脚的值

function GPIO_set(){

echo $2 》 `GPIO $1`/value

}

# 改变DIN的值

function GPIO_DIN(){

GPIO_set $DIN $1

}

# 改变CS的值

function GPIO_CS(){

GPIO_set $CS $1

}

# 改变CLK的值

function GPIO_CLK(){

GPIO_set $CLK $1

}

# 向MAX7219发送一个byte的值

function Matrix_send_char(){

local i=1

for ((i=1;i《=8;i++)); do

chr=`expr substr $1 $i 1`

GPIO_DIN $chr

GPIO_CLK 1

GPIO_CLK 0

done

}

# 向MAX7219发送一次完整的信号

function Matrix_send_word(){

GPIO_CS 1

GPIO_CS 0

GPIO_CLK 0

Matrix_send_char $1

Matrix_send_char $2

GPIO_CS 1

}

# 初始化GPIO引脚

function GPIO_init(){

GPIO_export $DIN

GPIO_export $CS

GPIO_export $CLK

sleep 2

GPIO_direction $DIN out

GPIO_direction $CS out

GPIO_direction $CLK out

}

# 清除GPIO引脚

function GPIO_clear(){

GPIO_unexport $DIN

GPIO_unexport $CS

GPIO_unexport $CLK

}

# 在点阵上显示数据

function Matrix_render(){

local i=1

for ((i=0;i《8;i++)); do

echo $i $1

Matrix_send_word ${BIN[$i]} $1

shift

done

}

# 使用文件中的数据进行显示

function Matrix_render_file(){

local tmp=(`cat $1`)

Matrix_render “${tmp[@]}”

}

# 使用某个图案清屏

function Matrix_clear(){

local STR=(

00000000

01100110

11111111

11111111

11111111

01111110

00111100

00011000

Matrix_render “${STR[@]}”

}

# 初始化点阵

function Matrix_init(){

# 编码模式

Matrix_send_word 00001001 00000000

# 亮度

Matrix_send_word 00001010 00000011

# 扫描数码管个数

Matrix_send_word 00001011 00000111

# 工作模式

Matrix_send_word 00001100 00000001

# 初始化完毕后清屏显示默认图案

Matrix_clear

}

在终端中:

source matrix.sh

GPIO_init

Matrix_init

效果如图:


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2718250.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存