📄 12864 具有菜单显示的电子钟 温度计.txt
字号:
/****************************************************************************
*描述:12864+ds1302+ds18b20 *
*硬件:AT89C52单片机,晶振为11.0592MHz,KS0108驱动的128*64液晶 *
* SPI总线的DS1302时钟,1-WIRE温度传感器DS18B20。 *
*作者:LO单片机VE *
*文件:12864.c *
*日期:2007-06-10 *
*****************************************************************************
*描述: *
****************************************************************************/
/****************************************************************************
头文件区
****************************************************************************/
#include<reg52.h>
#include<intrins.h>
/****************************************************************************
内存区定义
****************************************************************************/
sbit BF=P0^7; //12864
sbit DI=P2^0;
sbit RW=P2^1;
sbit ENABLE=P2^2;
sbit CS1=P2^3;
sbit CS2=P2^4;
sbit TIMECLK=P2^7; //DS1302
sbit TIMEDATA=P1^7;
sbit TIMERST=P1^6;
sbit K1=P1^2; //三个按键
sbit K2=P1^3;
sbit K3=P1^4;
sbit K4=P1^5;
sbit LN1=P3^2; //水位控制端口
//sbit LN2=P3^7;
sbit DQ=P3^6; //DS18b20*1
sbit HT=P3^4; //温度控制端口
sbit CR=P3^5;
sbit WT=P3^3;
sbit BUZZ=P3^7;//蜂鸣器
sbit BeiGuang=P2^6;//液晶背光控制
bit SCNF=1; //秒闪烁标志位
bit tempflag; //温度标志位
#define INIT_SECOND 0x00 //年月日星期时间初始值
#define INIT_MINUTE 0x00
#define INIT_HOUR 0x00
#define INIT_DAY 0x01
#define INIT_MONTH 0x01
#define INIT_WEEK 0x01
#define INIT_YEAR 0x00
unsigned char data SECOND; //年月日星期时间
unsigned char data MINUTE;
unsigned char data HOUR;
unsigned char data DAY;
unsigned char data MONTH;
unsigned char data WEEK;
unsigned char data YEAR;
unsigned char count=10; //计数器记数值
unsigned char RF1; //一路闹钟
unsigned char RF2; //二路闹钟
unsigned char MF=0; //移位设置
unsigned char TMF=0;
unsigned char TPF=0;
unsigned char TRF=0;
unsigned char TN=0x60; //温度初始值
unsigned char n=0; //音调
unsigned char year_lunar;
unsigned char month_lunar;
unsigned char day_lunar;
/****************************************************************************
函数声明
****************************************************************************/
void busyl(void); //12864
void busyr(void);
void write_cmdl(unsigned char Commandaddr);
void write_datal(unsigned char Dataaddr);
void busyr(void);
void write_cmdr(unsigned char Commandaddr);
void write_datar(unsigned char Dataaddr);
void init_12864(void);
void clear(void);
void write_ascii(unsigned char x,unsigned char y,unsigned char time,bit fanhei);
void write_character(unsigned char x,unsigned char y,unsigned char *ptr,bit fanhei);
void write_week(unsigned char x,unsigned char y,unsigned char weektime,bit fanhei);
void write_ds1302(unsigned char Writeaddr,unsigned char Writedata); //DS1302
unsigned char read_ds1302(unsigned char Readaddr);
void init_ds1302(void);
void readtime(void);
bit reset_ds18b20(void); //DS18B20
unsigned char ds18b20(void);
void write_ds18b20(unsigned char value);
unsigned char read_temp(void);
void keyscanf(void); //按键
void tempdisplay(void);
void ringdisplay(void);
void keyscanf1(void);
void timereset(void);
void ringreset(void);
void tempreset(void);
unsigned char turntobcd(unsigned char x,unsigned char y,unsigned char value,signed char max,signed char min);
void sound(void);
void display1(void);
void display2(void);
void delayus(unsigned char i); //延时
void delayms(unsigned char j);
void delays(unsigned char k);
void initTimer0(void);
void Timer0(void);
void initTimer1(void);
void Timer1(void);
/****************************************************************************
表格
****************************************************************************/
unsigned char bcddis[6];
unsigned char code divdisplay[] =
{
0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,
0x05,0x05,0x06,0x06,0x07,0x08,0x08,0x09
};
/****************************************************************************
ASCII字模的数据表
码表从0x20~0x7e
字库: D:\学习软件\单片机小软件\字模提取\Asc8X16E.dat 纵向取模下高位
****************************************************************************/
unsigned char code nAsciiDot[] = // ASCII
{
0xF8,0xFC,0x04,0xC4,0x24,0xFC,0xF8,0x00, // -0-
0x07,0x0F,0x09,0x08,0x08,0x0F,0x07,0x00,
0x00,0x10,0x18,0xFC,0xFC,0x00,0x00,0x00, // -1-
0x00,0x08,0x08,0x0F,0x0F,0x08,0x08,0x00,
0x08,0x0C,0x84,0xC4,0x64,0x3C,0x18,0x00, // -2-
0x0E,0x0F,0x09,0x08,0x08,0x0C,0x0C,0x00,
0x08,0x0C,0x44,0x44,0x44,0xFC,0xB8,0x00, // -3-
0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
0xC0,0xE0,0xB0,0x98,0xFC,0xFC,0x80,0x00, // -4-
0x00,0x00,0x00,0x08,0x0F,0x0F,0x08,0x00,
0x7C,0x7C,0x44,0x44,0xC4,0xC4,0x84,0x00, // -5-
0x04,0x0C,0x08,0x08,0x08,0x0F,0x07,0x00,
0xF0,0xF8,0x4C,0x44,0x44,0xC0,0x80,0x00, // -6-
0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
0x0C,0x0C,0x04,0x84,0xC4,0x7C,0x3C,0x00, // -7-
0x00,0x00,0x0F,0x0F,0x00,0x00,0x00,0x00,
0xB8,0xFC,0x44,0x44,0x44,0xFC,0xB8,0x00, // -8-
0x07,0x0F,0x08,0x08,0x08,0x0F,0x07,0x00,
0x38,0x7C,0x44,0x44,0x44,0xFC,0xF8,0x00, // -9-
0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -.-
0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00, // -:-
0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, // ---
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
/****************************************************************************
星期汉字字模表
星期汉字库: 宋体16.dot 纵向取模下高位,数据排列:从左到右从上到下
****************************************************************************/
unsigned char code characterweek[] = // 数据表
{
0x80,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,
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,// 二
0x08,0x08,0x08,0x0C,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,// 三
0x84,0x84,0x84,0xC4,0x86,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,
0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,// 四
0x04,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x7F,0x20,0x28,0x24,0x23,0x20,0x20,
0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,
0x00,0x04,0x84,0x84,0x84,0x84,0xFC,0x84,// 五
0x84,0x84,0x84,0xC4,0x86,0x84,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,
0x40,0x40,0x40,0x7F,0x40,0x60,0x40,0x00,
0x20,0x20,0x20,0x20,0x20,0x22,0x2C,0x38,// 六
0x20,0x20,0x20,0x20,0x20,0x30,0x20,0x00,
0x00,0x40,0x20,0x18,0x06,0x03,0x00,0x00,
0x00,0x01,0x02,0x0C,0x38,0x70,0x00,0x00,
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,// 日
0x82,0x82,0x82,0xFF,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x7F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x01,0x02,0x04,0x08,//闹钟图标
0xF0,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x80,0x40,0x20,0x10,
0x0F,0x08,0x08,0x08,0x0F,0x00,0x00,0x00,
0x00,0x00,0x00,0x18,0x18,0xF8,0xFE,0x0E,//加热图标
0x0E,0xFE,0xF8,0x18,0x18,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0xC0,
0xC0,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xC8,0x64,0xFE,0x64,0x48,//进出水图标
0x44,0x68,0xFE,0x68,0xC4,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0xF0,0xF3,0xF0,0xF0,
0xF0,0xF0,0xF3,0xF0,0x7F,0x00,0x00,0x00
};
// 汉字表:
// 一二三四五六日及几个图标
/****************************************************************************
汉字字模的数据结构定义
****************************************************************************/
typedef struct typFNT_GB16 // 汉字字模数据结构
{
signed char Index[2]; // 汉字内码索引
char Msk[32]; // 点阵码数据
};
/****************************************************************************
汉字字模表
汉字库: 宋体16.dot 纵向取模下高位,数据排列:从左到右从上到下
****************************************************************************/
struct typFNT_GB16 code GB_16[] = // 数据表
{
"年", 0x00,0x20,0x10,0xCC,0x47,0x44,0x44,0xFC,
0x44,0x44,0x44,0x64,0x46,0x04,0x00,0x00,
0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,
0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,
"月", 0x00,0x00,0x00,0x00,0xFE,0x22,0x22,0x22,
0x22,0x22,0x22,0xFF,0x02,0x00,0x00,0x00,
0x00,0x80,0x40,0x30,0x0F,0x02,0x02,0x02,
0x02,0x42,0x82,0x7F,0x00,0x00,0x00,0x00,
"日", 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,
0x82,0x82,0x82,0xFF,0x02,0x00,0x00,0x00,
0x00,0x00,0x00,0x7F,0x20,0x20,0x20,0x20,
0x20,0x20,0x20,0x7F,0x00,0x00,0x00,0x00,
"星", 0x00,0x00,0xBE,0x2A,0x2A,0x2A,0x2A,0xEA,
0x2A,0x2A,0x2A,0x2A,0xBF,0x02,0x00,0x00,
0x48,0x44,0x4B,0x49,0x49,0x49,0x49,0x7F,
0x49,0x49,0x49,0x4D,0x49,0x61,0x40,0x00,
"期", 0x00,0x08,0xFF,0xA8,0xA8,0xA8,0xFF,0x08,
0x00,0xFE,0x22,0x22,0x22,0xFF,0x02,0x00,
0x84,0x44,0x37,0x04,0x04,0x14,0xA7,0x44,
0x24,0x1F,0x02,0x42,0x82,0x7F,0x00,0x00,
"室", 0x10,0x0C,0x24,0x24,0xA4,0x64,0x25,0x26,
0x24,0x24,0xA4,0x34,0x24,0x14,0x0C,0x00,
0x00,0x40,0x40,0x49,0x49,0x49,0x49,0x7F,
0x49,0x49,0x49,0x4B,0x60,0x40,0x00,0x00,
"温", 0x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92,
0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,
0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42,
0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
"度", 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,
0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,
0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,
0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,
"热", 0x00,0x88,0x88,0x48,0xFF,0x48,0x28,0x08,
0x48,0xFF,0x08,0x08,0xFC,0x08,0x00,0x00,
0x80,0x60,0x04,0x08,0x27,0xC0,0x08,0x04,
0x23,0xC0,0x01,0x00,0x27,0x48,0xC6,0x00,
"水", 0x00,0x20,0x20,0x20,0x20,0xE0,0x00,0xFF,
0xC0,0x40,0x20,0x10,0x18,0x00,0x00,0x00,
0x20,0x10,0x08,0x04,0x03,0x40,0x80,0x7F,
0x00,0x01,0x02,0x04,0x08,0x18,0x08,0x00,
"箱", 0x40,0x48,0x44,0x43,0xF6,0x4A,0x43,0x0A,
0xE4,0x23,0x26,0x2A,0x22,0xF3,0x22,0x00,
0x20,0x10,0x0C,0x03,0xFF,0x02,0x04,0x00,
0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,
"管", 0x80,0x68,0x24,0xA3,0xA6,0xAA,0xA2,0xBA,
0xA4,0xA3,0xA2,0xA6,0x2A,0xA2,0x60,0x00,
0x00,0x00,0x00,0xFF,0x4A,0x4A,0x4A,0x4A,
0x4A,0x4A,0x4A,0x7B,0x00,0x00,0x00,0x00,
"集", 0x20,0x10,0x08,0xFC,0x57,0x54,0x54,0xFD,
0x56,0x54,0x54,0x56,0x04,0x00,0x00,0x00,
0x04,0x44,0x44,0x27,0x15,0x0D,0x05,0xFF,
0x05,0x0D,0x15,0x25,0x65,0x24,0x04,0x00,
"器", 0x80,0x80,0x9F,0x91,0x91,0x91,0x9F,0xE0,
0x9F,0x91,0xB1,0xD1,0x9F,0xC0,0x80,0x00,
0x08,0x08,0xFC,0x8C,0x8A,0x8A,0xF9,0x00,
0xF9,0x8A,0x8A,0x8C,0xFC,0x08,0x08,0x00,
"闹", 0x00,0xF9,0x02,0x26,0x20,0x22,0x2A,0xF2,
0x22,0x22,0xB2,0x22,0x02,0xFF,0x02,0x00,
0x00,0xFF,0x00,0x00,0x1F,0x01,0x01,0x7F,
0x01,0x11,0x1F,0x41,0x80,0x7F,0x00,0x00,
"钟", 0x80,0x40,0x70,0xCF,0x48,0x48,0x00,0xF0,
0x10,0x10,0xFF,0x10,0x10,0xF8,0x10,0x00,
0x02,0x02,0x02,0x7F,0x22,0x12,0x00,0x07,
0x02,0x02,0xFF,0x02,0x02,0x07,0x00,0x00,
"设", 0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9F,
0x81,0x81,0x81,0x9F,0xA0,0x20,0x20,0x00,
0x00,0x00,0x00,0x7F,0xA0,0x90,0x40,0x43,
0x2C,0x10,0x28,0x26,0x41,0xC0,0x40,0x00,
"置", 0x00,0x10,0x17,0xD5,0x55,0x57,0x55,0x7D,
0x55,0x57,0x55,0xD5,0x17,0x10,0x00,0x00,
0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,
0x55,0x55,0x55,0x7F,0x40,0x60,0x40,0x00,
"返", 0x40,0x42,0x44,0xCC,0x00,0x00,0xFC,0x04,
0xA4,0x24,0x24,0xA2,0x63,0x02,0x00,0x00,
0x00,0x40,0x20,0x1F,0x20,0x58,0x87,0x90,
0x88,0x85,0x82,0x85,0x88,0xD8,0x40,0x00,
"回", 0x00,0xFC,0x04,0x04,0x04,0xE4,0x24,0x24,
0x24,0xF4,0x24,0x04,0x04,0xFE,0x04,0x00,
0x00,0x7F,0x20,0x20,0x20,0x2F,0x24,0x24,
0x24,0x2F,0x20,0x20,0x20,0x7F,0x00,0x00,
"时", 0x00,0xFC,0x84,0x84,0x84,0xFE,0x14,0x10,
0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,
0x00,0x23,0x40,0x80,0x7F,0x00,0x00,0x00,
"间", 0x00,0xF8,0x01,0x02,0xF6,0x10,0x12,0x12,
0x12,0x12,0xFA,0x12,0x02,0xFF,0x02,0x00,
0x00,0xFF,0x00,0x00,0x3F,0x11,0x11,0x11,
0x11,0x11,0x3F,0x40,0x80,0x7F,0x00,0x00,
"路", 0x00,0xFE,0x42,0xC2,0x42,0x7F,0x12,0x08,
0x8C,0x57,0x24,0x54,0x8C,0x84,0x80,0x00,
0x40,0x7E,0x40,0x3F,0x22,0x22,0x01,0xFF,
0x42,0x42,0x42,0x42,0x42,0xFF,0x02,0x00,
"开", 0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,
0x82,0x82,0xFE,0x82,0x83,0xC2,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,
0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,
"关", 0x00,0x10,0x10,0x11,0x12,0x1C,0x10,0xF0,
0x10,0x18,0x14,0x13,0x1A,0x90,0x00,0x00,
0x81,0x81,0x41,0x41,0x21,0x11,0x0D,0x03,
0x0D,0x11,0x21,0x21,0x41,0xC1,0x41,0x00,
"定", 0x10,0x0C,0x04,0x24,0x24,0x24,0x25,0xE6,
0x24,0x24,0x34,0x24,0x04,0x14,0x0C,0x00,
0x80,0x40,0x20,0x1F,0x20,0x40,0x40,0x7F,
0x42,0x42,0x43,0x42,0x40,0x60,0x20,0x00,
"到", 0x00,0x62,0x52,0x4A,0xC6,0x42,0x52,0x63,
0xC2,0x00,0xF8,0x00,0x00,0xFF,0x00,0x00,
0x40,0x42,0x42,0x42,0x7F,0x22,0x23,0x22,
0x20,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,
"℃", 0x00,0x06,0x09,0x09,0xE6,0xF0,0x18,0x08,
0x08,0x08,0x18,0x30,0x78,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x07,0x0F,0x18,0x30,
0x20,0x20,0x20,0x10,0x08,0x00,0x00,0x00
};
/****************************************************************************
延时
****************************************************************************/
void delayus(unsigned char i)
{
for(;i>0;i--);
}
void delayms(unsigned char j)
{
unsigned char i;
for(;j>0;j--)
for(i=248;i>0;i--);
}
void delays(unsigned char k)
{
unsigned char i,j;
for(;k>0;k--)
for(j=200;j>0;j--)
for(i=248;i>0;i--);
}
/****************************************************************************
定时器0
****************************************************************************/
void initTimer0(void)
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
}
void timer0(void)interrupt 1 using 1
{
count--;
TH0=0x3c;
TL0=0xb0;
if(count==0)
{
count=10;
SCNF=~SCNF;
}
}
/****************************************************************************
定时器1
****************************************************************************/
void initTimer1(void)
{
TMOD=0x10;
TH1=0xd8;
TL1=0xef;
}
void timer1(void)interrupt 3 using 2
{
TH1=0xd8;
TL1=0xef;
n--;
}
/****************************************************************************
向DS1302写入一个字节数据
****************************************************************************/
void write_ds1302(unsigned char Writeaddr,unsigned char Writedata)
{
unsigned char i;
TIMECLK=0;
delayus(1);
TIMERST=1;
delayus(1);
for(i=8;i>0;i--)
{
TIMECLK=0;
TIMEDATA=Writeaddr&0x01;
delayus(1);
TIMECLK=1;
Writeaddr=Writeaddr>>1;
}
for(i=8;i>0;i--)
{
TIMECLK=0;
TIMEDATA=Writedata&0x01;
delayus(1);
TIMECLK=1;
Writedata=Writedata>>1;
}
TIMERST=0;
delayus(1);
TIMECLK=0;
delayus(1);
}
/****************************************************************************
从DS1302读出一个字节的数据
****************************************************************************/
unsigned char read_ds1302(unsigned char Readaddr)
{
unsigned char i;
unsigned char value=0;
TIMECLK=0;
delayus(1);
TIMERST=1;
delayus(1);
for(i=8;i>0;i--)
{
TIMECLK=0;
TIMEDATA=Readaddr&0x01;
delayus(1);
TIMECLK=1;
Readaddr=Readaddr>>1;
}
for(i=8;i>0;i--)
{
value=value>>1;
TIMECLK=1;
delayus(1);
TIMECLK=0;
if(TIMEDATA==1)
{
value=value|0x80;
}
delayus(1);
}
TIMERST=0;
delayus(1);
TIMECLK=0;
delayus(1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -