就是一个74595和P0口控制矩阵LED(51单片机)。当575最高位制高时,必须调用两次595函数,才能正常显示矩阵,这么说呢,74595控制矩阵阳极。P0控制阴极。但是写P0=0x00;595函数=0x80;按理第一排LED灯亮。可是都没有亮;但是写成P0=0x00;595函数=0x80;595函数=0x80;对就是595函数调用,两次第一排LED灯才亮,其他的只要最高位不等于1.函数只调用一次就亮。打个比方P0=0x00;595函数=0xEF;按理应该亮1234678排,其实全不亮;P0=0x00;595函数=0xEF;595函数=0xEF;这样就行;还有就是P0=0x00;595函数=0xFF,按理全亮,实际全不亮,写几道都不亮;下面是程序:/**************************************************************************************
* 8*8LED点阵———点亮一个点实验 *
实现现象:下载程序后点阵左上角第一个点点亮
注意事项:一定要将74HC595模块上的JP595短接片短接,并且将JOE短接片短接到GND端。
***************************************************************************************/
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;
void delay()
{
u16 i=10000;
while(i--);
}
/*******************************************************************************
* 函数名 : Hc595SendByte(u8 dat)
* 函数功能 : 向74HC595发送一个字节的数据
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
u8 a;
SRCLK=0;
RCLK=0;
for(a=0;a<8;a++)
{
SER=dat>>7;
dat<<=1;
SRCLK=1;
_nop_();
_nop_();
SRCLK=0;
}
RCLK=1;
_nop_();
_nop_();
RCLK=0;
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
P0=0x00;
Hc595SendByte(0xEF);
Hc595SendByte(0xEF);
while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
SER=dat>>7;
dat<<=1;
改为
if(dat & 0x80) SER = 1;
else SER = 0;
dat<<=1;
一周热门 更多>