原理图
OE接GND 595才会有输出
左边就是一个串行输入,SERCLK来一个上升沿SER进一位数据,RCLK打开了全部数据就出来了
sfr特殊功能寄存器声明
如sfr P0 = 0x80(地址);
sbit 特殊位声明
sbit P0_1 = 0x81;
或 P0_1 = P0^1;
一个寄存器有8个位但只有1个物理地址
要操作其中一位不影响别的位需要用&=,|=,^=
定义一下74H595的输入接口
然后再通过循环给寄存器数据
再把移位寄存器的数据发送到并行寄存器中
就可以控制Dpa~Dph了
再写一个函数同时控制P00~P07
这个函数是先确定这一列要显示的数据,然后给Dpa~Dph赋值,然后确定这是那一列,再给P07~P00赋值
但是需要多个列显示这个方法就行不通
这里和动态数码管显示同理
延时显示的时间来控制屏幕刷新率
最后清楚当前显示避免拖影
再不断调用这个函数已达到动态显示的效果
这里的频闪在摄像头下仍然是很高的,这一类显示比较伤眼,这里可以推测一下显示频率,可以看出有四列,每列显示1ms,而FPS是一秒显示的帧数,所以显示的时长(Delay)就可以是 (1/FPS)/4 , 如果是60FPS就是(1/60)/4 = 4.16ms (1/60就是计算显示一次画面所需时长,一次画面所需时长/4就是计算有四列,每一列显示多久合适)当然这里在实际应用有极大的不准确性,需要测量程序在其它部分的时长,再重新消除这个误差才能达到稳定的帧数。但放到实际应用中我试了一下这里如果帧数太高的话会导致亮度变低。
这里可以用点阵屏做一个动画
用取模工具做一个8x32的像素图
把数据放入数组中
这里我犯了一个错误,忘了在最后加分号
这里再让行的显示随着Offset变化
利用定时器让offset每1秒变一次
这里再加一个判断让它重新开始
使用code
关键字是为了将数组存储在程序存储器(也称为代码存储器或Flash存储器)中,而不是在数据存储器(RAM)中。这是因为51单片机的RAM通常非常有限,而程序存储器的空间相对较大。
但是如果放入flash这个数组就不能再更改了(类似常数)