📄 main.lst
字号:
264 1 }
265
266 /*
267 *********************************************************************************************************
268 * 函数名称:SSP_SendData()
269 * 函数功能:SSP接口向SPI总线发送数据。
270 * 入口参数:data 待发送的数据
271 * 出口参数:返回值为读取的数据
272 *********************************************************************************************************
273 */
274
275 uint8 SSP_SendData(uint8 data)
276 {
277 1 SSPDR = data;
278 1 while( (SSPSR & 0x01) == 0 ); // 等待TFE置位,即发送FIFO空
279 1 return(SSPDR);
280 1 }
281
282 uint8 MSSP_SendData(uint8 data)
283 {
284 1 unsigned char i;
285 1 // _delay_loop_(1);
286 1 for (i = 0; i < 8; i ++) {
287 2 // _delay_loop_(1);
288 2 IOCLR0 = (1 << SCK1);
289 2 // _delay_loop_(1);
290 2 if (data & 0x80) {//MSB最高位为1时
291 3 IOSET0 = (1 << MOSI1);
292 3 }
293 2 else {
294 3 IOCLR0 = (1 << MOSI1);
295 3 }
296 2 // _delay_loop_(1);
297 2 data <<= 1;
298 2 IOSET0 = (1 << SCK1);
299 2 // _delay_loop_(1);
300 2 }
301 1 return 0;
302 1 }
303
304
305
306 void SystemInit(void) {
307 1 PINSEL0 = 0x00000000; // 设置管脚连接GPIO
308 1 PINSEL1 = 0x00000000; // 设置管脚连接GPIO
309 1 IODIR0 = 0x00000000; // 设置P0口为输入
310 1 IODIR1 = 0x00000000; // 设置P1口为输入
311 1 }
312
313 void KeyInit(void) {
314 1 IODIR0 &= ~((1 << KEY1) | // 设置KEY1为输入
315 1 (1 << KEY3) | // 设置KEY3为输入
316 1 (1 << KEY5) | // 设置KEY5为输入
317 1 (1 << KEY6)); // 设置KEY6为输入
318 1 }
319
320 void LedInit(void) {
321 1 IODIR1 |= (1 << LED1) | // 设置LED1为输出
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 6
322 1 (1 << LED2) | // 设置LED2为输出
323 1 (1 << LED3) | // 设置LED3为输出
324 1 (1 << LED4) | // 设置LED4为输出
325 1 (1 << LED5) | // 设置LED5为输出
326 1 (1 << LED6) | // 设置LED6为输出
327 1 (1 << LED7) | // 设置LED7为输出
328 1 (1 << LED8); // 设置LED8为输出
329 1 IOSET1 = (1 << LED1) | // 关闭LED1
330 1 (1 << LED2) | // 关闭LED2
331 1 (1 << LED3) | // 关闭LED3
332 1 (1 << LED4) | // 关闭LED4
333 1 (1 << LED5) | // 关闭LED5
334 1 (1 << LED6) | // 关闭LED6
335 1 (1 << LED7) | // 关闭LED7
336 1 (1 << LED8); // 关闭LED8
337 1 }
338
339 void LednumInit(void) {
340 1 MSPI_Init();
341 1 }
342
343 void MSPI_Init(void) {
344 1 PINSEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_5_MISO0 << P0_5_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));
345 1 IODIR0 |= (1 << RCLK); // 设置RCLK控制口为输出
346 1 IOCLR0 = (1 << RCLK);
347 1 S0SPCCR = 0x52; // 设置SPI时钟分频
348 1 S0SPCR = (1 << CPHA) | // CPHA = 1, 数据在SCK 的第2个时钟沿采样
349 1 (1 << CPOL) | // CPOL = 1, SCK 为低有效
350 1 (1 << MSTR) | // MSTR = 1, SPI 处于主模式
351 1 (0 << LSBF) | // LSBF = 0, SPI 数据传输MSB (位7)在先
352 1 (0 << SPIE); // SPIE = 0, SPI 中断被禁止
353 1 }
354
355 unsigned char MSPI_SendData(unsigned char data) {
356 1 S0SPDR = data; //发送数据(相当于51的SBUF = DATA)
357 1 while(!(S0SPSR & (1 << SPIF))); // 等待SPIF置位,即等待数据发送完毕
358 1 return(S0SPDR);
359 1 }
360
361 void LedDisplay(unsigned char data) {
362 1 MSPI_SendData(LedTab[data & 0x0f]);
363 1 IOSET0 = (1 << RCLK);
364 1 IOCLR0 = (1 << RCLK);
365 1 }
366
367
368 void BeepInit(void) {
369 1 // IODIR0 |= (1 << BEEP);// 设置BEEP控制口为输出
370 1 IO0SET = (1 << BEEP);//关闭BEEP
371 1 }
372
373 void MainTask (void) __task {
374 1 SystemInit();
375 1 Key_Task = os_tsk_create (KeyTask, 100);//创建KeyTask任务及级别
376 1 Led_Task = os_tsk_create (LedTask, 100);//创建LedTask任务及级别
377 1 Lednum_Task = os_tsk_create (LednumTask, 100);//创建LednumTask任务及级别
378 1 Beep_Task = os_tsk_create (BeepTask, 100);//创建BeepTask任务及级别
379 1 Lcd_Task = os_tsk_create (LcdTask, 100);//创建LcdTask任务及级别
380 1 Adc_Task = os_tsk_create (AdcTask, 100);//创建AdcTask任务及级别
381 1 os_tsk_delete_self ();//MainTask自毁
382 1 }
383
384 void LcdTask (void) __task {
385 1 LcdInit();
386 1 for (;;) {
387 2 LcdDisplayBuffers();// 将缓冲区的内容操作硬件
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 7
388 2 }
389 1 }
390 void KeyTask (void) __task {
391 1 KeyInit();
392 1 for (;;) {
393 2 if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
394 3 os_evt_set (0x0001, Led_Task);//
395 3 os_evt_set (0x0001, Adc_Task);//
396 3 // SetLcdDisplayPos(0, 0);//汉字定位到上行左端
397 3 // LcdDisplayString("汉字显示演示1212");
398 3 }
399 2 else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
400 3 os_evt_set (0x8001, Led_Task);//
401 3 // SetLcdDisplayPos(0, 0);//汉字定位到上行左端
402 3 // LcdDisplayString("汉字显示演示 ");
403 3 }
404 2 if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
405 3 os_evt_set (0x0003, Led_Task);//
406 3 os_evt_set (0x0003, Adc_Task);//
407 3 // SetLcdDisplayPos(1, 0);//汉字定位到上行左端
408 3 // LcdDisplayString("汉字显示演示3434");
409 3 }
410 2 else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
411 3 os_evt_set (0x8003, Led_Task);//
412 3 // SetLcdDisplayPos(1, 0);//汉字定位到上行左端
413 3 // LcdDisplayString("汉字显示演示 ");
414 3 }
415 2 if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
416 3 os_evt_set (0x0005, Led_Task);//
417 3 // SetLcdDisplayPos(2, 0);//汉字定位到上行左端
418 3 // LcdDisplayString("汉字显示演示5656");
419 3 }
420 2 else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
421 3 os_evt_set (0x8005, Led_Task);//
422 3 // SetLcdDisplayPos(2, 0);//汉字定位到上行左端
423 3 // LcdDisplayString("汉字显示演示 ");
424 3 }
425 2 if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
426 3 os_evt_set (0x0006, Led_Task);//
427 3 // SetLcdDisplayPos(3, 0);//汉字定位到上行左端
428 3 // LcdDisplayString("汉字显示演示7878");
429 3 }
430 2 else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
431 3 os_evt_set (0x8006, Led_Task);//
432 3 // SetLcdDisplayPos(3, 0);//汉字定位到上行左端
433 3 // LcdDisplayString("汉字显示演示 ");
434 3 }
435 2 os_dly_wait (2);//延时20mS
436 2 }
437 1 }
438
439 void LedTask (void) __task {
440 1 OS_RESULT result;
441 1 unsigned int i;
442 1 LedInit();
443 1 for (;;) {
444 2 result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
445 2 if(result == OS_R_EVT) {
446 3 i = os_evt_get();
447 3 switch(i) {
448 4 case 0x0001: IOCLR1 = (1 << LED1);//点亮LED1
449 4 break;
450 4 case 0x0002: IOCLR1 = (1 << LED2);//点亮LED2
451 4 break;
452 4 case 0x0003: IOCLR1 = (1 << LED3);//点亮LED3
453 4 break;
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 8
454 4 case 0x0004: IOCLR1 = (1 << LED4);//点亮LED4
455 4 break;
456 4 case 0x0005: IOCLR1 = (1 << LED5);//点亮LED5
457 4 break;
458 4 case 0x0006: IOCLR1 = (1 << LED6);//点亮LED6
459 4 break;
460 4
461 4 case 0x8001: IOSET1 = (1 << LED1);//关掉LED1
462 4 break;
463 4 case 0x8002: IOSET1 = (1 << LED2);//关掉LED2
464 4 break;
465 4 case 0x8003: IOSET1 = (1 << LED3);//关掉LED3
466 4 break;
467 4 case 0x8004: IOSET1 = (1 << LED4);//关掉LED4
468 4 break;
469 4 case 0x8005: IOSET1 = (1 << LED5);//关掉LED5
470 4 break;
471 4 case 0x8006: IOSET1 = (1 << LED6);//关掉LED6
472 4 break;
473 4 }
474 3 os_evt_set (i, Beep_Task);//开关BEEP
475 3 os_evt_set (i, Lednum_Task);//开关Lednum
476 3 }
477 2 os_dly_wait (2);//延时20mS
478 2 }
479 1 }
480
481 void LednumTask (void) __task {
482 1 OS_RESULT result;
483 1 unsigned int i;
484 1 LednumInit();
485 1 for (;;) {
486 2 result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
487 2 if(result == OS_R_EVT) {
488 3 i = os_evt_get();
489 3 switch(i) {
490 4 case 0x0001: LedDisplay(1);//显示数码'1'
491 4 break;
492 4 case 0x0002: LedDisplay(2);//显示数码'2'
493 4 break;
494 4 case 0x0003: LedDisplay(3);//显示数码'3'
495 4 break;
496 4 case 0x0004: LedDisplay(4);//显示数码'4'
497 4 break;
498 4 case 0x0005: LedDisplay(5);//显示数码'5'
499 4 break;
500 4 case 0x0006: LedDisplay(6);//显示数码'6'
501 4 break;
502 4 }
503 3 }
504 2 os_dly_wait (2);//延时20mS
505 2 }
506 1 }
507
508
509 void BeepTask (void) __task {
510 1 OS_RESULT result;
511 1 unsigned int i;
512 1 BeepInit();
513 1 for (;;) {
514 2 result = os_evt_wait_or(0xffff, 0xffff);//等待BeepTask任务事件发生
515 2 if(result == OS_R_EVT) {
516 3 i = os_evt_get();
517 3 switch(i) {
518 4 case 0x0001:
519 4 case 0x0002:
ARM COMPILER V2.42, main 19/01/06 08:10:09 PAGE 9
520 4 case 0x0003:
521 4 case 0x0004:
522 4 case 0x0005:
523 4 case 0x0006:
524 4 IOCLR0 = (1 << BEEP);//打开BEEP
525 4 os_dly_wait (50);//延时500mS
526 4 IOSET0 = (1 << BEEP);//关闭BEEP
527 4 break;
528 4 case 0x8001:
529 4 case 0x8002:
530 4 case 0x8003:
531 4 case 0x8004:
532 4 case 0x8005:
533 4 case 0x8006:
534 4 IOSET0 = (1 << BEEP);//关闭BEEP
535 4 break;
536 4 }
537 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -