如下的单片机程序,p3.4和p1.0分别输出一串数据,定义两个函数void LED24show(long byteData)和void LED16show(int byteData)用于驱动数码管和LED,当 执行 LED24show(0x7fffff); LED16show(0x0202);时数码管应当显示00,24个LED小灯应当只有一个亮,但是仿真的结果如下,没有实现要求显示的部分,请大神帮忙看一下。
#include<reg52.h>
#include <intrins.h>
typedef unsigned char uchar;
typedef unsigned char uint;
void delayms(unsigned int xms);
//****************************************74LS595端口定义
sbit SER1 = P3^4; //p3.4脚控制串行数据输入
sbit SCK1 = P3^6; //串行输入时钟
sbit RCK1 = P3^5; //存储寄存器时钟
sbit SER2 = P1^0; //p1.0脚控制串行数据输入
sbit SCK2 = P1^2; //串行输入时钟
sbit RCK2 = P1^1; //存储寄存器时钟
sbit key=P1^7;
sbit run=P0^0;
//*********************************************************************
void LED24show(long byteData)
{
char i=0;
for(i=0;i<24;i++)
{
SER1 = byteData<<23; //送出23位数据
byteData= byteData>>1;
SCK1 = 0; //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
_nop_();
_nop_();
SCK1 = 1; //变为低电平,为下次准备
}
//位移寄存器数据准备完毕,转移到存储寄存器
RCK1 = 0; //上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
_nop_();
_nop_();
RCK1 = 1;
}
void LED16show(int byteData)
{
char i =0;
for(i=0;i<16;i++)
{
SER2 = byteData>>15; //送出15位数据
byteData= byteData<<1;
SCK2 = 0; //上升沿,让串行输入时钟变为高电平,并延时2个时钟周期
_nop_();
_nop_();
SCK2 = 1; //变为低电平,为下次准备
}
//位移寄存器数据准备完毕,转移到存储寄存器
RCK2 = 0; //上升沿,让存储寄存器时钟变为高电平,并延时2个时钟周期
_nop_();
_nop_();
RCK2 = 1;
}
void main()
{
while(1)
{
LED24show(0x7fffff);
delayms(100);
LED16show(0x0202);
}
}
void delayms(unsigned int xms) //延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
|