📄 main.lst
字号:
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 1
ARM COMPILER V2.42, COMPILATION OF MODULE main
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\ARM\BIN\CA.exe main.c THUMB OPTIMIZE(7,SPEED) BROWSE DEBUG TABS(4)
stmt level source
1 /*--------------------------------------------------------
2 ARTX水鸟LPC2131板实验笔记
3 HotPower@126.com 2006.1.15 03:18 于西安大雁塔村队部
4 ---------------------------------------------------------*/
5 #include <ARTX.h>
6 #include <LPC213x.H> // Philips Peripheral Registers
7 #include <LPC213xDEF.H> //ARM菜鸟HotPower创建定义文件(新版)
8 #include <main.h>
9 #include <string.h>
10 #include <stdio.h>
11
12 #pragma NOINIT
13
14 #define LcdSSP //LCD硬件用SSP接口
15
16
17 volatile unsigned int SystemRamTest;
18
19 LcdData LcdBuffers;
20
21 OS_TID Main_Task, Key_Task, Led_Task, Lednum_Task, Beep_Task, Lcd_Task, Adc_Task;
22
23 void MainTask (void) __task;
24 void KeyTask (void) __task;
25 void LedTask (void) __task;
26 void LednumTask (void) __task;
27 void BeepTask (void) __task;
28 void LcdTask (void) __task;
29 void AdcTask (void) __task;
30
31 void SystemInit(void);
32 void KeyInit(void);
33 void LcdInit(void);
34 void LedInit(void);
35 void LednumInit(void);
36 void BeepInit(void);
37 void AdcInit(void);
38
39
40
41 void MSPI_Init(void);
42 unsigned char MSPI_SendData(unsigned char);
43 void LedDisplay(unsigned char);
44 void SSP_Init(void);
45 uint8 SSP_SendData(uint8);
46 void MSSP_Init(void);
47 uint8 MSSP_SendData(uint8);
48 void LcdSendCommand(unsigned char);
49 void LcdSendData(unsigned char);
50 void _delay_loop_(unsigned int);
51 void LcdClearBuffer(void);
52 void LcdDisplayBuffers(void);
53 void SetLcdDisplayPos(unsigned char, unsigned char);
54 void LcdDisplayString(unsigned char []);
55 uint32 GetAdcVal(unsigned char);
56
57
58 void _delay_loop_(unsigned int val)
59 {
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 2
60 1 unsigned int i;
61 1 for(i = 0; i < val; i ++);
62 1 }
63
64 void AdcInit(void)
65 {
66 1 PINSEL1 |= (P0_28_AD0_1 << P0_28_PINSEL);// P0.28连接到AD0.1
67 1 PINSEL1 |= (P0_30_AD0_3 << P0_30_PINSEL);// P0.30连接到AD0.3
68 1 }
69
70 uint32 GetAdcVal(unsigned char Chnum)
71 {
72 1 uint32 ADC_Data;
73 1 Chnum &= 0x07;//Adc0~Adc7
74 1 /* 进行ADC模块设置 */
75 1 AD0CR = (1 << Chnum) | // SEL=8,选择通道3 不加电容 加电容
76 1 // ((Fpclk / 1000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
77 1 // ((Fpclk / 2000000 - 1) << 8) | // CLKDIV=Fpclk/2000000-1,转换时钟为500KHz(1.511V~1.395V)
78 1 // ((Fpclk / 2500000 - 1) << 8) | // CLKDIV=Fpclk/2500000-1,转换时钟为400KHz(1.508V~1.240V)
79 1 // ((Fpclk / 3333333 - 1) << 8) | // CLKDIV=Fpclk/3333333-1,转换时钟为300KHz(1.506V~1.503V)
80 1 ((Fpclk / 4000000 - 1) << 8) | // CLKDIV=Fpclk/4000000-1,转换时钟为250KHz(1.501V~1.499V)(1.
-503V~1.508V)
81 1 // ((Fpclk / 5000000 - 1) << 8) | // CLKDIV=Fpclk/5000000-1,转换时钟为200KHz(1.508V~1.503V)
82 1 // ((Fpclk / 10000000 - 1) << 8) | // CLKDIV=Fpclk/10000000-1,转换时钟为100KHz(1.487V~1.484V)(1.
-511V~1.513V)
83 1 // ((Fpclk / 100000000 - 1) << 8) | // CLKDIV=Fpclk/100000000-1,转换时钟为10KHz(低频不行)
84 1 (0 << 16) | // BURST=0,软件控制转换操作
85 1 (0 << 17) | // CLKS=0, 使用11clock转换
86 1 (1 << 21) | // PDN=1,正常工作模式
87 1 (0 << 22) | // TEST1:0=00,正常工作模式
88 1 (1 << 24) | // START=1,直接启动ADC转换
89 1 (0 << 27); // 直接启动ADC转换时,此位无效
90 1 _delay_loop_(20);
91 1 ADC_Data = AD0DR; // 读取ADC结果,并清除DONE标志位
92 1 AD0CR |= 1 << 24; // 进行第一次转换
93 1 while ((AD0DR & 0x80000000) == 0); // 等待转换结束
94 1 AD0CR |= 1 << 24; // 再次启动转换
95 1 //必须2次转换,否则差0.1V~0.2V
96 1 while ((AD0DR & 0x80000000) == 0); // 等待转换结束
97 1 ADC_Data = AD0DR; // 读取ADC结果
98 1 ADC_Data = (ADC_Data >> 6) & 0x3ff;
99 1 ADC_Data = ADC_Data * 2480; // 参考电压经过3/4分压
100 1 ADC_Data = ADC_Data / 1024;
101 1 return ADC_Data;
102 1 }
103
104 void LcdClearBuffer(void)//清除屏幕
105 {
106 1 unsigned char i, j;
107 1 for (i = 0;i < 4;i ++) {
108 2 for (j = 0;j < 16; j ++) {
109 3 LcdBuffers.LcdBuff[i][j] = ' ';
110 3 }
111 2 LcdBuffers.LcdBuffWrFlag[i] = 0;
112 2 }
113 1 }
114
115
116
117 void LcdInit(void) {
118 1 #ifdef LcdSSP
119 1 SSP_Init();
120 1 #else
MSSP_Init();
#endif
123 1 /*---------------------------------------------------
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 3
124 1 LCD模块上电等待延时
125 1 ----------------------------------------------------*/
126 1 // DelayMs(1000);//上电等待延时1000Ms
127 1 os_dly_wait (5);//延时100mS
128 1
129 1 LcdClearBuffer();
130 1 LcdSendCommand(0x20);//发送4位控制命令
131 1 LcdSendCommand(0x02);//发送位址归位命令,设定DDRAM位址计数器为0
132 1 LcdSendCommand(0x0c);//发送开显示关光标命令
133 1 LcdSendCommand(0x04);//发送进入点命令
134 1 LcdSendCommand(0x01);//发送清除显示命令
135 1 LcdSendCommand(0x80);//发送设定DDRAM地址0x00命令
136 1 // DelayMs(1000);//上电等待延时1000Ms//晕~~~
137 1 // SetLcdDisplayPos(0, 0);//汉字定位到上行左端
138 1 // LcdDisplayString("汉字显示演示12");
139 1 // SetLcdDisplayPos(1, 0);//汉字定位到上行左端
140 1 // LcdDisplayString("汉字显示演示34");
141 1 SetLcdDisplayPos(2, 0);//汉字定位到上行左端
142 1 LcdDisplayString("汉字显示演示56");
143 1 SetLcdDisplayPos(3, 0);//汉字定位到上行左端
144 1 LcdDisplayString("汉字显示演示78");
145 1 os_dly_wait (5);//延时100mS
146 1 }
147
148 /*--------------------------------------------------------
149 发送8位LCD控制命令
150 --------------------------------------------------------*/
151 void LcdSendCommand(unsigned char cCommand)
152 {
153 1 /*--------------------------------------------------------
154 1 发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)
155 1 --------------------------------------------------------*/
156 1 #ifdef LcdSSP
157 1 SSP_SendData(0xf8);//发送LCD控制命令
158 1 SSP_SendData(cCommand & 0xf0);//发送高4位LCD控制命令
159 1 SSP_SendData(cCommand << 4);//发送低4位LCD控制命令
160 1 #else
MSSP_SendData(0xf8);//发送LCD控制命令
MSSP_SendData(cCommand & 0xf0);//发送高4位LCD控制命令
MSSP_SendData(cCommand << 4);//发送低4位LCD控制命令
#endif
165 1 if (cCommand == 0x01) _delay_loop_(1600);//1.6mS
166 1 else _delay_loop_(72);//st7920要求等待72uS
167 1 }
168
169
170 /*--------------------------------------------------------
171 发送8位LCD显示数据
172 --------------------------------------------------------*/
173 void LcdSendData(unsigned char cData)
174 {
175 1 /*--------------------------------------------------------
176 1 发送同步脉冲11111 WR(0) RS(0) 0发送顺序从左至右)
177 1 --------------------------------------------------------*/
178 1 #ifdef LcdSSP
179 1 SSP_SendData(0xfa);//发送LCD显示数据
180 1 SSP_SendData(cData & 0xf0);//发送高4位LCD显示数据
181 1 SSP_SendData(cData << 4);//发送低4位LCD显示数据
182 1 #else
MSSP_SendData(0xfa);//发送LCD显示数据
MSSP_SendData(cData & 0xf0);//发送高4位LCD显示数据
MSSP_SendData(cData << 4);//发送低4位LCD显示数据
#endif
187 1 _delay_loop_(72);//st7920要求等待延时72uS
188 1 }
189
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 4
190
191 void LcdDisplayBuffers(void)
192 {
193 1 unsigned char i, j;
194 1 for (i = 0;i < 4;i ++) {
195 2 if (LcdBuffers.LcdBuffWrFlag[i]) {//此行已被改写
196 3 LcdSendCommand(0x80 + (i & 1) * 16 + (i >> 1) * 8);
197 3 for (j = 0;j < 16; j ++) {
198 4 LcdSendData(LcdBuffers.LcdBuff[i][j]);//显示刷新
199 4 }
200 3 LcdBuffers.LcdBuffWrFlag[i] = 0;
201 3 }
202 2 }
203 1 }
204
205
206 void SetLcdDisplayPos(unsigned char row, unsigned char col)
207 {
208 1 LcdBuffers.Row = row & 0x03;//4行
209 1 LcdBuffers.Col = col & 0x0f;//16列
210 1 }
211
212 void LcdDisplayString(unsigned char string[])
213 {
214 1 char len, i;
215 1 len = strlen(string);
216 1 if ((LcdBuffers.Row < 4) && ((LcdBuffers.Col + len) <= 16)) {
217 2 if (len == 0) {
218 3 while(LcdBuffers.Col < 16) LcdBuffers.LcdBuff[LcdBuffers.Row][LcdBuffers.Col ++] = ' ';
219 3 }
220 2 else
221 2 for (i = 0; i < len; i ++) LcdBuffers.LcdBuff[LcdBuffers.Row][LcdBuffers.Col ++] = string[i];
222 2 LcdBuffers.LcdBuffWrFlag[LcdBuffers.Row] = 1;//需要显示刷新
223 2 }
224 1 }
225
226
227
228 void MSSP_Init(void)
229 {
230 1 IODIR0 |= (1 << SCK1); // 设置SCK0控制口为输出
231 1 IODIR0 |= (1 << MOSI1); // 设置MOSI0控制口为输出
232 1 }
233
234 /*
235 *********************************************************************************************************
236 ** 函数名称:SSP_Init()
237 ** 函数功能:将SSP控制器设置为主机SPI。
238 ** 入口参数:无
239 ** 出口参数:无
240 *********************************************************************************************************
241 */
242 void SSP_Init(void)
243 {
244 1 PCONP |= 1<<10;
245 1 PINSEL1 |= ((P0_17_SCK1 << P0_17_PINSEL) | (P0_19_MOSI1 << P0_19_PINSEL));
246 1
247 1
248 1 SSPCR0 = (0x01 << 8) | // SCR 设置SPI时钟分频
249 1 // (0x01 << 7) | // CPHA 时钟输出相位,仅SPI模式有效
250 1 (0x00 << 7) | // CPHA 时钟输出相位,仅SPI模式有效
251 1 // (0x01 << 6) | // CPOL 时钟输出极性,仅SPI模式有效
252 1 (0x00 << 6) | // CPOL 时钟输出极性,仅SPI模式有效
253 1 (0x00 << 4) | // FRF 帧格式 00=SPI,01=SSI,10=Microwire,11=保留
254 1 (0x07 << 0); // DSS 数据长度,0000-0010=保留,0011=4位,0111=8位,1111=16位
255 1
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 5
256 1 SSPCR1 = (0x00 << 3) | // SOD 从机输出禁能,1=禁止,0=允许
257 1 (0x00 << 2) | // MS 主从选择,0=主机,1=从机
258 1 (0x01 << 1) | // SSE SSP使能,1=允许SSP与其它设备通信
259 1 (0x00 << 0); // LBM 回写模式
260 1
261 1 SSPCPSR = 0x52; // PCLK分频值
262 1 // SSPIMSC = 0x07; // 中断屏蔽寄存器
263 1 SSPICR = 0x03; // 中断清除寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -