原理图
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
uchar code Table[] =
{ // 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x86,0xFF,0xbf
};
//-----------------------------------------------------------------------------
sbit SER = P1^0; //串行数据输入端
sbit STCP = P1^1; //时钟脉冲信号——上升沿有效 存储寄存器时钟输入端,并行输出
sbit SHCP = P1^2; //输入信号————上升沿有效 移位寄存器时钟输入端
sbit key1 = P3^0; //选择键
sbit key2 = P3^1; //加键
sbit key3 = P3^2; //减键
sbit key4 = P3^3;
uchar shan,A,K,C,D,E,F;
uchar knum; //选择键计数变量
void TimerInit();
void KeyScan();
void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao); // 数码管显示
void SMG_Int(uchar Dat); // 数码管单字节串行移位函数
//*****************************************************************************
// 主程序
void main ()
{
TimerInit();
while(1)
{
Display (A,K,C,D,E,F);
KeyScan();
}
}
void KeyScan()
{
}
void Display (uchar shi10,uchar shi,uchar fen10,uchar fen,uchar miao10,uchar miao)
{
uchar i;
//显示第1位 小时10位
i = Table[shi10];
SMG_Int(i);
SMG_Int(0x01);
STCP = 0; //数据并行输出,(借助上升沿)
_nop_();
_nop_();
STCP = 1;
//显示第2位 小时个位
i = Table[shi];
SMG_Int(i);
SMG_Int(0x02);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第3位 -
if(shan<10) //"-" 闪烁
i = Table[16];
else
i = Table[15];
SMG_Int(i);
SMG_Int(0x04);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第4位 分钟10位
i = Table[fen10];
SMG_Int(i);
SMG_Int(0x08);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第5位 分钟个位
i = Table[fen];
SMG_Int(i);
SMG_Int(0x10);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第6位 -
if(shan<10) //"-" 闪烁
i = Table[16];
else
i = Table[15];
SMG_Int(i);
SMG_Int(0x20);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第7位 秒10位
i = Table[miao10];
SMG_Int(i);
SMG_Int(0x40);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
//显示第8位 秒个位
i = Table[miao];
SMG_Int(i);
SMG_Int(0x80);
STCP = 0;
_nop_();
_nop_();
STCP = 1;
}
void SMG_Int(uchar Dat) //通过8次循环将8位数据移入74HC595
{
uchar i;
for(i=8;i>=1;i--)
{
if (Dat & 0x80)
{
SER = 1;
}
else
{
SER = 0;
}
Dat <<= 1;
SHCP = 0;
_nop_();
_nop_();
SHCP = 1;
}
}
void TimerInit() //定时器0初始化
{
TMOD = 0x01;
TH0 = (65536-50000)/256; //50ms初值
TL0 = (65536-50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0() interrupt 1
{
static uchar cnt,shi=12,fen=59,miao=30;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
shan++;
if(shan==20)
shan=0;
cnt++;
if(cnt==20)
{
cnt = 0;
miao++;
if(miao == 60)
{
miao = 0;
fen++;
if(fen==60)
{
fen = 0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
A=shi/10;
K=shi%10;
C=fen/10;
D=fen%10;
E=miao/10;
F=miao%10;
}
由共阳极改的,改了段码表,可是程序显示乱码,个别数码管什么都不显示。
请问高手,如何解决?谢谢
就是8个8字显示,一个595负责段码,一个595负责位码,你把所有的组合写到纸上,程序里从0到9,挨个儿显示一遍,中间加长延时,然后就能发现问题了。不过位码595不加三极管驱动,不知道能不能驱动7段全亮的电流。
你让段选全输出,看看数码管能不能全亮。