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

📄 mt8870.c

📁 基于DTMF制式的来电显示设计(暂时不支持FSK模式)
💻 C
📖 第 1 页 / 共 2 页
字号:
         case 0:  WriteDataLCM(0x4F); TEL=TEL*10+Number ; break;                 
        }
	 }    //算出完整来电号码
}  

//===========拨号显示=============================================
void  Signal_BoHao_Start()
{ 
  switch (Number)    //判断电话号码
     { 
      case 1:  WriteDataLCM(0x31);  k++; break;                 
      case 2:  WriteDataLCM(0x32);  k++; break; 
      case 3:  WriteDataLCM(0x33);  k++; break; 
      case 4:  WriteDataLCM(0x34);  k++; break;                 
      case 5:  WriteDataLCM(0x35);  k++; break; 
      case 6:  WriteDataLCM(0x36);  k++; break; 
      case 7:  WriteDataLCM(0x37);  k++; break;                 
      case 8:  WriteDataLCM(0x38);  k++; break; 
      case 9:  WriteDataLCM(0x39);  k++; break; 
      case 0:  WriteDataLCM(0x30);  k++; break; 
      case 11: WriteDataLCM(0x2A);  k++; break; //*  
      case 12: WriteDataLCM(0x23);  k++; break; //#            
     }
}

//结束读取完整来电号码=============================================
void Signal_CID_END()
 {
  Receiving=0 ;  //
  Receiving2=0;  
  WriteCommandLCM(0x0C,1);  // 显示开及光标设置,0x0C关光标,0x0D开光标,0x0E光标不闪

//------------以下刷屏---------------------------------- 
  Display_XY(0,0);   Display("来电:");        
  Display_XY(0,1);   Display("单位:           ");        
  Display_XY(8,0);   Display("姓名:           ");       
  Display_XY(8,1);   Display("备注:           ");      
  Display_XY(3,1);            //显示信息光标初始定位
//------------以上刷屏----------------------------------

//----------------------------------------------------------------------      
//======以下判断电话号码=================================================
//----------------------------------------------------------------------    
  switch ( TEL )    
   {  
                      case     12345:                 //如果来电是该号码,此行用于测试
                      Display( "某个单位"    );       //显示单位
    Display_XY(11,0); Display( "张三"    );           //显示姓名
    Display_XY(11,1); Display( "VIP"    );            //显示备注
	break; 

                      case     136123456:                //如果来电是该号码,此行用于测试
                      Display( "某个单位"    );       //显示单位
    Display_XY(11,0); Display( "某名字"    );           //显示姓名
    Display_XY(11,1); Display( "VIP"    );            //显示备注
	break; 
//----------------------------------------------------------------------    
//========以上是电话簿,可不断添加,电话号码长度在11位或以下=======
//----------------------------------------------------------------------   
            
    default:    //--------- 如果没有查到号码----------------------------
    Record=0;
    Display_XY(3,1); Display(   "┌───┐"   );       //第四行
    Display_XY(11,0);Display(   "│无记录┃"   ); //第三行
    Display_XY(11,1); Display(  "└━━━┛"   );       //第四行
    break;
   }

//---------判断是否有记录---------------------------------------------
      if (Record ==0 )  //号码1
       { Record2 = 0; Record =1;}
    else if (Record ==1 )
       { Record2 = 1;}
//--------------------------------------------------------------
    TEL = 0;   //号码清零
}

