📄 test51.lst
字号:
C51 COMPILER V7.50 TEST51 12/02/2007 23:53:05 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEST51
OBJECT MODULE PLACED IN test51.OBJ
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE test51.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 ****************************************************************************************************
3 * 沈阳市万柳塘路56号
4 * (c)著作权2005,世信汇诚电子版权所有
5 * 世信汇诚电子的源代码是不公开, 属于世信汇诚电子的企业机密文件, 任何未经允许使用
6 * 或发表的行为都是违法行,任何个人或组织尝试或者参与修改源代码的行为,都应尽早得到世信
7 * 汇诚电子设计组的同意.
8 *
9 * 版本号:1.0
10 * 作 者:linan4526
11 * 日 期:2005-05-08
12 *---------------------------------------------------------------------------------------------------
13 * 描 述:SXHC-I型MCU51实验
14 ****************************************************************************************************
15 */
16 #include <test51.h>
17 /**********************************************************************
18 函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)
19 入口参数: 无
20 出口参数: 无
21 ***********************************************************************/
22 void Time0_Func() interrupt 1
23 {
24 1 TH0=(0xffff-9259)/256;
25 1 TL0=(0xffff-9259)%256;
26 1 Key_Scan();
27 1 Disp_Func();
28 1 }
29 /**********************************************************************
30 函数功能: 显示刷新函数
31 入口参数: 无
32 出口参数: 无
33 ***********************************************************************/
34 void Disp_Func(void)
35 {
36 1 P0=0xff; /*清除显示*/
37 1 P0=g_bpDisp[g_bCurrent_Local];/*显示段码*/
38 1 if (g_bCurrent_Local)/*刷新DS2*/
39 1 {
40 2 Setb_Func(DS1_CS);
41 2 Clr_Func(DS2_CS);
42 2 g_bCurrent_Local=0;
43 2 }
44 1 else/*刷新DS1*/
45 1 {
46 2 Setb_Func(DS2_CS);
47 2 Clr_Func(DS1_CS);
48 2 g_bCurrent_Local=1;
49 2 }
50 1 P2=g_bP2_Io;/*更新P2口状态*/
51 1 }
52 /**********************************************************************
53 函数功能: 清相应IO口函数(仅限中断服务函数使用)
54 入口参数: bPort:相应IO口
55 出口参数: 无
C51 COMPILER V7.50 TEST51 12/02/2007 23:53:05 PAGE 2
56 ***********************************************************************/
57 void Clr_Func(byte bPort)
58 {
59 1 bit btEa_Bak;
60 1
61 1 btEa_Bak=EA;
62 1 EA=0;
63 1 bPort =~ bPort;
64 1 g_bP2_Io &= bPort;
65 1 EA=btEa_Bak;
66 1 }
67 /**********************************************************************
68 函数功能: 置相应IO口函数(仅限中断服务函数使用)
69 入口参数: bPort:相应IO口
70 出口参数: 无
71 ***********************************************************************/
72 void Setb_Func(byte bPort)
73 {
74 1 bit btEa_Bak;
75 1
76 1 btEa_Bak=EA;
77 1 EA=0;
78 1 g_bP2_Io |= bPort;
79 1 EA=btEa_Bak;
80 1 }
81 /**********************************************************************
82 函数功能: 判断行列键是否有键函数
83 入口参数: 无
84 出口参数: 0/1 无键/有键
85 ***********************************************************************/
86 byte Key_Func(void)
87 {
88 1 byte bI;
89 1
90 1 Clr_Func(KEY_OUT1);
91 1 Clr_Func(KEY_OUT2);
92 1 P2 = g_bP2_Io;
93 1 bI=P2;
94 1 if ((bI&KEY_IN1) && (bI&KEY_IN2))
95 1 return 0;
96 1 else
97 1 return 1;
98 1 }
99 /**********************************************************************
100 函数功能: 行列键盘扫描函数
101 入口参数: 无
102 出口参数: 0/1 无键/有键
103 ***********************************************************************/
104 void Key_Scan(void)
105 {
106 1 byte bK,bKey,bLine,bRow;
107 1
108 1 if (Key_Func())
109 1 {
110 2 if (g_btKey_Press || g_btKey_Flag)
111 2 { /*键盘未抬起或键值未处理则不扫描键盘*/
112 3 return;
113 3 }
114 2 Setb_Func(KEY_OUT2);
115 2 for (bRow=0; bRow<2; bRow++)
116 2 {
117 3 if (bRow)
C51 COMPILER V7.50 TEST51 12/02/2007 23:53:05 PAGE 3
118 3 {
119 4 Setb_Func(KEY_OUT1);
120 4 Clr_Func(KEY_OUT2);
121 4 }
122 3 P2=g_bP2_Io;
123 3 bK=P2;
124 3 bK &=(KEY_IN1 | KEY_IN2);
125 3 bK>>=2;
126 3 switch (bK)
127 3 {
128 4 case 1:
129 4 bLine=0;
130 4 break;
131 4 case 2:
132 4 bLine=1;
133 4 break;
134 4 default :
135 4 bLine=0xff;
136 4 break;
137 4 }
138 3 if (bLine!=0xff)
139 3 {
140 4 bKey=bLine+bRow*2;/*扫描到键值*/
141 4 break;
142 4 }
143 3 }
144 2 if (g_bKey_Bak != bKey)/*为去抖而备份当前按键*/
145 2 {
146 3 g_bKey_Time=0;
147 3 g_bKey_Bak=bKey;
148 3 }
149 2 else
150 2 {
151 3 if (g_bKey_Time==2)/*去抖有效*/
152 3 {
153 4 g_bKey=g_bKey_Bak;
154 4 g_bKey_Bak=0xff;
155 4 g_btKey_Press=1;
156 4 g_btKey_Flag=1;
157 4 Clr_Func(BELL_ON);
158 4 }
159 3 else/*去抖*/
160 3 g_bKey_Time++;
161 3 }
162 2 }
163 1 else/*按键抬起*/
164 1 {
165 2 g_btKey_Press=0;
166 2 Setb_Func(BELL_ON);
167 2 }
168 1 }
169 /**********************************************************************
170 函数功能: 扫描键盘函数
171 入口参数: bFlag:0/1 死等/不死等
172 出口参数: 0/1 无键值/有键值
173 ***********************************************************************/
174 byte Wait_Key(byte bFlag)
175 {
176 1 if (bFlag)
177 1 {
178 2 if (g_btKey_Flag)
179 2 {
C51 COMPILER V7.50 TEST51 12/02/2007 23:53:05 PAGE 4
180 3 g_btKey_Flag=0;
181 3 return 1;
182 3 }
183 2 else
184 2 return 0;
185 2 }
186 1 else
187 1 {
188 2 while (!g_btKey_Flag);
189 2 g_btKey_Flag=0;
190 2 return 1;
191 2 }
192 1 }
193 /**********************************************************************
194 函数功能: 转换显示数据函数
195 入口参数: bDisp_Data 显示数据0~99
196 出口参数: 无
197 ***********************************************************************/
198 void Hex_To_Disp(byte bDisp_Data)
199 {
200 1 byte bI,bJ,bpDisp[2];
201 1
202 1 if (bDisp_Data<100)
203 1 {
204 2 bI=Bin_Bcd_Func((dword)bDisp_Data,bpDisp);/*二进制转十进制*/
205 2 for (bJ=0; bJ<bI; bJ++)/*查找显示段码*/
206 2 {
207 3 bpDisp[bJ]=g_bpDisp_Seg[bpDisp[bJ]];
208 3 }
209 2 if (bI==1)
210 2 { /*如果转换十进制结果为一位,则将此位移到个位*/
211 3 Right_Move(bpDisp,1,1,g_bpDisp_Seg[0]);
212 3 }
213 2 while (g_bCurrent_Local);/*等待上次数据显示完*/
214 2 ET0=0;
215 2 Init_Array_Func(2,g_bpDisp,0xff);
216 2 for ( bJ=0; bJ<2; bJ++)/*更新显示数据*/
217 2 g_bpDisp[bJ]=bpDisp[bJ];
218 2 ET0=1;
219 2 }
220 1 }
221 /**********************************************************************
222 函数功能: 上电初始化函数
223 入口参数: 无
224 出口参数: 无
225 ***********************************************************************/
226 void Power_Up(void)
227 {
228 1 TMOD = 0x01;/*Time0为16位*/
229 1 TH0=(0xffff-9259)/256;
230 1 TL0=(0xffff-9259)%256;
231 1 IE=0x82; /*开启定时器中断0*/
232 1 TR0=1;
233 1 g_bP2_Io=0xff;
234 1 g_bKey_Bak=0xff;
235 1 }
236 /**********************************************************************
237 函数功能: 主函数
238 入口参数: 无
239 出口参数: 无
240 ***********************************************************************/
241 void main()
C51 COMPILER V7.50 TEST51 12/02/2007 23:53:05 PAGE 5
242 {
243 1 Power_Up();
244 1 while (1)
245 1 {
246 2 if (Wait_Key(0))
247 2 {
248 3 Hex_To_Disp(g_bKey);/*显示当前键值*/
249 3 }
250 2 }
251 1 }
252
C51 COMPILER V7.50 TEST51 12/02/2007 23:53:05 PAGE 6
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION Time0_Func (BEGIN)
0000 C0E0 PUSH ACC
0002 C0F0 PUSH B
0004 C083 PUSH DPH
0006 C082 PUSH DPL
0008 C0D0 PUSH PSW
000A 75D000 MOV PSW,#00H
000D C000 PUSH AR0
000F C001 PUSH AR1
0011 C002 PUSH AR2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -