📄 system.lst
字号:
C51 COMPILER V7.01 SYSTEM 06/30/2007 11:42:50 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE SYSTEM
OBJECT MODULE PLACED IN System.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE System.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "System.h"
2
3 //25ms定时器2计数值=0x10000-22.1184M/12/40
4 #define T2L_VAL 0x00
5 #define T2H_VAL 0x4C
6
7 unsigned char CheckKeyF=0; //键盘检测标志位
8 unsigned int counter=0; //T2计数器,25ms++
9 unsigned int Mycounter; //计数器,用于用户定时
10 unsigned char Myflag=0; //用户定时标志
11
12 //键盘数据结构
13 struct KeyStruct Key[8];
14
15 void delay(int n) //延时函数
16 {
17 1 int i=0;
18 1 while(i<n) i++;
19 1 }
20
21 #define XBARE 0x40 //ENABLE XBR, set XBR2.6 = 1
22 //配置交叉开关和I/O口
23 void PORT_INIT()
24 {
25 1 SFRPAGE = CONFIG_PAGE;
26 1 /* XBR0 control follow digital utils
27 1 uart0:xbr0.2->p0.0,p0.1
28 1 spi0:xbr0.1->p0.2,p0.3,p0.4,(p0.5)
29 1 smb0:xbr0.0->p0.6,p0.7
30 1 */
31 1 XBR0 = 0x07;
32 1
33 1 /*XBR2 control follows
34 1 UART1:xbr2.2->p1.0,p1.1
35 1 */
36 1 XBR2 = 0x4;
37 1
38 1 // set P1MDIN.2 to ADC2-in, skip p1.2 pin
39 1 P1MDIN = 0xFB;
40 1
41 1 /*XBR1 control follows
42 1 T0:XBR1.1->p1.3
43 1 INT0:XBR1.2->p1.4
44 1 */
45 1 XBR1 = 0x06;
46 1 //for test
47 1 // P1MDOUT |= 0x10;
48 1 // XBR1 |= 0x82; //XBR1.7:sysclk->p1.4
49 1
50 1
51 1 //ENABLE switch
52 1 XBR2 |= XBARE;
53 1
54 1 P5MDOUT|=0x0F; //LCD控制信号
55 1 P6MDOUT|=0xFF; //LCD数据信号
C51 COMPILER V7.01 SYSTEM 06/30/2007 11:42:50 PAGE 2
56 1 P7MDOUT|=0x13; //背光,RES,HC157控制
57 1 P3MDOUT|=0x04; //KEY_EN
58 1 }
59
60 //系统时钟初始化
61 void SYSCLK_INIT() //使用外部晶阵22.1184M
62 {
63 1 SFRPAGE = CONFIG_PAGE;
64 1 OSCXCN |=0x67; //使能外部晶阵
65 1 while((OSCXCN & 0x80)==0) //延时,直至外部晶阵就绪
66 1 delay(100);
67 1 CLKSEL |=0x01; //切换到外部时钟
68 1 }
69
70
71 void Timer2_INIT() //16位自动重装模式,产成25ms中断
72 {
73 1 SFRPAGE = TMR2_PAGE;
74 1
75 1 TMR2L=T2L_VAL; //赋值
76 1 TMR2H=T2H_VAL;
77 1 RCAP2L=T2L_VAL;
78 1 RCAP2H=T2H_VAL;
79 1 TMR2CF |=0x01; //SYSCLK/12作为T2输入,向上计数
80 1 TMR2CN &=0xf4; //T2工作模式: 自动重装,计时器,忽略T2EX信号
81 1 ET2=1;
82 1 TR2=1;
83 1 }
84
85 void Timer2_ISR() interrupt 5 //T2 25ms中断
86 {
87 1 TF2=0;
88 1 counter++;
89 1 CheckKeyF=1; //键盘检测
90 1 if(Mycounter==counter)
91 1 Myflag=1; //用户定时到,置位
92 1 }
93
94 void CheckKey() //键盘检测.要求每次按键时间超过100ms;持续按键以每秒4次计算
95 {
96 1 unsigned char data i;
97 1 unsigned char data M=1;
98 1 SFRPAGE = CONFIG_PAGE;
99 1 OE=1; //关闭并口
100 1 Key_En=0; //使能键盘
101 1 P6MDOUT=0x00; //配置P6为数字输入 (数字输入=漏极开路+SFR写1)
102 1 P6=0xff;
103 1 delay(5);
104 1 for(i=0;i<8;i++) //依次检测各键
105 1 {
106 2 if((P6&M)==0) //当前第i位为0
107 2 {
108 3 if(Key[i].pressold==0) //前一次为0
109 3 {
110 4 Key[i].pressing++;
111 4 if(Key[i].pressing==4) Key[i].pressed=1;
112 4 if(Key[i].pressing==10) Key[i].pressing=0; //持续按键以每秒4次计算
113 4 }
114 3 else //前一次为1
115 3 {
116 4 Key[i].pressing=1;
117 4 }
C51 COMPILER V7.01 SYSTEM 06/30/2007 11:42:50 PAGE 3
118 3 Key[i].pressold=0;
119 3 }
120 2 else //当前第i位为1
121 2 {
122 3 if(Key[i].pressold==0) //前一次为0
123 3 {
124 4 Key[i].pressing=0;
125 4 }
126 3 else //前一次为1
127 3 {
128 4
129 4 }
130 3 Key[i].pressold=1;
131 3 }
132 2 M=M<<1;
133 2 }
134 1 CheckKeyF=0;
135 1 Key_En=1;
136 1 P6MDOUT=0xff; //P6置回输出状态
137 1 }
138
139 void Key_INIT()
140 {
141 1 int i;
142 1 for(i=0;i<8;i++)
143 1 {
144 2 Key[i].pressed=0;
145 2 Key[i].pressold=1;
146 2 Key[i].pressing=0;
147 2 }
148 1 }
149
150 void ClearKey()
151 {
152 1 int i;
153 1 for(i=0;i<8;i++)
154 1 {
155 2 Key[i].pressed=0;
156 2 }
157 1 }
158
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 557 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 30 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -