关于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;
}
}
}
}
|