数码管怎么回事啊求助
protues吧
全部回复
仅看楼主
level 1
shiftlovevvbb 楼主
2014年06月20日 13点06分 1
level 1
shiftlovevvbb 楼主
/*************************************************************
【程序说明】
【1】开发环境:KEIL
【2】主控芯片:STC89C52RC
【3】实现功能:设计一个由6位数码管组成的静态显示电路,
显示当前时间,时分秒每个用2位显示;
可用按键校准时间,控制校准时间时的启动。
【4】I/O分配:P0口连接数码管,按键为 P3^4 P3^5 P3^6 P3^7
【5】按键功能:key1(P3^4):启动时钟,无论是开始还是校正时间后,
只有按下key1,时钟才能运行
key2(P3^5):加1按键
key3(P3^6):减1按键
key4(P3^7):校正按键,按一下可以校正秒,按两下
可以校正分,按三下可以校正时
(按键次数可以叠加,例如:按一下校正
秒后,只需再按一下便可校正分)
【6】初始化时间:00:00:00
*************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula = P2^6; // 段选
sbit wela = P2^7; // 位选
sbit key1 = P3^4; //定义按键位置 独立按键模式
sbit key2 = P3^5;
sbit key3 = P3^6;
sbit key4 = P3^7;
sbit a = P1^0;sbit b = P1^1;sbit c = P1^2;
uchar num,num1,num2,num3,shi_ge,shi_shi,fen_ge,fen_shi,miao_shi,miao_ge;
uchar choice=0;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f, // 0 1 2 3 // 数码管数组
0x66,0x6d,0x7d,0x07, // 4 5 6 7
0x7f,0x6f,0x77,0x7c, // 8 9 A B
0x39,0x5e,0x79,0x71}; // C D E F
void delayms(uint xms) // 毫秒级延时
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(num) // 显示函数
{
miao_shi=num1/10; //秒显示
miao_ge=num1%10;
fen_shi=num2/10; //分显示
fen_ge=num2%10;
shi_shi=num3/10; //时显示 24小时制
shi_ge=num3%10;
dula=1; // 秒
P0=table[miao_shi];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(2);
dula=1;
P0=table[miao_ge];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(2);
dula=1; // 分钟
P0=table[fen_shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(2);
dula=1;
P0=table[fen_ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(2);
dula=1; // 小时
P0=table[shi_shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(2);
dula=1;
P0=table[shi_ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(2);
}
void adjustment()
{
if (key1==0) // 开启定时器 开启(时钟)
{
delayms(15);
if(key1==0)
{
TR0=1;
while(!key1);
}
}
if (key4==0) // 选择按键
{
delayms(30);
if(key4==0)
{
choice++;
if(choice>3)
choice=0;
while(!key4);
}
}
2014年06月21日 06点06分 3
level 1
shiftlovevvbb 楼主
if(choice==1) // 校正秒表
{
if (key2==0)
{
delayms(15);
if(key2==0)
{
TR0=0;
num1++; // 加1
if(num1==60)
num1=0;
while(!key2);
}
}
if (key3==0)
{
delayms(15);
if(key3==0)
{
TR0=0;
if(num1==0)
num1=60;
num1--; // 减1
while(!key3);
}
}
}
if(choice==2) // 校正分钟
{
if (key2==0)
{
delayms(15);
if(key2==0)
{
TR0=0;
num2++; // 加1
if(num2==60)
num2=0;
while(!key2);
}
}
if (key3==0)
{
delayms(15);
if(key3==0)
{
TR0=0;
if(num2==0)
num2=60;
num2--; // 减1
while(!key3);
}
}
}
if(choice==3) // 校正小时
{
if (key2==0)
{
delayms(15);
if(key2==0)
{
TR0=0;
num3++; // 加1
if(num3==24)
num3=0;
while(!key2);
}
}
if (key3==0)
{
delayms(15);
if(key3==0)
{
TR0=0;
if(num3==0)
num3=24;
num3--; // 减1
while(!key3);
}
}
}
}
void main()
{
TMOD=0X01; // 定时器0工作方式1
TH0=(65536-45872)/256; // 装载初值
TL0=(65536-45872)%256;
EA=1; // 开启
ET0=1;
//TR0=1;
while(1)
{
display(num); // 显示函数
adjustment(); //时间调整函数
}
}
void T0_time() interrupt 1 // 外部中断1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
if(num==20) // 1秒时间
{
num=0;
num1++;
if(num1==60)
{
num1=0;
num2++;
}
if(num2==60)
{
num2=0;
num3++;
}
if(num3==24)
{
num3=0;
}
}
}
2014年06月21日 06点06分 4
level 1
shiftlovevvbb 楼主
2014年06月21日 06点06分 5
我接的是共阴的,要不你加我qq291745334 吧我把电路图发给你,你给我调调,弄好我给你冲 q b要交了比较急谢谢
2014年06月21日 06点06分
1