找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2327|回复: 24
收起左侧

单片机驱动8*16点阵遇到的问题

[复制链接]
ID:908996 发表于 2021-5-2 16:19 | 显示全部楼层 |阅读模式
我是初学者,现在遇到一个问题请教。
点阵是2块8*8共阳,行用74ls164,列用74hc154
每次给一行通电,列选是否亮。
行的代码如下:
                i =0x01;           //二进制是00000001
                for(row=0;row<8;row++){
                       
                        COW_1641 = i;
                        COW_1642 = i;
                        CLK_1641 = 0;
                        CLK_1642 = 0;
                       
                        CLK_1641 = 1;
                        CLK_1642 = 1;
                        i>>=1;
                        delay(500);
                }


这是软件提取的字模数组:
unsigned char code image[][16] = {
                {0xFF,0xFF,0xF7,0xFF,0xF3,0xFF,0x01,0xFF,0x01,0xFF,0xF3,0xFF,0xF7,0xFF,0xFF,0xFF}}


现在遇到的问题是74hc154的输入端ABCD分别接到单片机P3^0--P3^3上,如何用这个数组给这四个端口赋值,使点阵上的各列能根据需要亮起来?或者说如何给这四个端口赋值能让点阵各列根据需要亮起来?



谢谢!
回复

使用道具 举报

ID:332444 发表于 2021-5-2 17:10 | 显示全部楼层
回复

使用道具 举报

ID:220661 发表于 2021-5-2 18:54 | 显示全部楼层
8421BCD编码
回复

使用道具 举报

ID:684049 发表于 2021-5-2 19:43 | 显示全部楼层
你的i的值应该是左移吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:908996 发表于 2021-5-2 22:50 | 显示全部楼层
xianfajushi 发表于 2021-5-2 17:10
可参https://blog.csdn.net/xianfajushi/article/details/106965367

谢谢回复,不过你发的文章是VIP的,我看不到,能否帮忙把内容贴一下?谢谢!
回复

使用道具 举报

ID:908996 发表于 2021-5-2 23:04 | 显示全部楼层
花心的刘备 发表于 2021-5-2 19:43
你的i的值应该是左移吧

是的,应该是左移,从程序上我知道有问题,但是在proteus里视觉上能实现我的效果,所以没有深究。改成左移后所有点会全部亮,而不是逐行亮。
回复

使用道具 举报

ID:908996 发表于 2021-5-3 09:29 | 显示全部楼层
另外我要说一点的是,P3^4--P3^7接的是74ls164的Data和CLK,用P3=0XFF整体赋值会有问题,所以才问如何给P3的几个端口用字模的数据赋值。
回复

使用道具 举报

ID:332444 发表于 2021-5-6 08:25 | 显示全部楼层
其实就是回复本论坛问题的,不过贴主认为就那么点代码就可以?http://www.51hei.com/bbs/dpj-191849-1.html
回复

使用道具 举报

ID:908996 发表于 2021-5-7 10:30 | 显示全部楼层
本帖最后由 javastory 于 2021-5-7 10:39 编辑
xianfajushi 发表于 2021-5-6 08:25
其实就是回复本论坛问题的,不过贴主认为就那么点代码就可以?http://www.51hei.com/bbs/dpj-191849-1.html

我仔细看了一下代码,做了两个循环,有个地方不明白,麻烦给解释一下:

数组部分我不写了,主程序部分如下:

unsigned char wei=0,Xd=0,Ws=0,zt=0;
unsigned int Ys=47474;

第一次循环:

while(1){
if (!--Ys){                //Ys=47473
    P2=CHARCODE[wei][Xd]   //这里得到的值是0x00
    if(!(ww*=2)) ++ww;     //这里ww=1;
    P3=~ww;                //这里P3=1101;
    if(++Xd>7){Xd=0;++zt; //如果Xd>7,则一个8*8的数码已经复制完,zt=1;
    if(zt>22){zt=0;++wei;} //如果zt>22,则wei=1;
    if(wei>17) wei=0;      //如果wei>17,则整个数组取值完,wei归零;
    Ys=474;
    }
}


第二次循环:

while(1){
if (!--Ys){                //Ys=473
    P2=CHARCODE[wei][Xd]   //这里得到的值是0x00
    if(!(ww*=2)) ++ww;     //这里ww=3;
    P3=~ww;                //这里P3=1100;
    if(++Xd>7){Xd=0;++zt; //如果Xd>7,则一个8*8的数码已经复制完,zt=2;
    if(zt>22){zt=0;++wei;} //如果zt>22,则wei=2;
    if(wei>17) wei=0;      //如果wei>17,则整个数组取值完,wei归零;
    Ys=474;
    }
}

我不明白的地方如下:
1、Xd始终为0,那其他6个值如何赋值:
2、zt和Ys这两个值作用是什么?
另外就是我发现原来对扫描的理解是错误的,重新发了一个贴,有我发的仿真的图,现在的设计思路是,154管列,164管行,一次给164复制,然后让154轮流导通,但是仍旧有问题,具体的描述和代码在新贴里,麻烦帮着看看是什么问题,谢谢!

地址:http://www.51hei.com/bbs/dpj-206464-1.html
回复

使用道具 举报

ID:332444 发表于 2021-5-7 10:41 | 显示全部楼层
^_^代数应该学过,把每循环时的值代进去读,试看,不可能是始终为0.
回复

使用道具 举报

ID:908996 发表于 2021-5-7 10:49 | 显示全部楼层
xianfajushi 发表于 2021-5-7 10:41
^_^代数应该学过,把每循环时的值代进去读,试看,不可能是始终为0.

Xd看漏了,那么zt值的意义是什么?
回复

使用道具 举报

ID:332444 发表于 2021-5-7 11:07 | 显示全部楼层
举一反三,还是代数问题,把所有值都代进去读
回复

使用道具 举报

ID:844772 发表于 2021-5-7 11:42 | 显示全部楼层
你看看154的手册,它一次只能操作一个脚,所以取的字模直接给它没用的,你这么弄组不了字。
回复

使用道具 举报

ID:908996 发表于 2021-5-7 11:46 | 显示全部楼层
xianfajushi 发表于 2021-5-7 11:07
举一反三,还是代数问题,把所有值都代进去读

能解释一下吗,还是没有想明白。
回复

使用道具 举报

ID:908996 发表于 2021-5-7 11:48 | 显示全部楼层
glinfei 发表于 2021-5-7 11:42
你看看154的手册,它一次只能操作一个脚,所以取的字模直接给它没用的,你这么弄组不了字。

是的,这是原来的思路,是错的,现在的思路重新发了个贴:http://www.51hei.com/bbs/dpj-206464-1.html

我在这贴里贴了代码和图,麻烦帮着看看,程序哪里错了,谢谢!
回复

使用道具 举报

ID:332444 发表于 2021-5-7 11:57 | 显示全部楼层
138同154就差引脚多一个,道理是一样的,驱动也一样,有点小差异而已.
1.gif
回复

使用道具 举报

ID:844772 发表于 2021-5-7 15:00 | 显示全部楼层
javastory 发表于 2021-5-7 10:49
Xd看漏了,那么zt值的意义是什么?

你把zt的判断改成50也能用啊,不过相当于延时而已。
回复

使用道具 举报

ID:844772 发表于 2021-5-7 15:11 | 显示全部楼层
javastory 发表于 2021-5-7 11:48
是的,这是原来的思路,是错的,现在的思路重新发了个贴:http://www.51hei.com/bbs/dpj-206464-1.html
...

你是不是师傅要求,行用74ls164,列用74hc154,否则没谁这么折腾啊,你的帖子我看不到,提醒你自模的数据,你需要按位来用,而且为了关灯每列要搞两次,中间要延时。如果不是师傅要求,就用max7219啊,两根线搞掂。
回复

使用道具 举报

ID:332444 发表于 2021-5-7 16:29 | 显示全部楼层
glinfei 发表于 2021-5-7 15:00
你把zt的判断改成50也能用啊,不过相当于延时而已。

^_^从代码也能猜到,切换嘛.Xd为内循环zt为外循环,修改外循环值修改切换时间。
回复

使用道具 举报

ID:332444 发表于 2021-5-7 16:40 | 显示全部楼层
这是驱动138的代码,就是上图运行的代码,看我的代码足以锻炼你的逻辑分析
  1. #include "reg52.h"
  2. unsigned char code DuLiAnJian[]={1,2,4,8,16,32,64,128,254,253,251,247,239,223,191,127};
  3. bit k = 0;
  4. unsigned char code CHARCODE[32][8]={
  5. {0xFD,0xFD,0x0D,0xED,0xED,0xED,0x0D,0xFD},{0x0D,0xED,0xED,0xED,0x0D,0xFD,0xFD,0xFF},
  6. {0xFF,0xFF,0x00,0xFE,0xB9,0x7F,0x80,0xFF},{0x00,0xFE,0xB9,0x7F,0x80,0xFF,0xFF,0xFF},
  7. {0xEF,0xEF,0x0F,0xE0,0xEF,0x0F,0xFF,0x01},{0xDD,0xDD,0xDD,0xDD,0x01,0xFF,0xFF,0xFF},
  8. {0xBF,0xDD,0xEA,0xF7,0xE9,0x9E,0xBF,0x80},{0xBD,0xBD,0xBD,0xBD,0x80,0xBF,0xBF,0xFF},
  9. {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
  10. {0xFF,0xFF,0xA7,0xC7,0xFF,0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
  11. {0x7F,0xBF,0xCF,0xE1,0xEF,0xEF,0xEF,0x00},{0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF},
  12. {0xBF,0xBF,0xBD,0xBD,0xBD,0xBD,0xBD,0x80},{0xBD,0xBD,0xBD,0xBD,0xBD,0xBF,0xBF,0xFF},
  13. {0xFF,0xFF,0xFF,0x01,0x7D,0x7D,0x7D,0x7D},{0x7D,0x7D,0x7D,0x01,0xFF,0xFF,0xFF,0xFF},
  14. {0xFF,0xFF,0xFF,0x00,0xBF,0xBF,0xBF,0xBF},{0xBF,0xBF,0xBF,0x00,0xFF,0xFF,0xFF,0xFF},
  15. {0xFF,0x1F,0xFF,0x00,0xEF,0xDF,0xF7,0xF7},{0xF7,0x00,0xF7,0xF7,0x07,0xFF,0xFF,0xFF},
  16. {0xFE,0xFF,0xFF,0x00,0xFF,0x7E,0xBE,0xCE},{0xF2,0xFC,0xF2,0xCE,0xBE,0x7E,0x7E,0xFF},
  17. {0xFF,0xFF,0x1F,0x63,0x7B,0x7B,0x7B,0x0B},{0x7D,0x7D,0x7C,0x7D,0x7F,0x7F,0xFF,0xFF},
  18. {0xFF,0xDF,0xEF,0xF7,0xF9,0xBF,0x7F,0x80},{0xFF,0xFF,0xFD,0xFB,0xF7,0xCF,0xFF,0xFF},
  19. {0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},
  20. {0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7},{0xFF,0x99,0x00,0x00,0x00,0x81,0xC3,0xE7}
  21. };
  22. void main()
  23. {
  24.         unsigned char wei=0,Xd=0,Sw=0,By=8;
  25.         unsigned int Ys=47474,Lx=0;
  26.         P0=P1=P2=P3=0;
  27.         while(1)
  28.         {
  29.                 if(!--Ys)
  30.                 {
  31.                         P2=P3=255;
  32.                         if(k){P0=7;Sw=wei+2;P1=DuLiAnJian[Xd];}else{P1=0;Sw=wei;P0=By;if(++By>=16)By=8;}//后前DuLiAnJian[Xd]
  33.                         P3=CHARCODE[Sw+1][Xd];//下
  34.                         P2=CHARCODE[Sw][Xd];//上
  35.                         if(++Xd>=8){Xd=0;k=~k;++Lx;}
  36.                         if(Lx>74){wei+=4;Lx=0;}
  37.                         if(wei>=32)wei=0;
  38.                         Ys=247;
  39.                 }
  40.         }
  41. }
复制代码
回复

使用道具 举报

ID:332444 发表于 2021-5-7 16:44 | 显示全部楼层
138的例子也是本论坛的http://www.51hei.com/bbs/dpj-194791-1.html
回复

使用道具 举报

ID:332444 发表于 2021-5-7 16:48 | 显示全部楼层
假如说把154一脚不用就同138一样了,154的4脚都用就能驱动多一块点阵,8与16的区别。
回复

使用道具 举报

ID:332444 发表于 2021-5-7 16:52 | 显示全部楼层
当然138和154只能用于选行或列,不能作为数据传输。
回复

使用道具 举报

ID:908996 发表于 2021-5-9 20:12 | 显示全部楼层
glinfei 发表于 2021-5-7 15:11
你是不是师傅要求,行用74ls164,列用74hc154,否则没谁这么折腾啊,你的帖子我看不到,提醒你自模的数据 ...

首先谢谢你的回复,这个不是什么师傅要求,只是自己的爱好而已,并且是刚开始学习,所以很多错误。
选154和164是因为看论坛上的一个贴,(地址:http://www.51hei.com/bbs/dpj-149292-1.html,9楼的贴)因为是要8*16,所以就这样选了。并且在发这贴的时候,从编程思路和硬件电路上有很多错的地方,比如对行和列的扫描理解是错误的,看别人的程序能看懂,实际动手的时候就错了。
在另外查了一些例子后,重新修改了电路和程序,但是仍旧有错误,我发了个新贴,地址:http://www.51hei.com/bbs/dpj-206586-1.html
麻烦帮着看看是哪里的问题。谢谢!
回复

使用道具 举报

ID:908996 发表于 2021-5-9 20:22 | 显示全部楼层
xianfajushi 发表于 2021-5-7 16:52
当然138和154只能用于选行或列,不能作为数据传输。

这个结论是我错误了很多次以后才知道的,查的资料里都是0--15互斥输出,只输出一个低电平。当时我的想法就是行共阳点阵,一行通电,列扫描就是154选择输出低电平,就可以实现这一行选择的led亮。
现在知道错在哪里了,另外就是我遇到新问题了,地址:http://www.51hei.com/bbs/dpj-206586-1.html

麻烦帮着看看是哪里出问题了,谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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