多功能智能控制器
本《多功能智能控制器》是我业余时间设计的一款小型智能控制器。此控制器主要是利用AT89C52作为主控制器件,以2*8LCD作为显示,具有手动、遥控、定时等方式控制继电器,且具有温度显示功能等。可以放在任何需要智能控制的地方。
本文引用地址:https://www.eepw.com.cn/article/201611/315655.htm功能说明:
定时器的基本功能:
1.使用2*8LCD液晶模块显示器显示现在的时间。
2.显示格式为“HH:MM:SS”,在第二行显示时间。
3.由WLED和冒号闪动来做秒计数表示。
手动按键的基本功能:
1.操作键K1:进入或退出设置现在的时间。
2.操作键K2:整点报时开关。并有相应的指示灯DLED显示(DLED亮则整点报时,DLED灭则不整点报时)。
3.操作键K3:闹铃控制开关。并有相应的指示灯CLED显示(CLED亮则闹铃开启,DLED灭则关闭闹铃)。
4.操作键K4:进入或退出闹铃时间设置。
5.操作键K5:继电器1手动开关。并有相应的指示灯显示。
6.操作键K6:继电器2手动开关。
注:以上按键说明都是按键的第一功能按键。K2的第二功能是小时的加;K3的第二功能时分钟的加。
遥控按键的基本功能:
现在时间设置:
1.TIME:进入设置现在的时间。
2.下一首歌按键:表示分钟的加。
3.上一首歌按键:表示小时的加。
4.停止按键:表示退出现在时间设置。
开关功能:
R/L:表示整点报时开关。
P/N:表示闹铃开关。
闹铃时间设置:
1.RETURN:进入闹铃时间设置。
2.向前快进:表示小时加。
3.向后快进:表示分钟加。
4.停止按键:表示退出闹铃时间设置。
二、三D图:
三、程序:
1.系统头文件:
#ifndef __CONFIG_H__
#define __CONFIG_H__
/********************************/
/* "以下为系统配置" */
/********************************/
#include
#include
#include
#include "ir.h"
#include "lcd1602.h"
#include "ds18b20.h"
#define RELAY P3_5 // 继电器1引脚
#define FELAY P3_6 // 继电器2引脚
#define F_LED P2_3 // 继电器2工作指示灯
#define Y_LED P2_4 // 继电器1工作指示灯
#define C_LED P2_5 // 定时控制指示灯
#define D_LED P2_6 // 整点报时指示灯
#define W_LED P2_7 // 时钟工作指示灯
#define K1 P1_0 // 当前时间的设置与结束
#define K2 P1_1 // 整点报时开关/小时加1
#define K3 P1_2 // 闹铃控制开关/分钟加1
#define K4 P1_3 // 闹铃时间的设置与结束
#define K5 P1_4 // 手动控制继电器1
#define K6 P1_5 // 手动控制继电器2
uchar hour,min,sec; // 当前时间寄存器
uchar armhour,armmin,armsec; // 控制时间寄存器
uchar con_1s; // 时间计数器
uchar data Time[8]={0x30,0x30,0x3a,0x30,0x30,0x3a,0x30,0x30}; // 显示时间暂存
void turn_on_information(void);//开机信息信息
// 时间控制部分
void TimeOut(void);//到点工作
void O_clock(void);//整点报时
void Scan(bit mark,bit line,uchar arr[]);//显示
// 手动控制部分函数
void Keyscan(void); // 手动按键扫描
void Set_time(void); // 手动设置当前时间
void Set_ctrltime(void); // 手动设置控制时间
// 遥控部分函数
void Telecontrol(void); // 遥控按键扫描
void Tele_Set_time(void); // 遥控设置当前时间
void Tele_Set_ctrltime(void); // 遥控设置控制时间
// 密码锁部分函数
void Coded_lock(void);
/*****************************************************
函 数 名:void Clearmen(void)
功 能:系统初始化
说 明:对系统引脚变量及中断进行初始化
入口参数:无
返 回 值:无
*****************************************************/
void Clearmen(void)
{
//***************** 中断初始化 *****************
// 中断允许寄存器IE
/*----------------------------------------------------
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
- - - - - - - - - - - - - - - - - - - - - - - -
| EA | | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
-----------------------------------------------------*/
IE = 0x00; // "清除中断"
EX0 = 1; // 0"外部中断0允许"
ET0 = 1; // 1"定时器0中断允许"
EX1 = 0; // 2"外部中断1允许"
ET1 = 1; // 3"定时器1中断允许"
ES = 0; // 4"串行中断允许"
ET2 = 0; // 5"定时器2中断允许"-52才有
EA = 1; // "中断总允许"
// 中断优先级管理寄存器IP
/*----------------------------------------------------
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
- - - - - - - - - - - - - - - - - - - - - - - -
| | | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
-----------------------------------------------------*/
IP = 0x00; // "清除中断优先级"
PS = 0; // "串行中断优先"
PX0 = 0; // "外部中断0"
PT0 = 1; // "定时器中断0"
PX1 = 0; // "外部中断1"
PT1 = 0; // "定时器中断1"
// 定时器控制寄存器TCON
/*----------------------------------------------------
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
- - - - - - - - - - - - - - - - - - - - - - - -
| TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
- - - - - - - - - - - - - - - - - - - - - - - -
| 用于定时器 | 用于外中断 |
-----------------------------------------------------*/
TCON = 0x00;
IT0 = 1; // "外部中断0触发方式 0=电平 1=边沿"
IE0 = 0; // "外部中断0申请标志"
IT1 = 0; // "外部中断1触发方式 0=电平 1=边沿"
IE1 = 0; // "外部中断1申请标志"
TR0 = 0; // "T0运行控制"
TF0 = 0; // "T0溢出标志"
TR1 = 0; // "T1运行控制"
TF1 = 0; // "T1溢出标志"
// 定时器模式控制寄存器TMOD
/*----------------------------------------------------
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
- - - - - - - - - - - - - - - - - - - - - - - -
|GATE| C/T| M0 | M1 |GATE | C/T | M0 | M1 |
- - - - - - - - - - - - - - - - - - - - - - - -
| 高4位用于T1 | 低4位用于T0" |
-----------------------------------------------------*/
TMOD=0x11; // 定时器T0、T1为16位定时模式1
TH0=0x3C;TL0=0xB0; // 定时器0赋初值
TH1=0x3C;TL1=0xB0; // 定时器1赋初值
ET0=1;TR0=1;EA=1; // 开定时器0
//***************** 变量及引脚初始化 **********************************
hour=0; min=0; sec=0; // 当前时间初始化
armhour=0;armmin=0;armsec=0; // 控制时间初始化
IRIN=1;BEEP=1;RELAY=1; FELAY=1;
W_LED=1;D_LED=1;C_LED=1; // 指示灯初始化
F_LED=1;Y_LED=1;
Adjust_Res(0x5f); // 调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
}
/*****************************************************
函 数 名:void Delay_50us(uint t)
功 能:延时函数
说 明:系统用延时
入口参数:无
返 回 值:无
*****************************************************/
void Delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--)
;
}
/*****************************************************
函 数 名:void Work_led(uchar count)
功 能:工作指示灯闪烁提示
说 明:闪烁以提示工作状态
入口参数:无
返 回 值:无
*****************************************************/
Work_led(uchar count)
{
while(count--)
{
W_LED=~W_LED; //工作灯取反
Delay_50us(3000);
}
C_LED=1;
}
/*****************************************************
函 数 名:void turn_on_information(void)
功 能:开机显示信息
说 明:第1行显示产品名;第2行动态显示作者信息
入口参数:无
返 回 值:无
*****************************************************/
uchar code string[]=" 2008-1-20";
void turn_on_information(void)
{
uchar num=30;
uchar *cp;
cp=string;
do
{
WriteCommandLCM(0x01,1); // 显示清屏
Delay_50us(100);
DisplayListChar(0,0,"zhao jun");
DisplayListChar(0,1,cp);
Delay_50us(8000);
cp++;
if(*cp== )
{
cp=string; // 到达字符的尾部时,改变指针,重新指向字符串的头部
}
}while(num--);
WriteCommandLCM(0x01,1); // 显示清屏
}
#endif
2.温度部分:
/*--------------------------------------------------------------------------
TEMPERATURE.H
The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __TEMPERATURE_H__
#define __TEMPERATURE_H__
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^3;//ds18b20与单片机连接口
uchar data Tp[8];//温度显示数据
/******************************ds1820程序***************************************/
/*****************************************************
函 数 名:void Delay_DS(uint useconds)
功 能:DS18B20延时1微秒
说 明:DS18B20时序延时
入口参数:useconds
返 回 值:无
*****************************************************/
//延时
void Delay_DS(uint useconds)//延时1微秒
{
while(useconds--);
}
/*****************************************************
函 数 名:void Ow_Reset()
功 能:DS18B20复位
说 明:DS18B20使用时先要复位
入口参数:无
返 回 值:
*****************************************************/
void Ow_Reset()
{
DQ = 1; // DQ复位
Delay_DS(4); // 延时
DQ = 0; // DQ拉低
Delay_DS(100); // 精确延时大于480us
DQ = 1; // 拉高
Delay_DS(40);
}
/*****************************************************
函 数 名:uchar Read_byte()
功 能:从 1-wire 总线上读取一个字节
说 明:读总线上的数据有严格的时序
入口参数:
返 回 值:value
*****************************************************/
uchar Read_byte()
{
uchar i=0;
uchar value = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
value>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
value|=0x80;
Delay_DS(10);
}
return(value);
}
/*****************************************************
函 数 名:void Write_Byte()
功 能:向 1-WIRE 总线上写一个字节
说 明:写总线上的数据有严格的时序
入口参数:val
返 回 值:无
*****************************************************/
void Write_Byte(uchar val)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = val&0x01;
Delay_DS(10);
DQ = 1;
val>>=1;
}
}
/*****************************************************
函 数 名:void Read_Temperature()
功 能:读温度并放入显示数组中
说 明:
入口参数:xx,yy
返 回 值:无
*****************************************************/
void Read_Temperature()
{
uchar a,b;
uchar tflag; // 温度正负标志
uint tvalue; // 温度值
Ow_Reset();
Write_Byte(0xcc); // 跳过读序列号*
Write_Byte(0x44); // 启动温度转换
Ow_Reset();
Write_Byte(0xcc); // 跳过读序列号
Write_Byte(0xbe); // 读取温度
a=Read_byte(); // 读出温度低8位
b=Read_byte(); // 读出温度高8位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*(0.625); // 温度值扩大10倍,精确到1位小数
Tp[2]=tvalue%1000/100+0x30; // 十位数
Tp[3]=tvalue%100/10+0x30; // 个位数
Tp[4]=0x2e; // 显示小数点
Tp[5]=tvalue%10+0x30; // 显示温度小数位
Tp[6]=0x01; // 显示自定义字符
Tp[7]=0x43; // 显示字符"C"
if(tflag==0)
Tp[1]=0x20; // 正温度不显示符号
else
Tp[1]=0x2d; // 负温度显示负号:-
if(Tp[2]==0x30)
{
Tp[2]=0x20; // 如果十位为0,不显示
}
}
/*****************************************************
函 数 名:void Adjust_Res()
功 能:温度分辨率调整
说 明:此函数可以对温度的显示进行精度调节.
入口参数:res
返 回 值:无
*****************************************************/
void Adjust_Res(char res) // res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
// 0.5, 0.25, 0.125
{
Ow_Reset(); // 复位
Write_Byte(0xcc); // 跳过Rom
Write_Byte(0x4e); // 写暂存器
Write_Byte(0x02); // 写TH
Write_Byte(0x01); // 写TL
Write_Byte(res); // 温度转换分辨率设置
Ow_Reset(); // 复位
Write_Byte(0xcc); // 跳过Rom
Write_Byte(0x48); // 把暂存器内容写到EPRam中
}
#endif
3.红外部分:
/*--------------------------------------------------------------------------
IR.H
The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __IR_H__
#define __IR_H__
#define uchar unsigned char
#define uint unsigned int
#define IRIN P3_2 // 红外引脚
#define BEEP P3_7 // 蜂鸣器引脚
uchar IRCOM[4]; // IRCOM[0]和IRCOM[1]存放用户编码;IRCOM[2]键值码暂存
// IRCOM[3]键值反码存放.
/*======================================== 红外解码部分 ======================================================*/
/*****************************************************
函 数 名:void DelayIR(uchar number)
功 能:延时程序
说 明:对红外信号进行解码时的时间比较
入口参数:无
返 回 值:无
*****************************************************/
void DelayIR(uchar number)//number*0.14MS
{
uchar i;
while(number--)
{
for(i=13;i>0;i--);
}
}
/*****************************************************
函 数 名:void Delay_bell(void)
功 能:蜂鸣器延时程序
说 明:对蜂鸣器发音延时
入口参数:无
返 回 值:无
*****************************************************/
void Delay_bell(void)
{
uint i;
for(i=0;i<20000;i++)
;
}
/*****************************************************
函 数 名:void Buzzer(num)
功 能:蜂鸣器发音程序
说 明:对密码输入正确与否、按键等的提示
入口参数:无
返 回 值:无
*****************************************************/
void Buzzer(num)
{
while(num--)
{
BEEP=0; // 灯亮
Delay_bell(); // 延时
BEEP=1; // 灯灭
Delay_bell(); // 延时
}
}
/*****************************************************
函 数 名:void IR_IN() interrupt 0 using 0
功 能:红外解码
说 明:把红外编码信号进行解码,并存放在IRCOM[]中
入口参数:无
返 回 值:无
*****************************************************/
// 外中断0,红外数据接收
void IR_IN() interrupt 0 using 0
{
uchar i,j,k,num=0;
EX0 = 0;
do // 读引导码
{
for(i=0;i<4;i++)
{
if(IRIN==0)break;
if(i==3) {EX0=1;return;}
}
DelayIR(20);
}while(IRIN==1); // 确认IR信号出现
while(!IRIN){DelayIR(1);} // 等IR变为高电平
// 读4字节按键编码 = 16位的用户码+8位键值码+8位键值反码
for(j=0;j<4;j++)
{ // 解码原理:0=0.8ms的低电平+0.4ms的高电平;1=0.8ms的低电平+1.6ms的高电平
for(k=0;k<8;k++) // 8位一接收
{
while(IRIN){DelayIR(1);} // 等 IR 变为低电平
while(!IRIN){DelayIR(1);} // 等 IR 变为高电平
while(IRIN) // 计算IR高电平时长
{
DelayIR(1);
num++;
if(num>=30){EX0=1;return;}
}
IRCOM[j]=IRCOM[j]>>1; // 接收数据右移一位
if(num>=8){IRCOM[j]=IRCOM[j]|0x80;} // 电平长度大于等于8,则写入高电平
num=0;
} // 读完一字节
} // 按键4字节读完
// 接收数据检测
if(IRCOM[2]!=~IRCOM[3]){EX0=1;return;} // 8位键码!=8位键反码:按键错误
Buzzer(1); // 有键按下,蜂鸣器响一声
EX0 = 1; // 开外中断
}
/*===================================
DT9122D 遥控器
****** 红外遥控器键值表 ***********
| 10 | 03 | 01 | 06 |
- - - - - - - - - - - - - - - - - - -
| 09 | 1D | 1F | 0D |
- - - - - - - - - - - - - - - - - - -
| 19 | 1B | 11 | 15 |
- - - - - - - - - - - - - - - - - - -
| 17 | 12 | 16 | 4C |
- - - - - - - - - - - - - - - - - - -
| 40 | 48 | 04 | 00 |
- - - - - - - - - - - - - - - - - - -
| 02 | 05 | 54 | 4D |
- - - - - - - - - - - - - - - - - - -
| 0A | 1E | 0E | 1A |
- - - - - - - - - - - - - - - - - - -
| 1C | 14 | 0F | 0C |
=====================================*/
#endif
4.LCD1602部分:
/*--------------------------------------------------------------------------
LCD1602.H
The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __LCD1602_H__
#define __LCD1602_H__
/*连接线图:
---------------------------------------------------
| LCM-----51 | LCM-----51 | LCM------51 |
| ----------------------------------------------- |
| DB0-----P0.0 | DB4-----P0.4 | RS-------P2.0 |
| DB1-----P0.1 | DB5-----P0.5 | RW-------P2.1 |
| DB2-----P0.2 | DB6-----P0.6 | E--------P2.2 |
| DB3-----P0.3 | DB7-----P0.7 | VLCD接1K电阻到GND |
---------------------------------------------------*/
/****************** LCD1602指令 ***********************************/
//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 // 数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 // 数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 // 数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 // 数据读、写操作,画面不动
#define LCD_GO_HOME 0x02 // AC=0,光标、画面回HOME位
//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C // 显示开
#define LCD_DISPLAY_OFF 0x08 // 显示关
#define LCD_CURSOR_ON 0x0A // 光标显示
#define LCD_CURSOR_OFF 0x08 // 光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 // 光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 // 光标不闪烁
//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 // LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C // LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 // 光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 // 光标右移一位
//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 // 两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 // 单行显示
#define LCD_CLEAR_SCREEN 0x01 // 清屏
/***********************LCD1602地址相关******************************/
#define LINE1_HEAD 0x80 // 第一行DDRAM起始地址
#define LINE2_HEAD 0xc0 // 第二行DDRAM起始地址
#define LINE1 0 // 第一行
#define LINE2 1 // 第二行
#define LINE_LENGTH 8 // 每行的最大字符长度
/***********************LCD1602接线引脚定义**************************/
#define LCM_RS P2_0 // 数据/命令选择信号
#define LCM_RW P2_1 // 读/写选择信号
#define LCM_E P2_2 // 使能信号
#define LCM_Data P0 // 显示数据端口
#define Busy 0x80 // 用于检测LCM状态字中的Busy标识
#define uchar unsigned char
#define uint unsigned int
//================================ LCM1602控制部分 =========================================================
/*****************************************************
函 数 名:void Delay_LCD(void)
功 能:5ms延时
说 明:LCD显示延时
入口参数:无
返 回 值:无
*****************************************************/
void Delay_LCD(void)
{
uint TempCyc = 5552; // 放入延时数据
while(TempCyc--);
}
/*****************************************************
函 数 名:uchar ReadStatusLCM()
功 能:读忙状态
说 明:判断LCM的工作状态;也可以不用此函数,用一段延时程序代替
入口参数:无
返 回 值:LCM_Data
*****************************************************/
//读状态
uchar ReadStatusLCM(void)
{
LCM_Data = 0xFF; // LCM数据口先置1
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); // 检测忙信号.如果忙,则不执行
return(LCM_Data); // 不忙返回读取数据
}
/*****************************************************
函 数 名:void WriteDataLCM()
功 能:向LCM1602中写入数据
说 明:将形参WDLCM中的数据写入LCM中
入口参数:WDLCM
返 回 值:无
*****************************************************/
//写数据
void WriteDataLCM(uchar WDLCM)
{
ReadStatusLCM(); // 检测忙
LCM_Data = WDLCM; // 写入数据到LCM
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; // 若晶振速度太高可以在这后加小的延时
LCM_E = 0; // 延时
LCM_E = 1;
}
/*****************************************************
函 数 名:void WriteCommandLCM()
功 能:向LCM1602中写入指令
说 明:向LCM中写入指令;如果BuysC=0时,忽略忙检测,如果BuysC=1时,不忽略忙检测
入口参数:WCLCM,BuysC
返 回 值:无
*****************************************************/
//写指令
void WriteCommandLCM(uchar WCLCM,BuysC) // BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); // 根据需要检测忙
LCM_Data = WCLCM; // 写入指令
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*****************************************************
函 数 名:void LCMInit()
功 能:初始化LCM1602
说 明:LCM在工作前先要对显示屏初始化,否则模块无法正常工作
入口参数:无
返 回 值:无
*****************************************************/
//LCM初始化
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 三次显示模式设置,不检测忙信号
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0); // 0x38指令表示:8位数据显示模式,俩行多显示
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,0);
Delay_LCD();
WriteCommandLCM(LCD_DISPLAY_DOUBLE_LINE,1); // 显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(LCD_DISPLAY_OFF,1); // 关闭显示
WriteCommandLCM(LCD_CLEAR_SCREEN,1); // 显示清屏
WriteCommandLCM(LCD_AC_AUTO_INCREMENT,1); // 显示光标移动设置
WriteCommandLCM(LCD_DISPLAY_ON,1); // 显示开及光标设置
}
/*****************************************************
函 数 名:void DisplayOneChar()
功 能:按指定坐标中写入数据
说 明:X-横坐标,Y-纵坐标,DData为ASCII值
入口参数:X,Y,DData
返 回 值:无
*****************************************************/
//按指定位置显示一个字符
void DisplayOneChar(uchar X, uchar Y, uchar DData)
{
Y &= 0x01;
X &= 0x0F; // 限制X不能大于15,Y不能大于1
if (Y) X |=LINE2_HEAD; // 当要显示第二行时地址码:0xc0
X |= LINE1_HEAD; // 第一行的地址码:0x80
WriteCommandLCM(X, 0); // 这里不检测忙信号,发送地址码
WriteDataLCM(DData);
}
/*在LCD1602中使用此函数,在DIPS082中使用下面的函数
/*****************************************************
函 数 名:void DisplayListChar(uchar x,uchar y,uchar *DData)
功 能:向指定坐标中写入字符串(在LCD1602中使用此函数)
说 明:X-横坐标,Y-纵坐标
入口参数:X,Y,*DData
返 回 值:无
*****************************************************
//按指定位置显示字符串
void DisplayListChar(uchar x,uchar y,uchar *DData)
{
if(y==LINE1) // 判断是否写入第1行
{
if(x { WriteCommandLCM(LINE1_HEAD+x,0); // 写入第1行地址 for(;x