⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 font.lis

📁 AVR控制12864液晶画圆弧,在AVR单片机的控制下完成圆弧的绘制。
💻 LIS
📖 第 1 页 / 共 5 页
字号:
                        .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 + -