⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 计数器的c1.txt

📁 一个基于51单片机的时钟电路设计源代码,还包括了电路图.PCB.源程序
💻 TXT
字号:
#include <reg52.h>
//     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<= 9 )                // 如果用户按数字键
           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 ;
      }

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -