一个基于51单片机的时钟电路设计源代码,还包括了电路图.PCB.源程序
源代码在线查看: 计数器的c1.txt
#include
// 7 8 9 / ON
// 4 5 6 * OFF
// 1 2 3 - Back
// 0 +/- . + =
#define key_0 0
#define key_1 1
#define key_2 2
#define key_3 3
#define key_4 4
#define key_5 5
#define key_6 6
#define key_7 7
#define key_8 8
#define key_9 9
#define key_off 20
#define key_on 21
#define key_add 22
#define key_sub 23
#define key_mul 24
#define key_div 25
#define key_YN 26
#define key_Back 27
#define key_equ 28
#define key_p 29
#define key_nul 255
unsigned char buff[9],p_led ;
//
// 按键扫描程序:如果有键值则返回键值,无键值返回 key_nul
//
unsigned char rKey( void )
{
unsigned char temp= key_nul ;//无按键值
P3=0xff ; // 读键时先对P3口置1
P1= 0xfe ; // 将p1.0置0,实现读第一行值 1111 1110
if ( P3^0== 0 )
temp= key_on ;
if ( P3^1== 0 )
temp= key_div ;
if ( P3^2== 0 )
temp= key_9 ;
if ( P3^3== 0 )
temp= key_8 ;
if ( P3^4== 0 )
temp= key_7 ;
//第二行
P1= 0xfd ; // 将p1.1置0,实现读第二行值 1111 1101
if ( P3^0== 0 )
temp= key_off ;
if ( P3^1== 0 )
temp= key_mul ;
if ( P3^2== 0 )
temp= key_6 ;
if ( P3^3== 0 )
temp= key_5 ;
if ( P3^4== 0 )
temp= key_4 ;
//第三行
P1= 0xfb ; // 将p1.2置0,实现读第三行值 1111 1011
if ( P3^0== 0 )
temp= key_Back ;
if ( P3^1== 0 )
temp= key_sub ;
if ( P3^2== 0 )
temp= key_3 ;
if ( P3^3== 0 )
temp= key_2 ;
if ( P3^4== 0 )
temp= key_1 ;
//第四行
P1= 0xf7 ; // 将p1.3置0,实现读第四行值 1111 0111
if ( P3^0== 0 )
temp= key_equ ;
if ( P3^1== 0 )
temp= key_add ;
if ( P3^2== 0 )
temp= key_p ;
if ( P3^3== 0 )
temp= key_YN ;
if ( P3^4== 0 )
temp= key_0 ;
return( temp ) ;
}
//
// 响应用户按的一个键, 返回一个正确的键值
//
unsigned char read_key( void ) // aa= getch() ;
{
unsigned char i;
unsigned int j;
for( ; rKey( )!= key_nul ; ); // 等待用户松开按键 即无返回键值
loop: for ( ; rKey( )== key_nul; ); // 等待用户重新按键
i=rKey( ); // 第一次读入按键值
for ( j= 0; j< 1000; j++ ); // 延时,起到消抖作用
if ( i== rKey( ) ) // 和第二次读回来比较,如果相等,返回键值,如果不等继续等键值
return ( i ) ;
else
goto loop ;
}
//
// 每2ms执行一回中断的中断程序, 实现LED数码管动态显示
//
void timero(void) interrupt 1
{
unsigned code led_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
TH0 = ( 65535-2000 ) / 256 ;
TL0 = ( 65535-2000 ) % 256 ;
P2= 0x01>> p_led ;
P0=led_code[buff[p_led]];
p_led++;
if ( p_led== 8 ) p_led=0;
}
void cprintf(unsigned char idata *buff, long n )
{
unsigned char i ;
for( i=8 ; i>0 ;i-- )
{
buff[i-1]= n%10 ;
n/= 10 ;
}
}
//
//
//
unsigned char input( long int *temp )
{
unsigned char k ;
loop:
k= read_key( ) ;
if (k if ( *temp< 100000000 ) // 不能超过八个数码管范围
*temp= (*temp)* 10+ k ;
else if(k== key_Back ) // 如果用户按后退键
*temp= (*temp)/10 ;
else
return ( k ) ; // 否则用户按的是其他功能键,退出
cprintf( *buff,*temp ) ;
goto loop ;
}
main( )
{
long n1, n2, n3 ;
unsigned char sysb1, j ;
TMOD = 0x01;
TH0 = ( 65535-2000 ) / 256 ;
TL0 = ( 65535-2000 ) % 256 ;
TCON = 0x10;
EA= 1 ;
start:
n1= 0 ;
n2= 0 ;
sysb1= input(&n1) ;
// switch( sysb1 ) // 输入第一个数
switch( sysb1 )
{
case key_off:
case key_on:
goto start ;//*
case key_equ:
case key_add:
case key_sub:
case key_mul:
case key_div:
break ;
}
j= input(&n2) ;
// switch(j) // 输入第二个数
switch( j )
{
case key_off:
case key_on:
goto start ;
case key_equ:
case key_add:
case key_sub:
case key_mul:
case key_div:
switch( sysb1 )
{
case key_add :
n3=n1+n2 ;
break ;
case key_sub:
n3=n1-n2 ;
break ;
case key_mul:
n3=n1*n2 ;
break ;
case key_div:
n3=n1/n2 ;
break ;
}
cprintf( *buff, n3 ) ;
break ;
}
}