📄 lcd106x56.src
字号:
CLR A
RLC A
MOV R6,A
CLR C
MOV A,x?13120
SUBB A,R7
MOV A,R6
XRL A,#080H
MOV R0,A
MOV A,#080H
SUBB A,R0
JC $ + 4H
AJMP ?C0105
; {
; SOURCE LINE # 647
; byte_offset = top >> 3; /* get the byte offset into y direction */
; SOURCE LINE # 648
MOV A,top?13109
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R7,A
;---- Variable 'byte_offset?13115' assigned to Register 'R7' ----
; y_bits = height; /* get length in y direction to write */
; SOURCE LINE # 649
MOV y_bits?13116,height?13111
; remaining_bits = 8 - bit_pos; /* number of bits left in byte */
; SOURCE LINE # 650
CLR C
MOV A,#08H
SUBB A,bit_pos?13114
MOV remaining_bits?13117,A
; mask = l_mask_array[bit_pos]; /* get mask for this bit */
; SOURCE LINE # 651
MOV A,bit_pos?13114
MOV DPTR,#l_mask_array
MOVC A,@A+DPTR
MOV R6,A
;---- Variable 'mask?13118' assigned to Register 'R6' ----
; glyph_scan = glyph + glyph_offset; /* point to base of the glyph */
; SOURCE LINE # 652
MOV R3,glyph?13112
MOV R4,#00H
MOV A,glyph?13112+02H
ADD A,glyph_offset?13122
MOV R1,A
MOV A,R4
ADDC A,glyph?13112+01H
MOV R2,A
;---- Variable 'glyph_scan?13121' assigned to Register 'R1/R2/R3' ----
?C0097:
;
; /* boundary checking here to account for the possibility of */
; /* write past the bottom of the screen. */
; while((y_bits) && (byte_offset < Y_BYTES)) /* while there are bits still to write */
; SOURCE LINE # 656
MOV A,y_bits?13116
JZ ?C0098
MOV A,R7
CLR C
SUBB A,#08H
JNC ?C0098
; {
; SOURCE LINE # 657
; /* check if the character pixel is set or not */
; if(*glyph_scan & char_mask)
; SOURCE LINE # 659
LCALL ?C?CLDPTR
ANL A,char_mask?13119
MOV B,#06AH
JZ ?C0099
; {
; SOURCE LINE # 660
; l_display_array[byte_offset][x] |= mask; /* set image pixel */
; SOURCE LINE # 661
MOV A,R7
MUL AB
ADD A,#LOW (l_display_array)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (l_display_array)
MOV DPH,A
MOV A,DPL
ADD A,x?13120
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR
ORL A,R6
MOVX @DPTR,A
; }
; SOURCE LINE # 662
SJMP ?C0100
?C0099:
; else
; {
; SOURCE LINE # 664
; l_display_array[byte_offset][x] &= ~mask; /* clear the image pixel */
; SOURCE LINE # 665
MOV A,R7
MUL AB
ADD A,#LOW (l_display_array)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (l_display_array)
MOV DPH,A
MOV A,DPL
ADD A,x?13120
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR
MOV R5,A
MOV A,R6
CPL A
MOV R4,A
MOV A,R5
ANL A,R4
MOVX @DPTR,A
; }
; SOURCE LINE # 666
?C0100:
;
; if(l_mask_array[0] & 0x80)
; SOURCE LINE # 668
MOV DPTR,#l_mask_array
CLR A
MOVC A,@A+DPTR
MOV R5,A
JNB ACC.7,?C0101
; {
; SOURCE LINE # 669
; mask >>= 1;
; SOURCE LINE # 670
MOV A,R6
CLR C
RRC A
MOV R6,A
; }
; SOURCE LINE # 671
SJMP ?C0102
?C0101:
; else
; {
; SOURCE LINE # 673
; mask <<= 1;
; SOURCE LINE # 674
MOV A,R6
ADD A,ACC
MOV R6,A
; }
; SOURCE LINE # 675
?C0102:
;
; y_bits--;
; SOURCE LINE # 677
DEC y_bits?13116
; remaining_bits--;
; SOURCE LINE # 678
DJNZ remaining_bits?13117,?C0103
; if(remaining_bits == 0)
; SOURCE LINE # 679
; {
; SOURCE LINE # 680
; /* just crossed over a byte boundry, reset byte counts */
; remaining_bits = 8;
; SOURCE LINE # 682
MOV remaining_bits?13117,#08H
; byte_offset++;
; SOURCE LINE # 683
INC R7
; mask = l_mask_array[0];
; SOURCE LINE # 684
MOV R6,AR5
; }
; SOURCE LINE # 685
?C0103:
;
; /* bump the glyph scan to next raster */
; glyph_scan += store_width;
; SOURCE LINE # 688
MOV A,store_width?13113
ADD A,R1
MOV R1,A
CLR A
ADDC A,R2
MOV R2,A
; }
; SOURCE LINE # 689
SJMP ?C0097
?C0098:
;
; /* shift over to next glyph bit */
; char_mask >>= 1;
; SOURCE LINE # 692
MOV A,char_mask?13119
CLR C
RRC A
MOV char_mask?13119,A
; if(char_mask == 0) /* reset for next byte in raster */
; SOURCE LINE # 693
JNZ ?C0096
; {
; SOURCE LINE # 694
; char_mask = 0x80;
; SOURCE LINE # 695
MOV char_mask?13119,#080H
; glyph_offset++;
; SOURCE LINE # 696
INC glyph_offset?13122
; }
; SOURCE LINE # 697
; }
; SOURCE LINE # 698
?C0096:
INC x?13120
AJMP ?C0094
; }
; SOURCE LINE # 699
?C0105:
RET
; END OF _lcd_glyph
;
; /*
; **
; ** Prints the given string at location x,y in the specified font.
; ** Prints each character given via calls to lcd_glyph. The entry string
; ** is null terminated and non 0x20->0x7e characters are ignored.
; **
; ** Arguments are:
; ** left coordinate of left start of string.
; ** top coordinate of top of string.
; ** font font number to use for display
; ** str text string to display
; **
; */
;
; void lcd_text(unsigned char left, unsigned char top, unsigned char font, char *str)
RSEG ?PR?_lcd_text?LCD106X56
_lcd_text:
USING 0
; SOURCE LINE # 715
MOV top?14124,R5
MOV font?14125,R3
;---- Variable 'left?14123' assigned to Register 'R7' ----
; {
; SOURCE LINE # 716
; unsigned char x = left;
; SOURCE LINE # 717
MOV x?14127,R7
?C0106:
; unsigned char glyph;
; unsigned char width;
; unsigned char height;
; unsigned char store_width;
; unsigned char code *glyph_ptr;
;
; while(*str != 0x00)
; SOURCE LINE # 724
MOV R3,str?14126
MOV R2,str?14126+01H
MOV R1,str?14126+02H
LCALL ?C?CLDPTR
JNZ $ + 4H
AJMP ?C0111
; {
; SOURCE LINE # 725
; glyph = (unsigned char)*str;
; SOURCE LINE # 726
MOV glyph?14128,A
;
; /* check to make sure the symbol is a legal one */
; /* if not then just replace it with a "." character */
; if((glyph < ASCII_BOT) || (glyph > ASCII_TOP))
; SOURCE LINE # 730
CLR C
SUBB A,#020H
JC ?C0109
MOV A,glyph?14128
SETB C
SUBB A,#07EH
JC ?C0108
?C0109:
; {
; SOURCE LINE # 731
; glyph = '.';
; SOURCE LINE # 732
MOV glyph?14128,#02EH
; }
; SOURCE LINE # 733
?C0108:
;
; /* the fonts start at ASCII_BOT, so to get the index into the font array */
; /* subtract ASCII_BOT from the glyph */
; glyph -= ASCII_BOT;
; SOURCE LINE # 737
MOV A,#0E0H
ADD A,glyph?14128
MOV glyph?14128,A
; width = fonts[font].fixed_width; /* check if it is a fixed width */
; SOURCE LINE # 738
MOV B,#07H
MOV A,font?14125
MUL AB
ADD A,#LOW (fonts+04H)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (fonts+04H)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV width?14129,A
; if(width == 0)
; SOURCE LINE # 739
JNZ ?C0110
; {
; SOURCE LINE # 740
; width=fonts[font].width_table[glyph]; /* get the variable width instead */
; SOURCE LINE # 741
MOV B,#07H
MOV A,font?14125
MUL AB
ADD A,#LOW (fonts+05H)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (fonts+05H)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV A,#01H
MOVC A,@A+DPTR
ADD A,glyph?14128
MOV DPL,A
CLR A
ADDC A,R6
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV width?14129,A
; }
; SOURCE LINE # 742
?C0110:
;
; height = fonts[font].glyph_height;
; SOURCE LINE # 744
MOV B,#07H
MOV A,font?14125
MUL AB
ADD A,#LOW (fonts+01H)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (fonts+01H)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV height?14130,A
; store_width = fonts[font].store_width;
; SOURCE LINE # 745
MOV B,#07H
MOV A,font?14125
MUL AB
ADD A,#LOW (fonts)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (fonts)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV store_width?14131,A
;
; glyph_ptr = fonts[font].glyph_table + (glyph * store_width * height);
; SOURCE LINE # 747
MOV B,#07H
MOV A,font?14125
MUL AB
ADD A,#LOW (fonts+02H)
MOV DPL,A
MOV A,B
ADDC A,#HIGH (fonts+02H)
MOV DPH,A
MOV A,glyph?14128
MOV B,store_width?14131
MUL AB
MOV B,height?14130
MUL AB
MOV R7,A
MOV R6,B
MOV A,#01H
MOVC A,@A+DPTR
ADD A,R7
MOV glyph_ptr?14132+01H,A
CLR A
MOVC A,@A+DPTR
ADDC A,R6
MOV glyph_ptr?14132,A
;
; lcd_glyph(x,top,width,height,glyph_ptr,store_width); /* plug symbol into buffer */
; SOURCE LINE # 749
MOV ?_lcd_glyph?BYTE+03H,height?14130
MOV ?_lcd_glyph?BYTE+04H,#0FFH
MOV ?_lcd_glyph?BYTE+05H,A
MOV ?_lcd_glyph?BYTE+06H,glyph_ptr?14132+01H
MOV ?_lcd_glyph?BYTE+07H,store_width?14131
MOV R3,width?14129
MOV R5,top?14124
MOV R7,x?14127
LCALL _lcd_glyph
;
; x += width; /* move right for next character */
; SOURCE LINE # 751
MOV A,width?14129
ADD A,x?14127
MOV x?14127,A
; str++; /* point to next character in string */
; SOURCE LINE # 752
MOV A,#01H
ADD A,str?14126+02H
MOV str?14126+02H,A
CLR A
ADDC A,str?14126+01H
MOV str?14126+01H,A
; }
; SOURCE LINE # 753
AJMP ?C0106
; }
; SOURCE LINE # 754
?C0111:
RET
; END OF _lcd_text
;
; /*
; **
; ** Updates area of the display. Writes data from display
; ** RAM to the lcd display controller.
; **
; ** Arguments Used:
; ** top top line of area to update.
; ** bottom bottom line of area to update.
; **
; */
;
; void lcd_update(unsigned char top, unsigned char bottom)
RSEG ?PR?_lcd_update?LCD106X56
_lcd_update:
USING 0
; SOURCE LINE # 767
;---- Variable 'bottom?15134' assigned to Register 'R5' ----
;---- Variable 'top?15133' assigned to Register 'R7' ----
; {
; SOURCE LINE # 768
; unsigned char x;
; unsigned char y;
; unsigned char yt;
; unsigned char yb;
; unsigned char *colptr;
;
; yt = top >> 3; /* setup bytes of range */
; SOURCE LINE # 775
MOV A,R7
RRC A
RRC A
RRC A
ANL A,#01FH
MOV R7,A
;---- Variable 'yt?15137' assigned to Register 'R7' ----
; yb = bottom >> 3;
; SOURCE LINE # 776
MOV A,R5
RRC A
RRC A
RRC A
ANL A,#01FH
MOV yb?15138,A
;
; for(y = yt; y <= yb; y++)
; SOURCE LINE # 778
MOV y?15136,R7
?C0112:
MOV A,y?15136
SETB C
SUBB A,yb?15138
JNC ?C0118
; {
; SOURCE LINE # 779
; /* setup the page number for the y direction */
; lcd_out_ctl(LCD_SET_PAGE+y); /* set page */
; SOURCE LINE # 781
MOV A,y?15136
;
; /* setup column of update to left side */
; lcd_out_ctl(LCD_SET_COL_HI+(26/16)); /* set column 26 */
; SOURCE LINE # 784
; lcd_out_ctl(LCD_SET_COL_LO+(26%16));
; SOURCE LINE # 785
LCALL L?0124
;
; colptr = &l_display_array[y][0];
; SOURCE LINE # 787
MOV A,y?15136
MOV B,#06AH
MUL AB
ADD A,#LOW (l_display_array)
MOV R1,A
MOV A,#HIGH (l_display_array)
ADDC A,B
MOV colptr?15139,#01H
MOV colptr?15139+01H,A
MOV colptr?15139+02H,R1
; for (x=0; x < X_BYTES; x++)
; SOURCE LINE # 788
;---- Variable 'x?15135' assigned to Register 'R4' ----
CLR A
MOV R4,A
?C0115:
; {
; SOURCE LINE # 789
; lcd_out_dat(*colptr++);
; SOURCE LINE # 790
MOV R3,colptr?15139
INC colptr?15139+02H
MOV A,colptr?15139+02H
MOV R2,colptr?15139+01H
JNZ ?C0123
INC colptr?15139+01H
?C0123:
DEC A
MOV R1,A
LCALL ?C?CLDPTR
MOV R7,A
LCALL _lcd_out_dat
; }
; SOURCE LINE # 791
INC R4
CJNE R4,#06AH,?C0115
; }
; SOURCE LINE # 792
?C0114:
INC y?15136
SJMP ?C0112
; }
; SOURCE LINE # 793
?C0118:
RET
; END OF _lcd_update
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -