利用AT89C51单片机设计一个简易电子钟(六位),并通过一个8位LED数码管实现时间显示;该系统可以通过三个按钮实现计时。
# include & ltIOM 16v . h & gt;
# include & ltmacros.h & gt
#定义uchar无符号字符
#定义uint无符号整数
const uchar table[10]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };//0-9对应的字符
const uchar key _ value[16]= { 0,1,2,3,4,5,6,7,8,9,10,112,13,14,15 };
uchar data[4]= { 0 };//显示初始值为0
uint count = 0;?//初始计数值为0
uchar keynum
void port_init()?//端口初始化功能
{ DDRA = 0x ff;//端口A为推挽1输出。
PORTA = 0XFF?
PORTB = 0XFF?//端口B为推挽1输出。
DDRB = 0x ff;
DDRC = 0x ff;?//端口C是不带上拉电阻的输入。
PORTC = 0XFF
DDRD = 0x ff;?//输出端口D的低4位。
PORTD = 0X0F
}
无效延迟(uint j)?//延迟功能
{ uint k;
while(j -)
{ for(k = 1000;k & gt0;k-);}
}
void显示(uchar *p)?//显示功能
{uchar i,sel = 0x 01;
for(I = 0;我& lt4;i++)
{ PORTA = sel?//选通最右边的数码管
PORTB = table[p[I]];//发送字体代码
延时(1);
sel = sel & lt& lt1;//向左移动一个位置
}
}
uchar get_key(void)
{如果((PIND & amp;0X0F)!=0X0F)延迟(3);
{
PORTD = 0XEF
开关(PIND & amp;0X0F)
{ case 0x0e:keynum = key _ value[0];打破;
case 0x0d:keynum = key _ value[4];打破;
case 0x0b:keynum = key _ value[8];打破;
case 0x 07:keynum = key _ value[12];打破;
默认:break
}
PORTD = 0xdf
开关(PIND & amp;0X0F)
{ case 0x0e:keynum = key _ value[1];打破;
case 0x0d:keynum = key _ value[5];打破;
case 0x0b:keynum = key _ value[9];打破;
case 0x 07:keynum = key _ value[13];打破;
默认:break
}
PORTD = 0xbf
开关(PIND & amp;0X0F)
{ case 0x0e:keynum = key _ value[2];打破;
case 0x0d:keynum = key _ value[6];打破;
case 0x0b:keynum = key _ value[10];打破;
case 0x 07:keynum = key _ value[14];打破;
默认:break
}
PORTD = 0x7f
开关(PIND & amp;0X0F)
{ case 0x0e:keynum = key _ value[3];打破;
case 0x0d:keynum = key _ value[7];打破;
case 0x0b:keynum = key _ value[11];打破;
case 0x 07:keynum = key _ value[15];打破;
默认:break
}?
而((PIND & amp;0x0f)!= 0x0f);
}
返回keynum
}
Void process(uint i,uchar *q) //拆分BCD码函数并显示千、百、十、个位。
{ ?q[0]= I/1000;
I = I % 1000;
q[1]= I/100;
I = I % 100;
q[2]= I/10;
I = I % 10;
q[3]= I;
}
无效总管(无效)
{ port _ init();
PORTB = 0xff
PORTA = 0X00
延迟(50);
PORTA = 0xff
while(1)
{ get _ key();
count = keynum
过程(计数、数据);
显示(数据);
}
}