51单片机+LCD12864的万年历Proteus仿真

51单片机+LCD12864的万年历Proteus仿真


  • Proteus仿真效果
    在这里插入图片描述

按键说明:递增按键的范围是根据设置的属性变化而变化,如果是年就是0-99,超出范围归0,如果是月份就是0-12超出范围归0,如果是日期就是0-31,超出归0,递减有所不同只能做到0-9之间递减。

使用说明

关于有朋友反馈,仿真时时间从代码设定值开始,00:00:00开始走起,可以将main.c里面的第143行,Ds1302Init();//Ds1302初始化,并且附上设定的默认时间注释掉即可,重新编译,Proteus仿真时重新调用编译的hex文件进行仿真。

在这里插入图片描述

实例代码

  • main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#include <reg51.h>
#include "DS18B20.h"
#include "DS1302.h"
#include "LCD12864.h"

char a;
sbit KEY1=P3^4;
sbit KEY2=P3^5;
sbit KEY3=P3^6;
sbit KEY4=P3^7;
/\*\*\*按键触发标志位\*\*\*/
bit KeyTrg1=0;
bit KeyCont1=0;

bit KeyTrg2=0;
bit KeyCont2=0;

bit KeyTrg3=0;
bit KeyCont3=0;

bit KeyTrg4=0;
bit KeyCont4=0;
/\*\*\*按键触发标志位\*\*\*/
/\*\*\*按键模式选择\*\*\*/
#define KEY\_MODE 0x01 // 模式按键
#define KEY\_PLUS 0x02 // 加
uint cnt_plus=0;
bit flag=1; //进入/退出设置标志
uchar choose=0x01; //切换标志

/\*\*\*按键触发实现函数\*\*\*/
void KeyRead1(void)
{
unsigned char ReadData = KEY1^0x01; //
KeyTrg1 = ReadData & (ReadData ^ KeyCont1); // 触发
KeyTrg1 = ReadData; //长按
}
void KeyRead2(void)
{
unsigned char ReadData = KEY2^0x01; //
KeyTrg2 = ReadData & (ReadData ^ KeyCont2); // 触发
KeyTrg2 = ReadData; //长按
}
void KeyRead3(void)
{
unsigned char ReadData = KEY3^0x01; //
KeyTrg3 = ReadData & (ReadData ^ KeyCont3); // 触发
KeyTrg3 = ReadData; //长按
}
void KeyRead4(void)
{
unsigned char ReadData = KEY4^0x01; //
KeyTrg4 = ReadData & (ReadData ^ KeyCont4); // 触发
KeyTrg4 = ReadData; //长按
}
/\*\*\*按键触发实现函数\*\*\*/
void delay10(void) //延时10ms
{
unsigned char i,j;
for(i=0; i<255; i++)
for(j=0; j<200; j++);
}
void delay5ms(void) //误差 0us
{
unsigned char a,b;
for(b=19; b>0; b--)
for(a=130; a>0; a--);
}

//设置时ds1302寄存器值循环 如秒寄存器59时加一变为00
unsigned char conver(unsigned char a,unsigned char b,unsigned char c)
{

if((a&0x0f)==0x0a) a=a+6;
if(a==b) a=c;
return a;
}

void digplay() {

//时间
ShowNumber16\_32(2,0,TIME[2]>>4&0x03); //时 十位
ShowNumber16\_32(2,16, TIME[2]&0x0f);//时 个位
ShowNumber16\_32(2,48,TIME[1]>>4&0x07);//分 十位
ShowNumber16\_32(2,64, TIME[1]&0x0f);//分 个位
ShowNumber16\_32(2,96,TIME[0]>>4&0x07);//秒 十位
ShowNumber16\_32(2,112, TIME[0]&0x0f);//秒 个位


//日期
ShowNumber(0,0,2);
ShowNumber(0,8,0);
ShowNumber(0,16,TIME[6]>>4&0x0f);
ShowNumber(0,24, TIME[6]&0x0f);//年

ShowNumber(0,40,TIME[4]>>4&0x01);
ShowNumber(0,48, TIME[4]&0x0f);//月

ShowNumber(0,64,TIME[3]>>4&0x03);
ShowNumber(0,72, TIME[3]&0x0f);//日

ShowChina(0,112,(TIME[5]&0x07)-1);//周
}
void wendu() {
//温度
a=Read\_Temperature(); //读取DS18B20的温度
if(a<0) //处理温度正负
{
a = (-1)\*a; // 取补
ShowNumber(6,88,11); //温度计图标—
}
else
{
ShowNumber(6,88,12);//温度计图标+
}
ShowNumber(6,96,a/10%10); //显示温度中位

ShowNumber(6,104,a%10); //显示温度低位

}

void digplaystart() {//开机显示
uchar i=0;
ShowChina(2,64-16\*1.5,19);
ShowChina(2,64-16\*0.5,20);
ShowChina(2,64+16\*0.5,21);
ShowChina(2,64+16\*1.5,22);
for (i=0; i<10; i++) {
ShowNumber(4,32+8\*i,16);
delay5ms();
delay5ms();
}
ClearScreen(0);//清屏
}

void main(void)
{
uchar i;
InitLCD(); //初始化LCD12864
digplaystart();
delay5ms();
Ds1302Init();//Ds1302初始化,并且附上设定的默认时间
a=Read\_Temperature(); //读取DS18B20的温度
ShowNumber(0,32,11);//-
ShowNumber(0,56,11);//-
ShowChina(0,96,7);//汉字周
ShowNumber16\_32(2,32,10);//:
ShowNumber16\_32(2,80,10);//:
ShowChina(6,112,8);//℃
while(1)
{
wendu();//温度显示
if(flag==1)
Ds1302ReadTime();
//读取DS1302的时间
else
Ds1302WriteTime();

KeyRead1();
KeyRead2();
KeyRead3();
KeyRead4();
// if(KEY1==0) //按键1--处理设定时间和返回
// {
// delay10();
if(KeyTrg1==1)
{
delay10();
flag=~flag;

if(flag==0) {
ShowChina(6,48,9);
ShowChina(6,0,16);
ShowChina(6,16,17);
ShowNumber(6,32,10);
}
if(flag==1) {
for( i=0; i<8; i++) {
ShowNumber(6,8\*i,15);
}
}
}
// }

// if(KEY2==0) //按键2--处理选择设定时间的项目
// {
// delay10();
if(KeyTrg2==1)
{
delay10();
choose++;
ShowChina(6,48,8+choose);
if(choose==7)
choose=0x00;
}
// }

// if(KEY3==0) //按键3--处理设定时间和返回
// {
// delay10();
if(KeyTrg3 & KEY_MODE)
{
delay10();
switch(choose)
{
case 1:
TIME[6]++;
TIME[6]=conver(TIME[6],0xa0,0x00);
break;//年
case 2:
TIME[5]++;
TIME[5]=conver(TIME[5],0x08,0x01);
break;//周
case 3:
TIME[4]++;
TIME[4]=conver(TIME[4],0x13,0x01);
break;//月
case 4:
TIME[3]++;
TIME[3]=conver(TIME[3],0x32,0x01);
break;//日
case 5:
TIME[2]++;
TIME[2]=conver(TIME[2],0x24,0x00);
break;//时
case 6:
TIME[1]++;
TIME[1]=conver(TIME[1],0x60,0x00);
break;//分
case 7:
TIME[0]++;
TIME[0]=conver(TIME[0],0x60,0x00);
break;//秒
}
digplay();
}
/\*\*\*\*\*\*\*\*\*\*长按模式没有起作用\*\*\*\*\*\*\*\*\*\*\*/
if(KeyCont3 & KEY_PLUS)
{
cnt_plus++;
if (cnt_plus > 100) // 20ms\*100 = 2S 如果时间到
{
switch(choose)
{
case 1:
TIME[6] +=5;
TIME[6]=conver(TIME[6],0xa0,0x00);
break;//年
case 2:
TIME[5] +=5;
TIME[5]=conver(TIME[5],0x08,0x01);
break;//周
case 3:
TIME[4] +=5;
TIME[4]=conver(TIME[4],0x13,0x01);
break;//月
case 4:
TIME[3]+=5;
TIME[3]=conver(TIME[3],0x32,0x01);
break;//日
case 5:
TIME[2]+=5;
TIME[2]=conver(TIME[2],0x24,0x00);
break;//时
case 6:
TIME[1]+=5;
TIME[1]=conver(TIME[1],0x60,0x00);
break;//分
case 7:
TIME[0]+=5;
TIME[0]=conver(TIME[0],0x60,0x00);
break;//秒
}
digplay();
cnt_plus=0;
}
}
if(KeyTrg4 & KEY_MODE)
{
delay10();
switch(choose)
{
case 1:
TIME[6] --;
TIME[6]=conver(TIME[6],0xa0,0x00);
break;//年
case 2:
TIME[5] --;
TIME[5]=conver(TIME[5],0x08,0x01);
break;//周
case 3:
TIME[4] --;
TIME[4]=conver(TIME[4],0x13,0x01);
break;//月
case 4:
TIME[3] --;
TIME[3]=conver(TIME[3],0x32,0x01);
break;//日
case 5:
TIME[2] --;
TIME[2]=conver(TIME[2],0x24,0x00);
break;//时
case 6:
TIME[1]--;
TIME[1]=conver(TIME[1],0x60,0x00);
break;//分
case 7:
TIME[0] --;
TIME[0]=conver(TIME[0],0x60,0x00);
break;//秒
}
digplay();
}
if(flag==1)
Ds1302ReadTime(); //读取DS1302的时间
else
Ds1302WriteTime(); //写入DS1302的时间
digplay();
}
}


  • DS1302.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
//ds1302具有自动闰年补偿

#include <reg51.h>
#include <intrins.h>
#include "DS1302.h"



//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码-四位二进制为一位十进制---//
uchar TIME[7] = {0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x20};

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名 : Ds1302Write
\* 函数功能 : 向DS1302命令(地址+数据)
\* 输 入 : addr,dat
\* 输 出 : 无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

void Ds1302Write(uchar addr, uchar dat)
{
uchar n;
RST = 0;
\_nop\_();

SCLK = 0;//先将SCLK置低电平。
\_nop\_();
RST = 1; //然后将RST(CE)置高电平。
\_nop\_();

for (n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
\_nop\_();
SCLK = 0;
\_nop\_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
\_nop\_();
SCLK = 0;
\_nop\_();
}

RST = 0;//传送数据结束
\_nop\_();
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名 : Ds1302Read
\* 函数功能 : 读取一个地址的数据
\* 输 入 : addr
\* 输 出 : dat
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
\_nop\_();

SCLK = 0;//先将SCLK置低电平。
\_nop\_();
RST = 1;//然后将RST(CE)置高电平。
\_nop\_();

for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
\_nop\_();
SCLK = 0;//DS1302下降沿时,放置数据
\_nop\_();
}
\_nop\_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
\_nop\_();
SCLK = 0;//DS1302下降沿时,放置数据
\_nop\_();
}

RST = 0;
\_nop\_(); //以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
\_nop\_();
DSIO = 0;
\_nop\_();
DSIO = 1;
\_nop\_();
return dat;
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名 : Ds1302Init
\* 函数功能 : 初始化DS1302.
\* 输 入 : 无
\* 输 出 : 无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打开写保护功能
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 函 数 名 : Ds1302ReadTime
\* 函数功能 : 读取时钟信息
\* 输 入 : 无
\* 输 出 : 无
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
void Ds1302WriteTime()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打开写保护功能
}

  • DS1302.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef \_\_DS1302\_H\_\_
#define \_\_DS1302\_H\_
#define uchar unsigned char
sbit DSIO=P2^5;
sbit RST= P2^3;
sbit SCLK=P2^4;


//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif



//---定义全局函数---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();
void Ds1302WriteTime();



//---加入全局变量--//
extern uchar TIME[7]; //加入全局变量
#endif

  • LCD12864.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include <reg51.h>
#include "LCD12864.h"
#include "code.h"




void nop(void)
{
\_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_(); \_nop\_();
}

//状态检查
void CheckState(void)
{
uchar dat;
dat = 0x00;
di=0;
rw=1;
/\* do
{
P1=0xff;
en=1;
dat=P1;
en=0;
dat&=0x80; //仅当第7位为0时才可操作
}while(dat);\*/
}

//写显示数据
//dat:显示数据
void WriteByte(uchar dat)
{
CheckState();
di=1;
rw=0;
LCD12864DataPort=dat;
en=1;
en=0;
}


void lcd\_cmd\_wr(uchar command)
{
cs1=1;
cs2=1;
CheckState();
rw=0;
di=0;
LCD12864DataPort=command;
en=1;
en=0;
}
/\*-----------------------------------------------------------------------------------------------------\*/
//向LCD发送命令
//command :命令
void SendCommandToLCD(uchar command)
{
CheckState();
rw=0;
di=0;
LCD12864DataPort=command;
en=1;
en=0;
}
/\*----------------------------------------------------------------------------------------------------\*/
//设定行地址(页)--X 0-7
void SetLine(uchar line)
{
line &= 0x07; // 0<=line<=7
line |= 0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(uchar column)
{
column &= 0x3f; // 0=<column<=63
column |= 0x40; //01xx xxxx
SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(uchar startline) //0--63
{
//startline &= 0x07;
startline |= 0xc0; //1100 0000
SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(uchar onoff)
{
onoff|=0x3e; //0011 111x
SendCommandToLCD(onoff);
}
/\*---------------------------------------------------------------------------------------------------\*/
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(uchar screen)
{ //北京显示器:负有效 cs1: 0--右; cs2: 0--左
switch(screen)
{
case 0:
cs1=0;//全屏
nop();
cs2=0;
nop();
break;
case 1:
cs1=1;//左屏
nop();
cs2=0;
nop();
break;
case 2:
cs1=0;//右屏
nop();
cs2=1;
nop();
break;
default:
break;
}
}
/\*---------------------------------------------------------------------------------------------------\*/
//清屏
//screen: 0-全屏,1-左屏,2-右
void ClearScreen(uchar screen)
{
uchar i,j;
SelectScreen(screen);
for(i=0;i<8;i++)
{
SetLine(i);
for(j=0;j<64;j++)
{
WriteByte(0x00);
}
}
}
/\*--------------------------------------------------------------------------------------------------\*/
//显示8\*8点阵
//lin:行(0-7), column: 列(0-127)
//address : 字模区首地址
void Show8x8(uchar lin,uchar column,uchar \*address)
{
uchar i;
// if(column>128) {return;}
if(column<64)
{
SelectScreen(1); //如果列数<64则从第一屏上开始写
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)
{
if(column+i<64)
{
WriteByte(\*(address+i));
}
else
{
SelectScreen(2);
SetLine(lin);
SetColumn(column-64+i);
WriteByte(\*(address+i));
}
}
}
else
{
SelectScreen(2); //否则从第二屏上开始写
column-=64; //防止越界
SetLine(lin);
SetColumn(column);
for(i=0;i<8;i++)
{
if(column+i<64)
{
WriteByte(\*(address+i));
}
else
{
SelectScreen(1);
SetLine(lin);
SetColumn(column-64+i);
WriteByte(\*(address+i));
}
}
}
}

//显示数字8\*16
void ShowNumber(uchar lin,uchar column,uchar num)
{
uchar \*address;
address=&Numcode[num];
Show8x8(lin,column,address);
Show8x8(lin+1,column,address+8);
}
//显示数字16\*32
void ShowNumber16\_32(uchar lin,uchar column,uchar num)
{
uchar \*address;
address=&Numcode16_32[num\*2];
Show8x8(lin,column,address);
Show8x8(lin,column+8,address+8);

Show8x8(lin+1,column,address+16);
Show8x8(lin+1,column+8,address+24);
Show8x8(lin+2,column,address+32);
Show8x8(lin+2,column+8,address+40);
Show8x8(lin+3,column,address+48);
Show8x8(lin+3,column+8,address+56);
}
//显示汉字16\*16


void ShowChina(uchar lin,uchar column,uchar num)
{
uchar \*address;
// if(lin>7 || column>127){return;}
address = &week[num];
Show8x8(lin,column,address);
Show8x8(lin,column+8,address+8);
Show8x8(lin+1,column,address+16);
Show8x8(lin+1,column+8,address+24);
}

void InitLCD(void) //初始化LCD
{
uchar i=2000; //延时
while(i--);
SetOnOff(1); //开显示
ClearScreen(1);//清屏
ClearScreen(2);
SetStartLine(0); //开始行:0
}

  • LCD12864.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#ifndef \_\_LCD12864\_H\_\_
#define \_\_LCD12864\_H\_\_

extern void \_nop\_ (void);
// LCD128\*64 数据线
#define LCD12864DataPort P1
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif


// LCD128\*64 I/O 信号管脚
sbit di = P2^2; // 数据\指令 选择
sbit rw = P2^1; // 读\写 选择
sbit en = P2^0; // 读\写使能
sbit cs1= P3^0; // 片选1,低有效(前64列)
sbit cs2= P3^1; // 片选2,低有效(后64列)


void nop(void);
void CheckState(void);
void WriteByte(uchar dat);
void lcd\_cmd\_wr(uchar command);
void SendCommandToLCD(uchar command);
void SetLine(uchar line);
void ClearScreen(uchar screen);
void ShowNumber(uchar lin,uchar column,uchar num);
void ShowNumber16\_32(uchar lin,uchar column,uchar num);
void ShowChina(uchar lin,uchar column,uchar num);
void InitLCD(void);

extern void \_nop\_ (void);
#endif

  • DS18B20.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef \_\_DS18B20\_H\_\_
sbit DQ = P2^6;


void delay(int useconds);
unsigned char ow\_reset(void) ;
void write\_bit(char bitval);
void write\_byte(char val);

unsigned char read\_bit(void);
unsigned char read\_byte(void);

int Read\_Temperature(void) ;
#endif

  • DS18B20.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <reg51.h>
#include "DS18B20.h"


/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 延时函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void delay(int useconds) {
int s;
for (s=0; s<useconds;s++);
}


/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 复位函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:完成单总线的复位操作。
\* 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。
\* 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
unsigned char ow\_reset(void) {
unsigned char presence;
DQ = 0; // 将 DQ 线拉低
delay(29); // 保持 480μs
DQ = 1; // DQ返回高电平
delay(3); // 等待存在脉冲
presence = DQ; // 获得存在信号
delay(25); // 等待时间隙结束
return(presence); // 返回存在信号,0 = 器件存在, 1 = 无器件
}


/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 位写入函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:向单总线写入1位值:bitval
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void write\_bit(char bitval) {
DQ = 0; // 将DQ 拉低开始写时间隙
if(bitval==1) DQ =1; // 如果写1,DQ 返回高电平
delay(5); // 在时间隙内保持电平值,
DQ = 1; // Delay函数每次循环延时16μs,因此delay(5) = 104μs
}


/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 字节写入函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:向单总线写入一个字节值:val
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void write\_byte(char val) {
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) { // 写入字节, 每次写入一位
temp = val>>i;
temp &= 0x01;
write\_bit(temp);
}
delay(5);
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 位读取函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义
\* 的delay()函数,而采用一个for()循环来实现延时。
\* \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
unsigned char read\_bit(void) {
unsigned char i;
DQ = 0; //将DQ 拉低开始读时间隙
DQ = 1; // then return high
for (i=0; i<3; i++); // 延时15μs
return(DQ); // 返回 DQ 线上的电平值
}

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 字节读取函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:从单总线读取一个字节的值
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
unsigned char read\_byte(void) {
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++) { // 读取字节,每次读取一个字节
if(read\_bit()) value|=0x01<<i; // 然后将其左移
delay(6);
}
return(value);
}


/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 读取温度函数 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
\* 功能:如果单总线节点上只有一个器件则可以直接掉用本函数。如果节点上有多个器
\* 件,为了避免数据冲突,应使用Match ROM函数来选中特定器件。
\* 注: 本函数是根据DS1820的温度数据格式编写的,若用于DS18B20,必须根据
\* DS18B20的温度数据格式作适当修改。
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
int Read\_Temperature(void) {
unsigned char get[10];
unsigned char temp_lsb,temp_msb;
unsigned int t;
unsigned char k;
ow\_reset();
write\_byte(0xCC); // 跳过 ROM
write\_byte(0x44); // 启动温度转换
delay(5);
ow\_reset();
write\_byte(0xCC); // 跳过 ROM
write\_byte(0xBE); // 读暂存器
for (k=0;k<2;k++){get[k]=read\_byte();}

temp_msb = get[1]; // Sign byte + lsbit
temp_lsb = get[0]; // Temp data plus lsb

t=temp_msb\*256+temp_lsb;
t=t&0x0ff0;
if(t<0xff&&t>0xf0)
t=(-1)\*t;
return t>>4;
//temp\_f = (((int)temp\_c)\* 9)/5 + 32;
// 输出华氏温度值
}


  • code.h汉字取模文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
uchar code Numcode[][16]= //8X16数字
{0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/\*"0",0\*/

0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/\*"1",1\*/

0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/\*"2",2\*/

0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/\*"3",3\*/

0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/\*"4",4\*/

0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/\*"5",5\*/

0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/\*"6",6\*/

0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/\*"7",7\*/

0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/\*"8",8\*/

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/\*"9",9\*/

0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/\*":",10\*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,/\*"-",11\*/

0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,/\*"+",12\*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,/\*".",13\*/

/\*-- 文字: \_ --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --\*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,


/\*-- 文字: 空格 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --\*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/\*-- 文字: < --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --\*/
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//<

};


uchar code Numcode16_32[][32]=//时间数字显示16X32
{
/\*-- 调入了一幅图像:这是您新建的图像 0 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0xFC,0xFA,0xF6,0xEE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0xEE,0xF6,0xFA,0xFC,
0x00,0xFF,0x7F,0x3F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x3F,0x7F,0xFF,
0x00,0xFE,0xFC,0xF8,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFC,0xFE,
0x00,0x3F,0x5F,0x6F,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x6F,0x5F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像 1--\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0xF8,0xFC,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x3F,0x7F,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFC,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像2 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0xEE,0xF6,0xFA,0xFC,
0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xDF,0xBF,0x7F,0xFF,
0x00,0xFE,0xFD,0xFB,0xF7,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x01,0x00,
0x00,0x3F,0x5F,0x6F,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x70,0x60,0x40,0x00,


/\*-- 调入了一幅图像:这是您新建的图像 3--\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0xEE,0xF6,0xFA,0xFC,
0x00,0x00,0x00,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xDF,0xBF,0x7F,0xFF,
0x00,0x00,0x01,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xF7,0xFB,0xFD,0xFE,
0x00,0x00,0x40,0x60,0x70,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x6F,0x5F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像4 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0xFC,0xF8,0xF0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0,0xF8,0xFC,
0x00,0xFF,0x7F,0xBF,0xDF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xDF,0xBF,0x7F,0xFF,
0x00,0x00,0x01,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xF7,0xFB,0xFD,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,
/\*-- 调入了一幅图像:这是您新建的图像5 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0xFC,0xFA,0xF6,0xEE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x0E,0x06,0x02,0x00,
0x00,0xFF,0x7F,0xBF,0xDF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,
0x00,0x00,0x01,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xF7,0xFB,0xFD,0xFE,
0x00,0x00,0x40,0x60,0x70,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x6F,0x5F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像6 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0xFC,0xFA,0xF6,0xEE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x0E,0x06,0x02,0x00,
0x00,0xFF,0x7F,0xBF,0xDF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,0x00,0x00,
0x00,0xFE,0xFD,0xFB,0xF7,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xF7,0xFB,0xFD,0xFE,
0x00,0x3F,0x5F,0x6F,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x6F,0x5F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像 7 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0x00,0x02,0x06,0x0E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0xEE,0xF6,0xFA,0xFC,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x3F,0x7F,0xFF,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF8,0xFC,0xFE,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x1F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像 8--\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0xFC,0xFA,0xF6,0xEE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0xEE,0xF6,0xFA,0xFC,
0x00,0xFF,0x7F,0xBF,0xDF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xDF,0xBF,0x7F,0xFF,
0x00,0xFE,0xFD,0xFB,0xF7,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xF7,0xFB,0xFD,0xFE,
0x00,0x3F,0x5F,0x6F,0x77,0x78,0x78,0x78,0x78,0x78,0x78,0x70,0x67,0x6F,0x5F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像 9 --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0xFC,0xFA,0xF6,0xEE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0xEE,0xF6,0xFA,0xFC,
0x00,0xFF,0x7F,0xBF,0xDF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xDF,0xBF,0x7F,0xFF,
0x00,0x00,0x01,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xF7,0xFB,0xFD,0xFE,
0x00,0x00,0x40,0x60,0x70,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x77,0x6F,0x5F,0x3F,

/\*-- 调入了一幅图像:这是您新建的图像 : --\*/
/\*-- 宽度x高度=16x32 --\*/
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,

};

uchar code week[][32]=//星期显示
{
/\*-- 文字: 日 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,
/\*-- 文字: 一 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

/\*-- 文字: 二 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,

/\*-- 文字: 三 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

/\*-- 文字: 四 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,

/\*-- 文字: 五 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00,
0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,

/\*-- 文字: 六 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,



0x00,0x00,0x00,0xFE,0x02,0x42,0x4A,0x4A,0x7E,0x4A,0x4A,0x42,0x02,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x00,0x00,0x1F,0x09,0x09,0x09,0x1F,0x40,0x80,0x7F,0x00,0x00, //0\*"周",6\*/

/\*-- 文字: ℃ --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x06,0x09,0x09,0xE6,0xF8,0x0C,0x04,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,//1\*-- 文字: ℃ --\*/
0x00,0x00,0x00,0x07,0x1F,0x30,0x20,0x40,0x40,0x40,0x40,0x40,0x20,0x10,0x00,0x00,

/\*-- 文字: 年 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 8 --\*/
0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00,
0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,

/\*-- 文字: 周 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00,
0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00,

/\*-- 文字: 月 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,

/\*-- 文字: 日 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,

/\*-- 文字: 时 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0xFC,0x84,0x84,0x84,0xFC,0x00,0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x00,
0x00,0x3F,0x10,0x10,0x10,0x3F,0x00,0x00,0x01,0x06,0x40,0x80,0x7F,0x00,0x00,0x00,

/\*-- 文字: 分 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x80,0x40,0x20,0x90,0x88,0x86,0x80,0x80,0x80,0x83,0x8C,0x10,0x20,0x40,0x80,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x40,0x80,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,

/\*-- 文字: 秒 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x24,0x24,0xA4,0xFE,0x23,0x22,0x00,0xC0,0x38,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,
0x08,0x06,0x01,0xFF,0x01,0x06,0x81,0x80,0x40,0x40,0x27,0x10,0x0C,0x03,0x00,0x00,

/\*-- 文字: 设 15 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9E,0x82,0x82,0x82,0x9E,0xA0,0x20,0x20,0x00,
0x00,0x00,0x00,0x3F,0x90,0x88,0x40,0x43,0x2C,0x10,0x28,0x46,0x41,0x80,0x80,0x00,

/\*-- 文字: 置 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x17,0x15,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x15,0x17,0x00,0x00,
0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x40,0x40,0x00,

/\*-- 文字: : --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,


/\*-- 文字: 正 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00,
0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,

/\*-- 文字: 在 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x08,0x08,0x88,0xC8,0x38,0x0C,0x0B,0x08,0x08,0xE8,0x08,0x08,0x08,0x08,0x08,0x00,
0x02,0x01,0x00,0xFF,0x40,0x41,0x41,0x41,0x41,0x7F,0x41,0x41,0x41,0x41,0x40,0x00,

/\*-- 文字: 开 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x80,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0x80,0x00,
0x00,0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

/\*-- 文字: 机 --\*/
/\*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --\*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,


};


代码资源链接

1
2
3
baidu链接:https://pan.baidu.com/s/10jnS5y5aqxQ6_DDcgZ5j8Q 
提取码:ec0y