STC89C52RC+LCD1602+M48T86PC1+DS18B20-时钟闹钟温度

这是一个使用STC89C52RC单片机,结合LCD1602显示屏、M48T86PC1实时时钟芯片和DS18B20温度传感器实现的时钟闹钟及温度显示系统。通过c语言编程,实现了时间显示、温度测量和闹钟功能。
摘要由CSDN通过智能技术生成

 

lcdmain.c

#include<stc89.h>	 
#include"display.h"

void main(void){
		
	Display();	
}

lcd1602.c

#include <stc89.h>
#include <intrins.h>
#include "delay.h"

sbit LCD_RS = P2^7;
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;

#define LCD_DataPort P0
unsigned char code num_table[] = "0123456789";
unsigned char code Temp_C[] = {0x18,0x1B,0x04,0x08,0x08,0x08,0x04,0x03}; //温度图标码

void LCD_IsBusy(void){            //检测是否忙
 	unsigned char temp = 0x80;

	LCD_DataPort = 0x80;

	while(temp & 0x80){
	 	LCD_RS = 0;
		LCD_RW = 1;
		LCD_EN = 0;
		_nop_();
		LCD_EN = 1;
		_nop_();
		temp = LCD_DataPort;
		LCD_EN = 0;
		_nop_();
	}
}



void LCD_WriteCommand(unsigned char Command){    //写命令

	LCD_IsBusy();
	LCD_RS = 0;
	LCD_RW = 0;
	LCD_EN = 0;
	_nop_();
	LCD_DataPort = Command;
	_nop_();
	LCD_EN = 1;
	_nop_();
	LCD_EN = 0;
	
}

void LCD_WriteData(unsigned char Data){   //写数据

 	LCD_IsBusy();
	LCD_RS = 1;
	LCD_RW = 0;
	LCD_EN = 0;
	_nop_();
	LCD_DataPort = Data;
	_nop_();
	LCD_EN = 1;
	_nop_();
	LCD_EN = 0;

}

//设置光标位置
void LCD_SetCursor(unsigned char Line,unsigned char Column){
 	
	if(Line == 1){
		LCD_WriteCommand(0x80 | (Column-1));
	}
	else if(Line == 2){
	 	LCD_WriteCommand(0xc0 | (Column-1));
	}
}

//指定位置写入字符
void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char){
 	LCD_SetCursor(Line,Column);
	LCD_WriteData(Char);
}

//指定位置写入字符串
void LCD_ShowString(unsigned char Line,unsigned char Column,char *String){

	unsigned char i;
 	LCD_SetCursor(Line,Column);
	for(i=0;String[i]!='\0';i++){
		LCD_WriteData(String[i]);
	}
}
 
//返回值=x的y次方
int LCD_Pow(int x, int y){
 	unsigned char i;
	int Result = 1;
	for (i=0;i<y;i++){
	 	Result *= x;
	}
	return Result;
}  

//指定位置开始显示所给数字
void LCD_ShowNum(unsigned char Line,unsigned char Column,int Number){
 	 
	LCD_SetCursor(Line,Column);
		LCD_WriteData(num_table[Number / 10]);
		LCD_WriteData(num_table[Number % 10]);

}

//指定位置开始以有符号十进制显示所给数字
void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number){

	unsigned char LSB;                //这函数改成了外理温度与显示温度
	LCD_SetCursor(Line,Column);
	if((Number&0xf800)==0x0000){
	 	LCD_WriteData(' ');
		LSB = (Number&0x000f)*0.625;
		Number>>=4;
		Number=Number*10;
		
	}
		LCD_WriteData(Number/LCD_Pow(10,2)%10+'0');
	 	LCD_WriteData(Number/LCD_Pow(10,1)%10+'0');
		LCD_SetCursor(2,15);                        //小数显示的位置
		LCD_WriteData(LSB/LCD_Pow(10,0)%10+'0');    //LSB是小数位,单独外理了
}

void LCD_Init(void){            //LCD1602初始化
	unsigned char i;
    DelayMs(10);
 	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
	DelayMs(1);	
	LCD_WriteCommand(0x06);	//显示开,光标关,闪烁关
	LCD_WriteCommand(0x0c);	//数据读写操作后,光标自动加一,画面不动
	LCD_WriteCommand(0x01);	//光标复位,清屏
	DelayMs(1);
   
	LCD_WriteCommand(0x40);       //温
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值