基于51单片机的1602液晶显示温度和时间的C程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//液晶显示温度
#include "AT89X52.H"
#define Ddata P0
sbit RS=P2^7; //命令数据控制端
sbit RW=P2^6; //读写选择端
sbit LCDE=P2^5; //液晶使能端
sbit DQ=P2^0; //ds18b20与单片机连接口
#define uchar unsigned char
#define uint unsigned int
unsigned char hour=0,min=0,sec=0; //定义初值
unsigned int count=0;
unsigned char line1[16]={" temp: "}; //16个字符
unsigned char line2[16]={" time: 00:00:00"}; //16个字符
unsigned char tab[]={'0','1','2','3','4','5','6','7','8','9'}; //数组
uchar data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志
void time();
/*************************lcd1602程序**************************/ void delay1ms(unsigned int ms)//延时1毫秒(不够精确的)
{
unsigned int i,j;
for(i=0;i for(j=0;j<110;j++); } void delay5ms()//延时5毫秒(不够精确的) { unsigned int i; for (i=0;i<1000;i++); } void delay50us() { register int i; for (i=0;i<20;i++); } void delay() {unsigned char m,n; for(m=255;m>0;m--) for(n=255;n>0;n--); } void wr_com(unsigned char comm) //********写控制字符程序E=1 RS=0 RW=0 **********// { LCDE=0; //使能端 RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。 RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。LCDE=1; Ddata=comm; RS=0; RW=0; LCDE=0; void wr_data(unsigned char dat)//*****当前位置写字符子程序:E=1 RS=1 RW=0 { LCDE=0; RS=0; //********RS寄存器选择输入端,当RS=0;当进行写模块操作,指向指令寄存器。 RW=0; //********当RS=1,无论是读操作还是写操作,都是指向数据寄存器。RS=1; RW=0; LCDE=1; Ddata=dat; //将dat赋给P0口 LCDE=0; RS=0; RW=0; } unsigned char busycheck()//*****忙状态检查*******// { unsigned char i; LCDE=0; RS=0; RW=0; RS=0; RW=1; LCDE=1; i=Ddata; LCDE=0; return(i); } void init()//**********初始化程序,必须按照产品的资料介绍的过程进行********// { wr_com(0x38); //*****显示模式设置必须三次,不用检测忙信号 delay5ms(); wr_com(0x38); delay5ms(); wr_com(0x38); delay5ms(); wr_com(0x01); ///***清屏**** delay5ms(); busycheck(); wr_com(0x08); delay5ms(); busycheck(); delay5ms(); wr_com(0x06); ///****光标移动设置,写一个字符后地址指针加1*** delay5ms(); busycheck(); delay50us(); wr_com(0x38); ////***显示模式设置**** delay50us(); busycheck(); delay50us(); wr_com(0x0c); /////***显示开,不显示光标*** delay50us(); busycheck(); delay50us(); wr_com(0x40); //set cgram address delay50us(); delay50us(); //***这些延时可用可不用***// } void display() { unsigned char i; wr_com(0x80); //set ram address delay50us(); busycheck(); delay50us(); for(i=0;i<6;i++) {wr_data(line1[i]); //display(6个字符)delay50us(); busycheck();} busycheck(); delay50us(); wr_com(0xc0); //0xc0=0x80+0x40 delay50us(); busycheck(); delay50us(); for(i=0;i<16;i++) { wr_data(line2[i]); //display delay50us(); busycheck(); } }