⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 new.c

📁 LCD12864和DS18B20与DS1302实现温度测试
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************/
/*  Name:  LCD12864+DS1302+DS18B20+S52                                        */
/*                                                                            */
/*  Designed by :whoami                         Date:2005/11/13               */
/*                                                                            */
/*  http://www.mculover.net                                                   */
/******************************************************************************/

#include <reg51.h>

sbit Bell_Out  = P1 ^ 7;//闹钟管脚输出

sbit DQ        = P2 ^ 1;//ds1820data
sbit clock_clk = P2 ^ 2;//ds1302_clk
sbit clock_dat = P2 ^ 3;//ds1302_dat
sbit clock_Rst = P2 ^ 4;//ds1302_Rst

#define Disp_On  0x3f //定义管脚的指令值
#define Disp_Off 0x3e
#define Col_Add  0x40
#define Page_Add 0xb8
#define Start_Line 0xc0
#define Lcd_Bus P0  //定义数据口

sbit Mcs    = P3 ^ 5;  //
sbit Scs    = P3 ^ 6;  //
sbit Enable = P1 ^ 5; //
sbit Di     = P1 ^ 4;  //
sbit RW     = P1 ^ 3;  //
sbit Lcd_Rst= P3 ^ 7; //

//键盘扫描
sbit Add_Key   = P1 ^ 0;//加1键
sbit Dec_Key   = P1 ^ 1;//减1键
sbit OK_Key    = P1 ^ 2;//确定键

//24存储器
sbit SCL       = P3 ^ 3;            
sbit SDA       = P3 ^ 4;
sbit WP        = P3 ^ 2;

#define TRUE            1
#define FALSE           0
#define Delay2408_TIME  60 //经实验,不要小于50!否则可能造成时序混乱 

//为了编程方便定义的位变量
sbit a0   = ACC ^ 0;
sbit a1   = ACC ^ 1;
sbit a2   = ACC ^ 2;
sbit a3   = ACC ^ 3;
sbit a4   = ACC ^ 4;
sbit a5   = ACC ^ 5;
sbit a6   = ACC ^ 6;
sbit a7   = ACC ^ 7;

bit flag, Bell_Swh,Hourb,Minb,Secb,Kgb;//闪烁标志位
bit sec=0,min=0,hour=0,year=0,mon=0,day=0,weekk=0; //闪烁标志位
unsigned char id,id2,d,e,S_1302,H_1302,H_2402,S_2402; //

//Function Definition 函数声明 
void Delay(int num);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
unsigned int ReadTemperature(void);
void clock_out(unsigned char dd);
unsigned char clock_in(void);
unsigned char read_clock(unsigned char ord);
void write_clock(unsigned char ord, unsigned char dd);
void Disp(void);
void id_case1_key(void);
void id_case2_key(void);
void Set_time(unsigned char sel,bit sel_1);
void Timer0_Init(void);
void Init_1302(void);
void Set_Bell(unsigned char sel, bit sel_1);

//24系列
void Delay2408(unsigned int t);
void I2C_Start(void);
void I2C_Stop(void);
void SEND_0(void); 
void SEND_1(void);
bit Check_Acknowledge(void);
void WriteI2CByte(unsigned char b)reentrant;
unsigned char ReadI2CByte(void)reentrant;
void Write_One_Byte(unsigned char addr,unsigned char thedata);
char Read_One_Byte(unsigned char addr);

//12864
void Delay12864(unsigned int t);
void write_com(unsigned char cmdcode);
void write_data(unsigned char Dispdata);
void frame(void);
void Clr_Scr(void);
void Disp_Img(unsigned char code *img);
void Disp_Digit(unsigned char pag,unsigned char col, unsigned char code *hzk);
void Disp_Chinese(unsigned char pag,unsigned char col, unsigned char code *hzk);
void Init_lcd(void);


//汉字库及数字符号库
unsigned char code nao[32]={0x00,0x00,0xF9,0x12,0x90,0x92,0x96,0xFA,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,
0x00,0x00,0xFF,0x00,0x1F,0x00,0x00,0x7F,0x00,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00};/*--  文字:  闹  --*/

unsigned char code zhong[32]={0x40,0x30,0x2C,0xEB,0x28,0x28,0x00,0xF8,0x08,0x08,0xFF,0x08,0x08,0xF8,0x00,0x00,
0x01,0x01,0x01,0xFF,0x41,0x21,0x00,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x00,0x00};/*--  文字:  钟  --*/

unsigned char code she[32]={0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,
0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00};/*--  文字:  设  --*/

unsigned char code ding[32]={0x00,0x10,0x0C,0xA4,0x24,0x24,0x25,0xE6,0x24,0x24,0x24,0x24,0x14,0x0C,0x04,0x00,
0x40,0x20,0x18,0x07,0x08,0x10,0x20,0x7F,0x42,0x42,0x42,0x42,0x40,0x40,0x00,0x00};/*--  文字:  定  --*/

