找了一个74hc595控制两位数码管,发现延时有问题 改却改不好 拿出来请大家帮我改正下面是代码
#include<reg51.h>
#include<intrins.h>
sbit DS= P2^1; //串行数据输入,对应595的14脚SER
sbit SHCP = P2^0; //移位寄存器时钟输入,对应595的11脚SCK
sbit STCP = P2^2; //存储寄存器时钟输入,对应595的12脚RCK
unsigned char code duan[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
//0 1 2 3 4 5 6 7 8 9
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay(unsigned int m)
{
unsigned char i,j;
for(i=m;i>0;i--)
for(j=114;j>0;j--);
}
void in(unsigned char Data)
{
unsigned char i;
for(i = 0; i < 8; i++) //循环8次,刚好移完8位
{
SHCP = 0; //先将移位寄存器控制引脚置为低
_nop_();
_nop_();
if((Data & 0x80)== 0x80)
DS =1;
else
DS =0;
Data <<= 1; //将数据的次高位移到最高位
SHCP = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
}
}
void out(void)
{
STCP = 0; //先将存储寄存器引脚置为低
_nop_();
_nop_();
STCP = 1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
}
void main(void)
{
unsigned char i;
for(i=0;i<9;i++) //有八位数码管,八位依次扫描
{
in(wei[i]);
//先传位码
in(duan[i]); //再传段码
out();
delay(1000); //延迟时间2ms以内
}
}
-
一周热门 更多>