标题:
关于基于74HC595和138的16*16点阵左移单片机程序的问题
[打印本页]
作者:
爱吃饺子
时间:
2018-4-12 20:50
标题:
关于基于74HC595和138的16*16点阵左移单片机程序的问题
我是最近学单片机的萌新 我用的 两块74HC138级联加三极管 作为行驱动 两块74HC595级联作为列驱动 连接如图片所示
字符取码逐行式 低位在前 高位在后 我已经完成了 拉幕显示 从下往上移显示 现在问题是由于我是只能是
逐行式扫描 我要怎么进行从右往左移显示啊 有点想不通 希望各位大神能给一点指点 编程的思路 万分感谢 我不想更改595和138的驱动程序
下面是我发送数据的595和138的驱动代码
void HC595_Data_Send(uchar daH,daL,hang) //¸高八位在点阵屏幕的右八位 因此我先移如高八位再移入第八位
{
uchar i;
Latch_port = 0;//关闭锁存器的存储寄存器 不输出数据
CLK_port = 0;//
锁存器移位寄存器的时钟输入口置0
for(i=0;i<8;i++){
if((daH&0x80)!=0) DA_in_port = 1;
else DA_in_port = 0;
CLK_port = 1;
CLK_port = 0;
daH <<= 1;
}
for(i=0;i<8;i++){
if((daL&0x80)!=0) DA_in_port = 1;
else DA_in_port = 0;
CLK_port = 1;
CLK_port = 0;
daL <<= 1;
}
EN_port = 1; /关闭显示 使138输出全为1 点阵不显示
switch (hang){
case 0:
A_port = 0; B_port = 0; C_port = 0; D_port = 0; //D为0时 对应上八行有可能不显示
break;
case 1:
A_port = 1; B_port = 0; C_port = 0; D_port = 0;
break;
case 2:
A_port = 0; B_port = 1; C_port = 0; D_port = 0;
break;
case 3:
A_port = 1; B_port = 1; C_port = 0; D_port = 0;
break;
case 4:
A_port = 0; B_port = 0; C_port = 1; D_port = 0;
break;
case 5:
A_port = 1; B_port = 0; C_port = 1; D_port = 0;
break;
case 6:
A_port = 0; B_port = 1; C_port = 1; D_port = 0;
break;
case 7:
A_port = 1; B_port = 1; C_port = 1; D_port = 0;
break;
case 8:
A_port = 0; B_port = 0; C_port = 0; D_port = 1; //D为1时 下有可能八行显示
break;
case 9:
A_port = 1; B_port = 0; C_port = 0; D_port = 1;
break;
case 10:
A_port = 0; B_port = 1; C_port = 0; D_port = 1;
break;
case 11:
A_port = 1; B_port = 1; C_port = 0; D_port = 1;
break;
case 12:
A_port = 0; B_port = 0; C_port = 1; D_port = 1;
break;
case 13:
A_port = 1; B_port = 0; C_port = 1; D_port = 1;
break;
case 14:
A_port = 0; B_port = 1; C_port = 1; D_port = 1;
break;
case 15:
A_port = 1; B_port = 1; C_port = 1; D_port = 1;
break;
}
Latch_port = 1; //595数据输出到Q1---Q8端
EN_port = 0; /*138输出有效打开显示*/
Latch_port = 0; /*595输出锁定*/
}
作者:
yzwzfyz
时间:
2018-4-13 02:45
要点:
1、显示不要直接取字库显示,这样不灵活。
2、建立两个与LED点阵的对应缓冲区,区内的每个字节对应每个LED的一个行,字节的8个位刚好对应8个点。一个8*8的点阵,用8个字节做缓冲区。
3、给这两个缓冲区取名:一个叫RAMX1-RAMX8,另一个叫RAMY1-RAMY8
4、显示的内容:显示的内容不要直接送到LED,而是送入RAMX1-RAMX8!!!这是要点一!!!
5、显示(扫描输出):每次送到LED中内容从RAMY1-RAMY8取数!!!这是要点二!!!扫描的方式,楼主已会了,不再重复。
作者:
yzwzfyz
时间:
2018-4-13 02:45
6、正常显示、上下滚行、左右滚行:多久滚一行呢?做个时间中断就解决了,假设中断时间=滚行时间。
7、正常显示:每次中断、将RAMX1-RAMX8的内容依序送到RAMY1-RAMY8。就是楼主已会的方式。
8、上下滚行:每次中断将从RAMx起至RAM(x+8)结束,依序送到RAMY1-RAMY8。比如将RAMX2送入RAMY1,或RAMX3送入RAMY1,就是错开送,形成滚动效果!
9、如何时做到呢:做一个指针RXP(一个寄存器)x取RXP的末三位,高出的位不要,屏蔽掉。每次中断先将RXP+1,以RXP的末三位为索引,做第8步。这样上下滚行就做完成了。
10、左右滚列:每次中断、每当将RAMX1-RAMX8的内容取一个字节后,先循环左移(也可右移)一位[记得要回送],而后再送到RAMY1-RAMY8。这样左右滚行就做完成了。
作者:
yzwzfyz
时间:
2018-4-13 02:45
对于楼主的16*16点阵:先理解一下我构思方案,再自己去以葫芦画瓢。
这个方案的好处时:更换显示内容与滚不滚行无关,都是向RAMX1-RAMX8中送入字库。
滚不滚?上滚、下滚、左滚、右滚,只要做个选标记,在中断时让RXP=0、RXP+1、RXP-1、字节左移、右移。即可实现!!!
作者:
yzwzfyz
时间:
2018-4-13 02:47
我在自己所做的产品中就是这样处理的,效果很好。也出个题目给楼主想想,也是个提示:
我的屏只能显示4个汉字,超过4个汉字显示时,就需要左滚显示。不超过4个就不滚。约定最多一次显示8个汉字(需滚),但是我的RAMX的数量却是按9个汉字做的,而RAMY是按4个汉字做的。这是为什么呢?
作者:
lids
时间:
2018-4-13 15:07
yzwzfyz 发表于 2018-4-13 02:47
我在自己所做的产品中就是这样处理的,效果很好。也出个题目给楼主想想,也是个提示:
我的屏只能显示4个汉 ...
请问点阵左移、右移汉字正常,数字左移、右移就显示乱码,改怎么处理呢?
作者:
ahshmj
时间:
2018-4-13 16:02
做左右滚动,使用逐列取模方便。例如:第一次扫描从字模的第一列开始,延时后从第二列开始......,就会向左滚动了。
逐行取模不好处理。
作者:
看看看看有
时间:
2018-4-18 15:03
楼主可以加扣吗:532560194,我做了16*16的点阵屏设计,但是想改成16*32的,不知道怎么改了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1