请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册

扫一扫,访问微社区

搜索
查看: 752|回复: 10

关于74HC595控制点阵小弟碰到的一个奇怪的问题

[复制链接]

5

主题

25

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
发表于 2019-7-18 09:50:25 | 显示全部楼层 |阅读模式
关于74HC595控制点阵小弟碰到的一个奇怪的问题
麻烦各位老师各位大神多多指点,小弟感激不尽!程序功能是:8*8点阵循环移动显示"AB"两个字母。
问题现象是:点阵上面那一行LED不知为何会点亮,我只是在HC595第一行给了高电平,但是P^0口全部都是1111 1111 。所以我很不解,为什么会点亮。发现一个规律,只要点阵那一列中有一个LED灯亮,第一行对应的那一列LED就会亮。

以下是我的源程序,备注是我自己的理解,可能有误,希望各位老师多指点以下:


#include <reg51.h>    //定义头文件
#include <intrins.h>  //调用头文件(里面包含有特殊功能函数)

typedef unsigned char u8;   //重定义数据类型名称
typedef unsigned int u16;
typedef unsigned long u32;

/*
sbit  端口位定义
HC595
*/
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
/*
定义数组数据类型

*/
u16 code lieA[16][8]=
{
       
{0xff,0xc3,0xdb,0xdb,0xc7,0xdb,0xdb,0xc7},//1

{0xff,0x87,0xb7,0xb7,0x8f,0xb7,0xb7,0x8f},//2

{0xff,0x0f,0x6f,0x6e,0x1e,0x6e,0x6e,0x1e},//3

{0xff,0x1f,0xde,0xdd,0x3d,0xdc,0xdd,0x3d},//4

{0xff,0x3e,0xbd,0xbb,0x7b,0xb8,0xbb,0x7b},//5

{0xff,0x7d,0x7a,0x77,0xf7,0x70,0x77,0xf7},//6

{0xff,0xfb,0xf5,0xee,0xee,0xe0,0xee,0xee},//7

{0xff,0xf7,0xeb,0xdd,0xdd,0xc1,0xdd,0xdd},//8

{0xff,0xef,0xd7,0xbb,0xbb,0x83,0xbb,0xbb},//9

{0xff,0xdf,0xaf,0x77,0x77,0x07,0x77,0x77},//10

{0xff,0xbf,0x5f,0xef,0xef,0x0f,0xef,0xef},//11

{0xff,0x7e,0xbe,0xde,0xde,0x1e,0xde,0xde},//12

{0xff,0xfc,0x7d,0xbd,0xbc,0x3d,0xbd,0xbc},//13

{0xff,0xf8,0xfb,0x7b,0x78,0x7b,0xfb,0x78},//14

{0xff,0xf0,0xf6,0xf6,0xf1,0xf6,0xf6,0xf1},//15

{0xff,0xe1,0xed,0xed,0xe3,0xed,0xed,0xe3},//16

};

