一个基于51单片机的时钟电路设计源代码,还包括了电路图.PCB.源程序

源代码在线查看: 计数器的c1.txt

软件大小: 619 K
上传用户: novelty1234
关键词: PCB 51单片机 时钟 电路设计
下载地址: 免注册下载 普通下载 VIP

相关代码

				#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 ;
				      }
				
				}
				
				
							

相关资源