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

📄 graphic.s

📁 AVR控制12864液晶画圆弧,在AVR单片机的控制下完成圆弧的绘制。
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module graphic.c
	.area data(ram, con, rel)
_l_mask_array::
	.blkb 2
	.area idata
	.byte 1,2
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 4,8
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 16,32
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 64,128
	.area data(ram, con, rel)
	.dbfile C:\ygksb0108\programme2_can_run\graphic.c
	.dbsym e l_mask_array _l_mask_array A[8:8]c
_l_display_array::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile C:\ygksb0108\programme2_can_run\graphic.c
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile C:\ygksb0108\programme2_can_run\graphic.c
	.blkb 125
	.area idata
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.byte 0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile C:\ygksb0108\programme2_can_run\graphic.c
	.blkb 896
	.area idata
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.word 0,0,0,0,0
	.byte 0,0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile C:\ygksb0108\programme2_can_run\graphic.c
	.dbsym e l_display_array _l_display_array A[1024:8:128]c
	.area text(rom, con, rel)
	.dbfile C:\ygksb0108\programme2_can_run\graphic.c
	.dbfunc e lcd_fill _lcd_fill fV
;           page -> R20
;            col -> R10
;        pattern -> R22
	.even
_lcd_fill::
	xcall push_gset3
	mov R22,R16
	.dbline -1
	.dbline 14
; //*****************************************************************
; //本头文件实现了用于液晶显示的缓冲区和基本的图形函数
; //包括了画点,画线,画圆,画矩形等函数,每种函数都有三种方式画
; //即 LCD_MODE_CLEAR, LCD_MODE_SET, LCD_MODE_XOR(清除,置位,异或)
; //             ---北京交通大学电气学院 杨罡 2008.8
; //*****************************************************************
; #include  "graphic.h"
; 
;  unsigned char l_mask_array[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
;  unsigned char l_display_array[LCD_Y_BYTES][LCD_X_BYTES]={0,0,0};
;  /* TODO: avoid or PROGMEM */
;  /* fill buffer and LCD with pattern */
; void lcd_fill( unsigned char pattern)
;  { unsigned char page, col;
	.dbline 16
; 
;    for (page=0; page<LCD_Y_BYTES; page++) 
	clr R20
	xjmp L5
L2:
	.dbline 17
;     { for (col=0; col<LCD_X_BYTES; col++) 
	.dbline 17
	clr R10
	xjmp L9
L6:
	.dbline 18
	ldi R24,128
	mul R24,R20
	movw R2,R0
	ldi R24,<_l_display_array
	ldi R25,>_l_display_array
	add R2,R24
	adc R3,R25
	mov R30,R10
	clr R31
	add R30,R2
	adc R31,R3
	std z+0,R22
L7:
	.dbline 17
	inc R10
L9:
	.dbline 17
	mov R24,R10
	cpi R24,128
	brlo L6
	.dbline 19
L3:
	.dbline 16
	inc R20
L5:
	.dbline 16
	cpi R20,8
	brlo L2
	.dbline 20
;          l_display_array[page][col]=pattern;
;     }
;    lcd_update_all();
	xcall _lcd_update_all
	.dbline -2
L1:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r page 20 c
	.dbsym r col 10 c
	.dbsym r pattern 22 c
	.dbend
	.dbfunc e lcd_erase _lcd_erase fV
	.even
_lcd_erase::
	.dbline -1
	.dbline 25
;  }
; 
; 
; void lcd_erase(void)
;  { lcd_fill(0x00);
	.dbline 25
	clr R16
	xcall _lcd_fill
	.dbline 26
;    lcd_update_all();
	xcall _lcd_update_all
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_update _lcd_update fV
;             yt -> R10
;             yb -> R20
;              y -> R22
;         colptr -> R10,R11
;              x -> R12
;         bottom -> R20
;            top -> R22
	.even
_lcd_update::
	xcall push_gset4
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 41
;  }
; 
; /*
; **
; ** Updates area of the display. Writes data from "framebuffer" 
; ** RAM to the lcd display controller RAM.
; ** 
; ** Arguments Used:
; **    top     top line of area to update.
; **    bottom  bottom line of area to update.
; **    from MJK-Code
; **
; */
; void lcd_update( unsigned char top,  unsigned char bottom)
;  { unsigned char x;
	.dbline 48
;    unsigned char y;
;    unsigned char yt;
;    unsigned char yb;
;    unsigned char *colptr;
;   
;    /* setup bytes of range */
;    yb = bottom >> 3;
	lsr R20
	lsr R20
	lsr R20
	.dbline 49
;    yt = top >> 3;		
	mov R10,R22
	lsr R10
	lsr R10
	lsr R10
	.dbline 51
; 
;    for(y = yt; y <= yb; y++)
	mov R22,R10
	xjmp L15
L12:
	.dbline 52
;     {lcd_out_ctl(LCD_SET_PAGE+y,3);	    /* set page */
	.dbline 52
	ldi R18,3
	mov R16,R22
	subi R16,72    ; addi 184
	xcall _lcd_out_ctl
	.dbline 54
;                                        //     lcd_out_ctl(LCD_SET_COL+LCD_STARTCOL_REVERSE,3);
;      lcd_out_ctl(LCD_SET_COL+0,3);
	ldi R18,3
	ldi R16,64
	xcall _lcd_out_ctl
	.dbline 56
; 	 
;      colptr = &l_display_array[y][0];
	ldi R24,128
	mul R24,R22
	movw R10,R0
	ldi R24,<_l_display_array
	ldi R25,>_l_display_array
	add R10,R24
	adc R11,R25
	.dbline 58
; 
;       for (x=0; x < LCD_X_BYTES; x++)
	clr R12
	xjmp L19
L16:
	.dbline 59
;        { if ( x <LCD_X_BYTES/2 ) 
	.dbline 59
	mov R24,R12
	cpi R24,64
	brsh L20
	.dbline 60
;             lcd_out_dat_l(*colptr++);
	movw R30,R10
	ld R16,Z+
	movw R10,R30
	xcall _lcd_out_dat_l
	xjmp L21
L20:
	.dbline 62
;          else 
;             lcd_out_dat_r(*colptr++);
	movw R30,R10
	ld R16,Z+
	movw R10,R30
	xcall _lcd_out_dat_r
L21:
	.dbline 63
L17:
	.dbline 58
	inc R12
L19:
	.dbline 58
	mov R24,R12
	cpi R24,128
	brlo L16
	.dbline 65
L13:
	.dbline 51
	inc R22
L15:
	.dbline 51
	cp R20,R22
	brsh L12
	.dbline -2
L11:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r yt 10 c
	.dbsym r yb 20 c
	.dbsym r y 22 c
	.dbsym r colptr 10 pc
	.dbsym r x 12 c
	.dbsym r bottom 20 c
	.dbsym r top 22 c
	.dbend
	.dbfunc e lcd_update_all _lcd_update_all fV
	.even
_lcd_update_all::
	.dbline -1
	.dbline 71
;        }
;  
;     }
;  }
; 
; 
; 
; void lcd_update_all(void)
;  { lcd_update(SCRN_TOP,SCRN_BOTTOM);
	.dbline 71
	ldi R18,63
	clr R16
	xcall _lcd_update
	.dbline -2
L22:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e lcd_dot _lcd_dot fV
;        pBuffer -> R20,R21
;        bitmask -> R22
;          yByte -> R20
;         bitnum -> R22
;           mode -> y+6
;              y -> R18
;              x -> R16
	.even
_lcd_dot::
	xcall push_gset3
	.dbline -1
	.dbline 78
;  }
; 
; 
; 
; /* sets/clears/switchs(XOR) dot at (x,y) */
; void lcd_dot( unsigned char x,  unsigned char y,  unsigned char mode) 
;  { unsigned char bitnum, bitmask, yByte;
	.dbline 81
	ldi R24,127
	cp R24,R16
	brlo L26
	ldi R24,63
	cp R24,R18
	brsh L24
L26:
	.dbline 81
;    unsigned char *pBuffer; /* pointer used for optimisation */
; 
;    if ( ( x > SCRN_RIGHT ) || ( y > SCRN_BOTTOM ) ) return;
	xjmp L23
L24:
	.dbline 83
; 
;    yByte   = y >> 3; 
	mov R20,R18
	lsr R20
	lsr R20
	lsr R20
	.dbline 84
;    bitnum  = y & 0x07;
	mov R22,R18
	andi R22,7
	.dbline 85
;    bitmask = l_mask_array[bitnum]; // bitmask = ( 1 << (y & 0x07) );
	ldi R24,<_l_mask_array
	ldi R25,>_l_mask_array
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 86
;    pBuffer = &(l_display_array[yByte][x]);
	ldi R24,128
	mul R24,R20
	movw R2,R0
	ldi R24,<_l_display_array
	ldi R25,>_l_display_array
	add R2,R24
	adc R3,R25
	mov R20,R16
	clr R21
	add R20,R2
	adc R21,R3
	.dbline 87
;    switch (mode) 
	ldd R10,y+6
	clr R11
	tst R10
	brne X0
	tst R11
	breq L31
X0:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L30
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	breq L32
	xjmp L28
X1:
	.dbline 88
;     { case LCD_MODE_SET:
L30:
	.dbline 89
;          *pBuffer |= bitmask;
	movw R30,R20
	ldd R2,z+0
	or R2,R22
	std z+0,R2
	.dbline 90
;          break;
	xjmp L28
L31:
	.dbline 92
;       case LCD_MODE_CLEAR:
;          *pBuffer &= ~bitmask;
	mov R2,R22
	com R2
	movw R30,R20
	ldd R3,z+0
	and R3,R2
	std z+0,R3
	.dbline 93
;          break;
	xjmp L28
L32:
	.dbline 95
	movw R30,R20
	ldd R2,z+0
	eor R2,R22
	std z+0,R2
	.dbline 96
	.dbline 97
L28:
	.dbline -2
L23:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r pBuffer 20 pc
	.dbsym r bitmask 22 c
	.dbsym r yByte 20 c
	.dbsym r bitnum 22 c
	.dbsym l mode 6 c
	.dbsym r y 18 c
	.dbsym r x 16 c
	.dbend
	.dbfunc e lcd_line _lcd_line fV
;           yTmp -> y+6
;           xTmp -> y+5
;           yAlt -> R20
;              m -> R22,R23
;              y -> R10
;         length -> R12
;              i -> R14
;           mode -> y+23
;             y2 -> y+21
;             x2 -> y+19
;             y1 -> y+17
;             x1 -> R8
	.even
_lcd_line::
	st -y,r19
	st -y,r18
	xcall push_gset5
	mov R8,R16
	sbiw R28,7
	.dbline -1
	.dbline 105
;       case LCD_MODE_XOR:
;          *pBuffer ^= bitmask;
;          break;
;       default: break;
;     }         
;  }
; 
; 
; /* line- and circle-function from a KS0108-library by F. Thiele */
; 
; void lcd_line( uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2,  uint8_t mode ) 
;  { uint8_t length, xTmp, yTmp, i, y, yAlt;
	.dbline 108
;    int16_t m;
;    
;    if(x1 == x2) 
	ldd R0,y+19
	cp R8,R0
	brne L34
	.dbline 109
;     { // vertical line
	.dbline 111
;       // x1|y1 must be the upper point
;       if(y1 > y2) 
	ldd R0,y+21
	ldd R16,y+17
	cp R0,R16
	brsh L36
	.dbline 112
;        { xTmp = x1;
	.dbline 112
	std y+5,R8
	.dbline 113
;          yTmp = y1;
	ldd R0,y+17
	std y+6,R0
	.dbline 114
;          x1 = x2;
	ldd R8,y+19
	.dbline 115
;          y1 = y2;
	ldd R0,y+21
	std y+17,R0
	.dbline 116
;          x2 = xTmp;
	ldd R0,y+5
	std y+19,R0
	.dbline 117
;          y2 = yTmp;
	ldd R0,y+6
	std y+21,R0
	.dbline 118
;        }
L36:
	.dbline 119
;       length = y2-y1;
	ldd R12,y+21
	ldd R0,y+17
	sub R12,R0
	.dbline 120
;       for(i=0; i<=length; i++) 
	clr R14
	xjmp L41
L38:
	.dbline 121
	ldd R0,y+23
	std y+0,R0
	ldd R18,y+17
	add R18,R14
	mov R16,R8
	push R16
	xcall _lcd_dot
	pop R8
L39:
	.dbline 120
	inc R14
L41:
	.dbline 120
	cp R12,R14
	brsh L38
	.dbline 122
;          lcd_dot(x1, y1+i, mode);
;     } 
	xjmp L35
L34:
	.dbline 123
;    else if(y1 == y2) 
	ldd R0,y+17
	ldd R16,y+21
	cp R0,R16
	brne L42
	.dbline 124
;     { // horizontal line
	.dbline 126
;       // x1|y1 must be the left point
;       if(x1 > x2) 
	ldd R0,y+19
	cp R0,R8
	brsh L44
	.dbline 127
;        { xTmp = x1;
	.dbline 127
	std y+5,R8
	.dbline 128
;          yTmp = y1;
	ldd R0,y+17
	std y+6,R0
	.dbline 129
;          x1 = x2;
	ldd R8,y+19
	.dbline 130
;          y1 = y2;
	ldd R0,y+21
	std y+17,R0
	.dbline 131
;          x2 = xTmp;
	ldd R0,y+5
	std y+19,R0
	.dbline 132
;          y2 = yTmp;
	ldd R0,y+6
	std y+21,R0
	.dbline 133
;        }
L44:
	.dbline 135
; 
;       length = x2-x1;
	ldd R12,y+19
	sub R12,R8
	.dbline 136
;       for(i=0; i<=length; i++) 
	clr R14
	xjmp L49
L46:
	.dbline 137
	ldd R0,y+23
	std y+0,R0
	ldd R18,y+17
	mov R16,R8
	add R16,R14
	push R8
	xcall _lcd_dot
	pop R8
L47:
	.dbline 136
	inc R14
L49:
	.dbline 136
	cp R12,R14
	brsh L46
	.dbline 139
;          lcd_dot(x1+i, y1, mode);
;        
;     } 
	xjmp L43
L42:
	.dbline 141
;    else 
;     { // x1 must be smaller than x2
	.dbline 142
;       if(x1 > x2) 
	ldd R0,y+19
	cp R0,R8
	brsh L50
	.dbline 143
;        { xTmp = x1;
	.dbline 143
	std y+5,R8
	.dbline 144
;          yTmp = y1;
	ldd R0,y+17
	std y+6,R0
	.dbline 145
;          x1 = x2;
	ldd R8,y+19
	.dbline 146
;          y1 = y2;
	ldd R0,y+21
	std y+17,R0
	.dbline 147
;          x2 = xTmp;
	ldd R0,y+5
	std y+19,R0
	.dbline 148
;          y2 = yTmp;
	ldd R0,y+6
	std y+21,R0
	.dbline 149
;        }
L50:
	.dbline 151
; 		
;       if((y2-y1) >= (x2-x1) || (y1-y2) >= (x2-x1)) 
	mov R2,R8
	clr R3
	ldd R4,y+19
	clr R5
	sub R4,R2
	sbc R5,R3
	ldd R2,y+17
	clr R3
	ldd R6,y+21
	clr R7
	sub R6,R2
	sbc R7,R3
	cp R6,R4
	cpc R7,R5
	brge L54
	ldd R2,y+21
	clr R3
	ldd R6,y+17
	clr R7
	sub R6,R2
	sbc R7,R3
	cp R6,R4
	cpc R7,R5
	brge X2
	xjmp L52
X2:
L54:
	.dbline 152
;        { // angle larger or equal 45?
	.dbline 153
;          length = x2-x1;								// not really the length :)
	ldd R12,y+19
	sub R12,R8
	.dbline 154
;          m = ((y2-y1)*200)/length;
	ldd R2,y+21
	ldd R0,y+17
	sub R2,R0
	ldi R24,200
	mul R24,R2
	movw R16,R0
	mov R18,R12
	clr R19
	xcall div16s
	movw R22,R16
	.dbline 155

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -