?? better.lst
字號:
C51 COMPILER V8.02 BETTER 05/12/2012 16:30:22 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE BETTER
OBJECT MODULE PLACED IN better.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE better.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #define uint unsigned int// // 定義新類型,方便下次使用
2 #define uchar unsigned char
3 #include"STC12C5A.h"
4 #include <intrins.h>
5 #define WaitTime 0x01
6 #define ENABLE_IAP 0x82
7 #define address 0x2800
8 #define CMD_IDLE 0// //定義時鐘頻率
9 #define CMD_READ 1// //讀命令
10 #define CMD_PROGRAM 2// //寫命令
11 #define CMD_ERASE 3// //擦除命令,一般需要幾個毫秒
12 sbit shang=P2^0;// //行列式鍵盤行線的定義
13 sbit xia=P2^1;
14 sbit a =P4^6;// // 數碼管段碼和單片機I/O口的對應關系
15 sbit b =P4^5;
16 sbit dp =P2^4;
17 sbit d =P2^6;
18 sbit e =P2^7;
19 sbit g =P0^6;
20 sbit f =P0^7;
21 sbit c =P2^5;
22 sbit P44=P4^4;// //74hc244片選信號
23 sbit SMG_1=P0^1;// //數碼管位選信號
24 sbit SMG_2=P0^2;
25 sbit SMG_3=P0^3;
26 sbit SMG_4=P0^4;
27 sbit SMG_5=P0^5;
28 sbit SMG_6=P0^0;
29 sbit P3_6=P3^6;// //鍵盤列線的定義
30 sbit P3_7=P3^7;
31 sbit P2_3=P2^3;
32 sbit P2_2=P2^2;
33 void display(uint cha);
34 void start();
35 void delay(uint time);
36 void disable();
37 void enable();
38 void IapIdle();
39 uint IapReadByte(uint addr);
40 void IapProgramByte(uint addr, uchar dat);
41 void IapEraseSector(uint addr);
42 void INT0_init();
43 void INT0time() ;
44 void systeminit();
45 static uint cha;
46 static long int yichu;// //時間計數,一旦達到設定值,關閉數碼管
47 static bit state;
48 void main(void)
49 {
50 1 uchar t;
51 1 shang=0;xia=0;
52 1 systeminit();// //系統初始化函數,stc12c5a62s2單片機的I/O口工作方式的設定
53 1 start();// //系統顯示校驗函數,這里會從9顯示到0,最后顯示上一次的數碼管亮的值
54 1 INT0_init();// //開啟定時器0中斷
55 1 while(1){ // //死循環
C51 COMPILER V8.02 BETTER 05/12/2012 16:30:22 PAGE 2
56 2 if(state==0 ){// //如果狀態0,則執行判鍵及相應的顯示函數
57 3 if(P3_6==0)// //鍵盤1和5的判鍵
58 3 { delay(20);
59 4 if(P3_6==0)
60 4 { shang=1;
61 5 if(P3_6==1)
62 5 cha=1;
63 5 else
64 5 cha=5;
65 5 shang=0;
66 5 }
67 4 }
68 3 if(P3_7==0)// //鍵盤2和6的判鍵
69 3 { delay(20);
70 4 if(P3_7==0)
71 4 { shang=1;
72 5 if(P3_7==1)
73 5 cha=2;
74 5 else
75 5 cha=6;
76 5 shang=0;
77 5 }
78 4 }
79 3 if(P2_3==0)// //鍵盤3和7的判鍵
80 3 { delay(20);
81 4 if(P2_3==0)
82 4 { shang=1;
83 5 if(P2_3==1)
84 5 cha=3;
85 5 else
86 5 cha=7;
87 5 shang=0;
88 5 }
89 4 }
90 3 if(P2_2==0) //鍵盤4的判鍵
91 3 { delay(20);
92 4 if(P2_2==0)
93 4 cha=4; }
94 3 }
95 2 if(!(P2_2==1&&P2_3==1&&P3_6==1&&P3_7==1)) //按鍵按下判定語句
96 2 { yichu=0; //如果有按鍵按下,重新設置溢出值,使達到關狀態的時間相同
97 3 if(state==1){ //如果為關閉狀態
98 4 delay(500); //延時20ms
99 4 if(!(P2_2==1&&P2_3==1&&P3_6==1&&P3_7==1)) //如果有按鍵按下,狀態清零,開始判鍵程序
100 4 state=0;}
101 3 }
102 2 if(yichu>=80000) //達到數碼管關閉時間
103 2 { do{disable();}while(P2_2==1&&P2_3==1&&P3_6==1&&P3_7==1); //若無按鍵按下,則執行關閉語句
104 3 yichu=0; //重設溢出值
105 3 enable(); //點亮數碼管
106 3 state=1; //狀態設1,為關閉后點亮狀態
107 3 }
108 2 if(t!=cha) //如果有不同的鍵按下
109 2 { IapEraseSector(address); //eeprom擦除
110 3 IapProgramByte(address,cha); //eeprom寫
111 3 t=cha; //保存目前的按鍵值,和下一次做比較,看是否要進行寫操作
112 3 }
113 2 }
114 1
115 1 }
116 void systeminit()
117 { P4SW=0x7F;
C51 COMPILER V8.02 BETTER 05/12/2012 16:30:22 PAGE 3
118 1 P0M1=0x00;
119 1 P0M0=0xff;
120 1 P2M1=0x00;
121 1 P2M0=0xff;
122 1 P3M1=0x00;
123 1 P3M0=0xff;
124 1 P4M1=0x00;
125 1 P4M0=0xff;
126 1 P44=0;
127 1 }
128 void display(uint cha) //顯示函數,其中小數點一直關閉
129 {
130 1 switch(cha){
131 2 case 0: a=1;b=1;c=1;d=1;e=1;f=1;g=0;dp=0;break; //顯示數值0
132 2 case 1: a=0;b=1;c=1;d=0;e=0;f=0;g=0;dp=0;break; //顯示數值1
133 2 case 2: a=1;b=1;c=0;d=1;e=1;f=0;g=1;dp=0;break; //顯示數值2
134 2 case 3: a=1;b=1;c=1;d=1;e=0;f=0;g=1;dp=0;break; //顯示數值3
135 2 case 4: a=0;b=1;c=1;d=0;e=0;f=1;g=1;dp=0;break; //顯示數值4
136 2 case 5: a=1;b=0;c=1;d=1;e=0;f=1;g=1;dp=0;break; //顯示數值5
137 2 case 6: a=1;b=0;c=1;d=1;e=1;f=1;g=1;dp=0;break; //顯示數值6
138 2 case 7: a=1;b=1;c=1;d=0;e=0;f=0;g=0;dp=0;break; //顯示數值7
139 2 case 8: a=1;b=1;c=1;d=1;e=1;f=1;g=1;dp=0;break; //顯示數值8
140 2 case 9: a=1;b=1;c=1;d=1;e=0;f=1;g=1;dp=0;break; //顯示數值9
141 2 }
142 1 }
143 void INT0_init() //開啟中斷,每2000/12 us溢出一次
144 { TMOD=0x18;
145 1 TH0=(65536-2000)/256;
146 1 TL0=(65536-2000)%256;
147 1 TR0=1;
148 1 ET0=1;
149 1 EA=1;
150 1 }
151 void start(void) //系統初始顯示函數
152 {
153 1 uchar time=100;
154 1 char i;
155 1 shang=0;xia=0;
156 1 enable();
157 1 for(i=9;i>=0;i--) //顯示數字9-0
158 1 { display(i);
159 2 delay(3000);
160 2 }
161 1 do{display(IapReadByte(address));yichu--;}while((P3_6&&P3_7&&P2_3&&P2_2==1)); //如無按鍵按下,則
-顯示上一次保存的數值
162 1 }
163 void delay(uint time ) //延時函數
164 {
165 1 unsigned long int j=time*40;
166 1 do{
167 2 ; }while(j--);
168 1 }
169 void disable() //數碼管關閉
170 {
171 1 SMG_1=0;
172 1 SMG_2=0;
173 1 SMG_3=0;
174 1 SMG_4=0;
175 1 SMG_5=0;
176 1 SMG_6=0;
177 1 }
178 void enable() //數碼管開啟顯示
C51 COMPILER V8.02 BETTER 05/12/2012 16:30:22 PAGE 4
179 {
180 1 SMG_1=1;
181 1 SMG_2=1;
182 1 SMG_3=1;
183 1 SMG_4=1;
184 1 SMG_5=1;
185 1 SMG_6=1;
186 1 }
187 void INT0time() interrupt 1 //定時器中斷0
188 { static uchar liangdu;
189 1 TH0=(65536-2000)/256;
190 1 TL0=(65536-2000)%256;
191 1 display(cha);
192 1 liangdu++;
193 1 if(liangdu<=2*cha) //pwm控制程序,其中數字1亮度最小,占空比最小
194 1 P44=0;
195 1 else
196 1 {
197 2 P44=1;
198 2 if(liangdu==15)
199 2 liangdu=0;
200 2 }
201 1 yichu++; //每溢出一次,溢出次數加一
202 1
203 1 }
204
205 void IapIdle() //eeprom初始函數
206 { IAP_CONTR = 0;
207 1 IAP_CMD = 0;
208 1 IAP_TRIG = 0;
209 1 IAP_ADDRH = 0x80;
210 1 IAP_ADDRL = 0;
211 1 }
212 uint IapReadByte(uint addr)
213 { uint dat;
214 1 IAP_CONTR =ENABLE_IAP;
215 1 IAP_CMD = CMD_READ;
216 1 IAP_ADDRL = addr;
217 1 IAP_ADDRH = addr >> 8;
218 1 IAP_TRIG = 0x5a; //因為是IAP單片機,所以觸發命令有所不同
219 1 IAP_TRIG = 0xa5;
220 1 _nop_();
221 1 dat = IAP_DATA;
222 1 IapIdle();
223 1 return dat;
224 1 }
225 void IapProgramByte(uint addr,uchar dat) //eeprom寫函數
226 {IAP_CONTR = ENABLE_IAP;
227 1 IAP_CMD = CMD_PROGRAM;
228 1 IAP_ADDRL = addr;
229 1 IAP_ADDRH = addr >> 8;
230 1 IAP_DATA = dat;
231 1 IAP_TRIG = 0x5a;
232 1 IAP_TRIG = 0xa5;
233 1 _nop_();
234 1 IapIdle();
235 1 }
236 void IapEraseSector(uint addr) //eeprom扇區擦出函數
237 {IAP_CONTR = ENABLE_IAP;
238 1 IAP_CMD = CMD_ERASE;
239 1 IAP_ADDRH=addr>>8;
240 1 IAP_ADDRL=addr;
C51 COMPILER V8.02 BETTER 05/12/2012 16:30:22 PAGE 5
241 1 IAP_TRIG = 0x5a;
242 1 IAP_TRIG = 0xa5;
243 1 _nop_();
244 1 IapIdle();
245 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 834 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 7
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -