DS18B20万年历温度时间按键控制1602显示51单片机程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

uint year=2015;
uchar month=2;
uchar day=27,daytemp;
uchar weekdayflag=5;
char H=12;
char M=0;
char S=0;
uchar displaybuf[9];
uchar code cdis1[20]= {"0123456789:.C- "};
sbit LCD_RS = P2^0; //LCD1602数据/命令选择端
sbit LCD_RW = P2^1; //LCD1602读/写选择端
sbit LCD_EN = P2^2; //LCD1602使能端
sbit DQ=P3^3; //DS18B20信号端
delayNOP();
}
//液晶初始化
void lcd_init() //1602液晶初始化函数
{
delay(5);
write_control(0x38); //16*2显示,5*7点阵,8位数据
**********************************************************/
void delayNOP()
{
_nop_(); //一个机器周期1us延时
_nop_();
_nop_();
_nop_();
_nop_();
delayNOP(); //5us延时
result = (bit)(P0&0x80); //确保STA7为0,说明为“闲”状态,为1位“忙”操作;(bit)(P0&0x80)为强制类型转换
LCD_EN = 0; //读取数据结束之后,复位执行使能操作
write_data(cdis1[day/10]);
write_data(cdis1[day%10]);
}
//weekday显示函数
void weekday_display()
{
int i=3;
while(lcd_busy());
write_address(0x0c);
write_control(0x0c);
write_data(cdis1[year/10%10]);
write_data(cdis1[year%10]);
write_data(cdis1[13]);
write_data(cdis1[month/10]);
write_data(cdis1[month%10]);
write_data(cdis1[13]);
displaybuf[1]=jj/10;
displaybuf[3]=M%10;
displaybuf[4]=M/10;
displaybuf[6]=H%10;
displaybuf[7]=H/10;
while(lcd_busy());
write_address(0x48); //写入时十位
temp=displaybuf[7];
write_data(cdis1[temp]);
temp=displaybuf[6]; //写入时个位
write_data(cdis1[temp]);
write_data(cdis1[10]); //写入":"
temp=displaybuf[4]; //写入分十位
* 来传送控制命令及数据。4位控制方式是用D4-D7数据线来传送控制命令
* 及数据。使用4位数据线做控制时,需要分两次来传送,先送出高4位数
* 据,再送出低4位数据。可以节省单片机的4根端口线。
LCD_EN = 1; //EN高脉冲
delayNOP();
LCD_EN = 0; //高脉冲之后恢复EN=0
delayNOP();
}
//写地址
void write_address(uchar pos) // 写入显示地址命令
for(i=0;i<3;i++)
{
write_data(cdis2[weekdayflag-1][i]);
}
}
//时间程序显示函数
void TimeDisplay(jj) //时间程序显示子函数
{
uchar temp;
displaybuf[0]=jj%10;
}
void delay(uint ms)
{
uint t;
while(ms--)
{
for(t = 0; t <100; t++);
}
}
/**********************************************************
{
bit result;
LCD_RS = 0; //RS为1选择数据,RS为0选择命令
LCD_RW = 1; //RW为1选择读操作,RW为0选择写操作
LCD_EN = 1; //EN等于1可以读取信息,等于0可以执行命令
LCD_RW=0; //RW为0时写数据;
LCD_EN=0; //1602执行命令
delayNOP();
P0=control; //发送高四位给1602数据P0口
1602液晶操作
**********************************************************/
//忙碌状态判断
bit lcd_busy() //RS/RW/EN=0/1/1为读状态
delay(1);
write_control(0x04); //光标移动
delay(1);
write_control(0x01); //清除LCD的显示内容
delay(5); //延时
*******************************************************************/
#include < reg52.h >
#include < intrins.h > //用到nop()时使用
#define uchar unsigned char
return(result);
}
//写命令
void write_control(uchar control) //RS/RW/EN=0/0/高脉冲 为写指令状态
{
while(lcd_busy());
LCD_RS=0; //选择命令操作
}
//万年历时间判断显示函数
void date_display()
{
while(lcd_busy());
write_address(0x00);
write_data(cdis1[year/1000%10]);
write_data(cdis1[year/100%10]);
{
while(lcd_busy());
LCD_RS=1; //选择命令操作
LCD_RW=0; //RW为0时写数据;
LCD_EN=0; //1602执行命令
delay(1);
write_control(0x38); //重复写入,确保成功
delay(1);
write_control(0x38); //重复写入,确保成功
delay(1);
write_control(0x0f); //光标移动
write_datuf[0]; //写入秒个位
write_data(cdis1[temp]);
}
//DS18B20操作函数
uchar code cdis2[7][5]=
{"Mon",
"Tue",
"Wed",
"Thu",
"Fir",
"Sat",
"Sun"};
/**********************************************************
5us 延时子程序 ms延时函数
write_data(cdis1[temp]);
temp=displaybuf[3]; //写入分个位
write_data(cdis1[temp]);
write_data(cdis1[10]); //:
temp=displaybuf[1]; //写入秒十位
#define uint unsigned int
sbit K5 = P1^4; //调节数位切换键
sbit K6 = P1^5; //数值增加键
sbit K7 = P1^6; //数值减小键
sbit K8 = P1^7; //确认键
uchar K5flag = 0;
{
pos=(pos|0x80); //数据指针=80+地址变量
write_control(pos);
}
//写数据
void write_data(uchar temp) // RS/RW/EN=1/0/高脉冲 为写数据状态
/*******************************************************************
描述:
* LCD1602可以分为8位和4位控制方式,8位控制方式是用D0-D7数据线
delayNOP();
P0=temp; //发送数据给1602数据P0口
LCD_EN = 1; //EN高脉冲
delayNOP();
LCD_EN = 0; //高脉冲之后恢复EN=0
//初始化函数读取应答信号
unsigned char time; //设置全局变量,专门用于严格延时
bit Init_DS18B20(void)
相关文档
最新文档