unsigned char code kai[32]={0x40,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00};/*--  文字:  开  --*/

unsigned char code guan[32]={0x00,0x10,0x10,0x10,0x11,0x1E,0x14,0xF0,0x10,0x18,0x17,0x12,0x18,0x10,0x00,0x00,
0x01,0x81,0x41,0x21,0x11,0x09,0x05,0x03,0x05,0x09,0x31,0x61,0xC1,0x41,0x01,0x00};/*--  文字:  关  --*/

unsigned char code shit[32]={0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,
0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00};/*--  文字:  时  --*/
unsigned char code jian[32]={0x00,0xF8,0x01,0x06,0x00,0xF0,0x92,0x92,0x92,0x92,0xF2,0x02,0x02,0xFE,0x00,0x00,
0x00,0xFF,0x00,0x00,0x00,0x07,0x04,0x04,0x04,0x04,0x07,0x40,0x80,0x7F,0x00,0x00};/*--  文字:  间  --*/
unsigned char code dao[32]={0x00,0x22,0x72,0x2A,0x26,0xE2,0x2A,0x72,0x22,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x00,0x42,0xC2,0x42,0x22,0x3F,0x22,0x12,0x12,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00};/*--  文字:  到  --*/

unsigned char code shi[32]={0x00,0x10,0x2C,0x24,0xA4,0x64,0x25,0x26,0x24,0x24,0xA4,0x24,0x34,0x2C,0x04,0x00,
0x40,0x40,0x48,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x4B,0x48,0x40,0x40,0x00};//室
unsigned char code wen[32]={0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00};//温
unsigned char code zero[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};//0
unsigned char code one[16]={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};//1
unsigned char code two[16]={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};//2
unsigned char code three[16]={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};//3
unsigned char code four[16]={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};//4
unsigned char code five[16]={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};//5
unsigned char code six[16]={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};//6
unsigned char code seven[16]={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};//7
unsigned char code eight[16]={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};//8
unsigned char code nine[16]={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};//9
unsigned char code point[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00};//小数点
unsigned char code maohao[16]={0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00};//冒号
unsigned char code space[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//空白
unsigned char code fh[16]={0x00,0x00,0x00,0xFC,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x6F,0x6F,0x00,0x00,0x00};//!感叹号

unsigned char code nian[32]={0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,
0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00};//年
unsigned char code yue[32]={0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00};//月
unsigned char code xing[32]={0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,
0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00};//星
unsigned char code qi[32]={0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00};//期
unsigned char code cone[32]={0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//一
unsigned char code ctwo[32]={0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00};//二
unsigned char code cthree[32]={0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00};//三
unsigned char code cfour[32]={0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00};//四
unsigned char code cfive[32]={0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00};//五
unsigned char code csix[32]={0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00};//六
unsigned char code ri[32]={0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00};//日
unsigned char code sheshidu[32]={0x00,0x02,0x05,0xE2,0x18,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x18,0x00,0x00};//摄氏度的符号
unsigned char code spaces[32]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//汉字空格
unsigned char code biaozhi[32]={0x00,0x00,0x00,0x00,0xE0,0xF8,0xFC,0xFC,0xFC,0xFC,0xF8,0xE0,0x00,0x00,0x00,0x00,
0x00,0x10,0x18,0x3E,0x3F,0x7F,0x5F,0x9F,0x9F,0x5F,0x7F,0x3F,0x3E,0x18,0x10,0x00};//闹钟的图标

/******************************************************************************/
/* 24C08.c*/
//调用方式如下:	
//Write_One_Byte(0x10,0x04);
//k=Read_One_Byte(0x10);
/********** 函数定义 ************/
void Delay2408(unsigned int t) /*延时函数*/
{
	while(t!=0)
    	t--;
}

void I2C_Start(void)
{
  	/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
    SDA=1;
    SCL=1;
    Delay2408(Delay2408_TIME);
    SDA=0;
    Delay2408(Delay2408_TIME);
    SCL=0;
    Delay2408(Delay2408_TIME);
}

void I2C_Stop(void)
{
 	/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
   	SDA=0;
	SCL=1;
    Delay2408(Delay2408_TIME);
    SDA=1;
    Delay2408(Delay2408_TIME);
    SCL=0;
    Delay2408(Delay2408_TIME);
}

void SEND_0(void)   /* SEND ACK */
{
   	/*发送0,在SCL为高电平时使SDA信号为低*/
    SDA=0;
    SCL=1;
    Delay2408(Delay2408_TIME);
    SCL=0;
    Delay2408(Delay2408_TIME);
}

void SEND_1(void)
{
	/*发送1,在SCL为高电平时使SDA信号为高*/
    SDA=1;
    SCL=1;
    Delay2408(Delay2408_TIME);
    SCL=0;
    Delay2408(Delay2408_TIME);
}

bit Check_Acknowledge(void)
{
	/*发送完一个字节后检验设备的应答信号*/
    SDA=1;
    SCL=1;
    Delay2408(Delay2408_TIME/2);
    F0=SDA;
    Delay2408(Delay2408_TIME/2);
    SCL=0;
    Delay2408(Delay2408_TIME);
    if(F0==1)
    	return FALSE;
    return TRUE;
}

void WriteI2CByte(unsigned char b)reentrant
{
	/*向I2C总线写一个字节*/
    unsigned char i;
    for(i=0;i<8;i++)
   		if((b<<i)&0x80)
        	SEND_1();
        else
            SEND_0();
}

unsigned char ReadI2CByte(void)reentrant
{
	/*从I2C总线读一个字节*/
   	unsigned char b=0,i;
  	for(i=0;i<8;i++)
    {
   		SDA=1;    /*释放总线*/
      	SCL=1;    /*接受数据*/
        Delay2408(10);
        F0=SDA;
        Delay2408(10);
        SCL=0;
        if(F0==1)
        {
        	b=b<<1;
            b=b|0x01;
        }
        else
            b=b<<1;
    }
    return b;
}

/**********以下为读写24c02的函数***********************************************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
	bit acktemp=1;
    /*write a byte to mem*/
    I2C_Start();
    WriteI2CByte(0xa0);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);               /*address*/
    acktemp=Check_Acknowledge();
    WriteI2CByte(thedata);           /*thedata*/
    acktemp=Check_Acknowledge();
    I2C_Stop();
}

