📄 closetest.lst
字号:
C51 COMPILER V7.05 CLOSETEST 11/25/2003 23:29:19 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE CLOSETEST
OBJECT MODULE PLACED IN closetest.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE closetest.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <absacc.h> //包含头文件
2 #include <reg51.h> //包含头文件
3
4 typedef unsigned char byte; //定义字节
5 typedef unsigned int word; //定义字
6
7 #define XTALL 11.0592 //定义晶振频率
8 #define DLY_1MS (word)(1500*XTALL/12) //1ms延时计数次数设定
9
10 #define SECOND (*(byte xdata*)0x4000) //秒
11 #define MINUTE (*(byte xdata*)0x4002) //分
12 #define HOUR (*(byte xdata*)0x4004) //小时
13 #define DAY (*(byte xdata*)0x4006) //天
14 #define WEEK (*(byte xdata*)0x4007) //星期
15 #define MONTH (*(byte xdata*)0x4008) //月
16 #define YEAR (*(byte xdata*)0x4009) //年
17 #define MCA (*(byte xdata*)0x400a) //寄存器A
18 #define MCB (*(byte xdata*)0x400b) //寄存器B
19 #define MCC (*(byte xdata*)0x400c) //寄存器C
20 #define MCD (*(byte xdata*)0x400d) //寄存器D
21
22 #define TIMES ((byte xdata*)0x400e) //开关时间及次第保存地址
23
24 #define DAY_SUM ((byte xdata*)0x407c) //继电器闭合总天数
25 #define PRESS_SUM ((byte xdata*)0x407d) //继电器闭合总次数
26 #define CUR_DAY ((byte xdata*)0x407e) //上次中断日期
27
28 /*byte code ASC2[19][5]={ //各字符对应的ASC2码
29 { 49,130,131,132,133 }, //1 R L U D_ARROW
30 { 50,65,66,67,35 }, //2 A B C #
31 { 51,68,69,70,63 }, //3 D E F ?
32 { 52,71,72,73,33 }, //4 G H I !
33 { 53,74,75,76,60 }, //5 J K L <
34 { 54,77,78,79,62 }, //6 M N O >
35 { 55,80,81,82,83 }, //7 P Q R S
36 { 56,84,85,86,44 }, //8 T U V ,
37 { 57,87,88,89,90 }, //9 W X Y Z
38 { 50,97,98,99,35 }, //2 a b c #
39 { 51,100,101,102,63 }, //3 d e f ?
40 { 52,103,104,105,33 }, //4 g h i !
41 { 53,106,107,108,60 }, //5 j k l <
42 { 54,109,110,111,62 }, //6 m n o >
43 { 55,112,113,114,115}, //7 p q r s
44 { 56,116,117,118,44 }, //8 t u v ,
45 { 57,119,120,121,122 }, //9 w x y z
46 { 41,38,36,32,37}, // $ ¥ 空格 %
47 { 48,43,45,47,92 }};//0 + - / \* */
48
49 byte lcddata,datadr,last_day,last_hour,last_minute,key_num,move_num,press_num,days_sum;
50 byte last_num,timeout,tiancha,check_num,num1,num2,num3;
51 sbit RS=P3^4;
52 sbit RW=P3^5;
53 sbit E=P3^3;
54 //sbit sqwe_flag=P2^5;
55 sbit int0_flag=P2^6;
C51 COMPILER V7.05 CLOSETEST 11/25/2003 23:29:19 PAGE 2
56 sbit uip_bit=ACC^7;
57 bit busy_flag,changetime_flag,checktime_flag,key_flag,close_flag,flash_flag,del_flag,daycheck_flag;//sqw_f
-lag;
58 //////////////////////////////////////////////////////////////////////////
59 void delay(){//延时子程序
60 1 byte d=8;
61 1 while(d)d--;
62 1 }
63 void timer0_isr() interrupt 1 using 1{ //定时器中断程序入口*/
64 1 TR0=0; //定时1毫秒进入中断*/
65 1 TH0=-(DLY_1MS/256);
66 1 TL0=-(DLY_1MS%256);
67 1 TR0=1; //1毫秒中断次数加1*/
68 1 num1++;
69 1 if (num1==100) //100毫秒定时到*/
70 1 {
71 2 num1=0;num2++;num3++;
72 2 }
73 1 if(num2==5) //500ms延时*/
74 1 {
75 2 flash_flag=~flash_flag;num2=0;
76 2 }
77 1 if(num3==20){ //2s检测一次日期变化
78 2 daycheck_flag=1;num3=0;
79 2 }
80 1 }
81 void check(){//忙状态检测子程序
82 1 byte d;
83 1 RS=0;
84 1 RW=1;
85 1 E=0;
86 1 E=1;
87 1 d=P1&0x80;
88 1 E=0;
89 1 if(d!=0) busy_flag=1;
90 1 else busy_flag=0;
91 1 }
92 void check_busy(){//等待直到可以写入
93 1 do{
94 2 check();
95 2 }while(busy_flag);
96 1 }
97 void write_data(){//数据写入子程序
98 1 check_busy();
99 1 E=0;
100 1 RS=1;
101 1 RW=0;
102 1 E=1;
103 1 P1=lcddata;
104 1 E=0;
105 1 delay();
106 1 }
107 void write_dr(){//数据写入地址指定,从0x00---0x13,0x40---0x53
108 1 check_busy();
109 1 E=0;
110 1 RS=0;
111 1 RW=0;
112 1 E=1;
113 1 P1=0x80+datadr;
114 1 E=0;
115 1 delay();
116 1 }
C51 COMPILER V7.05 CLOSETEST 11/25/2003 23:29:19 PAGE 3
117 void clr_lcd(){//清屏子程序
118 1 check_busy();
119 1 E=0;
120 1 RS=0;
121 1 RW=0;
122 1 E=1;
123 1 P1=0x01;
124 1 E=0;
125 1 delay();
126 1 }
127 void set_lcd(){//lcd屏设置为8位,2行,5*7点矩阵
128 1 check_busy();
129 1 RS=0;
130 1 RW=0;
131 1 E=1;
132 1 P1=0x38;
133 1 E=0;
134 1 delay();
135 1 }
136 void lcd_on(){//lcd屏点亮,显示
137 1 check_busy();
138 1 RS=0;
139 1 RW=0;
140 1 E=1;
141 1 P1=0x0c;
142 1 E=0;
143 1 delay();
144 1 }
145 void lcd_off(){//lcd屏熄灭,不显示
146 1 check_busy();
147 1 RS=0;
148 1 RW=0;
149 1 E=1;
150 1 P1=0x08;
151 1 E=0;
152 1 delay();
153 1 }
154 void cursor_move(){//光标移动模式设定
155 1 check_busy();
156 1 RS=0;
157 1 RW=0;
158 1 E=1;
159 1 P1=0x06;
160 1 E=0;
161 1 }
162 void start_lcd(){//lcd初始化
163 1 set_lcd();
164 1 lcd_off();
165 1 cursor_move();
166 1 }
167 void read_initstat(){//时钟芯片忙检测
168 1 do{
169 2 ACC=MCA;
170 2 }while(uip_bit);
171 1 }
172 void int0_place(){//继电器按下一次总次数和上次按下时间改变
173 1 byte i,j,a,y,z;
174 1 if(!close_flag){//第一次按下继电器
175 2 last_hour=HOUR;
176 2 last_minute=MINUTE;
177 2 //MCB=0x80;
178 2 if((*DAY_SUM==0)||(*DAY_SUM==1)){//总天数尚为0,第一次
C51 COMPILER V7.05 CLOSETEST 11/25/2003 23:29:19 PAGE 4
179 3 j=*(TIMES+1);//当天的按键次数加1
180 3 if(j<54){
181 4 j++;
182 4 *(TIMES+1)=j;
183 4 }
184 3 *DAY_SUM=1;
185 3 *TIMES=0;
186 3 i=*PRESS_SUM;
187 3 if(i<54){
188 4 i++;
189 4 *PRESS_SUM=i;
190 4 }
191 3 for(z=0;z<2*(*PRESS_SUM);z++){
192 4 *(TIMES+2*(*PRESS_SUM)+3-z)=*(TIMES+2*(*PRESS_SUM)+1-z);
193 4 }
194 3 *TIMES=0;
195 3 *(TIMES+2)=last_hour;
196 3 *(TIMES+3)=last_minute;
197 3 //MCB=0x20;
198 3 }
199 2 else if(*DAY_SUM>1){//非第一天
200 3 if((2*(*PRESS_SUM)+2*(*DAY_SUM))<109){
201 4 for(y=0;y<2*(*PRESS_SUM);y++){
202 5 *(TIMES+2*(*DAY_SUM)+2*(*PRESS_SUM)+1-y)=*(TIMES+2*(*DAY_SUM)+2*(*PRESS_SUM)-1-y);
203 5 }
204 4 *TIMES=0;
205 4 a=*(TIMES+1);
206 4 a++;
207 4 *(TIMES+1)=a;
208 4 y=*PRESS_SUM;
209 4 y++;
210 4 *PRESS_SUM=y;
211 4 }
212 3 else if((2*(*PRESS_SUM)+2*(*DAY_SUM))>=110){
213 4 for(y=0;y<2*(*PRESS_SUM)-2;y++){
214 5 *(TIMES+109-y)=*(TIMES+109-2-y);
215 5 }
216 4 z=*(TIMES+2*(*DAY_SUM)-1);
217 4 if(z>1){
218 5 z--;
219 5 *(TIMES+2*(*DAY_SUM)-1)=z;
220 5 }
221 4 else if(z==1){
222 5 for(y=0;y<2*(*PRESS_SUM-1);y++){
223 6 *(TIMES+2*(*DAY_SUM-1)+y)=*(TIMES+2*(*DAY_SUM-1)+2+y);
224 6 }
225 5 i=*DAY_SUM;
226 5 i--;
227 5 *DAY_SUM=i;
228 5 i=*PRESS_SUM;
229 5 i--;
230 5 *PRESS_SUM=i;
231 5 }
232 4 else if(z==0){
233 5 for(y=0;y<2*(*PRESS_SUM-1);y++){
234 6 *(TIMES+2*(*DAY_SUM-1)+y)=*(TIMES+2*(*DAY_SUM-1)+2+y);
235 6 }
236 5 i=*DAY_SUM;
237 5 i--;
238 5 *DAY_SUM=i;
239 5 }
240 4 *TIMES=0;
C51 COMPILER V7.05 CLOSETEST 11/25/2003 23:29:19 PAGE 5
241 4 a=*(TIMES+1);
242 4 a++;
243 4 *(TIMES+1)=a;
244 4 }
245 3 *(TIMES+2*(*DAY_SUM))=last_hour;
246 3 *(TIMES+2*(*DAY_SUM)+1)=last_minute;
247 3 }
248 2
249 2 datadr=0x46;//清除以前的次数10位
250 2 write_dr();
251 2 lcddata=0x20;
252 2 write_data();
253 2 datadr=0x46;//写入新的次数10位
254 2 write_dr();
255 2 lcddata=0x30+*(TIMES+1)/10;
256 2 write_data();
257 2
258 2 datadr=0x47;//清除以前的次数个位
259 2 write_dr();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -