这是原理图,SR42063是4位共阴数码管,为什么我这个不可以让数码管显示0-F,即使你想P0口写数据,数码管的显示也不变,我用万用表检测P0 口电压的时候电压很低,甚至有些是几毫伏(P0口已经接上拉电阻 10K) 然后我给P0 口写0xff的时候P0 口有几个IO 口电压还是只有几毫伏。这是怎么回事啊 我都接了上啦电阻的啊
这是让数码管显示数字的程序
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDATA_595=P2^0 ; //串行数据输入
sbit HC595_OE=P2^1; //输出使能端,高电平时 禁止输出
sbit RCK_595=P2^2 ; //输出锁存器控制脉冲 (上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
// 通常将RCK置为低电平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。通常都选微秒级),更新显示数据)
sbit SCLK_595=P2^3 ; //移位时钟脉冲
//上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。通常都选微秒级
sbit HC595_MR=P2^4; //595复位端,低电平复位 一般接到VCC
sbit P25=P2^5;
sbit P26=P2^6;
unsigned char code Led_Table[]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e};// 4, 5, 6, 7, 8, 9, off
void delays()
{
uint b,c;
for(b=100;b>0;b--)
for(c=1000;c>0;c--);
}
//function
void Display(unsigned char Num);
void Delay(unsigned int TotalTime);
unsigned char KeyScan();
//varible
unsigned char temp;
unsigned char Num;
unsigned char ret=0;
void delay(unsigned int TotalTime)
{
unsigned i,j;
for(i=0;i<TotalTime;i++)
for(j=0;j<114;j++);
}
/********************************************************/
/* *//*将显示数据送入74HC595内部移位寄存器 *//* */
/********************************************************/
void WR_595(uchar date)
{
uchar j;
for (j=0;j<8;j++)
{
if((date<<j) & 0x80)
SDATA_595=1;
else
SDATA_595=0;
SCLK_595=0; //上升沿发生移位
_nop_();
_nop_();
SCLK_595=1;
}
}
/********************************************************/
/* */
/*将移位寄存器内的数据锁存到输出寄存器并显示 *//* */
/********************************************************/
void OUT_595(void)
{
RCK_595=0 ;
_nop_() ;
_nop_() ;
RCK_595=1 ; //上升沿将数据送到输出锁存器
_nop_() ;
_nop_() ;
_nop_() ;
RCK_595=0 ;
}
void main(void)
{
SCLK_595=0 ;
RCK_595=1 ;
HC595_MR=1;
HC595_OE=0;
// temp = 0x
while(ret++<16)
{
WR_595(0x00) ;
OUT_595() ;
delays() ;
P25=0; //低表示选中,为1表示O端为高组态
P26=1; //为高表示O随着D变而变,为0则锁存住原电平。
P0=Led_Table[ret];
delays() ;
if(ret == 16)
ret=0;
P1=0X00;
}
}
希望各位指点迷津 |