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

📄

📁 用单片机控制锁相环
💻
字号:
  #include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Send_data_buff_num 50		 //发送和接收缓冲区的
#define LCDCOM0 XBYTE[0Xe000]         //写状态地址
#define LCDCOM1 XBYTE[0Xe000]         //读状态地址
#define LCDDATA XBYTE[0Xe800]         //写数据地址
#define LCDDATA_READ XBYTE[0Xe800]    //读数据地址
#define control XBYTE[0x8003]
#define counter0 XBYTE[0x8000]
#define counter1 XBYTE[0x8001]
#define counter2 XBYTE[0x8002]
sbit bflag=ACC^7;  
void dlms(void);
char kbscan(void);
/****************************************************************
 			//等待1602忙标志位
**************************************************************/                                                   

                                
void wait(void)                      
 { 
 do{ACC=LCDCOM1;}
   while(bflag==1);
 }                                      
/**************************************************************** 

			液晶显示初始化

********************************************************/
void init_lcd()             {
   wait();
   LCDCOM0=0x38;            /*置功能;2行,5*7字符 */
   wait();
   LCDCOM0=0x06;            /*置输入模式:地址增量,显示屏不移动*/
   wait();
   LCDCOM0=0x0c;            /*显示开0x0d,显示光标,光标闪烁*/
   wait();
   LCDCOM0=0x01;                /*清显示 */
  }
/****************************************************************
 		发送新命令,一般用于给出新的显示地址
***************************************************************/
void init_command(uchar command)
 {
  wait();
  LCDCOM0=command;       /*首行地址0x80~0xa7,次行地址0xc0~0xe7*/
  }	
/************************** 显示字符函数*****************************************/



void d_char(char a)           
  { wait();
     LCDDATA=a;
   }                          /*输出到数据寄存器*/
/****************************************************************
				延时
****************************************************************/
void dlms(void)                           
     {char i;
	   for(i=200;i>0;i--){}
	  }
/**********************************************************
                          键盘扫描
********************************************************************/
char kbscan(void)
{
  char sccode,recode;
  P1=0xf0;	
  if((P1&0xf0)!=0xf0)
    {
     dlms();
     if((P1&0xf0)!=0xf0)
       {
 	     sccode=0xfe;
         while((sccode&0x10)!=0)  //不到最后一行,循环
	      {
	       P1=sccode;
	       if((P1&0xf0)!=0xf0)
		    {
		      recode=(P1&0xf0)|0x0f;
		      return(sccode&recode);
		     }
	       else
 		     sccode=(sccode<<1)|0x01;
           }
	    }
     }
  return(0);
}
/****************************************************************
				8253初始化
****************************************************************/
void init_8253(void)
{	//control=0x34;
	//counter0=0x0a;
	//counter0=0x00;
	control=0x74;
	counter1=0x00;
	counter1=0x48;
	
}

/****************************************************************
				主函数
****************************************************************/
main()                                                
{   int b,i,j=0,k=0,m=0,aflag=0;
     int r[4]=0;                   //定义变量
    uchar key,num;
    uchar idata Receive_data[Send_data_buff_num]={0}; //定义接收数组
   	      
   
   init_8253();
   init_lcd();		//调用液晶初
   init_command(0xc4);	//在第一行中间显示PLL		
   d_char(0x50);			
   d_char(0x4c);
   d_char(0x4c);			


  while(aflag==0)
 {
   while(kbscan()==0){};                            
   num=kbscan();                     
   switch(num)
  {
   case 0x7e:key=0x31;r[k++]=1;break;			//1
   case 0xbe:key=0x32;r[k++]=2;break;			 
   case 0xde:key=0x33;r[k++]=3;break;	 
   case 0x7d:key=0x34;r[k++]=4;break; 
   case 0xbd:key=0x35;r[k++]=5;break;
   case 0xdd:key=0x36;r[k++]=6;break;
   case 0x7b:key=0x37;r[k++]=7;break;
   case 0xbb:key=0x38;r[k++]=8;break;
   case 0xdb:key=0x39;r[k++]=9;break;		   //9
   case 0xb7:key=0x30;r[k++]=0;break;		  //0
   
   case 0xed:key=0x4d; break;		 //m
   case 0xeb:key=0x4e;break;		//n
   case 0xe7:key=0x7f;				//回车
	 m=r[3]+10*r[2]+100*r[1]+r[0]*1000;
	   control=0x34;
	   counter0=m&255;
	   counter0=m>>8;
	 	//aflag=0;	
	 break;		 
   case 0xd7:key=0x2e;break;		//.
   case 0x77:key=0x3d;break;		//=
   case 0xee:key=0xfe;aflag=1;break;		 //清零
   default:break;
   }
       
		  
   
   	 
   
    Receive_data[j++]=key;
    init_command(0x80);      //显示器第一行
    for(i=0;i<=j;i++)
     {
	   d_char(Receive_data[i]);
     }
     if(j>=15)
      {j=0;i=0;
       for(b=0;b<=15;b++)
       Receive_data[b]=0;
      } 
     for(i=0;i<=30000;i++){;}

	}
 }

⌨️ 快捷键说明

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