调试了好几遍~ 没接口芯片 光单片机好麻烦啊 在我的开发板上调试成功了 12M晶振~~ 既然多少分都可以 那就使劲给吧~
#include <reg52.h>
code unsigned char tab[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳数码管 0-9
unsigned char Dis_Shiwei;//定义十位
unsigned char Dis_Gewei; //定义个位
unsigned char second; //秒
char flag;
unsigned char shi;
void delay(unsigned int cnt)
{
while(--cnt);
}
unsigned char keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值并返回
}
}
return(0xff); //否则返回固定值0xff
}
void main()
{
unsigned char key,temp;
TMOD |=0x01;//定时器设置 10ms in 12M crystal
TH0=0xd8;
TL0=0xf0;
IE= 0x82; //打开中断
TR0=1;
flag=0;
Dis_Shiwei=tab[0];//十位显示值处理
Dis_Gewei=tab[0]; //个位显示处理
while(1)
{
P0=Dis_Shiwei;//显示十位
P2=0xFD;
delay(150);//短暂延时
P0=Dis_Gewei; //显示个位
P2=0xFE;
delay(150);
key=keyscan();//调用键盘扫描,
temp=-1;
if(key!=0xff){
switch(key)
{
case 0x7e:temp=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:temp=1;break;//1
case 0x7b:temp=2;break;//2
case 0x77:temp=3;break;//3
case 0xbe:temp=4;break;//4
case 0xbd:temp=5;break;//5
case 0xbb:temp=6;break;//6
case 0xb7:temp=7;break;//7
case 0xde:temp=8;break;//8
case 0xdd:temp=9;break;//9
case 0xdb:temp=10;break;//a
case 0xd7:temp=11;break;//b
case 0xee:temp=12;break;//c
case 0xed:temp=13;break;//d
case 0xeb:temp=14;break;//e
case 0xe7:temp=15;break;//f
}
if(temp==10)//按下了A键
{
TR0=!TR0;
flag=!flag;
}else
if(flag==1)//按下有效键
{
second=shi*10+temp;
Dis_Shiwei=Dis_Gewei;
Dis_Gewei=tab[temp];
delay(0x7fff); //这个延时太长会在设置时显示不流畅 太短会出现连键
shi=temp;
}
}
}
}
//定时中断
void tim(void) interrupt 1 using 1
{
static unsigned char count;
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
second++;//秒减1
if(second>=60)
{
second=0; //减到0是重新赋值
}
Dis_Shiwei=tab[second/10];//十位显示值处理
Dis_Gewei=tab[second%10]; //个位显示处理
}
}