|
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef char int8;
typedef int int16;
typedef long int32;
// LCD1602
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit BUSY = P0^7;
// KEYS
sbit Key1 = P3^4;
sbit Key2 = P3^5;
sbit Key3 = P3^6;
sbit Key4 = P3^7;
sbit BUZZ = P1^2; //BUZZER
//LED
sbit LED1 = P1^0;
#define KEY_DELAY 5 // 按键扫描延时
//键值
#define K_ALARM 1
#define K_TL 2
#define K_ADD 3
#define K_SUB 4
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
/******** 1602函数声明 ********/
void LCD_Initial();
void GotoXY(unsigned char x, unsigned char y);
void Print(unsigned char *str);
void LCD_Write(bit style, unsigned char input);
//1602程序
//内部等待函数**************************************************************
unsigned char LCD_Wait(void)
{
RS=0;
RW=1; _nop_();
E=1; _nop_();
E=0;
return DBPort;
}
//向LCD写入命令或数据********************************************************
#define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
E=0;
RS=style;
RW=0; _nop_();
DBPort=input; _nop_();//注意顺序
E=1; _nop_();//注意顺序
E=0; _nop_();
LCD_Wait();
}
//设置显示模式************************************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式************************************************************
#define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//初始化LCD************************************************************
void LCD_Initial()
{
E=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//液晶字符输入的位置************************
void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
//将字符输出到液晶显示
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
void rece_init(void)
{ EA=1; /*CPU开放所有中断*/
ES=1; /*允许串行口中断*/
TMOD=0x20; /*定时器/计时器T1为定时器模式,工作于方式2*/
TH1=0xfd; /*向T1置初值*/
TL1=0xfd;
PCON=0x00; /*SMOD=0*/
SCON=0x50; /*数据串行传输工作于方式1,波特率9600bit/s,允许接收*/
TR1=1;/*启动定时器T1*/
}
receive(void)
{ while(!RI); /*等待等待数据接受*/
RI=0;
return SBUF;
}
// 远程温湿度控制
uint32 Count=0;
uint8 Rev_dat[16]=0, Alarm=0, Tl=0;
int8 k_val=0,Top=40, Low=10;
void delay(uint16 n)
{ while (n--);
}
void delay_ms(uint16 m)
{ uint16 n;
for (; m>0; m--)
for (n=125; n>0; n--);
}
void main()
{
unsigned char error; //用于检验是否出现错误
unsigned char checksum; //CRC
uchar TEMP1[7]; //用于记录温度
uchar HUMI1[6]; //用于记录湿度
delay_ms(500); // 上电延时
LCD_Initial(); //初始化液晶
GotoXY(0,0); //选择温度显示位置
Print("Temp: C"); //5格空格
GotoXY(0,1); //选择湿度显示位置
Print("Humi: %RH"); //5格空格
Rev_dat[0]=receive();
GotoXY(5,0); //设置温度显示位置
TEMP1[0]= Rev_dat[0]/1000+'0'; //温度百位
if (TEMP1[0]==0x30) TEMP1[0]=0x20;
TEMP1[1]= Rev_dat[0]%1000/100+'0'; //温度十位
if (TEMP1[1]==0x30 && TEMP1[0]!=0x30) TEMP1[1]=0x20;
TEMP1[2]= Rev_dat[0]%100/10+'0'; //温度个位
TEMP1[3]=0x2e; //小数点
TEMP1[4]= Rev_dat[0]%10+'0'; //温度小数点后第一位
TEMP1[5]=0xdf; //显示温度符号℃
Print(TEMP1); //输出温度
GotoXY(5,1); //设置湿度显示位置
HUMI1[0]= Rev_dat[0]/1000+'0'; //湿度百位
if (HUMI1[0]==0x30) HUMI1[0]=0x20;
HUMI1[1]= Rev_dat[0]%1000/100+'0'; //湿度十位
if (HUMI1[1]==0x30 && HUMI1[0]!=0x30) HUMI1[1]=0X20;
HUMI1[2]= Rev_dat[0]%100/10+'0'; //湿度个位
HUMI1[3]=0x2E; //小数点
HUMI1[4]= Rev_dat[0]%10+'0'; //湿度小数点后第一位
Print(HUMI1); //输出湿度
delay(800); //等待足够长的时间,以进行下一次转换
}
发送部分发出温湿度,帮忙加个报警系统,和怎么在1602显示屏显示
|
|