📄 main.lst
字号:
C51 COMPILER V9.02 MAIN 11/08/2012 21:34:06 PAGE 1
C51 COMPILER V9.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN ..\output\main.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\source\main.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(..\outpu
-t\main.lst) OBJECT(..\output\main.obj)
line level source
1 /*
2 **********************************************************************************************************
-***
3 * Kingst-51
4 * Development board samples
5 *
6 * (c) Copyright 2009-2012, Kingst Studio
7 * All Rights Reserved
8 *
9 * http://www.kingst.org
10 * 文件名:main.c
11 * 描 述:工程主文件
12 * 版本号:1.0.0
13 **********************************************************************************************************
-***
14 */
15 #define _MAIN_C
16 #include <string.h>
17 #include "config.h"
18 #include "main.h"
19 #include "UartCom.h"
20 #include "KeyBoard.h"
21 #include "Lcd1602.h"
22 #include "LedNumber.h"
23
24
25 /*
26 ********************************************************************************
27 * ----------------------- Local variables -------------------------------------
28 ********************************************************************************
29 */
30 /* 通信命令与其响应函数的封装结构 */
31 typedef struct _sComAnswer{
32 const uint8 *cmdstr; //命令字符串的指针
33 const uint8 cmdlen; //命令字符串的长度
34 void (*answer) (uint8 *para, int8 len); //响应函数的指针
35 } sComAnswer;
36
37 /* 蜂鸣器开关状态的枚举类型 */
38 typedef enum {
39 BUZZ_OFF, BUZZ_ON
40 } eBuzzSwitch;
41 static bit BuzzSwitch = BUZZ_OFF; //蜂鸣器开关状态
42
43 static bit flag100ms = 0; //100ms定时间隔标志
44 static bit staStopwatch = 1; //秒表状态
45 static uint32 tmrStopwatch = 0; //秒表定时器
46
47
48 /*
49 ***************************************************************************************************
50 * ---------------------------------- Source codes ------------------------------------------------
51 ***************************************************************************************************
52 */
C51 COMPILER V9.02 MAIN 11/08/2012 21:34:06 PAGE 2
53 void ComHandle(void);
54 void Stopwatch(void);
55
56
57 /*
58 *==============================================================================
59 * 函数名:main
60 * 描 述:C语言main函数,即程序执行入口
61 *==============================================================================
62 */
63 void main (void)
64 {
65 1 /* 配置T0作为系统定时器 */
66 1 TMOD &= 0xF0;
67 1 TMOD |= 0x01;
68 1 ET0 = 1;
69 1 TR0 = 1;
70 1
71 1 UartComInit();
72 1 Lcd1602Init();
73 1 LedNumberInit();
74 1
75 1 /* 使能中断,开始主循环 */
76 1 EA = 1;
77 1 while(1) {
78 2 KeyHandle();
79 2 ComHandle();
80 2 Stopwatch();
81 2 }
82 1 }
83
84
85 /*
86 * 描 述:以下皆为串口命令响应函数,参数相同,功能见各自开头的描述
87 * 输 入:para - 串口命令之后附带的参数指针
88 * len - 参数长度
89 * 输 出:无
90 */
91 /* 回传命令,将命令码之后的字符回传给上位机 */
92 void ComCallback(uint8 *para, int8 len)
93 {
94 1 if (len > 0) {
95 2 UartWrite(para, len);
96 2 }
97 1 else {
98 2 UartWrite("none\r\n", sizeof("none\r\n")-1);
99 2 }
100 1 }
101 /* 蜂鸣器开关命令,控制蜂鸣器鸣叫的开启和关闭 */
102 void ComBuzzSwitch(uint8 *para, int8 len)
103 {
104 1 para++; //消除编译器警告
105 1 len++; //消除编译器警告
106 1 if (BuzzSwitch == BUZZ_OFF) {
107 2 BuzzSwitch = BUZZ_ON;
108 2 UartWrite("turn on\r\n", sizeof("turn on\r\n")-1);
109 2 }
110 1 else {
111 2 BuzzSwitch = BUZZ_OFF;
112 2 UartWrite("turn off\r\n", sizeof("turn off\r\n")-1);
113 2 }
114 1 }
C51 COMPILER V9.02 MAIN 11/08/2012 21:34:06 PAGE 3
115 /* 字符串显示命令,在液晶上显示命令码之后的字符串 */
116 void ComShowString(uint8 *para, int8 len)
117 {
118 1 if ((*para==' ') && (len>1)) {
119 2 /* 显示命令码之后的字符 */
120 2 para++;
121 2 len--;
122 2 *(para+len) = '\0';
123 2 Lcd1602ShowStr(para, 0, 0);
124 2 /* 不满一行时清楚屏幕后续字符位 */
125 2 if (len < 16) {
126 3 Lcd1602Clear(len, 0, 16-len);
127 3 }
128 2 UartWrite("complete\r\n", sizeof("complete\r\n")-1);
129 2 }
130 1 else {
131 2 UartWrite("error\r\n", sizeof("error\r\n")-1);
132 2 }
133 1 }
134
135 /*
136 * 函数名:ComHandle
137 * 描 述:串口通信命令解析处理函数
138 */
139 void ComHandle(void)
140 {
141 1 int8 i,len;
142 1 uint8 xdata buff[40];
143 1
144 1 /* 可响应的所有命令列表 */
145 1 const sComAnswer code ca[] = {
146 1 {"callback", sizeof("callback")-1, ComCallback},
147 1 {"buzz switch", sizeof("buzz switch")-1, ComBuzzSwitch},
148 1 {"showstr", sizeof("showstr")-1, ComShowString}
149 1 };
150 1
151 1 /* 监控串口接收状态 */
152 1 if (UartRxSta == RX_NONE) {
153 2 return;
154 2 }
155 1 UartRxSta = RX_NONE;
156 1
157 1 /* 接收完一帧命令后处理该命令 */
158 1 len = UartRead(buff, sizeof(buff));
159 1 for (i=0; i<ArraySize(ca); i++) {
160 2 if (memcmp(buff, ca[i].cmdstr, ca[i].cmdlen) == 0) {
161 3 ca[i].answer(buff+ca[i].cmdlen, len-ca[i].cmdlen);
162 3 return;
163 3 }
164 2 }
165 1
166 1 /* 命令不在支持列表中时返回"无效命令"信息 */
167 1 if (i >= ArraySize(ca)) {
168 2 UartWrite("invalid command\r\n", sizeof("invalid command\r\n")-1);
169 2 }
170 1 }
171
172
173 /*
174 * 函数名:Stopwatch
175 * 描 述:秒表功能函数
176 */
C51 COMPILER V9.02 MAIN 11/08/2012 21:34:06 PAGE 4
177 void Stopwatch(void)
178 {
179 1 if (flag100ms) {
180 2 flag100ms = 0;
181 2 /* 每隔100ms,秒表计数器+1 */
182 2 if (staStopwatch) {
183 3 tmrStopwatch++;
184 3 }
185 2 /* 秒表计数器当前值显示在数码管上 */
186 2 LedNumberShow(tmrStopwatch, 1);
187 2 }
188 1 }
189 /*
190 * 函数名:ResetStopwatch
191 * 描 述:重置秒表,定时器归零
192 */
193 void ResetStopwatch(void)
194 {
195 1 staStopwatch = 0;
196 1 tmrStopwatch = 0;
197 1 }
198 /*
199 * 函数名:KickStopwatch
200 * 描 述:启动/停止秒表计数
201 */
202 void KickStopwatch(void)
203 {
204 1 staStopwatch = ~staStopwatch;
205 1 }
206
207
208
209 /*
210 * 函数名:Timer0_ISR
211 * 描 述:Timer0定时中断服务函数
212 */
213 void Timer0_ISR() interrupt 1
214 {
215 1 static uint8 t100ms = 0;
216 1
217 1 /* Timer1定时1ms */
218 1 TL0 = (uint8)((65535 - SYS_MCLK/1000) + 18);
219 1 TH0 = (uint8)(((65535 - SYS_MCLK/1000) + 18) >> 8);
220 1
221 1 /* 蜂鸣器控制 */
222 1 if (BuzzSwitch == BUZZ_ON) {
223 2 BUZZ_CTRL = 0;
224 2 }
225 1
226 1 /* 100ms定时标志处理 */
227 1 t100ms++;
228 1 if (t100ms >= 100) {
229 2 t100ms = 0;
230 2 flag100ms = 1;
231 2 }
232 1
233 1 /* 其他需定时处理的函数 */
234 1 KeyScan();
235 1 LedNumberScan();
236 1 UartRxMonitor(1);
237 1
238 1 BUZZ_CTRL = 1;
C51 COMPILER V9.02 MAIN 11/08/2012 21:34:06 PAGE 5
239 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 592 ----
CONSTANT SIZE = 115 ----
XDATA SIZE = ---- 40
PDATA SIZE = ---- ----
DATA SIZE = 5 6
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -