手機撥號仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (11.71 KB, 下載次數: 44)
下載附件
2018-11-8 16:37 上傳
0.png (50.06 KB, 下載次數: 39)
下載附件
2018-11-8 16:37 上傳
單片機源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define u8 unsigned char
- #define u16 unsigned int
- #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
- sbit BEEP=P1^0;
- sbit LCD_RS=P2^0;
- sbit LCD_RW=P2^1;
- sbit LCD_EN=P2^2;
- void DelayMS(u16 ms);
- bit LCD_Busy_Check();
- void LCD_Set_Position(u8 Position);
- void Write_LCD_command(u8 cmd);
- void Write_LCD_data(u8 dat);
- //--標題字符串
- char code Title_Text[]={"intput number: "};
- char code Wrong_Text[]={"wrong number! "};
- char code Calling_Text[]={"phone calling! "};
- //--鍵盤拔號與鍵盤符號映射表
- u8 code key_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};
- //--鍵盤拔號數字緩沖
- u8 Dial_Code_Str[]={" "};
- u8 keyNo=0xff;
- int tCount=0;
- //------------------------------------ //延時 //------------------------------------
- void DelayMS(u16 x)
- {
- u8 i;
- while(x--)
- for(i=0;i<120;i++);
- }
- //-------------------------------- //在LCD指定的行上顯示字符串 //--------------------------------
- void Display_String(u8 *str,u8 LineNo)
- {
- u8 k;
- LCD_Set_Position(LineNo);
- for(k=0;k<16;k++)
- Write_LCD_data(str[k]);
- }
- //---------------------------------------------- //忙檢查 //---------------------------------------------
- bit LCD_Busy_Check()
- {
- bit LCD_Status;
- LCD_RS=0;//寄存器選擇
- LCD_RW=1;//讀狀態寄存器
- LCD_EN=1;//開始讀
- DelayMS(1);
- LCD_Status=(bit)(P0&0x80) ;
- LCD_EN=0;
- return LCD_Status;
- }
- //--------------------------------------------------- //寫LCD命令 //----------------------------------------------------
- void Write_LCD_Command(u8 cmd)
- {
- while((LCD_Busy_Check()&0x80)==0x80);//忙等待
- LCD_RS=0;//選取擇命令寄存器
- LCD_RW=0;//寫
- LCD_EN=0;
- _nop_();
- _nop_();
- P0=cmd;
- DelayNOP();
- LCD_EN=1;
- DelayNOP();
- LCD_EN=0;
- }
- //----------------------------------------- //發送數據 //----------------------------------------
- void Write_LCD_Data(u8 Str)
- {
- while((LCD_Busy_Check()&0x80)==0x80);//忙等待
- LCD_RS=1;
- LCD_RW=0;
- LCD_EN=0;
- P0=Str;
- DelayNOP();
- LCD_EN=1;
- DelayMS(1);
- LCD_EN=0;
- }
- //------------------------------------------------- //LCD初始化 //-------------------------------------------------
- void Initialize_LCD()
- {
- Write_LCD_Command(0x38);
- DelayMS(5);
- Write_LCD_Command(0x0C);//清屏
- DelayMS(5);
- Write_LCD_Command(0x06);//字符進入模式,屏幕不動,字符后移。
- DelayMS(5);
- Write_LCD_Command(0x01);//顯示開,關光標。
- DelayMS(5);
- }
- //-------------------------------------- //設置顯示位置 //--------------------------------------
- void LCD_Set_Position(u8 Position)
- {
- Write_LCD_Command(Position | 0x80);
- }
- //----------------------------------------------- //t0控制按鍵聲音 //-----------------------------------------------
- void T0_INT() interrupt 1
- {
- TH0=-400/256;
- TL0=-400%256;
- BEEP=~BEEP;
- if(++tCount==200)
- {
- tCount=0;
- TR0=0;
- }
- }
- //------------------------- //鍵盤掃描 //------------------------
- u8 Getkey()
- {
- u8 i,j,k=0;
- u8 keyScanCode[]={0xef,0xdf,0xbf,0x7f};//鍵盤掃描碼
- u8 keyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};
- P3=0x0f; //掃描鍵盤獲取按鍵序號
- if(P3!=0X0F)
- {
- for(i=0;i<4;i++)
- { P3=keyScanCode[i];
- for(j=0;j<3;j++)
- { k=i*3+j;
- if(P3==keyCodeTable[k])
- return k;
- }
- }
- }
- else
- return 0xff;
- }
- //------------------------------- //main//--------------------------------
- void main()
- {
- int i=0,j;
- int c=0;
- P0=P2=P1=0XFF;
- IE=0X82;
- TMOD=0X01;
- Initialize_LCD(); //LCD初始化
- Display_String(Title_Text,0x00);//在第一行顯示標題
- while(1)
- {
- keyNo=Getkey();//獲取按鍵值
- if(keyNo==0xff)
- continue;//無按鍵時繼續掃描
- if(keyNo==0x09)
- {
- Dial_Code_Str[i]=0;
- Dial_Code_Str[i-1]=0;
- i=i-2;
- if(i<-1)
- {
- i=-1;
- }
- }
- //刪除鍵
-
- else if(keyNo==0x0b)
- {
- if(i==11&&c==0)
- {
- Display_String(Calling_Text,0x00);
- while(c==0)
- {
- TR0=1;
- DelayMS(1500);
- keyNo=Getkey();
- if(keyNo==0x0b)
- {
- break;
- }
- }
- c=1;
-
- }
- else if(i==11&&c==1)
- {
- Display_String(Title_Text,0x00);
- for(j=0;j<16;j++) Dial_Code_Str[j]=' '; i=0;
- c=0;
- }
- else
- {
- Display_String(Wrong_Text,0x00);
- DelayMS(3000);
- Display_String(Title_Text,0x00);
- }
- Dial_Code_Str[i]=0;
- i=i-1;
- if(i<-1)
- {
- i=-1;
- }
- }
- else{
- Dial_Code_Str[i]=key_Table[keyNo];//將待顯示字符放入待顯示的拔號串中
- }
- Display_String(Dial_Code_Str,0x40);//在第二行顯示號碼
- if(++i==11)//超過11位時清空
- {
- for(j=0;j<16;j++) Dial_Code_Str[j]=' '; i=0;
- }
- TR0=1;//T0中斷控制按鍵聲音
- while(Getkey()!=0xff);//等待按鍵釋放
- }
- }
復制代碼
所有資料51hei提供下載:
手機撥號.zip
(71.02 KB, 下載次數: 93)
2018-11-8 16:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|