1.认识MAX7219
拿到MAX7219驱动的LED矩阵,第一件事是先连接并尝试显示图案。使用MAX7219除了需要提供GND以及VCC外,只需要再提供三根引脚即可点亮矩阵。其中,DIN引脚输入数据,CS(LOAD)引脚控制数据输入,CLK引脚用于区分每个bit。
MAX的整个写入流程为,首先CS引脚置0,表示允许写入。而后从高位顺序写入16个bit。每个bit的写入方式为首先DIN置为要写入的bit值,而后CLK产生一个下降沿(图中为上升沿,不知道为何有差别)即被读入。最后CS引脚置1表示写入结束。
时序图如下:
在运行之前,需要进行一次初始化,其行为是向某几个特定的地址写入特定的值。至少需要写入两个地址,第一个是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
效果如图:
技术专区
- 低成本开发系统现在正处于物联网期望膨胀峰值期
- 因特尔Cyclone 10 LP FPGA评估板电路图集及PCB装配图
- 采用32位MCU系列对新型无磁水表设计
- 一个嵌入式或者X86的工业控制板上,少不了CAN口!
- 以MSP432主机微控制器的软件与硬件集成解决方案