u8 code hang[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //hc595段选
       

void delay(u16 i)         //延时函数i=1时大约延时1us
                {
                  while(i--);
                }
       
void HC595(u8 j)
{
    u8 f;
    SRCLK=0;
          RCLK=0;
       
               
          for(f=0;f<8;f++)
           {
       SER=j>>7;  /*假设j=1001 1001,那么右移7位就等于0000 0001,把最高位后面的都移出去了,生下一个最高位,那么当SRCLK上升沿到的时候,就将1传送到QA,
                                                                         然后J<<=1(将J的原始数据1001 1001 左移一位,目的是将刚才已经传送出去的最高位移出去,那么现在J=001 1001 0 )第二个循环SER=J的数据0011 0010右移7次后等于0000 0000.
                                                                         所以第二个循环将第二位0传送出去。那么当SRCLK上升沿到的时候,就将0传送到QB。然后J<<=1(将J的原始数据0011 0010 左移一位,
                                      目的是将刚才已经传送出去的最高位移出去,那么现在J=01 1001 00  )后面依次类推。                         */
       j<<=1;

       SRCLK=1;//上升沿时将SER当前电平信号传送到QA-QH.第一次将1传到QA,第二次将0传到QB,第三次将0传到QC,第四次将1传到QD,依次类推。
       _nop_();//延时一个循环周期
       _nop_();
       SRCLK=0;                //将SRCLK点位拉低,为下一次上升沿做准备         
                 }
           RCLK=1;//当上面循环8次后,八个数据都传送到位了,这个上升沿到来时,将寄存器里面刚传进来的数据通过并行口QA-QH发送出去。
                 _nop_();                 
                 _nop_();//延时一个循环周期
                 RCLK=0;//将SRCLK点位拉低,为下一次上升沿做准备
          
}


void main()
{
                       
        while(1)
        {
                u8 a=0;
                u8 c;
                u8 d=0;
                u8 e=0;
                u8 b;
        //        u16 P0;
        for(e=0;e<16;e++)
                {
                          
                       
                                        for(d=0;d<40;d++)
                                        {       
                                                        for(a=0;a<8;a++)
                                                        {
                                                        P0=lieA[c][a];
                                                        HC595(hang[a]);
                                                        delay(100);
                                                        HC595(hang[0x00]);                       
                                                        }                                                
                                         }       
                    c++;
                                if(c==16)
        {
                                c=0;
                                }                                       
          }
        }       
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

5

主题

25

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
 楼主| 发表于 2019-7-22 16:03:26 | 显示全部楼层
有没有老师帮我解答一下啊
回复 支持 反对

使用道具 举报

4

主题

176

帖子

536

积分

高级会员

Rank: 4

积分
536
发表于 2019-7-23 09:07:43 | 显示全部楼层
点亮一个点,结果亮一列的话应该是你595芯片的是OE脚接地,有个跳线帽的你可以看一下
回复 支持 反对

使用道具 举报

4

主题

176

帖子

536

积分

高级会员

Rank: 4

积分
536
发表于 2019-7-23 09:35:52 | 显示全部楼层
u8 code hang[8]={0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //hc595段选   程序没问题, 既然不要第一行就把它给关了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

5

主题

25

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
 楼主| 发表于 2019-8-8 18:59:19 | 显示全部楼层
YXUN 发表于 2019-7-23 09:07
点亮一个点,结果亮一列的话应该是你595芯片的是OE脚接地,有个跳线帽的你可以看一下

不是点亮第一个呢,每一列中下面每一行只要有一个灯亮了,那么第一行就会亮[img][img][/img][/img]
回复 支持 反对

使用道具 举报

5

主题

25

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
 楼主| 发表于 2019-8-8 19:01:03 | 显示全部楼层
YXUN 发表于 2019-7-23 09:35
u8 code hang[8]={0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x01};  //hc595段选   程序没问题, 既然不要第一 ...

跳线帽没问题,!!好奇怪老师怎么回答问题!!!!
回复 支持 反对

使用道具 举报

5

主题

25

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
 楼主| 发表于 2019-8-8 19:06:18 | 显示全部楼层
ωǒメ№懂爱 发表于 2019-8-8 19:01
跳线帽没问题,!!好奇怪老师怎么回答问题!!!!

怎么没老师回答问题!!!@
回复 支持 反对

使用道具 举报

4

主题

176

帖子

536

积分

高级会员

Rank: 4

积分
536
发表于 2019-8-9 09:18:28 | 显示全部楼层
ωǒメ№懂爱 发表于 2019-8-8 19:06
怎么没老师回答问题!!!@

跳线帽没问题, 那就是点阵显示取模的问题呗, 还能有啥 。上面不是都跟你说了第一行关掉吗
回复 支持 反对

使用道具 举报

4

主题

176

帖子

536

积分

高级会员

Rank: 4

积分
536
发表于 2019-8-9 09:19:27 | 显示全部楼层
试了,没问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

5

主题

25

帖子

74

积分

注册会员

Rank: 2

积分
74
QQ
 楼主| 发表于 2019-8-28 21:31:02 | 显示全部楼层
YXUN 发表于 2019-8-9 09:18
跳线帽没问题, 那就是点阵显示取模的问题呗, 还能有啥 。上面不是都跟你说了第一行关掉吗

已经决绝了,
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|51开发板专区 STM32开发板专区 PLC工控专区 PLC学习机专区 ( 粤ICP备18101765号 )

GMT+8, 2019-9-22 06:21 , Processed in 0.168932 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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