//将DTMF音频转换成号码数值=======================
void Signal_Read()
{
   while(STD==1)
    { }                  //等待STD的下降延开始读取DTMF解码
      Delay(260);        //消抖 
      Bell=1;            //关蜂鸣器
      _nop_(); 

      if (b4==0 && b3==0 && b2==0 && b1==1)  //号码1
       { Number = 1; }
	  else if (b4==0 && b3==0 && b2==1 && b1==0)  //号码2
	   { Number = 2; }	
	  else if (b4==0 && b3==0 && b2==1 && b1==1)  //号码3
	   { Number = 3; }
	  else if (b4==0 && b3==1 && b2==0 && b1==0)  //号码4
	   { Number = 4; }
	  else if (b4==0 && b3==1 && b2==0 && b1==1)  //号码5
	   { Number = 5; }
	  else if (b4==0 && b3==1 && b2==1 && b1==0)  //号码6
	   { Number = 6; }
	  else if (b4==0 && b3==1 && b2==1 && b1==1)  //号码7
	   { Number = 7; }
	  else if (b4==1 && b3==0 && b2==0 && b1==0)  //号码8
	   { Number = 8; }
	  else if (b4==1 && b3==0 && b2==0 && b1==1)  //号码9
	   { Number = 9; }
	  else if (b4==1 && b3==0 && b2==1 && b1==0)  //号码0
	   { Number = 0; }
	  else if (b4==1 && b3==0 && b2==1 && b1==1)  //号码*
	   { Number = 11;}
      else if (b4==1 && b3==1 && b2==0 && b1==0)  //号码#
	   { Number = 12;}
      else if (b4==0 && b3==0 && b2==0 && b1==0)  //号码D
	   { Number = 13;}
	  else if (b4==1 && b3==1 && b2==1 && b1==1)  //号码C
	   { Number = 14;}
}

//LCM初始化================================================================
void LCMInit(void) 
{
  LCM_Data = 0;
  WriteCommandLCM(0x38,0);  //三次显示模式设置,不检测忙信号
  Delay(1000); 
  WriteCommandLCM(0x38,0);
  Delay(1000); 
  WriteCommandLCM(0x38,0);
  Delay(1000); 

  WriteCommandLCM(0x38,1);  //基本指令集0x38,扩充指令0x34,开始要求每次检测忙信号
  WriteCommandLCM(0x08,1);  //关闭显示
  WriteCommandLCM(0x01,1);  //显示清屏
  WriteCommandLCM(0x06,1);  // 显示光标移动设置,0x06 AC值自动加1,
  WriteCommandLCM(0x0D,1);  // 显示开及光标设置,0x0C关光标,0x0D开光标,0x0E光标不闪
}

//写指令==============================================================
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
  if (BuysC) ReadStatusLCM(); //根据需要检测忙
  LCM_Data = WCLCM;
  LCM_RS = 0;
  LCM_RW = 0; 
  LCM_EN = 0;
  LCM_EN = 0;
  LCM_EN = 1; 
}

//读状态=======================================================
unsigned char ReadStatusLCM(void)
{
  LCM_Data = 0xFF; 
  LCM_RS = 0;
  LCM_RW = 1;
  LCM_EN = 0;
  LCM_EN = 0;
  LCM_EN = 1;
  while (LCM_Data & Busy); //检测忙信号
  return(LCM_Data);
}

//定位光标位置=============================
void Display_XY(unsigned char X, unsigned char Y)
{
  WriteCommandLCM(0x06,1);//bug
  Y &= 0x1;
  X &= 0xF;   //限制X不能大于15,Y不能大于1
  if (Y) X |= 0x10;   //当要显示第二行时地址码+0x10;
  X |= 0x80;   //算出指令码
  WriteCommandLCM(X, 0);   //这里不检测忙信号,发送地址码
}

//写数据=======================================================
void WriteDataLCM(unsigned char WDLCM)
{
  ReadStatusLCM(); //检测忙
  LCM_Data = WDLCM;
  LCM_Data = WDLCM;
  LCM_RS = 1;
  LCM_RW = 0;
  LCM_EN = 0; //若晶振速度太高可以在这后加小的延时
  LCM_EN = 0; 
  LCM_EN = 0;
  LCM_EN = 0;
  LCM_EN = 1;
}

//显示字符串================================================
void Display(unsigned char code *DData)
{
//      ReadStatusLCM(); //检测忙
//     WriteDataLCM( DData[0]);
  unsigned char ListLength;
  ListLength = 0;

  while (DData[ListLength]>0x1F)   //若到达字串尾则退出
   {
     ReadStatusLCM(); //检测忙
   	 WriteDataLCM( DData[ListLength]);   //显示单个字符
     ListLength++;
   }
}

//延时秒==============================
void Delay_S(unsigned char delay1)
{
  unsigned int delay2=65530;
  while(delay1--)
   {
    while(delay2--);
   }
}

//延时0~65535=======================
void Delay(unsigned int delay)
{
  while(delay--);
}

//===============END=====================

⌨️ 快捷键说明

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