/******************************************************************************/
char Read_One_Byte(unsigned char addr)
{         
	bit acktemp=1;
    unsigned char mydata;
    /*read a byte from mem*/
    I2C_Start();
    WriteI2CByte(0xa0);
    acktemp=Check_Acknowledge();
    WriteI2CByte(addr);/*address*/
    acktemp=Check_Acknowledge();
    I2C_Start();
    WriteI2CByte(0xa1);
    acktemp=Check_Acknowledge();
    mydata=ReadI2CByte();
    acktemp=Check_Acknowledge();
    return mydata;
    I2C_Stop();
}

/******************************************************************************/
void Delay(int num)//延时函数
{
	while(num--) ;
}

/*12864driver.c*/
/******************************************************************************/
void Delay12864(unsigned int t)//
{
	unsigned int i,j;
	for(i=0;i<t;i++)
	{
		for(j=0;j<10;j++);
	}
}

/******************************************************************************/
void write_com(unsigned char cmdcode)//写命令到LCD
{
	Di = 0;
	RW = 0;

	Lcd_Bus = cmdcode;
    Delay12864(0);
	Enable = 1;
	Delay12864(0);
	Enable = 0;
}

/******************************************************************************/
void write_data(unsigned char Dispdata)//写数据到LCD
{
	Di = 1;
	RW = 0;

	Lcd_Bus = Dispdata;
	Delay12864(0);
	Enable = 1;
	Delay12864(0);
	Enable = 0;
}

/*******************************************************************************/
void frame(void)//显示边框
{
	unsigned char i;
	Mcs = 1;
	Scs = 1;
 	write_com(Page_Add+0);
 	write_com(Col_Add+0);
	for(i=0;i<64;i++) 
	{
		write_data(0x01);
	}
	write_com(Page_Add+7);
	write_com(Col_Add+0);
	for(i=0;i<64;i++)
 	{
		write_data(0x80);
	}
	for(i=0;i<8;i++)
	{
		Mcs=0;
		Scs=1;
		write_com(Page_Add+i);
		write_com(Col_Add+63);
		write_data(0xff);
		Mcs=1;
		Scs=0;
		write_com(Page_Add+i);
		write_com(Col_Add+0);
		write_data(0xff);
	}
}

/******************************************************************************/
void Clr_Scr(void)//清除内存
{
	unsigned char j,k;
	Mcs=1;Scs=1;
 	write_com(Page_Add+0);
 	write_com(Col_Add+0);

 	for(k=0;k<8;k++)
	{
		write_com(Page_Add+k);
        write_com(Col_Add+0);

		for(j=0;j<64;j++)
		{
			write_data(0x00);
		}
 	}
}

/*******************************************************************************/
void Disp_Img(unsigned char code *img)//显示12864图片
{
	unsigned char j,k;
 	for(k=0;k<8;k++)
	{
  		Mcs=1;
		Scs=0;
		Delay(10);
  		write_com(Page_Add+k);
  		write_com(Col_Add+0);
  		for(j=0;j<64;j++) 
		{
			write_data(img[k*128+j]);
		}
  		Mcs=0;
		Scs=1;
	 	Delay(10);
  		write_com(Page_Add+k);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -