//----------------------------------------------------------------------------------------------------------------------------------
//程序名: main.c 2017/8/16
//程序功能:安卓手机蓝牙控制继电器程序并用1602显示*
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar buf[10]=0; //接收缓存数组
uchar r_x=0;//接收计数
uchar r_flag=0;//接收成功标志
sbit SPK=P0^5;
sbit DA = P1^7;//继电器1
sbit DB = P1^6;//继电器2
sbit DC = P1^5;//继电器3
sbit DD = P1^4;//继电器4
sbit RS=P2^6; // 引脚定义
sbit RW=P2^5;
sbit EN=P2^7;
sbit busy=P0^7; // "忙"标志位
void fs_d () ;
#define LCD P0 //命令或数据线
unsigned char code TAB1[]={"Welcome to use"}; //欢迎用语
unsigned char code TAB2[]={"Light up"}; //点亮字符
unsigned char code TAB3[]={"open"}; //定义字符打开
unsigned char code TAB4[]={"Shut down"}; //定义字符关闭
unsigned char code digit[10]={"0123456789"}; //定义字符数组显示数字
//------------------------------------ 延时函数 -------------------------------------------
void delay(unsigned int t) //延时若干微秒
{
while(t--);
}
//----------------------------------------- 发声函数 ----------------------------------------------
void fs_d ()
{
unsigned int j,y; // 声明无符号整型变量j, y
{
for(y=0;y<1000;y++) //循环1000次,嘀响0.5s
{
SPK=~SPK; //反相输出
for(j=0;j<50;j++); //延时约500μs
}
delay(200);
}
}
//---------------------------------- 判断液晶显示器是否忙函数 ----------------------------------
void CHECK_BF() //判断是否忙碌
{
do
{
LCD=0xff;
RS=0; // RS=0,选择指令寄存器
RW=1; // RW=1,选择读模式
EN=0; // 执行显示命令
EN=1; // 允许读/写
}
while(busy); //busy为高电平表示忙,循环等待
}
//-------------------------------------- 写命令函数 -----------------------------------
void WR_COMM() //写命令
{
RS=0; // RS=0,选择指令寄存器
RW=0; // RW=0,选择写模式
EN=0; // 执行显示命令
CHECK_BF(); // 等待
EN=1; // E=1,允许读/写LCD
}
//-------------------------------------- 写数据函数 -------------------------------------
void WR_DATA() //写数据
{
RS=1; // RS=1,选择数据寄存器
RW=0; //准备写入数据
EN=0; //执行显示命令
CHECK_BF(); //判断液晶模块是否忙
EN=1; // E=1,允许读/写LCD
}
//--------------------------------------- 初始化函数 ----------------------------------
void INIT_LCD() //初始化
{
unsigned char i=200;
{
while(--i);
LCD=0x01; //清屏并光标复位
WR_COMM(); //写入命令
LCD=0x38; //设置显示模式:8位2行5x7点阵
WR_COMM();
LCD=0x0c; //开显示屏
WR_COMM();
LCD=0x06; //文字不动,光标自动右移
WR_COMM(); //写入命令
}
}
//------------------------------------------ 显示欢迎用语字符菜单函数 ------------------------------------------------
void DISP_EXP (void)
{
unsigned char i;
LCD=0x80; //写入显示起始地址
WR_COMM(); //写入命令
for(i=0;i<15;i++)
{
LCD=TAB1[i]; //提取字符
WR_DATA(); //送出
}
}
//------------------------------------------- 显示点亮菜单函数 --------------------------------------------
void DISP1_EXP( )
{
unsigned char i;
LCD=0xc0; //写入显示起始地址
WR_COMM(); //写入命令
for(i=0;i<9;i++)
{
LCD= TAB2[i]; //提取字符
WR_DATA(); //送出
}
}
//--------------------------------------------显示打开函数--------------------------------------------
void dakai ()
{
unsigned char i;
LCD=0xCE; //写入显示起始地址
WR_COMM(); //写入命令
for(i=0;i<5;i++)
{
LCD=TAB3[i]; //提取字符
WR_DATA(); //送出
}
}
//--------------------------------------------显示关闭函数--------------------------------------------
void Shut_down ()
{
unsigned char i;
LCD=0xCE; //写入显示起始地址
WR_COMM(); //写入命令
for(i=0;i<10;i++)
{
LCD=TAB4[i]; //提取字符
WR_DATA(); //送出
}
}
uchar read_data(void)//读取接收数据
{
// uchar i=0;
uchar tep = 0;
if(r_flag == 1)
{
r_flag = 0;
tep = buf[2];
fs_d (); //鸣响
}
return tep;
}
void uart_init()
{
TMOD=0x20;
TH1=0xfd; //波特率9600
TL1=0xfA;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/********************************************************************
函数功能:主函数
********************************************************************/
void main()
{
INIT_LCD(); //LCD初始化函数
delay(100);
DISP_EXP(); //欢迎用语字符菜单函数
DISP1_EXP();
delay(100);
{
uchar key=0;
uart_init(); //串口初始化
SPK=1;//蜂鸣器关
DA=1;
DB=1;
DC=1;
DD=1;
while(1)
{
key = read_data();//读取接收数据
if(key == 'A');
{
DA =0;//打开A
delay(100);
fs_d();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[1]; //提取字符,数组中的1,
WR_DATA(); //送出
dakai ();
break;
}
if(key == 'B');
{
DA =1;//关闭A
delay(100);
fs_d();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[1]; //提取字符,数组中的1,
WR_DATA(); //送出
Shut_down (); //显示关闭
break;
}
if(key == 'C');
{
DB =0;//打开B
delay(100);
fs_d();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[2]; //提取字符,数组中的2,
WR_DATA(); //送出
dakai(); //显示打开
break;
}
if(key == 'D');
{
DB =1;//关闭B
delay(100);
fs_d ();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[2]; //提取字符,数组中的2,
WR_DATA(); //送出
Shut_down (); //显示关闭
break;
}
if(key == 'E');
{
DC =0;//打开C
fs_d();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[3]; //提取字符,数组中的3,
WR_DATA(); //送出
dakai(); //显示打开
break;
}
if(key == 'F');
{
DC =1;//关闭C
delay(100);
fs_d ();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[3]; //提取字符,数组中的3,
WR_DATA(); //送出
Shut_down (); //显示关闭
break;
}
if(key == 'G');
{
DD =0;//打开D
delay(100);
fs_d();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[4]; //提取字符,数组中的4,
WR_DATA(); //送出
dakai(); //显示打开
break;
}
if(key == 'H');
{
DD =1;//关闭D
delay(100);
fs_d();
LCD=0Xcc; //写入显示起始地址
WR_COMM(); //写入命令
LCD=digit[4]; //提取字符,数组中的4,
WR_DATA(); //送出
Shut_down (); //显示关闭
break;
}
}
}
}
void ser()interrupt 4 //接收中断
{
RI=0; //清除接收标志
buf[r_x] = SBUF;//接收数据至缓存区
r_x++;
if(buf[0]!='O'){r_x=0;}
if(r_x == 3) //接收完成
{
r_x=0;
r_flag=1;
}
}
|