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

📄 aa.c

📁 用51单片机实现液晶显示
💻 C
📖 第 1 页 / 共 2 页
字号:

/******************************************************************************/
#include<reg51.h>
#include<absacc.h>
#define w_c_add XBYTE[0x2070]      /*写命令字地址*/
#define w_d_add XBYTE[0x2071]      /*写数据地址  */
#define r_s_add XBYTE[0x2072]      /*读状态字地址*/
#define r_d_add XBYTE[0x2073]      /*读数据地质  */
#define COM XBYTE[0x2021]          /*8279命令口  */
#define DAT XBYTE[0x2020]          /*8279数据口  */
#define uchar unsigned char
#define uint unsigned int
uchar halftime0;                   /*半场时间分的十位纪录*/
uchar halftime1;                   /*半场时间分的个位纪录*/
uchar halftime;                    /*全场时间阿拉伯数字总计时*/
uchar second0;                     /*24秒到计时十位*/
uchar second1;                     /*24秒到计时个位*/
uchar time;                        /*用于一秒定时*/
uchar Acount;                      /*A队比分变量*/        
uchar Bcount;                      /*B对比分变量*/
uchar a; 
uchar fulltime0;                   /*全场计时分钟的十位lcd编码*/
uchar fulltime1;                   /*全场计时分的个位lcd编码*/                  
uchar fulltime;                    /*全场计时阿拉伯数字计数*/
uchar bdata status;               // 可位寻址片内数据存储器,允许位与字节混合访问 
sbit speaker=P1^4;
sbit red=P1^5;
sbit yellow=P1^6;
sbit green=P1^7;   
sbit busy=status^7;               /*RT12864HZ液晶显示器“忙”线的检测(第7位)*/
sbit clflag=ACC^7;                /*8279标志位*/
bit flag1;                         /*显示页面选择标志*/
bit flag2;
bit flag3; 
bit fgk;                           /*队伍选择标志*/
bit fgk1;
bit dk;                           
bit mk;                           /*功能选择标志*/   
bit stop;                         /*24秒到是标志位*/           
bit pk;                           /*10秒延时到标志位*/
                      
unsigned char code num_lcd[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
                          /*lcd数字编码*/
unsigned char code num_led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
                    0x39,0x5e,0x79,0x71};
                          /*led数字编码*/
unsigned char xdata hz1[16]={0xC8,0xAB,0xB3,0xA1,0xCA,0xB1,0xBC,0xE4,0x3A,
	                  /*     全        场        时         间   :*/
	                         0x20,0x30,0x30,0x3A,0x30,0x30,0x20};
                             /*     0     0    :   0    0     */
unsigned char xdata hz2[16]={0xB0,0xEB,0xB3,0xA1,0xCA,0xB1,0xBC,0xE4,0x3A,
	                     /*     半        场        时        间    : */
                             0x20,0x30,0x30,0x3A,0x30,0x30,0x20};                                 
                            /* 空    0    0    :   0     0  空*/  
unsigned char xdata hz3[16]={0xD6,0xD0,0xB9,0xFA,0x56,0x53,0xC3,0xC0,0xB9,0xFA, 
                           /*    中        国      V    S       美       国*/
                                0x20,0x20,0xBD,0xF8,0xB9,0xA5 };
                              /*              进        攻  */                 
unsigned char xdata hz4[16]={0x20,0x30,0x30,0x30,0x3A,0x30,0x30,0x30,0x20,
	                        /*  (主队得分)         :       (客队得分)  */			  
	                        0x20,0x20,0x20,0x20,0x32,0x34,0x20};
                            /*                        */							  	 
unsigned char xdata start1[16]={0xbb,0xb6,0xd3,0xad,0xca,0xb9,0xd3,0xc3,0x20,   
	                         /*        欢       迎       使         用   :*/
	                         0x20,0x20,0x20,0x20,0x20,0x20,0x20};
                             /*    空           */
unsigned char xdata start2[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xc0,
	                        /*                                  空   */
                             0xba,0xc7,0xf2,0xb1,0xc8,0xc8,0xfc};                                 
                            /* 篮        球       比      赛*/  
unsigned char xdata start3[16]={0xd7,0xa8,0xd3,0xc3,0xbc,0xc6,0xca,0xb1,0xbc,
                              /*       专        用        计       时                */
                                 0xc7,0xb7,0xd6,0xcf,0xb5,0xcd,0xb3  };
                              /*  记         分       系       统  */                 
unsigned char xdata start4[16]={0xb1,0xc8,0xc8,0xfc,0xca,0xb1,0xbc,0xe4,0xc9,0xe8,
	                         /*     比        赛         时         间       设 */
	                        0xb6,0xa8,0x3A,0x20,0x30,0x30};
                            /*    定    :               */
unsigned char xdata fg1[16]={0x20,0x20,0xB7,0xB8,0xB9,0xE6,0xB4,0xCE,0xCA,0xFD,
	                           /*          犯        规        次         数    */
	                                   0xCD,0xB3,0xBC,0xC6,0x20,0x20};
                             /*            统         计    */
unsigned char xdata fg2[16]={0xD6,0xD0,0xB9,0xFA,0xb6,0xD3,0x20,0x20,0x20,
	                       /*    中        国         队            */
	                         0x20,0xC3,0xC0,0xB9,0xFA,0xb6,0xD3};
                             /*        美       国         队        */
unsigned char xdata fg3[16]={0x20,0x20,0x30,0x30,0x20,0x20,0x20,0x20,0x20,
	                        /*           0    0                      */      
	                         0x20,0x20,0x20,0x30,0x30,0x20,0x20};
                             /*               0    0     */
unsigned char xdata fg4[16]={0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
	                            /*    空              */
	                         0x20,0x20,0x20,0x20,0x20,0x20,0x20};
                             /*                 空     */

/*LCD忙状态检测函数 */
void lcd_busy(void)                       
{
	do 
	{
  	  status=r_s_add;                    /* 读状态字地址的第7位 */
	}	
	while(busy);
}

/*LCD显示子程序*/
void display_lcd(void)                   
{   
	int i; 
    lcd_busy();
    w_c_add=0x30;                     /* 功能设置:8位数据 */
    lcd_busy();     
    w_c_add=0x0C;                     /* 显示状态:整体显示,游标位置无效*/
    lcd_busy();
    w_c_add=0x01;                     // 清除显示:将DDRAM填满“20H”,并且设
                                      // 定DDRAM的地址计数器到“00”
    lcd_busy();                
    w_c_add=0x02; 
    lcd_busy();
    w_c_add=0x80;                      /* 写第一行数据*/   
    for(i=0;i<8;i++)
       { 
	      lcd_busy();
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz1[2*i];     
          if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start1[2*i];     /* 写数据 ,上半字节*/
          if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg1[2*i]; 
	      lcd_busy();                    
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz1[2*i+1];   /* 写数据 ,下半字节*/
	      if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start1[2*i+1];
	      if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg1[2*i+1]; 
        }
    lcd_busy();
    w_c_add=0x90;                       /* 写第二行数据*/
    for(i=0;i<8;i++)
       {
	      lcd_busy();
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz2[2*i];     
          if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start2[2*i];     /* 写数据 ,上半字节*/
          if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg2[2*i]; 
	      lcd_busy();                    
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz2[2*i+1];   /* 写数据 ,下半字节*/
	      if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start2[2*i+1];
	      if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg2[2*i+1]; 
       }
    lcd_busy();
    w_c_add=0x88;                       /* 写第三行数据*/      
    for(i=0;i<8;i++)
       {
          lcd_busy();
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz3[2*i];     
          if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start3[2*i];     /* 写数据 ,上半字节*/
          if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg3[2*i]; 
	      lcd_busy();                    
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz3[2*i+1];   /* 写数据 ,下半字节*/
	      if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start3[2*i+1];
	      if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg3[2*i+1]; 
       }
    lcd_busy();
    w_c_add=0x98;                       /* 写第四行数据*/
    for(i=0;i<8;i++)
       {
	      lcd_busy();
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz4[2*i];     
          if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start4[2*i];     /* 写数据 ,上半字节*/
          if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg4[2*i]; 
	      lcd_busy();                    
	      if((flag1==1)&&(flag2==0)&&(flag3==0))w_d_add=hz4[2*i+1];   /* 写数据 ,下半字节*/
	      if((flag1==0)&&(flag2==1)&&(flag3==0))w_d_add=start4[2*i+1];
	      if((flag1==0)&&(flag2==0)&&(flag3==1))w_d_add=fg4[2*i+1]; 
       }
}
void display_led(void)      /*24秒倒计时led显示*/
    { int i,a[2];
      switch (hz4[14])
            { case 0x39:a[1]=9;break;
              case 0x38:a[1]=8;break;
              case 0x37:a[1]=7;break;
              case 0x36:a[1]=6;break;
              case 0x35:a[1]=5;break;
              case 0x34:a[1]=4;break;
              case 0x33:a[1]=3;break;
              case 0x32:a[1]=2;break;
              case 0x31:a[1]=1;break;
              case 0x30:a[1]=0;break;
              default:  break;
            	}
       switch (hz4[13])
            { case 0x39:a[0]=9;break;
              case 0x38:a[0]=8;break;
              case 0x37:a[0]=7;break;
              case 0x36:a[0]=6;break;
              case 0x35:a[0]=5;break;
              case 0x34:a[0]=4;break;
              case 0x33:a[0]=3;break;
              case 0x32:a[0]=2;break;
              case 0x31:a[0]=1;break;
              case 0x30:a[0]=0;break;
              default:  break;
            	}
          COM=0x90;        /*自动地址增量标志置1,将要写入的显示ram为0000*/
        for(i=0;i<2;i++)
         { COM=i+0x83;
           DAT=num_led[a[i]];
         }
   	}


/*一秒延时*/
void delay(void)
{
    uchar i,j,k,a=1;
    for(i=0;i<50;i++)
    for(j=0;j<200;j++)
    for(k=0;k<100;k++)
    {
    	a=a;
	}
}

/*全场时间,半场倒计时操作子程序*/
void operate1(void)
{
    uchar statefull=1,statehalf=1;
     /*判断全场时间是否到*/    
    if((hz1[10]==fulltime0)&&(hz1[11]==fulltime1))     /*全场时间到?(写一行太多,所以分两行)*/
      {                                
         if((hz1[13]==0x30)&&(hz1[14]==0x30))          /*时间达到fulltime0 fulltime1:59*/
           {
             TR1=0;                                    /*停止计时、发出铃声*/
             speaker=0;
             statefull=0;             
           }
      }
      /*判断半场时间是否到*/
     if((hz2[10]==0x30)&&(hz2[11]==0x30))              /*半场时间到?*/
      {                                
         if((hz2[13]==0x30)&&(hz2[14]==0x31))
           {
             TR1=0;                                    /*停止计时、发出铃声*/
             speaker=0;
             statehalf=0;            
                      
           }
      }
    if(statefull==1)
         {
           hz1[14]=hz1[14]+0x01;              /*秒个位加1*/
           if(hz1[14]==0x3A)                  /*秒个位是否等于10?*/
             {
                hz1[14]=0x30;                   /*等于 ,进位;秒个位归零*/
                hz1[13]=hz1[13]+0x01;           /*秒十位加1*/
                if(hz1[13]==0x36)               /*秒十位是否等于10?*/
                  {
                     hz1[13]=0x30;                /*等于 ,进位;秒十位归零*/ 
                     hz1[11]=hz1[11]+0x01;        /*分个位加1*/
                     if(hz1[11]==0x3A)            /*分个位是否等于10?*/
                       {
                         hz1[11]=0x30;             /*等于 ,进位;分个位归零*/
                         hz1[10]=hz1[10]+0x01;     /*分十位加1*/
                       }
                  }
             }
              
               /*半场时间为倒计时*/ 
           if(statehalf==1)                           /*半场时间未到,正常计时*/
             {
                hz2[14]=hz2[14]-0x01;              /*秒个位减1*/
                if(hz2[14]<0x30)                  /*秒个位是否 小于0?*/
                  {
                     hz2[14]=0x39;                   /*大于 ,进位;秒个位归零*/
                     hz2[13]=hz2[13]-0x01;           /*秒十位加1*/
                     if(hz2[13]<0x30)               /*秒十位是否大于10?*/
                       {
                         hz2[13]=0x35;                /*大于 ,进位;秒十位归零*/ 
                         hz2[11]=hz2[11]-0x01;        /*分个位加1*/
                         if(hz2[11]<0x30)            /*分个位是否大于10?*/
                           {
                              hz2[11]=0x39;             /*大于 ,进位;分个位归零*/
                              hz2[10]=hz2[10]-0x01;     /*分十位加1*/             
                           }
                       }
                  } 
             }   
           else                                /*半场时间到,恢复到初始状态*/
               {
                 hz2[10]=halftime0;
                 hz2[11]=halftime1;
                 hz2[13]=0x30;
                 hz2[14]=0x30;
                 statehalf=1;
                }             
         }
     
}

/*24秒倒计时子程序、显示程序*/
void operate2(void)
{   
	hz4[14]=hz4[14]-0x01;
	if((hz4[14]<0x30)&&(hz4[13]!=0x30))
	  {
	  	hz4[14]=0x39;
	  	hz4[13]=hz4[13]-0x01;
  	  }
	if((hz4[13]==0x30)&&(hz4[14]==0x30))
	  { 
	  	display_lcd();
	  	display_led();
	  	speaker=0;
	  	TR1=0;
	  	delay();
	  	speaker=1;		    	  	
      }	
    display_lcd();
    display_led();
}


/*定时计数器1一秒定时(20*50ms=1s)子程序*/
void timer(void)interrupt 3  using 2    
{ 
  TH1=(65536-50000)/256;                
  TL1=(65536-50000)%256;
  time++;
  if(time==20)
    {  flag1=1;
       time=0;
       operate1();                   /*调用全场时间,半场时间变化LCD子程序*/
       operate2();                   /*调用24倒计时子程序*/
       flag1=1;
       display_lcd();
       display_led();
    }
}

/*设定时间送入lcd显示器子程序*/
void timedevide(void)
{
   uchar half,i;     
   if(fulltime==0){halftime0=0;
   	               halftime1=0;}
   else	 {half=fulltime/2;
   i=half/10;
   hz2[10]=num_lcd[i];
   halftime0=num_lcd[i];
   i=half%10;
   hz2[11]=num_lcd[i];
   halftime1=num_lcd[i];
   display_lcd();}
}   

/******************************键盘功能设定*******************************/

⌨️ 快捷键说明

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