?? a_telephone_system.c
字號:
/*=======================================================================
基于DTMF制式的來電顯示設計(暫時不支持FSK模式) YRF_2005/7
-------------------------------------------------------------------------
以下硬件組成:
MCU:51內核各系列單片機
DTMF雙音頻信號解碼芯片:MT8870
顯示:帶中文字庫的128*64點陣形液晶模塊
(注:MCU使用12M晶振,以本C51程序的算法,編譯后,程序約占用2K字節,
電話本每組約占用20~40字節,每組信息包括電話號碼,姓名,單位)
===============================================================*/
#include <AT89X52.H> //頭文件
#include <intrins.h>
#include <stdio.h>
//引腳定義-------------------------------------------------------
#define LCM_Data P0
#define LCM_RS P2_5 //定義LCM128*64引腳
#define LCM_RW P2_6
#define LCM_EN P2_7
#define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
#define STD P1_0 //定義MT8870引腳
#define b1 P1_4
#define b2 P1_3
#define b3 P1_2
#define b4 P1_1
#define Bell P3_5 //蜂鳴器
#define key1 P2_4 //鍵盤1
#define key2 P2_3 //鍵盤2
//數據類型--------------------------------------------------------
unsigned char Number = 0; //單個音頻號碼
unsigned long TEL = 0; //完整電話號碼
unsigned char Receiving=0; //正在接收來電號碼識別定義
unsigned char Receiving2=0; //撥號識別定義
unsigned char Record=1; //是否有記錄識別定義
unsigned char Record2=1; //是否有記錄識別定義
unsigned char k=0; //K用于控制撥號的顯示范圍
unsigned char ReadStatusLCM(void); //讀數據從LCD
//----------------------------------------------------------------
unsigned char code Test[] = {"1234567890ABCDEF"};
//各功能函數----------------------------------------------------------
void Signal_CID_Start(); //來電DTMF音頻信號"D"啟動
void Signal_CID_END(); //來電DTMF音頻信號"C"結束
void Signal_Read(); //讀取DTMF音頻信號
void Signal_BoHao_Start(); //撥號
//LCM功能函數---------------------------------------------------------
void LCMInit(void); //LCD初始化
void WriteDataLCM(unsigned char WDLCM); //寫數據到DDRAM,寫入ASCII碼即顯示單個字符,如0x41是A)
void WriteCommandLCM(unsigned char WCLCM,BuysC); //寫指令到LCM,BuysC為"1"為檢測忙信號
void Display_XY(unsigned char X, unsigned char Y); //用于128x64光標定位
//說明:第一行從(0,0)到(7,0),第二行(0,1)~(7,1),第三行(8,0)~(15,0),第四行(8,1)~(15,1)
void Display( unsigned char code *DData); //直接寫入字符串
void Delay(unsigned int delay); //延時,微妙級,0~65535
void Delay_S(unsigned char delay1); //延時,秒級,0~65535
//---------------------------------------------------------------------------
//==========主函數===========================================================
main()
{
Delay(2000); //啟動等待,等LCM進入工作狀態
LCMInit(); //LCM初始化
//---------顯示開機信息(第一屏)----------------------------
Display_XY(0,0); Display("┌──────┐"); //光標定位第二行第一列,//顯示字符串
Display_XY(0,1); Display("│中文來電顯示┃");
Display_XY(8,0); Display("└━━━━━━┛");
Display_XY(8,1); Display("YRF 2005-7-14");
Delay_S(5); //延時幾秒
WriteCommandLCM(0x01,1); //顯示清屏,CLS
Bell=0;
Delay(600);
Bell=1;
Delay(14000);
Bell=0;
Delay(600); //響鈴
Bell=1;
//---------開機信息(第二屏)-----------------------------------------
//進入正常待機狀態----------------------------------------------------
Display_XY(0,0); Display("來電: 【待機】"); //光標定位第一行第三列
Display_XY(0,1); Display("單位: ┄┄┄┄┄");
Display_XY(8,0); Display("姓名: ┄┄┄┄┄");
Display_XY(8,1); Display("備注: ┄┄┄┄┄");
Display_XY(7,0); //光標定位第一行第八列
//-------------------------------------------------------------------
while(1) //進入來電信號和撥號信號掃描
{
if (key1==0) //按鍵盤1進入查詢電話號碼功能。
{
Display_XY(0,0); Display(" 【查詢號碼】 ");
Display_XY(0,1); Display(" 請按 * 鍵,再");
Display_XY(8,0); Display("輸入電話號碼,最");
Display_XY(8,1); Display("后按 #號鍵結束。");
while(1)
{
if (STD==1) //如果檢測到有DTMF音頻
{
_nop_();
Signal_Read(); //讀取DTMF號碼值
if (Number==11) //如果是信號"*",則開始讀電話號碼
{
TEL=0; //號碼清零
Receiving=1 ; //接收識別開始
Receiving2=0; //撥號識別復位
WriteCommandLCM(0x0D,1); // 顯示開及光標設置,0x0C關光標,0x0D開光標,0x0E光標不閃
Display_XY(2,0); //光標定位"查詢"后面
Display_XY(0,0); Display("查詢: ");
Display_XY(0,1); Display(" ");
Display_XY(8,0); Display("注:按 #號鍵結束");
Display_XY(8,1); Display(" 按* 鍵重新輸入");
Display_XY(2,0); //光標定位"查詢"后面
Display(":");
Signal_CID_Start(); //開始讀取完整來電號碼
}
else if ( Number==12) //如果信號是"#"
{
Signal_CID_END();break;
}
else Signal_CID_Start(); //繼續讀取號碼
}
}
}
if (STD==1) //如果檢測到有DTMF音頻
{
_nop_();
Signal_Read(); //讀取DTMF號碼值
if (Number==13) //如果是信號"D",則開始讀來電電話號碼
{
TEL=0; //號碼清零
Receiving=1 ; //接收識別開始
Receiving2=0; //撥號識別復位
Bell=0; //開蜂鳴器提示音
//------------------以下刷屏--------------------------
WriteCommandLCM(0x01,1); //顯示清屏,CLS
WriteCommandLCM(0x0D,1); // 顯示開及光標設置,0x0C關光標,0x0D開光標,0x0E光標不閃
Display_XY(0,0);
Display("來電:");
Display_XY(1,1); Display("┌────┐");
Display_XY(9,0); Display("│接收中…┃");
Display_XY(9,1); Display("└━━━━┛");
//------------------以上刷屏--------------------------
Display_XY(2,0); //光標定位"來電"后面
Display(":");
Signal_CID_Start(); //開始讀取完整來電號碼
}
else if ( Number==14) //如果信號是"C"
{
Signal_CID_END();
}
else Signal_CID_Start(); //繼續讀取號碼
}
}
}
//----------主函數結束------------------------------------------
//讀取完整來電號碼===============================================
void Signal_CID_Start()
{
Signal_Read(); //讀取一個號碼
if (Receiving==0 ) //如果不是正在接收,即正在撥號
{
if(Receiving2==0) //如果是首次撥號
{
k=0;
WriteCommandLCM(0x0D,1); // 顯示開及光標設置,0x0C關光標,0x0D開光標,0x0E光標不閃
if(Record2==0) //如果來電沒有記錄
{ Display_XY(0,1); Display(" "); } //清空這行
Display_XY(8,0); Display("撥號: ");
Display_XY(8,1); Display(" ");
Display_XY(8,1);
Receiving2=1; //注明已經撥號
}
if (k>15) //如果顯示一行已滿
{
k=0;
Display_XY(8,1); //循環顯示
Receiving2=1; //注明已經撥號
}
Signal_BoHao_Start(); //
Receiving2=1;
}
if (Receiving==1 ) //如果是正在接收
{
switch (Number) //判斷電話號碼
{
case 14: Signal_CID_END(); break; //信號"C"
case 1: WriteDataLCM(0x31); TEL=TEL*10+Number ; break;
case 2: WriteDataLCM(0x32); TEL=TEL*10+Number ; break;
case 3: WriteDataLCM(0x33); TEL=TEL*10+Number ; break;
case 4: WriteDataLCM(0x34); TEL=TEL*10+Number ; break;
case 5: WriteDataLCM(0x35); TEL=TEL*10+Number ; break;
case 6: WriteDataLCM(0x36); TEL=TEL*10+Number ; break;
case 7: WriteDataLCM(0x37); TEL=TEL*10+Number ; break;
case 8: WriteDataLCM(0x38); TEL=TEL*10+Number ; break;
case 9: WriteDataLCM(0x39); TEL=TEL*10+Number ; break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -