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

📄 mykey.c

📁 实现单片机与键盘和液晶的人机交互
💻 C
字号:
#include<aduc848.h>
#include<intrins.h>
#include<mykey.h>
#include<math.h>
#include<stdio.h>
#include<intrins.h>                  
#include <absacc.h>
#include <setjmp.h>
#include<string.h>

/******************************************/
//主程序
/******************************************/
void main()
{
 
   FLASHADDR=0x00FF;
   CPRST=NORM;      
   vp=0.2;
   ip=1.0;
   freq=50;
   P2=0xf0;
   _RD=1;
   _WR=1;
   RS=1;
   CS=1	;
   LCD_BUS=0xFF;
   LCD_Initial();
   CmdWrite(0x12,0x91);		 //选择page1进行读写
   CmdWrite(0x00,0xcd);		 //文本模式,开显示
   FullScreenFill(0x00);        //清屏
   dis_Page2();
   Timer2_Init(58000);
   while(1)
     {
      check_key();
	  if (FLASHADDR!=0x00FF)        //有闪烁
		     {
              if (numm%2==0)
				 DATALCD[FLASHADDR]=FLASHDATA[FLASHTAB]; 
			  else	   
			      DATALCD[FLASHADDR]=' ';  
				  WriteTextScreen(DATALCD);  
			  }
      }
 
}

void Timer2_Init(unsigned int count)
{   

   T2CON=0x00;
   TL2=count;
   TH2=(count>>8);
   RCAP2H=(count>>8);
   RCAP2L=count;
   CNT2=0;
   EA=1;
   ET2=1;
   TR2=1; 
} 
  
void Timer2_ISR(void) interrupt 5
{
    TF2=0;
    num++;
   if(num%100==0)
  { numm++;}
}

void check_key(void)
{	  P1=0x00;
     //SETBIT(P1,keyenter);
    // SETBIT(P1,keyesc);
    // SETBIT(P1,keyadd);
    // SETBIT(P1,keysub);
	 
 
	 if(set==0){
	   while(!set);
	   ckey=0x80;
	            }
	 if(add==0){
	   while(!add);
	   ckey=0x40;
	            }
	 if(sub==0){
	   while(!sub);
	   ckey=0x20;
	            }
	 if(esc==0){
	   while(!esc);
	   ckey=0x10;
	            }

      if(ckey!=0)	 //有键按下
	  {    
     if (keyenterflag==0)
        {
	       msg_key();
           keyenterflag=1;
         }
      else
         keyenterflag=0;
       } 
}

void msg_key(void)
{
   unsigned char i1;
    i1=0;
    IKEYSTUS=TBSTUS[i1];
    while  (IKEYSTUS!=CPRST) 
    {
	 i1+=4;
         IKEYSTUS=TBSTUS[i1];
    }
    i1++;
    IKEYSTUS=TBSTUS[i1];
    while(IKEYSTUS!=0&&(IKEYSTUS!=ckey))
    {
	 i1+=4;
         IKEYSTUS=TBSTUS[i1];
    }
    CPRST=TBSTUS[i1+2];
    CPRAMADDR=TBSTUS[i1+1];
	switch(CPRAMADDR)
	{
	 case SETNEXT:set_NEXT();break;
	 case SETADD1:set_ADD();break;
     case SETSUB1:set_SUB();break;
     case SETCLEAR:set_CLEAR();break;
    }
        ckey=0x00;	 
}

void set_NEXT(void)
{   
     
    if  (FLASHADDR==0x00FF) 
      {        
         FLASHTAB=0;
         FLASHADDR=FLASHPOS[FLASHTAB];
		 
		 DATALCD[FLASHADDR]=FLASHDATA[FLASHTAB]; 
		 WriteTextScreen(DATALCD);
	   }
    else
      {
          FLASHADDR=FLASHPOS[FLASHTAB];
		  DATALCD[FLASHADDR]=FLASHDATA[FLASHTAB]; 
          WriteTextScreen(DATALCD);
          FLASHTAB++;
		  if(FLASHDATA[FLASHTAB]=='.')
             FLASHTAB++;
          FLASHADDR=FLASHPOS[FLASHTAB];
          DATALCD[FLASHADDR]=FLASHDATA[FLASHTAB]; 
	  
		  if(FLASHTAB==7)
		  { 
		    sscanf(FLASHDATA,"%3f",&vp);
		    sscanf(FLASHDATA+3,"%3f",&ip);
			sscanf(FLASHDATA+6,"%2d",&freq);
			 dis_Page2();
          }
	   }  
}


 void set_ADD(void)
{
  switch(FLASHTAB)
  {
	 case 0:
	 FLASHADDR=FLASHPOS[FLASHTAB];
	 if((FLASHDATA[FLASHTAB]>='0')&&(FLASHDATA[FLASHTAB]<'5'))
      {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]+1;
	  return;
	  }
	 else return;
	
	case 2:
	 FLASHADDR=FLASHPOS[FLASHTAB];
	 if ((FLASHDATA[FLASHTAB]<'9')&&(FLASHDATA[FLASHTAB-2]<'5'))
      {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]+1;
      return;
	  }
	 if ((FLASHDATA[FLASHTAB]=='9')&&(FLASHDATA[FLASHTAB-2]<'4'))
      {
	  FLASHDATA[FLASHTAB-2]=FLASHDATA[FLASHTAB-2]+1;
	  DATALCD[FLASHPOS[FLASHTAB-2]]=FLASHDATA[FLASHTAB-2];
	  FLASHDATA[FLASHTAB]='0';
      return;
	  }

	 if((FLASHDATA[FLASHTAB]=='9')&&(FLASHDATA[FLASHTAB-2]=='4'))
      {
	  FLASHDATA[FLASHTAB-2]='5';
	   DATALCD[FLASHPOS[FLASHTAB-2]]=FLASHDATA[FLASHTAB-2];
	  FLASHDATA[FLASHTAB]='0';
	  return;
	  }
	  if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-2]=='5'))
      {
	  FLASHDATA[FLASHTAB-2]='0';
	   DATALCD[FLASHPOS[FLASHTAB-2]]=FLASHDATA[FLASHTAB-2];
	  FLASHDATA[FLASHTAB]='0';
	  return;
	  }
	 else return;
	
	 case 3:
	 FLASHADDR=FLASHPOS[FLASHTAB];
	 if((FLASHDATA[FLASHTAB]>='0')&&(FLASHDATA[FLASHTAB]<'5'))
      {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]+1;
	  return;
	  }
	 else return;

    case 5:
	 FLASHADDR=FLASHPOS[FLASHTAB];
	 if ((FLASHDATA[FLASHTAB]<'9')&&(FLASHDATA[FLASHTAB-2]<'5'))
      {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]+1;
      return;
	  }
	 if ((FLASHDATA[FLASHTAB]=='9')&&(FLASHDATA[FLASHTAB-2]<'4'))
      {
	  FLASHDATA[FLASHTAB-2]=FLASHDATA[FLASHTAB-2]+1;
	  DATALCD[FLASHPOS[FLASHTAB-2]]=FLASHDATA[FLASHTAB-2];
	  FLASHDATA[FLASHTAB]='0';
      return;
	  }

	 if((FLASHDATA[FLASHTAB]=='9')&&(FLASHDATA[FLASHTAB-2]=='4'))
      {
	  FLASHDATA[FLASHTAB-2]='5';
	   DATALCD[FLASHPOS[FLASHTAB-2]]=FLASHDATA[FLASHTAB-2];
	  FLASHDATA[FLASHTAB]='0';
	  return;
	  }
	  if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-2]=='5'))
      {
	  FLASHDATA[FLASHTAB-2]='0';
	   DATALCD[FLASHPOS[FLASHTAB-2]]=FLASHDATA[FLASHTAB-2];
	  FLASHDATA[FLASHTAB]='0';
	  return;
	  }
	 else return;   
   
	 case 6:
	 FLASHADDR=FLASHPOS[FLASHTAB];
	 if((FLASHDATA[FLASHTAB]>='4')&&(FLASHDATA[FLASHTAB]<'6'))
      {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]+1;
	  return;
	  }
	 else return;
	 
	 case 7:
	 FLASHADDR=FLASHPOS[FLASHTAB];
	 if((FLASHDATA[FLASHTAB]<'9')&&(FLASHDATA[FLASHTAB-1]<'6')&&(FLASHDATA[FLASHTAB-1]>='4'))
      {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]+1;
      return;
	  }
	 if((FLASHDATA[FLASHTAB]=='9')&&(FLASHDATA[FLASHTAB-1]<'6')&&(FLASHDATA[FLASHTAB-1]>='4'))
      {
	  FLASHDATA[FLASHTAB-1]=FLASHDATA[FLASHTAB-1]+1;
	  DATALCD[FLASHPOS[FLASHTAB-1]]=FLASHDATA[FLASHTAB-1];
	  
	  FLASHDATA[FLASHTAB]='0';;
      return;
	  }
	 if((FLASHDATA[FLASHTAB]=='9')&&(FLASHDATA[FLASHTAB-1]=='5'))
      {
	  FLASHDATA[FLASHTAB-1]='6';
	  DATALCD[FLASHPOS[FLASHTAB-1]]='6';
	  FLASHDATA[FLASHTAB]='0';
	  return;
	  }
	 if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-1]=='6'))
      {
	  FLASHDATA[FLASHTAB-1]='4';
	  DATALCD[FLASHPOS[FLASHTAB-1]]=FLASHDATA[FLASHTAB-1];
	  FLASHDATA[FLASHTAB]='0';
	  return;
	  }
	 else return;
   }  
  
}

void set_SUB(void)
{
  switch(FLASHTAB)
   {
	 case 0:
     FLASHADDR=FLASHPOS[FLASHTAB];
     if((FLASHDATA[FLASHTAB]<='5')&&(FLASHDATA[FLASHTAB]>'0'))
	 {
	 FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]-1;
     return; 
	 }
	 else return;

	case 2:
	  if((FLASHDATA[FLASHTAB-2]>='0')&&(FLASHDATA[FLASHTAB]<='9')&&(FLASHDATA[FLASHTAB]>'0'))
	  {
	  FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]-1;
      return;
	  }
	  if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-2]>'0'))
	  {
	  FLASHDATA[FLASHTAB]='9';
	  FLASHDATA[FLASHTAB-2]=FLASHDATA[FLASHTAB-2]-1;
	  DATALCD[FLASHPOS[FLASHTAB-2]]= FLASHDATA[FLASHTAB-2];
      return;
	  }
      else  return;

	  case 3:
	  FLASHADDR=FLASHPOS[FLASHTAB];
      if((FLASHDATA[FLASHTAB]<='5')&&(FLASHDATA[FLASHTAB]>'0'))
	  {
	   FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]-1;
       return; 
	  }
	   else return;

	   case 5:
	   if((FLASHDATA[FLASHTAB-2]>='0')&&(FLASHDATA[FLASHTAB]<='9')&&(FLASHDATA[FLASHTAB]>'0'))
	   {
	   FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]-1;
       return;
	   }
	   if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-2]>'0'))
	   {
	   FLASHDATA[FLASHTAB]='9';
	   FLASHDATA[FLASHTAB-2]=FLASHDATA[FLASHTAB-2]-1;
	   DATALCD[FLASHPOS[FLASHTAB-2]]= FLASHDATA[FLASHTAB-2];
       return;
	   }
       else  return;

	   case 6:
	   if((FLASHDATA[FLASHTAB]>'4')&&(FLASHDATA[FLASHTAB]<='6'))
	   {
	   FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]-1;
       return;
	   }
	   else return;

	   case 7:
	   if((FLASHDATA[FLASHTAB]>'0')&&(FLASHDATA[FLASHTAB]<='9')&&(FLASHDATA[FLASHTAB-1]>='4')&&(FLASHDATA[FLASHTAB-1]<'6'))
	   {
	   FLASHDATA[FLASHTAB]=FLASHDATA[FLASHTAB]-1;
       return;
	   }
	   if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-1]>'4')&&(FLASHDATA[FLASHTAB-1]<='6'))
	   {
	   FLASHDATA[FLASHTAB]='9';
	   FLASHDATA[FLASHTAB-1]=FLASHDATA[FLASHTAB-1]-1;
	   DATALCD[FLASHPOS[FLASHTAB-1]]= FLASHDATA[FLASHTAB-1];
       return;
	   }
	   if((FLASHDATA[FLASHTAB]=='0')&&(FLASHDATA[FLASHTAB-1]=='4'))
	   {
	   FLASHDATA[FLASHTAB]='0';
	   FLASHDATA[FLASHTAB-1]='6';
	   DATALCD[FLASHPOS[FLASHTAB-1]]= FLASHDATA[FLASHTAB-1];
       return;
	   }
	   else return;
   }
}
void set_CLEAR(void)
{
  FLASHADDR=0x00FF;
  CPRST=NORM;      
  Page1();
}




 
 
 





















  
 


/***************************************/
// 延时子程序	 延时t秒
/***************************************/
void delay(uint t)
{
	uint i;
	uint j;
	for(j=0;j<t;j++)
		for(i=0;i<109;i++)
			_nop_();
}


/***************************************/
//写寄存器命令
/***************************************/
void CmdWrite(uchar cmdreg,uchar cmddata)
{
   
	LCD_BUS=cmdreg;	 //写入寄存器地址
	CS=0;
	_RD=1;
	RS=0;
	_WR=0;
	_nop_();
	_WR=1;
	_nop_();
	RS=1;
	CS=1;

	LCD_BUS=cmddata;	//写入参数

	CS=0;
	_RD=1;
	RS=0;
	_WR=0;
	_nop_();
	_WR=1;
	_nop_();
	RS=1;
	CS=1;
	_RD=1;
}

/******************************************/
//数据写操作
/******************************************/
void DataWrite(uchar wrdata)
{
	_RD=1;
	_WR=1;
	RS=1;

	LCD_BUS=wrdata;	 //写入数据
	
	CS=0;
	_WR=0;
	_nop_();
	_WR=1;
	_nop_();
	RS=0;
	CS=1;
}

/******************************************/
//写入字符串
/******************************************/
void Printstr(uchar code *pstr)
{
	while(*pstr!=0)
	{
		DataWrite(*pstr);
		pstr++;
		delay(1);
	}
}

/******************************************/
//整屏幕写入数据
/******************************************/
void FullScreenFill(uchar fill_data)
{
	uchar i,j;
	CmdWrite(0x60,0x00);
	CmdWrite(0x70,0x00);
	for(i=0;i<24;i++)
		for(j=0;j<128;j++)
			DataWrite(fill_data);
}

/******************************************/
//模块复位与初始化
/******************************************/
void LCD_Initial()
{
	_RST=0;			 //复位开始
	delay(10);
	_RST=1;			 
	delay(10);		 //复位结束

    CmdWrite(0x00,0xcd); //电源、软件正常模式,文本正向模式,开显示	,屏幕不闪烁
	//CmdWrite(0x00,0xc5);
	CmdWrite(0x90,0x0d);
	CmdWrite(0xf0,0xa0); 
	CmdWrite(0x11,0x00); //光标高度和行距
	CmdWrite(0x03,0x80); //移动控制
	CmdWrite(0x10,0x6f); //光标和字体控制
    CmdWrite(0x12,0x91); //光标自动右移,显示PAGE1
					 
    CmdWrite(0x20,0x17);	  //工作视窗右边参数的设定
	CmdWrite(0x30,0x7f);
	CmdWrite(0x40,0x00);
	CmdWrite(0x50,0x00);

	CmdWrite(0x21,0x17);	  //显示视窗参数的设定
	CmdWrite(0x31,0x80);
	CmdWrite(0x41,0x00);
	CmdWrite(0x51,0x00);
						
	CmdWrite(0x60,0x00);	   //设定X坐标
	CmdWrite(0x70,0x00);	   //设定Y坐标
	CmdWrite(0xe0,0x00);
	CmdWrite(0xf0,0xa0);	 //简体自型
	CmdWrite(0xf1,0x0f);
}


void Page1(void)
{
 
	CmdWrite(0x60,0x00);		  //设定X坐标
	CmdWrite(0x70,0x00);		  //设定Y坐标	
    Printstr("请设定值:");
    
	CmdWrite(0x60,0x00);		  //设定X坐标
	CmdWrite(0x70,0x20);		  //设定Y坐标	
    Printstr("电压幅度:");

    CmdWrite(0x60,0x4a);
	CmdWrite(0x70,0x20);
	Printstr("0");

	CmdWrite(0x60,0x4b);
	CmdWrite(0x70,0x20);
	Printstr(".");

	CmdWrite(0x60,0x4c);
	CmdWrite(0x70,0x20);
	Printstr("1");

	CmdWrite(0x60,0x4d);
	CmdWrite(0x70,0x20);
	Printstr("V");

    CmdWrite(0x60,0x00);  //设定X坐标
 	CmdWrite(0x70,0x40);  //设定Y坐标
	Printstr("电流幅度:");


    CmdWrite(0x60,0x4a);
	CmdWrite(0x70,0x40);
	Printstr("1");

	CmdWrite(0x60,0x4b);
	CmdWrite(0x70,0x40);
	Printstr(".");

	CmdWrite(0x60,0x4c);
	CmdWrite(0x70,0x40);
	Printstr("0");

	CmdWrite(0x60,0x4d);
	CmdWrite(0x70,0x40);
	Printstr("m");

	CmdWrite(0x60,0x4e);
	CmdWrite(0x70,0x40);
	Printstr("A");




	CmdWrite(0x60,0x00);		  //设定X坐标
	CmdWrite(0x70,0x60);		  //设定Y坐标	
	Printstr("频率:");	

	CmdWrite(0x60,0x46);
	CmdWrite(0x70,0x60);
	Printstr("5");

    CmdWrite(0x60,0x47);
	CmdWrite(0x70,0x60);
	Printstr("0");

	CmdWrite(0x60,0x48);
	CmdWrite(0x70,0x60);
	Printstr("H");
	  
	CmdWrite(0x60,0x49);
	CmdWrite(0x70,0x60);
	Printstr("z");


}
 void WriteTextScreen(unsigned char *TxtData)
{
    
      unsigned char TempData;
      unsigned char i=0; 
	  CmdWrite(0x60,0x00);		  //设定X坐标
	 CmdWrite(0x70,0x00);		  //设定Y坐标	
      Printstr("请设定值:");
	       CmdWrite(0x60,0x00);		  //设定X坐标
           CmdWrite(0x70,0x20);		  //设定Y坐标
	   for(i=0; i<14; i++)
   		    { 
			TempData=(*(TxtData+i));
	   		DataWrite(TempData);
	   	    }
           CmdWrite(0x60,0x00);		  //设定X坐标
           CmdWrite(0x70,0x40);		  //设定Y坐标
	  for(i=14; i<29; i++)
   		    { 
		    TempData=(*(TxtData+i));
	   		DataWrite(TempData);
	   	    }
		  CmdWrite(0x60,0x00);		  //设定X坐标
          CmdWrite(0x70,0x60);		  //设定Y坐标
       for(i=29; i<39; i++)
   		   { 
		    TempData=(*(TxtData+i));
	   		DataWrite(TempData);
	        }  
}
void ncstrcpy(unsigned char *dst, const unsigned char *src)
{
	while (*src!=0x00)
	   *dst++=*src++;
}
void dis_Page2(void)
{
    sprintf(FLASHDATA,"%3.1f",vp);
 	ncstrcpy(DATALCD,"电压幅度: ");
    sprintf(DATALCD+10, "%3.1f",vp);
	sprintf(DATALCD+13, "V");

	sprintf(FLASHDATA+3,"%3.1f",ip);
	ncstrcpy(DATALCD+14,"电流幅度: ");
	sprintf(DATALCD+24, "%3.1f",ip);
	sprintf(DATALCD+27, "mA");

	sprintf(FLASHDATA+6,"%2d",freq);
	ncstrcpy(DATALCD+29,"频率: ");									 
	sprintf(DATALCD+35, "%2d",freq);
	sprintf(DATALCD+37, "Hz");

	WriteTextScreen(DATALCD);		 
} 
 
 
 








 

⌨️ 快捷键说明

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