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

📄 3310lcd_function.s

📁 AVR单片机系统开发经典实例部分源程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	mov R16,R22
	xcall _LCD_set_XY
	xjmp L15
L14:
	.dbline 96
	.dbline 97
	movw R30,R20
	ldd R16,z+0
	xcall _LCD_write_char
	.dbline 98
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 99
L15:
	.dbline 95
; 	////if(X+sizeof(s)*6 >83)  X = 83- sizeof(s)*6;
;     while (*s) 
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L14
	.dbline -2
L13:
	xcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbsym r Y 10 c
	.dbsym r X 22 c
	.dbend
	.dbfunc e LCD_write_chinese_string _LCD_write_chinese_string fV
;              i -> R20
;              n -> R14
;            row -> R10
;           line -> R12
;            num -> R22
;        ch_with -> y+14
;              Y -> y+12
;              X -> y+10
	.even
_LCD_write_chinese_string::
	xcall push_arg4
	xcall push_gset5
	ldd R22,y+16
	ldd R12,y+18
	ldd R10,y+20
	.dbline -1
	.dbline 119
;       {
; 	 LCD_write_char(*s);
; 	 s++;
;       }
;   }
; /*-----------------------------------------------------------------------
; LCD_write_chinese_string: 在LCD上显示汉字
; 
; 输入参数:X、Y    :显示汉字的起始X、Y坐标;
;           ch_with :汉字点阵的宽度
;           num     :显示汉字的个数;  
;           line    :汉字点阵数组中的起始行数
;           row     :汉字显示的行间距
; 编写日期          :2004-8-11 
; 最后修改日期      :2004-8-12 
; 测试:
; 	LCD_write_chi(0,0,12,7,0,0);
; 	LCD_write_chi(0,2,12,7,0,0);
; 	LCD_write_chi(0,4,12,7,0,0);	
; -----------------------------------------------------------------------*/                        
; void LCD_write_chinese_string(unsigned char X, unsigned char Y, 
;                    unsigned char ch_with,unsigned char num,
;                    unsigned char line,unsigned char row)
;   {
	.dbline 122
;     
;     unsigned char i,n;
;     LCD_set_XY(X,Y);                             //设置初始位置
	ldd R18,y+12
	ldd R16,y+10
	xcall _LCD_set_XY
	.dbline 124
;     
;     for (i=0;i<num;)
	clr R20
	xjmp L21
L18:
	.dbline 125
;       {
	.dbline 126
;       	for (n=0; n<ch_with*2; n++)              //写一个汉字
	clr R14
	xjmp L25
L22:
	.dbline 127
;       	  { 
	.dbline 128
;       	    if (n==ch_with)                      //写汉字的下半部分
	ldd R0,y+14
	cp R14,R0
	brne L26
	.dbline 129
;       	      {
	.dbline 130
;       	        if (i==0) LCD_set_XY(X,Y+1);
	tst R20
	brne L28
	.dbline 130
	ldd R18,y+12
	subi R18,255    ; addi 1
	ldd R16,y+10
	xcall _LCD_set_XY
	xjmp L29
L28:
	.dbline 132
;       	        else
;       	           LCD_set_XY((X+(ch_with+row)*i),Y+1);
	ldd R18,y+12
	subi R18,255    ; addi 1
	ldd R2,y+14
	add R2,R10
	mul R2,R20
	ldd R16,y+10
	add R16,R0
	xcall _LCD_set_XY
L29:
	.dbline 133
;               }
L26:
	.dbline 134
	ldi R18,1
	mov R2,R12
	add R2,R20
	ldi R24,24
	mul R24,R2
	movw R2,R0
	ldi R24,<_write_chinese_string
	ldi R25,>_write_chinese_string
	add R2,R24
	adc R3,R25
	mov R30,R14
	clr R31
	add R30,R2
	adc R31,R3
	lpm R16,Z
	xcall _LCD_write_byte
	.dbline 135
L23:
	.dbline 126
	inc R14
L25:
	.dbline 126
	ldi R24,2
	ldd R0,y+14
	mul R24,R0
	cp R14,R0
	brlo L22
	.dbline 136
	inc R20
	.dbline 137
	ldd R18,y+12
	ldd R2,y+14
	add R2,R10
	mul R2,R20
	ldd R16,y+10
	add R16,R0
	xcall _LCD_set_XY
	.dbline 138
L19:
	.dbline 124
L21:
	.dbline 124
	cp R20,R22
	brsh X0
	xjmp L18
X0:
	.dbline -2
L17:
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r n 14 c
	.dbsym r row 10 c
	.dbsym r line 12 c
	.dbsym r num 22 c
	.dbsym l ch_with 14 c
	.dbsym l Y 12 c
	.dbsym l X 10 c
	.dbend
	.area lit(rom, con, rel)
L31:
	.byte 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
	.byte 0,0,0
L32:
	.byte 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
	.byte 0,0,0
	.area text(rom, con, rel)
	.dbfile C:\AVR\M\1\3310LCD_function.c
	.dbfunc e LCD_move_chinese_string _LCD_move_chinese_string fV
;              i -> R20
;              j -> R22
;       buffer_l -> y+84
;       buffer_h -> y+0
;              n -> R10
;              T -> R12
;              Y -> R14
;              X -> y+178
	.even
_LCD_move_chinese_string::
	xcall push_arg4
	xcall push_gset5
	mov R14,R18
	sbiw R28,63
	sbiw R28,63
	sbiw R28,42  ; offset = 168
	movw R30,R28
	subi R30,74  ; addi 182
	sbci R31,255
	ldd R12,z+0
	.dbline -1
	.dbline 151
;       	    LCD_write_byte(write_chinese_string[line+i][n],1);
;       	  }
;       	i++;
;       	LCD_set_XY((X+(ch_with+row)*i),Y);
;       }
;   }
;   
; /*-----------------------------------------------------------------------
; LCD_move_chinese_string: 汉字移动
; 
; 输入参数:X、Y    :显示汉字的起始X、Y坐标;
;           T       :移动速度;
; 
; 编写日期          :2004-8-13 
; 最后修改日期      :2004-8-13 
; -----------------------------------------------------------------------*/                        
; void LCD_move_chinese_string (unsigned char X, unsigned char Y, unsigned char T)
;   {
	.dbline 152
;     unsigned char i,n,j=0;
	clr R22
	.dbline 153
;     unsigned char buffer_h[84]={0};
	ldi R24,<L31
	ldi R25,>L31
	movw R30,R28
	ldi R16,84
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 154
;     unsigned char buffer_l[84]={0};
	ldi R24,<L32
	ldi R25,>L32
	movw R30,R28
	subi R30,172  ; offset = 84
	sbci R31,255
	ldi R16,84
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 156
;       
;     for (i=0; i<156; i++)
	clr R20
	xjmp L36
L33:
	.dbline 157
;       {
	.dbline 158
;         buffer_h[83] = move_chinese_string[i/12][j];
	ldi R17,12
	mov R16,R20
	xcall div8u
	ldi R24,24
	mul R24,R16
	movw R2,R0
	ldi R24,<_move_chinese_string
	ldi R25,>_move_chinese_string
	add R2,R24
	adc R3,R25
	mov R30,R22
	clr R31
	add R30,R2
	adc R31,R3
	lpm R30,Z
	movw R26,R28
	subi R26,173  ; addi 83
	sbci R27,255
	st x,R30
	.dbline 159
;         buffer_l[83] = move_chinese_string[i/12][j+12];
	ldi R17,12
	mov R16,R20
	xcall div8u
	ldi R24,24
	mul R24,R16
	movw R2,R0
	ldi R24,<_move_chinese_string
	ldi R25,>_move_chinese_string
	add R2,R24
	adc R3,R25
	mov R30,R22
	clr R31
	adiw R30,12
	add R30,R2
	adc R31,R3
	lpm R30,Z
	movw R26,R28
	subi R26,89  ; addi 167
	sbci R27,255
	st x,R30
	.dbline 160
;         j++;
	inc R22
	.dbline 161
;         if (j==12) j=0;
	cpi R22,12
	brne L39
	.dbline 161
	clr R22
L39:
	.dbline 163
;         
;         for (n=0; n<83; n++)
	clr R10
	xjmp L44
L41:
	.dbline 164
	.dbline 165
	movw R24,R28
	adiw R24,1
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R24,R28
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 166
	movw R24,R28
	subi R24,171  ; offset = 85
	sbci R25,255
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	movw R24,R28
	subi R24,172  ; offset = 84
	sbci R25,255
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 167
L42:
	.dbline 163
	inc R10
L44:
	.dbline 163
	mov R24,R10
	cpi R24,83
	brlo L41
	.dbline 169
;           { 
;             buffer_h[n]=buffer_h[n+1];
;             buffer_l[n]=buffer_l[n+1];
;           } 
;         
;         LCD_set_XY(X,Y);
	mov R18,R14
	movw R30,R28
	subi R30,78  ; addi 178
	sbci R31,255
	ldd R16,z+0
	xcall _LCD_set_XY
	.dbline 170
;         for (n=0; n<83; n++)
	clr R10
	xjmp L50
L47:
	.dbline 171
	.dbline 172
	ldi R18,1
	movw R24,R28
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_write_byte
	.dbline 173
L48:
	.dbline 170
	inc R10
L50:
	.dbline 170
	mov R24,R10
	cpi R24,83
	brlo L47
	.dbline 175
;           { 
;             LCD_write_byte(buffer_h[n],1);
;           } 
;         
;         LCD_set_XY(X,Y+1); 
	mov R18,R14
	subi R18,255    ; addi 1
	movw R30,R28
	subi R30,78  ; addi 178
	sbci R31,255
	ldd R16,z+0
	xcall _LCD_set_XY
	.dbline 176
;         for (n=0; n<83; n++)
	clr R10
	xjmp L54
L51:
	.dbline 177
	.dbline 178
	ldi R18,1
	movw R24,R28
	subi R24,172  ; offset = 84
	sbci R25,255
	mov R30,R10
	clr R31
	add R30,R24
	adc R31,R25
	ldd R16,z+0
	xcall _LCD_write_byte
	.dbline 179
L52:
	.dbline 176
	inc R10
L54:
	.dbline 176
	mov R24,R10
	cpi R24,83
	brlo L51
	.dbline 181
	mov R16,R12
	clr R17
	xcall _delay_nms
	.dbline 182
L34:
	.dbline 156
	inc R20
L36:
	.dbline 156
	cpi R20,156
	brsh X1
	xjmp L33
X1:
	.dbline -2
L30:
	adiw R28,63
	adiw R28,63
	adiw R28,42  ; offset = 168
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r j 22 c
	.dbsym l buffer_l 84 A[84:84]c
	.dbsym l buffer_h 0 A[84:84]c
	.dbsym r n 10 c
	.dbsym r T 12 c
	.dbsym r Y 14 c
	.dbsym l X 178 c
	.dbend
	.dbfunc e LCD_draw_bmp_pixel _LCD_draw_bmp_pixel fV
;            row -> R20
;              n -> R22,R23
;              i -> R14,R15
;          Pix_y -> y+18
;          Pix_x -> R10
;            map -> R12,R13
;              Y -> y+12
;              X -> y+10
	.even
_LCD_draw_bmp_pixel::
	xcall push_arg4
	xcall push_gset5
	ldd R12,y+14
	ldd R13,y+15
	ldd R10,y+16
	.dbline -1
	.dbline 240
;           { 
;             LCD_write_byte(buffer_l[n],1);
;           } 
;           
;        delay_nms(T);
;       }
;   }
; /*void LCD_move_english_string (unsigned char X, unsigned char Y, unsigned char T,unsigned int n)
;   {
;     unsigned char i,n,j=0;
;     unsigned char buffer[84]={0};
;     T -= 31;  
;     for (i=0; i<n; i++)
;       {
;         buffer[83] = LCD_write_byte(font6x8[T][j], 1);
;         j++;
;         if (j==6) j=0;
;         
;         for (n=0; n<83; n++)
;           { 
;             buffer_h[n]=buffer_h[n+1];
;             buffer_l[n]=buffer_l[n+1];
;           } 
;         
;         LCD_set_XY(X,Y);
;         for (n=0; n<83; n++)
;           { 
;             LCD_write_byte(buffer_h[n],1);
;           } 
;         
;         LCD_set_XY(X,Y+1); 
;         for (n=0; n<83; n++)
;           { 
;             LCD_write_byte(buffer_l[n],1);
;           } 
;           
;        delay_nms(T);
;       }
;   }*/
;   /*
; void LCD_write_char(unsigned char c)
;   {
;     unsigned char line;
; 
;     c -= 32;
; 
;     for (line=0; line<6; line++)
;       LCD_write_byte(font6x8[c][line], 1);
;   }
; */
; /*-----------------------------------------------------------------------
; LCD_draw_map      : 位图绘制函数
; 
; 输入参数:X、Y    :位图绘制的起始X、Y坐标;
;           *map    :位图点阵数据;
;           Pix_x   :位图像素(长)
;           Pix_y   :位图像素(宽)
; 
; 编写日期          :2004-8-13
; 最后修改日期      :2004-8-13 
; -----------------------------------------------------------------------*/
; void LCD_draw_bmp_pixel(unsigned char X,unsigned char Y,unsigned char *map,
;                   unsigned char Pix_x,unsigned char Pix_y)
;   {
	.dbline 244
;     unsigned int i,n;
;     unsigned char row;
;     
;     if (Pix_y%8==0) row=Pix_y/8;      //计算位图所占行数
	ldi R17,8
	ldd R16,y+18
	xcall mod8u
	tst R16
	brne L56
	.dbline 244
	ldd R20,y+18
	lsr R20
	lsr R20
	lsr R20
	xjmp L57
L56:
	.dbline 246
;       else
;         row=Pix_y/8+1;
	ldd R20,y+18
	lsr R20
	lsr R20
	lsr R20
	subi R20,255    ; addi 1
L57:
	.dbline 248
;     
;     for (n=0;n<row;n++)
	clr R22
	clr R23
	xjmp L61
L58:
	.dbline 249
;       {
	.dbline 250
;       	LCD_set_XY(X,Y);
	ldd R18,y+12
	ldd R16,y+10
	xcall _LCD_set_XY
	.dbline 251
;         for(i=0; i<Pix_x; i++)
	clr R14
	clr R15
	xjmp L65
L62:
	.dbline 252
	.dbline 253
	ldi R18,1
	mov R2,R10
	clr R3
	push R18
	push R19
	movw R18,R2
	movw R16,R22
	xcall empy16s
	pop R19
	pop R18
	movw R30,R14
	add R30,R16
	adc R31,R17
	add R30,R12
	adc R31,R13
	ldd R16,z+0
	xcall _LCD_write_byte
	.dbline 254
L63:
	.dbline 251
	movw R24,R14
	adiw R24,1
	movw R14,R24
L65:
	.dbline 251
	mov R2,R10
	clr R3
	cp R14,R2
	cpc R15,R3
	brlo L62
	.dbline 255
	ldd R0,y+12
	inc R0
	std y+12,R0
	.dbline 256
L59:
	.dbline 248
	subi R22,255  ; offset = 1
	sbci R23,255
L61:
	.dbline 248
	mov R2,R20
	clr R3
	cp R22,R2
	cpc R23,R3
	brlo L58
	.dbline -2
L55:
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r row 20 c
	.dbsym r n 22 i
	.dbsym r i 14 i
	.dbsym l Pix_y 18 c
	.dbsym r Pix_x 10 c
	.dbsym r map 12 pc
	.dbsym l Y 12 c
	.dbsym l X 10 c
	.dbend
	.dbfunc e LCD_write_byte _LCD_write_byte fV
;        command -> R18
;           data -> R16
	.even
_LCD_write_byte::
	.dbline -1
	.dbline 269
;           {
;             LCD_write_byte(map[i+n*Pix_x], 1);
;           }
;         Y++;                         //换行
;       }      
;   }
; 
; /*-----------------------------------------------------------------------
; LCD_write_byte    : 使用SPI接口写数据到LCD
; 
; 输入参数:data    :写入的数据;
;           command :写数据/命令选择;
; 
; 编写日期          :2004-8-10 
; 最后修改日期      :2004-8-13 
; -----------------------------------------------------------------------*/
; void LCD_write_byte(unsigned char data, unsigned char command)
;   {
	.dbline 270
;     PORTA &= ~LCD_CE ;		        // 使能LCD
	cbi 0x1b,4
	.dbline 272
;     
;     if (command == 0)
	tst R18
	brne L67
	.dbline 273
;       PORTA &= ~LCD_DC ;	        // 传送命令
	cbi 0x1b,6
	xjmp L68
L67:
	.dbline 275
;     else
;       PORTA |= LCD_DC ;		        // 传送数据
	sbi 0x1b,6
L68:
	.dbline 277
; 
;     SPDR = data;			// 传送数据到SPI寄存器
	out 0xf,R16
L69:
	.dbline 279
L70:
	.dbline 279
; 
;     while ((SPSR & 0x80) == 0);         // 等待数据传送完毕
	sbis 0xe,7
	rjmp L69
	.dbline 281
; 	
;     PORTA |= LCD_CE ;			// 关闭LCD
	sbi 0x1b,4
	.dbline -2
L66:
	.dbline 0 ; func end
	ret
	.dbsym r command 18 c
	.dbsym r data 16 c
	.dbend

⌨️ 快捷键说明

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