?? text1.lst
字號:
C51 COMPILER V8.02 TEXT1 04/18/2008 20:54:48 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: D:\Keil1\C51\BIN\C51.EXE Text1.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*用定時器0,1602液晶,設(shè)計(jì)一個數(shù)字時鐘,可以由三個按鈕控制調(diào)節(jié)時間*/
2 #include<reg52.h>
3 #include <intrins.h>
4 #include"lcd1602.h"
5 #include"ds18b20.h"
6 #define uchar unsigned char
7 #define uint unsigned int
8 #define TIMER0_COUNT 0xEE11
9 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
10 sbit mode=P2^7;
11 sbit plus=P2^6;
12 sbit dec=P2^5;
13 sbit IRIN = P3^2; //紅外接收器數(shù)據(jù)線
14 uchar IRCOM[7];
15 sbit LCD_RS = P1^0;
16 sbit LCD_RW = P1^1;
17 sbit LCD_EN = P1^2;
18 void belay(uchar x); //x*0.14MS
19 void belay1(int ms);
20
21 bit lcd_busy()
22 {
23 1 bit result;
24 1 LCD_RS = 0;
25 1 LCD_RW = 1;
26 1 LCD_EN = 1;
27 1 delayNOP();
28 1 result = (bit)(P0&0x80);
29 1 LCD_EN = 0;
30 1 return(result);
31 1 }
32
33 /*******************************************************************/
34 /* */
35 /*寫指令數(shù)據(jù)到LCD */
36 /*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
37 /* */
38 /*******************************************************************/
39
40 void lcd_wcmd(uchar cmd)
41
42 {
43 1 while(lcd_busy());
44 1 LCD_RS = 0;
45 1 LCD_RW = 0;
46 1 LCD_EN = 0;
47 1 _nop_();
48 1 _nop_();
49 1 P0 = cmd;
50 1 delayNOP();
51 1 LCD_EN = 1;
52 1 delayNOP();
53 1 LCD_EN = 0;
54 1 }
55
C51 COMPILER V8.02 TEXT1 04/18/2008 20:54:48 PAGE 2
56 /*******************************************************************/
57 /* */
58 /*寫顯示數(shù)據(jù)到LCD */
59 /*RS=H,RW=L,E=高脈沖,D0-D7=數(shù)據(jù)。 */
60 /* */
61 /*******************************************************************/
62
63 void lcd_wdat(uchar dat)
64 {
65 1 while(lcd_busy());
66 1 LCD_RS = 1;
67 1 LCD_RW = 0;
68 1 LCD_EN = 0;
69 1 P0 = dat;
70 1 delayNOP();
71 1 LCD_EN = 1;
72 1 delayNOP();
73 1 LCD_EN = 0;
74 1 }
75
76 /*******************************************************************/
77 /* */
78 /* LCD初始化設(shè)定 */
79 /* */
80 /*******************************************************************/
81
82 void lcd_init()
83 {
84 1 belay1(15);
85 1 lcd_wcmd(0x38); //16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
86 1 belay1(5);
87 1 lcd_wcmd(0x38);
88 1 belay1(5);
89 1 lcd_wcmd(0x38);
90 1 belay1(5);
91 1
92 1 lcd_wcmd(0x0c); //顯示開,關(guān)光標(biāo)
93 1 belay1(5);
94 1 lcd_wcmd(0x06); //移動光標(biāo)
95 1 belay1(5);
96 1 lcd_wcmd(0x01); //清除LCD的顯示內(nèi)容
97 1 belay1(5);
98 1 }
99
100 /*******************************************************************/
101 /* */
102 /* 設(shè)定顯示位置 */
103 /* */
104 /*******************************************************************/
105
106 void lcd_pos(uchar pos)
107 {
108 1 lcd_wcmd(pos | 0x80); //數(shù)據(jù)指針=80+地址變量
109 1 }
110
111 /*******************************************************************/
112 void belay(uchar x); //x*0.14MS
113 void belay1(int ms);
114 uchar count,s1num,timer0_tick,count=0;
115 typedef struct{
116 char hour;
117 char minute;
C51 COMPILER V8.02 TEXT1 04/18/2008 20:54:48 PAGE 3
118 char second;
119 }time;
120
121 typedef struct{
122 uint year;
123 uchar month;
124 char day;
125 }date;
126 time now={0,0,0};
127 date today={2008,1,29};
128 char code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
129 char code weekday[7][4]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
130
131 uchar monthday(uchar year,uchar month)
132 {
133 1 if(month==2 && year%4==0) //潤年的2月有29天
134 1 return(29);
135 1 else
136 1 return(dayofmonth[month-1]); //非閏年時的該月份天數(shù)
137 1 }
138
139 void display_week() //由年月日計(jì)算星期
140 {
141 1 char days;
142 1 days=(today.day+1+2*today.month+3*(today.month+1)/5+today.year+today.year/4-today.year/100+today.year
-/400)%7;
143 1 display_string(&weekday[days][0]);
144 1 }
145
146 static void timer0_initialize(void) //timer0 initialize
147 {
148 1 EA=0; //設(shè)置不接受所有中斷
149 1 timer0_tick=0;
150 1 TR0=0; //關(guān)閉Timer0
151 1 TMOD=0X01; //設(shè)置Timer0為模式2,16位工作模式
152 1 TL0=(TIMER0_COUNT & 0X00FF); //設(shè)置Timer0低八位數(shù)值
153 1 TH0=(TIMER0_COUNT >> 8); //設(shè)置Timer0高八位數(shù)值
154 1 PT1=1; //設(shè)置Timer0的優(yōu)先級為最高
155 1 ET0=1; //設(shè)置接受Timer0的中斷
156 1 TR0=1; //啟動Timer0
157 1 EA=1; //設(shè)置系統(tǒng)接受中斷
158 1 }
159
160 void write_time(uchar add,uchar number)
161 {
162 1 gotoxy(2,add);
163 1 display_data(number);
164 1 }
165 void write_riqi(uchar add,uchar number)
166 {
167 1 gotoxy(1,add);
168 1 display_data(number);
169 1 }
170
171 void keyscan()
172 {
173 1 uchar mode_num;
174 1 if(plus|dec==0)
175 1 {
176 2 delay(5);
177 2 if(plus|dec==0)
178 2 { mode_num++;
C51 COMPILER V8.02 TEXT1 04/18/2008 20:54:48 PAGE 4
179 3 while(!plus|dec);
180 3 TR0=0;
181 3 write_com(0x0f);
182 3 }
183 2 if(mode_num==1) gotoxy(1,4);
184 2 while(!mode);
185 2 if(mode_num==2) gotoxy(1,7);while(!plus|dec);
186 2 if(mode_num==3) gotoxy(1,10);while(!plus|dec);
187 2 if(mode_num==4) gotoxy(2,2);while(!plus|dec);
188 2 if(mode_num==5) gotoxy(2,5);while(!plus|dec);
189 2 if(mode_num==6) gotoxy(2,8);while(!plus|dec);
190 2 if(mode_num==7)
191 2 {
192 3 mode_num=0;
193 3 write_com(0x0c);
194 3 TR0=1;
195 3 }
196 2 }
197 1 if(mode_num!=0)
198 1 {
199 2 if(plus==0)
200 2 {
201 3 delay(5);
202 3 if(plus==0)
203 3 {
204 4 delay(5);
205 4 while(!plus);
206 4 delay(5);
207 4 if(mode_num==1)
208 4 {
209 5 today.year++;
210 5 write_riqi(1,today.year/100);
211 5 write_riqi(3,today.year%100);
212 5 gotoxy(1,12);
213 5 display_week();
214 5 gotoxy(1,4);
215 5 while(!plus);
216 5 }
217 4 if(mode_num==2)
218 4 {
219 5 today.month++;
220 5 if(today.month==13) today.month=1;
221 5 write_riqi(6,today.month);
222 5 gotoxy(1,12);
223 5 display_week();
224 5 gotoxy(1,7);
225 5 while(!plus);
226 5 }
227 4 if(mode_num==3)
228 4 {
229 5 today.day++;
230 5 if(today.day>monthday(today.year,today.month))
231 5 today.day=1;
232 5 write_riqi(9,today.day);
233 5 gotoxy(1,12);
234 5 display_week();
235 5 gotoxy(1,10);while(!plus);
236 5 }
237 4 if(mode_num==4)
238 4 {
239 5 now.hour++;
240 5 if(now.hour==24) now.hour=0;
C51 COMPILER V8.02 TEXT1 04/18/2008 20:54:48 PAGE 5
241 5 write_time(1,now.hour);
242 5 gotoxy(2,2);
243 5 }
244 4 if(mode_num==5)
245 4 {
246 5 now.minute++;
247 5 if(now.minute==60) now.minute=0;
248 5 write_time(4,now.minute);
249 5 gotoxy(2,5);while(!plus);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -