找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4269|回复: 7
收起左侧

关于基于74HC595和138的16*16点阵左移单片机程序的问题

[复制链接]
ID:236686 发表于 2018-4-12 20:50 | 显示全部楼层 |阅读模式
10黑币
我是最近学单片机的萌新  我用的  两块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输出锁定*/
}





回复

使用道具 举报

ID:123289 发表于 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取数!!!这是要点二!!!扫描的方式,楼主已会了,不再重复。
回复

使用道具 举报

ID:123289 发表于 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。这样左右滚行就做完成了。
回复

使用道具 举报

ID:123289 发表于 2018-4-13 02:45 | 显示全部楼层
对于楼主的16*16点阵:先理解一下我构思方案,再自己去以葫芦画瓢。
这个方案的好处时:更换显示内容与滚不滚行无关,都是向RAMX1-RAMX8中送入字库。
滚不滚?上滚、下滚、左滚、右滚,只要做个选标记,在中断时让RXP=0、RXP+1、RXP-1、字节左移、右移。即可实现!!!
回复

使用道具 举报

ID:123289 发表于 2018-4-13 02:47 | 显示全部楼层
我在自己所做的产品中就是这样处理的,效果很好。也出个题目给楼主想想,也是个提示:
我的屏只能显示4个汉字,超过4个汉字显示时,就需要左滚显示。不超过4个就不滚。约定最多一次显示8个汉字(需滚),但是我的RAMX的数量却是按9个汉字做的,而RAMY是按4个汉字做的。这是为什么呢?
回复

使用道具 举报

ID:140489 发表于 2018-4-13 15:07 | 显示全部楼层
yzwzfyz 发表于 2018-4-13 02:47
我在自己所做的产品中就是这样处理的,效果很好。也出个题目给楼主想想,也是个提示:
我的屏只能显示4个汉 ...

请问点阵左移、右移汉字正常,数字左移、右移就显示乱码,改怎么处理呢?
回复

使用道具 举报

ID:7485 发表于 2018-4-13 16:02 | 显示全部楼层
做左右滚动,使用逐列取模方便。例如:第一次扫描从字模的第一列开始,延时后从第二列开始......,就会向左滚动了。

逐行取模不好处理。
回复

使用道具 举报

ID:282370 发表于 2018-4-18 15:03 | 显示全部楼层
楼主可以加扣吗:532560194,我做了16*16的点阵屏设计,但是想改成16*32的,不知道怎么改了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表