📄 lcd_gui.txt
字号:
00027a e8bd83f8 POP {r3-r9,pc}
;;;430 ////////////////////////////////////////////
ENDP
LCD_Print PROC
;;;432 //写,目的是达到的最快的文本显示
;;;433 void LCD_Print(const unsigned char *p_str)
00027e b538 PUSH {r3-r5,lr}
;;;434 {
000280 4604 MOV r4,r0
;;;435 static unsigned char XLine = 0;
;;;436 static unsigned char YLine = 0;
;;;437 //设置画笔前景和背景色
;;;438 # define CHAR_CLR 0x0000
;;;439 # define BK_CLR 0x07E0
;;;440 while(*p_str)
000282 e033 B |L1.748|
|L1.644|
;;;441 {
;;;442 //计算坐标
;;;443 if(*p_str == '\n') //换行
000284 7820 LDRB r0,[r4,#0]
000286 280a CMP r0,#0xa
000288 d109 BNE |L1.670|
;;;444 {
;;;445 XLine = 0;
00028a 2000 MOVS r0,#0
00028c 4952 LDR r1,|L1.984|
00028e 7008 STRB r0,[r1,#0]
;;;446 YLine ++;
000290 4852 LDR r0,|L1.988|
000292 7800 LDRB r0,[r0,#0] ; YLine
000294 1c40 ADDS r0,r0,#1
000296 4951 LDR r1,|L1.988|
000298 7008 STRB r0,[r1,#0]
;;;447 p_str ++; //调过换行符,不用显示
00029a 1c64 ADDS r4,r4,#1
;;;448 continue; //查询下一个字符
00029c e026 B |L1.748|
|L1.670|
;;;449 }
;;;450 else //未遇到换行符则按正常显示坐标自加
;;;451 {
;;;452 //如果不是换行符则显示字符
;;;453 LCD_WriteChar(XLine, YLine, //调用显示普通字符显示函数(较快)
00029e 7823 LDRB r3,[r4,#0]
0002a0 9300 STR r3,[sp,#0]
0002a2 f44f63fc MOV r3,#0x7e0
0002a6 2200 MOVS r2,#0
0002a8 484c LDR r0,|L1.988|
0002aa 7801 LDRB r1,[r0,#0] ; YLine
0002ac 484a LDR r0,|L1.984|
0002ae 7800 LDRB r0,[r0,#0] ; XLine
0002b0 f7fffffe BL LCD_WriteChar
;;;454 CHAR_CLR, BK_CLR,
;;;455 *p_str);
;;;456 #if LCD_CHAR_HORIZONTAL > 0
;;;457 XLine ++; //行号加1
;;;458 if(XLine == CHAR_X_NUM)
;;;459 {
;;;460 XLine = 0; //写满一行后行号清零
;;;461 YLine ++; //写满一行后列号加1
;;;462 if(YLine == CHAR_Y_NUM)
;;;463 {
;;;464 YLine = 0;
;;;465 LCD_Clear(BK_CLR);
;;;466 }
;;;467 }
;;;468 #else
;;;469 YLine ++; //行号加1
0002b4 4849 LDR r0,|L1.988|
0002b6 7800 LDRB r0,[r0,#0] ; YLine
0002b8 1c40 ADDS r0,r0,#1
0002ba 4948 LDR r1,|L1.988|
0002bc 7008 STRB r0,[r1,#0]
;;;470 if(YLine == CHAR_Y_NUM)
0002be 4608 MOV r0,r1
0002c0 7800 LDRB r0,[r0,#0] ; YLine
0002c2 2828 CMP r0,#0x28
0002c4 d110 BNE |L1.744|
;;;471 {
;;;472 YLine = 0; //写满一行后行号清零
0002c6 2000 MOVS r0,#0
0002c8 7008 STRB r0,[r1,#0]
;;;473 XLine ++; //写满一行后列号加1
0002ca 4843 LDR r0,|L1.984|
0002cc 7800 LDRB r0,[r0,#0] ; XLine
0002ce 1c40 ADDS r0,r0,#1
0002d0 4941 LDR r1,|L1.984|
0002d2 7008 STRB r0,[r1,#0]
;;;474 if(XLine == CHAR_X_NUM)
0002d4 4608 MOV r0,r1
0002d6 7800 LDRB r0,[r0,#0] ; XLine
0002d8 280f CMP r0,#0xf
0002da d105 BNE |L1.744|
;;;475 {
;;;476 XLine = 0;
0002dc 2000 MOVS r0,#0
0002de 7008 STRB r0,[r1,#0]
;;;477 LCD_Clear(BK_CLR);
0002e0 f44f60fc MOV r0,#0x7e0
0002e4 f7fffffe BL LCD_Clear
|L1.744|
;;;478 }
;;;479 }
;;;480 #endif
;;;481 }
;;;482
;;;483 //字符串指针自加
;;;484 p_str ++;
0002e8 1c64 ADDS r4,r4,#1
0002ea bf00 NOP ;448
|L1.748|
0002ec 7820 LDRB r0,[r4,#0] ;440
0002ee 2800 CMP r0,#0 ;440
0002f0 d1c8 BNE |L1.644|
;;;485 }
;;;486 }
0002f2 bd38 POP {r3-r5,pc}
;;;487 //数字显示函数
ENDP
LCD_WriteNumber PROC
;;;489 'A', 'B', 'C', 'D', 'E', 'F'};
;;;490 void LCD_WriteNumber(unsigned long data, unsigned char ch_Dot)
0002f4 b5f8 PUSH {r3-r7,lr}
;;;491 {
0002f6 4606 MOV r6,r0
0002f8 460f MOV r7,r1
;;;492 # define DIGIT_SHOW 10 //最多可以显示10位
;;;493 signed char digit_sum=0;
0002fa 2400 MOVS r4,#0
;;;494 signed char digit=0;
0002fc 2500 MOVS r5,#0
;;;495
;;;496 static unsigned char NumberBuffer[] = "0123456789";
;;;497 for(digit_sum = 0; digit_sum < DIGIT_SHOW; digit_sum ++)
0002fe bf00 NOP
000300 e010 B |L1.804|
|L1.770|
;;;498 {
;;;499 digit = data%10; //求取最低位
000302 200a MOVS r0,#0xa
000304 fbb6f1f0 UDIV r1,r6,r0
000308 fb006011 MLS r0,r0,r1,r6
00030c b245 SXTB r5,r0
;;;500 data /= 10; //十进制左移
00030e 200a MOVS r0,#0xa
000310 fbb6f6f0 UDIV r6,r6,r0
;;;501 NumberBuffer[digit_sum]=Number[digit];
000314 4832 LDR r0,|L1.992|
000316 5d40 LDRB r0,[r0,r5]
000318 4932 LDR r1,|L1.996|
00031a 5508 STRB r0,[r1,r4]
;;;502 if(data == 0)
00031c b906 CBNZ r6,|L1.800|
;;;503 {
;;;504 break; //如果已经移到了最高位则跳出循环
00031e e003 B |L1.808|
|L1.800|
000320 1c60 ADDS r0,r4,#1 ;497
000322 b244 SXTB r4,r0 ;497
|L1.804|
000324 2c0a CMP r4,#0xa ;497
000326 dbec BLT |L1.770|
|L1.808|
000328 bf00 NOP
;;;505 }
;;;506 }
;;;507 for(digit = 0; digit <= digit_sum; digit ++)
00032a 2500 MOVS r5,#0
00032c e00c B |L1.840|
|L1.814|
;;;508 {
;;;509 #if LCD_CHAR_HORIZONTAL > 0
;;;510 LCD_WriteChar(digit,0,0,1234,NumberBuffer[digit_sum - digit]);
;;;511 #else
;;;512 LCD_WriteChar(0,digit,0,1234,NumberBuffer[digit_sum - digit]);
00032e 1b60 SUBS r0,r4,r5
000330 492c LDR r1,|L1.996|
000332 5c0b LDRB r3,[r1,r0]
000334 9300 STR r3,[sp,#0]
000336 f24043d2 MOV r3,#0x4d2
00033a 2200 MOVS r2,#0
00033c 4629 MOV r1,r5
00033e 4610 MOV r0,r2
000340 f7fffffe BL LCD_WriteChar
000344 1c68 ADDS r0,r5,#1 ;507
000346 b245 SXTB r5,r0 ;507
|L1.840|
000348 42a5 CMP r5,r4 ;507
00034a ddf0 BLE |L1.814|
;;;513 #endif
;;;514 }
;;;515 }
00034c bdf8 POP {r3-r7,pc}
;;;516 //
ENDP
LCD_WriteHexNumber PROC
;;;517 void LCD_WriteHexNumber(u16 x, u16 y, unsigned long data, unsigned char is_cap)
00034e e92d43f8 PUSH {r3-r9,lr}
;;;518 {
000352 4680 MOV r8,r0
000354 460f MOV r7,r1
000356 4616 MOV r6,r2
000358 4699 MOV r9,r3
;;;519 # define DIGIT_SHOW 10 //最多可以显示10位
;;;520 signed char digit_sum=0;
00035a 2400 MOVS r4,#0
;;;521 signed char digit=0;
00035c 2500 MOVS r5,#0
;;;522
;;;523 static unsigned char NumberBuffer[] = "ff ff ff ff ff ff";
;;;524 for(digit_sum = 0; digit_sum < DIGIT_SHOW; digit_sum ++)
00035e bf00 NOP
000360 e016 B |L1.912|
|L1.866|
;;;525 {
;;;526 digit = data%16; //求取最低位
000362 f006050f AND r5,r6,#0xf
;;;527 data /= 16; //十进制左移
000366 0936 LSRS r6,r6,#4
;;;528
;;;529 if(!(digit_sum % 3))
000368 2003 MOVS r0,#3
00036a fb94f1f0 SDIV r1,r4,r0
00036e fb004011 MLS r0,r0,r1,r4
000372 b928 CBNZ r0,|L1.896|
;;;530 {
;;;531 NumberBuffer[digit_sum ++] = ' ';
000374 2220 MOVS r2,#0x20
000376 4620 MOV r0,r4
000378 1c61 ADDS r1,r4,#1
00037a b24c SXTB r4,r1
00037c 491a LDR r1,|L1.1000|
00037e 540a STRB r2,[r1,r0]
|L1.896|
;;;532 }
;;;533 NumberBuffer[digit_sum]=Number[digit];
000380 4817 LDR r0,|L1.992|
000382 5d40 LDRB r0,[r0,r5]
000384 4918 LDR r1,|L1.1000|
000386 5508 STRB r0,[r1,r4]
;;;534
;;;535 if(data == 0)
000388 b906 CBNZ r6,|L1.908|
;;;536 {
;;;537 break; //如果已经移到了最高位则跳出循环
00038a e003 B |L1.916|
|L1.908|
00038c 1c60 ADDS r0,r4,#1 ;524
00038e b244 SXTB r4,r0 ;524
|L1.912|
000390 2c0a CMP r4,#0xa ;524
000392 dbe6 BLT |L1.866|
|L1.916|
000394 bf00 NOP
;;;538 }
;;;539 }
;;;540 if(digit_sum == 2)
000396 2c02 CMP r4,#2
000398 d104 BNE |L1.932|
;;;541 {
;;;542 NumberBuffer[digit_sum] = '0';
00039a 2030 MOVS r0,#0x30
00039c 4912 LDR r1,|L1.1000|
00039e 5508 STRB r0,[r1,r4]
;;;543 digit_sum += 1;
0003a0 1c60 ADDS r0,r4,#1
0003a2 b244 SXTB r4,r0
|L1.932|
;;;544 }
;;;545 for(digit = 0; digit <= digit_sum; digit ++)
0003a4 2500 MOVS r5,#0
0003a6 e00c B |L1.962|
|L1.936|
;;;546 {
;;;547 LCD_WriteChar(x, y+digit,0,1234,NumberBuffer[digit_sum - digit]);
0003a8 1b60 SUBS r0,r4,r5
0003aa 490f LDR r1,|L1.1000|
0003ac 5c0b LDRB r3,[r1,r0]
0003ae 1979 ADDS r1,r7,r5
0003b0 9300 STR r3,[sp,#0]
0003b2 f24043d2 MOV r3,#0x4d2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -