?? bo hao.c
字號:
/*******************************************************************/
/* */
/* ME500B片機開發系統演示程序 - 電話撥號器 */
/* */
/* LCD1602顯示 */
/* */
/* 版本: V1.0 (2006/11/20) */
/* 作者: gguoqing (Email: gguoqing@willar.com) */
/* 網站: www.willar.com(偉納電子) www.mcusj.com(偉納單片機世界) */
/* 郵箱: support@willar.com */
/* */
/*【版權】Copyright(C)偉納電子 www.willar.com All Rights Reserved */
/*【聲明】此程序僅用于學習與參考,引用請注明版權和作者信息! */
/* */
/*******************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit BEEP = P3^7; //蜂鳴器驅動線
uchar dis_buf=0x00; //顯示緩存
uchar dis_buf1[ ] = {0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00};
//電話號碼存儲單元
uchar temp,m;
uchar key,keynum; //鍵順序嗎
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit MT_RS = P2^3;
sbit MT_RW = P2^4;
sbit MT_CS = P2^5;
sbit MT_CK = P2^6;
sbit TEL = P2^7; //電話摘掛機控制線
uchar code cdis1[ ] = {"TELEPHONE DIALER"};
uchar code cdis2[ ] = {"TEL: "};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*************************************************************
* *
* 延時子程序 *
* 晶振 11.0592MHz 延時為1ms *
* *
*************************************************************/
void delay(uint x)
{ uchar j;
while((x--)!=0)
{
for(j=0;j<115;j++)
{;}
}
}
/*************************************************************
* *
*檢查LCD忙狀態 *
*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與數據 *
* *
*************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*************************************************************
* *
*寫指令數據到LCD *
*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 *
* *
*************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/************************************************************
* *
*寫顯示數據到LCD *
*RS=H,RW=L,E=高脈沖,D0-D7=數據。 *
* *
************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/************************************************************
* *
* LCD初始化設定 *
* *
************************************************************/
void lcd_init()
{
delay(15);
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //顯示開,關光標
delay(5);
lcd_wcmd(0x06); //移動光標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}
/************************************************************
* *
* 設定顯示位置 *
* *
************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //數據指針=80+地址變量
}
/************************************************************
* *
* 矩陣鍵盤掃描函數 *
* 鍵值保存在key *
* *
************************************************************/
uchar keyscan(void)
{
P1=0x0F; //低四位輸入
delay(1);
temp=P1; //讀P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==1)
key=0;
else if(temp==2)
key=1;
else if(temp==4)
key=2;
else if(temp==8)
key=3;
else
key=16;
P1=0xF0; //高四位輸入
delay(1);
temp=P1; //讀P1口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1)
key=key+0;
else if(temp==2)
key=key+4;
else if(temp==4)
key=key+8;
else if(temp==8)
key=key+12;
else
key=16;
return(key);
}
/************************************************************
* *
* 延時 x*0.14ms *
* *
************************************************************/
void delay0(uchar x)
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/************************************************************
* *
* 蜂鳴器響一聲 *
* *
************************************************************/
void beep()
{
unsigned char i;
for (i=0;i<180;i++)
{
delay0(6);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //關閉蜂鳴器
delay(250); //延時
}
/************************************************************
* *
* 鍵入電話號碼函數 *
* *
************************************************************/
void key_input ()
{
P1=0xF0;
if(P1!=0xF0) //判是否有健按下
{
keyscan();
beep();
if(key==0x0f) //是否為發送鍵
return;
if(key==0) //0轉換為電話碼"a"
key=0x0a;
dis_buf1[keynum]=key; //健值送存儲單元
dis_buf =dis_buf1[keynum]; //健值送顯示單元
if(dis_buf==0x0a) //數據轉換
dis_buf=0x00;
dis_buf = dis_buf & 0x0f;
if(dis_buf>9) //轉換為ASCII碼
dis_buf = dis_buf+0x37;
else
dis_buf = dis_buf+0x30;
lcd_pos(0x44+keynum);
lcd_wdat(dis_buf); //顯示健值
keynum++; //按鍵次數計數
}
}
/*************************************************************
* *
* MT8880 寫狀態函數 *
* RS=1,RW=0,寫狀態寄存器 *
* *
*************************************************************/
void write_status(uchar value)
{
MT_RS=1;
MT_RW =0;
MT_CK =0;
P1 = value; //寫 8880CRA和CRB.
MT_CK =1;
delayNOP();
MT_CK =0;
}
/*************************************************************
* *
* MT8880 初始化函數 *
* *
*************************************************************/
void MT_INIT()
{
MT_CS=0; //MT8880使能
delayNOP();
write_status(0x10); //寫 8880CRA,CRA=0000.
write_status(0x10); //寫 8880CRA,CRA=0000.
write_status(0x18); //寫 8880CRA,CRA=1000,允許選擇CRB.
write_status(0x10); //寫 8880CRB,CRB=0000
MT_CS=1; //禁止MT8880工作
}
/*************************************************************
* *
* MT8880 發碼程序 *
* *
* RS=1,RW=0,寫狀態寄存器 *
* RS=1,RW=1,讀狀態寄存器 *
* RS=0,RW=0,寫發送寄存器 *
* *
*************************************************************/
void MT_TRAN()
{
uchar i;
lcd_pos(0x40); //設置顯示位置為第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
MT_CS=0;
delayNOP();
write_status(0x1d); //寫 8880CRA,CRA=1101.
write_status(0x10); //寫 8880CRB,CRB=0000.
//8880模式2為TONE,DTMF,IRQ,BURST
MT_RS=0; //寫發送寄存器
MT_RW =0;
MT_CK =0;
for(i=0;i<keynum;i++)
{
dis_buf1[i]=dis_buf1[i]&0x0f; //取數據低4位
P1 = dis_buf1[i];
MT_CK =1; //發送號碼
delayNOP();
MT_CK =0;
if(dis_buf1[i]==0x0a)
dis_buf1[i]=0x00;
dis_buf1[i]=dis_buf1[i]+0x30; //轉換為ASCII碼
lcd_pos(0x44+i);
lcd_wdat(dis_buf1[i]); //顯示撥號碼
delay(300); //調整撥號速率
}
MT_CS=1;
}
/************************************************************
* *
* 主程序 *
* *
************************************************************/
void main()
{
P0=0xFF; //置P0口
P2=0xFF; //置P2口
delay(10); //延時
MT_CS=1; //禁止MT8880工作
lcd_init(); //初始化LCD
lcd_pos(0); //設置顯示位置為第一行
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]);
lcd_pos(0x40); //設置顯示位置為第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
while(1)
{
key_input(); //輸入撥號號碼
if(key==0x0f) //撥號
{
TEL = 0; //摘機
delay(2000); //延時等待撥號音出現
MT_INIT(); //MT8880初始化
MT_TRAN(); //MT8880撥號
delay(5000); //調整在線時間
delay(5000);
delay(5000);
TEL = 1; //掛機
MT_CS=1; //禁止MT8880工作
key=0x00;
keynum=0x00;
lcd_pos(0x40); //設置顯示位置為第二行
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
delay(1000);
}
}
}
/************************************************************
使用說明:
先使用矩陣鍵盤輸入你要撥的電話號碼,LCD顯示你輸入的電話
號碼,可以輸入12位。檢查號碼輸入無誤后,按"F"健即可進行撥號。
************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -