下边这段代码是实现根据入参计算矩形X轴方向的结束位置,来画电池电量:
- void LCD_ShowPower(u16 power) {
-
- // 计算横坐标的结束位置
- unsigned int dis, xend;
-
- dis = power*38/3300;
- xend = dis + 263;
- LCD_Fill(263,16,xend,32,WHITE);
-
- LCD_DrawRectangle(260, 13, LCD_W - 16, 13+22, WHITE); // 首先画出电池的轮廓
- LCD_Fill(LCD_W - 15, 21,LCD_W - 12, 27, WHITE);
- }
复制代码
但是效果并没有达到预期, 其中电池的轮廓和正极能正常画出来。但是中间的填充画不出来,如视频显示:
这个文件的编译命令:
- sdcc -o .pio/build/STC8H8K64U/libdea/LCD/lcd.rel -c --opt-code-size --peep-return -mmcs51 --model-large --stack-auto --std-c99 --less-pedantic -DF_CPU=35000000L -DHEAP_SIZE=128 -DPLATFORMIO=60115 -DSTC8H8KXXU -DSTC8H8K64U -DNAKED_ARCH_MCS51 -DNAKED_MCS51_STC8H8KXXU -DPIO_OS_CPU_MAIN_CLOCK=35000000L -Ilib/LCD/src -I.pio/libdeps/STC8H8K64U/STC8G_H_LIB/include -I.pio/libdeps/STC8H8K64U/STC8G_H_LIB/src lib/LCD/src/lcd.c
复制代码
下边是这个函数的汇编程序:
- ;------------------------------------------------------------
- ;Allocation info for local variables in function 'LCD_ShowPower'
- ;------------------------------------------------------------
- ;power Allocated to registers r6 r7
- ;dis Allocated to registers
- ;xend Allocated to registers r6 r7
- ;------------------------------------------------------------
- ; lib/LCD/src/lcd.c:377: void LCD_ShowPower(u16 power) {
- ; -----------------------------------------
- ; function LCD_ShowPower
- ; -----------------------------------------
- _LCD_ShowPower:
- mov r6,dpl
- mov r7,dph
- ; lib/LCD/src/lcd.c:382: dis = power*38/3300;
- push ar6
- push ar7
- mov dptr,#0x0026
- lcall __mulint
- mov r6,dpl
- mov r7,dph
- dec sp
- dec sp
- mov a,#0xe4
- push acc
- mov a,#0x0c
- push acc
- mov dpl,r6
- mov dph,r7
- lcall __divuint
- mov r6,dpl
- mov r7,dph
- dec sp
- dec sp
- ; lib/LCD/src/lcd.c:383: xend = dis + 263;
- mov a,#0x07
- add a,r6
- mov r6,a
- mov a,#0x01
- addc a,r7
- mov r7,a
- ; lib/LCD/src/lcd.c:384: LCD_Fill(263,16,xend,32,WHITE);
- mov a,#0xff
- push acc
- push acc
- mov a,#0x20
- push acc
- clr a
- push acc
- push ar6
- push ar7
- mov a,#0x10
- push acc
- clr a
- push acc
- mov dptr,#0x0107
- lcall _LCD_Fill
- mov a,sp
- add a,#0xf8
- mov sp,a
- ; lib/LCD/src/lcd.c:386: LCD_DrawRectangle(260, 13, LCD_W - 16, 13+22, WHITE); // 首先画出电池的轮廓
- mov a,#0xff
- push acc
- push acc
- mov a,#0x23
- push acc
- clr a
- push acc
- mov a,#0x30
- push acc
- mov a,#0x01
- push acc
- mov a,#0x0d
- push acc
- clr a
- push acc
- mov dptr,#0x0104
- lcall _LCD_DrawRectangle
- mov a,sp
- add a,#0xf8
- mov sp,a
- ; lib/LCD/src/lcd.c:387: LCD_Fill(LCD_W - 15, 21,LCD_W - 12, 27, WHITE);
- mov a,#0xff
- push acc
- push acc
- mov a,#0x1b
- push acc
- clr a
- push acc
- mov a,#0x34
- push acc
- mov a,#0x01
- push acc
- mov a,#0x15
- push acc
- clr a
- push acc
- mov dptr,#0x0131
- lcall _LCD_Fill
- mov a,sp
- add a,#0xf8
- mov sp,a
- ; lib/LCD/src/lcd.c:390: }
- ret
复制代码
将程序中的send写死后想要的效果如下:
|