📄 font.lis
字号:
.module font.c
.area text(rom, con, rel)
0000 .dbfile C:\ygksb0108\programme2_can_run\font.c
0000 .dbfunc e lcd_glyph _lcd_glyph fV
0000 ; glyph_offset -> R6
0000 ; bit_pos -> R8
0000 ; x -> R10
0000 ; char_mask -> y+2
0000 ; glyph_scan -> y+0
0000 ; y_bits -> R20
0000 ; mask -> R14
0000 ; remaining_bits -> R22
0000 ; byte_offset -> R12
0000 ; store_width -> y+23
0000 ; glyph_ptr -> y+21
0000 ; height -> y+19
0000 ; width -> y+17
0000 ; top -> y+15
0000 ; left -> y+13
.even
0000 _lcd_glyph::
0000 0E940000 xcall push_arg4
0004 0E940000 xcall push_gset5
0008 2397 sbiw R28,3
000A .dbline -1
000A .dbline 10
000A ; //*****************************************************************
000A ; //本头文件实现了用于字符显示的宏以及显示函数和显示的数据
000A ; // ---北京交通大学电气学院 杨罡 2008.8
000A ; //*****************************************************************
000A ;
000A ; #include "font.h"
000A ;
000A ; void lcd_glyph(uint8_t left, uint8_t top, uint8_t width, uint8_t height,
000A ; uint8_t *glyph_ptr, uint8_t store_width)
000A ; { uint8_t bit_pos;
000A .dbline 20
000A ; uint8_t byte_offset;
000A ; uint8_t y_bits;
000A ; uint8_t remaining_bits;
000A ; uint8_t mask;
000A ; uint8_t char_mask;
000A ; uint8_t x;
000A ; uint8_t *glyph_scan;
000A ; uint8_t glyph_offset;
000A ;
000A ; bit_pos = top & 0x07; /* get the bit offset into a byte */
000A 8F85 ldd R24,y+15
000C 8770 andi R24,7
000E 882E mov R8,R24
0010 .dbline 21
0010 ; glyph_offset = 0; /* start at left side of the glyph rasters */
0010 6624 clr R6
0012 .dbline 22
0012 ; char_mask = 0x80; /* initial character glyph mask */
0012 80E8 ldi R24,128
0014 8A83 std y+2,R24
0016 .dbline 24
0016 ;
0016 ; for (x = left; x < (left + width); x++)
0016 AD84 ldd R10,y+13
0018 6AC0 xjmp L6
001A L3:
001A .dbline 25
001A ; {
001A .dbline 27
001A ;
001A ; byte_offset = top >> 3; /* get the byte offset into y direction */
001A CF84 ldd R12,y+15
001C C694 lsr R12
001E C694 lsr R12
0020 C694 lsr R12
0022 .dbline 28
0022 ; y_bits = height; /* get length in y direction to write */
0022 4B89 ldd R20,y+19
0024 .dbline 29
0024 ; remaining_bits = 8 - bit_pos; /* number of bits left in byte */
0024 68E0 ldi R22,8
0026 6819 sub R22,R8
0028 .dbline 30
0028 ; mask = l_mask_array[bit_pos]; /* get mask for this bit */
0028 80E0 ldi R24,<_l_mask_array
002A 90E0 ldi R25,>_l_mask_array
002C E82D mov R30,R8
002E FF27 clr R31
0030 E80F add R30,R24
0032 F91F adc R31,R25
0034 E080 ldd R14,z+0
0036 .dbline 31
0036 ; glyph_scan = glyph_ptr + glyph_offset; /* point to base of the glyph */
0036 262C mov R2,R6
0038 3324 clr R3
003A 0D88 ldd R0,y+21
003C 1E88 ldd R1,y+22
003E 200C add R2,R0
0040 311C adc R3,R1
0042 3982 std y+1,R3
0044 2882 std y+0,R2
0046 43C0 xjmp L8
0048 L7:
0048 .dbline 35
0048 ; /* boundary checking here to account for the possibility of */
0048 ; /* write past the bottom of the screen. */
0048 ; while((y_bits) && (byte_offset < LCD_Y_BYTES)) /* while there are bits still to write */
0048 ; { /* check if the character pixel is set or not */
0048 .dbline 37
0048 ; //if(*glyph_scan & char_mask)
0048 ; if(pgm_read_byte(glyph_scan) & char_mask)
0048 0881 ldd R16,y+0
004A 1981 ldd R17,y+1
004C 8F92 push R8
004E 6F92 push R6
0050 0E940000 xcall _pgm_read_byte
0054 6F90 pop R6
0056 8F90 pop R8
0058 202E mov R2,R16
005A 0A80 ldd R0,y+2
005C 2020 and R2,R0
005E 81F0 breq L10
0060 .dbline 38
0060 ; l_display_array[byte_offset][x] |= mask; /* set image pixel */
0060 80E8 ldi R24,128
0062 8C9D mul R24,R12
0064 1001 movw R2,R0
0066 80E0 ldi R24,<_l_display_array
0068 90E0 ldi R25,>_l_display_array
006A 280E add R2,R24
006C 391E adc R3,R25
006E 4A2C mov R4,R10
0070 5524 clr R5
0072 420C add R4,R2
0074 531C adc R5,R3
0076 F201 movw R30,R4
0078 2080 ldd R2,z+0
007A 2E28 or R2,R14
007C 2082 std z+0,R2
007E 11C0 xjmp L11
0080 L10:
0080 .dbline 40
0080 ; else
0080 ; l_display_array[byte_offset][x] &= ~mask; /* clear the image pixel */
0080 80E8 ldi R24,128
0082 8C9D mul R24,R12
0084 1001 movw R2,R0
0086 80E0 ldi R24,<_l_display_array
0088 90E0 ldi R25,>_l_display_array
008A 280E add R2,R24
008C 391E adc R3,R25
008E 4A2C mov R4,R10
0090 5524 clr R5
0092 420C add R4,R2
0094 531C adc R5,R3
0096 2E2C mov R2,R14
0098 2094 com R2
009A F201 movw R30,R4
009C 3080 ldd R3,z+0
009E 3220 and R3,R2
00A0 3082 std z+0,R3
00A2 L11:
00A2 .dbline 41
00A2 ; if(l_mask_array[0] & 0x80)
00A2 20900000 lds R2,_l_mask_array
00A6 27FE sbrs R2,7
00A8 02C0 rjmp L12
00AA .dbline 42
00AA ; mask >>= 1;
00AA E694 lsr R14
00AC 01C0 xjmp L13
00AE L12:
00AE .dbline 44
00AE ; else
00AE ; mask <<= 1;
00AE EE0C lsl R14
00B0 L13:
00B0 .dbline 46
00B0 ;
00B0 ; y_bits--;
00B0 4A95 dec R20
00B2 .dbline 47
00B2 ; remaining_bits--;
00B2 6A95 dec R22
00B4 .dbline 48
00B4 ; if(remaining_bits == 0)
00B4 21F4 brne L14
00B6 .dbline 49
00B6 ; { /* just crossed over a byte boundry, reset byte counts */
00B6 .dbline 50
00B6 ; remaining_bits = 8;
00B6 68E0 ldi R22,8
00B8 .dbline 51
00B8 ; byte_offset++;
00B8 C394 inc R12
00BA .dbline 52
00BA ; mask = l_mask_array[0];
00BA E0900000 lds R14,_l_mask_array
00BE .dbline 53
00BE ; }
00BE L14:
00BE .dbline 56
00BE 2880 ldd R2,y+0
00C0 3980 ldd R3,y+1
00C2 4F88 ldd R4,y+23
00C4 5524 clr R5
00C6 420C add R4,R2
00C8 531C adc R5,R3
00CA 5982 std y+1,R5
00CC 4882 std y+0,R4
00CE .dbline 58
00CE L8:
00CE .dbline 34
00CE 4423 tst R20
00D0 21F0 breq L16
00D2 8C2D mov R24,R12
00D4 8830 cpi R24,8
00D6 08F4 brsh X0
00D8 B7CF xjmp L7
00DA X0:
00DA L16:
00DA .dbline 61
00DA ;
00DA ; /* bump the glyph scan to next raster */
00DA ; glyph_scan += store_width;
00DA ;
00DA ; }
00DA ;
00DA ; /* shift over to next glyph bit */
00DA ; char_mask >>= 1;
00DA 2A80 ldd R2,y+2
00DC 2694 lsr R2
00DE 2A82 std y+2,R2
00E0 .dbline 62
00E0 ; if(char_mask == 0) /* reset for next byte in raster */
00E0 022C mov R0,R2
00E2 2220 tst R2
00E4 19F4 brne L17
00E6 .dbline 63
00E6 ; { char_mask = 0x80;
00E6 .dbline 63
00E6 80E8 ldi R24,128
00E8 8A83 std y+2,R24
00EA .dbline 64
00EA ; glyph_offset++;
00EA 6394 inc R6
00EC .dbline 65
00EC ; }
00EC L17:
00EC .dbline 67
00EC L4:
00EC .dbline 24
00EC A394 inc R10
00EE L6:
00EE .dbline 24
00EE 2D84 ldd R2,y+13
00F0 0988 ldd R0,y+17
00F2 200C add R2,R0
00F4 A214 cp R10,R2
00F6 08F4 brsh X1
00F8 90CF xjmp L3
00FA X1:
00FA .dbline -2
00FA L2:
00FA 2396 adiw R28,3
00FC 0E940000 xcall pop_gset5
0100 2496 adiw R28,4
0102 .dbline 0 ; func end
0102 0895 ret
0104 .dbsym r glyph_offset 6 c
0104 .dbsym r bit_pos 8 c
0104 .dbsym r x 10 c
0104 .dbsym l char_mask 2 c
0104 .dbsym l glyph_scan 0 pc
0104 .dbsym r y_bits 20 c
0104 .dbsym r mask 14 c
0104 .dbsym r remaining_bits 22 c
0104 .dbsym r byte_offset 12 c
0104 .dbsym l store_width 23 c
0104 .dbsym l glyph_ptr 21 pc
0104 .dbsym l height 19 c
0104 .dbsym l width 17 c
0104 .dbsym l top 15 c
0104 .dbsym l left 13 c
0104 .dbend
0104 .dbfunc e lcd_text _lcd_text fV
0104 ; width_table_ptr -> y+11
0104 ; glyph_end -> R20
0104 ; glyph_table_ptr -> y+9
0104 ; defaultheight -> y+17
0104 ; inprogmem -> y+16
0104 ; fixedwidth -> R12
0104 ; glyph_ptr -> y+7
0104 ; glyph_beg -> y+15
0104 ; store_width -> y+14
0104 ; height -> R22
0104 ; width -> R10
0104 ; x -> y+13
0104 ; glyph -> R14
0104 ; str -> y+32
0104 ; font -> y+30
0104 ; top -> y+28
0104 ; left -> R20
.even
0104 _lcd_text::
0104 3A93 st -y,r19
0106 2A93 st -y,r18
0108 0E940000 xcall push_gset5
010C 402F mov R20,R16
010E 6297 sbiw R28,18
0110 .dbline -1
0110 .dbline 82
0110 ;
0110 ; }
0110 ; }
0110 ;
0110 ;
0110 ; /*
0110 ; Prints the given string at location x,y in the specified font.
0110 ; Prints each character given via calls to lcd_glyph. The entry string
0110 ; is null terminated. (adapted function from the MJK-code)
0110 ; Arguments are:
0110 ; left coordinate of left start of string.
0110 ; top coordinate of top of string.
0110 ; font font number to use for display (see fonts.h)
0110 ; str text string to display (null-terminated)
0110 ; */
0110 ; void lcd_text(uint8_t left, uint8_t top, uint8_t font, char *str)
0110 ; { uint8_t x = left;
0110 .dbline 82
0110 4D87 std y+13,R20
0112 .dbline 92
0112 ; uint8_t glyph;
0112 ; uint8_t width;
0112 ; uint8_t height, defaultheight;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -