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

📄 lcd.s

📁 ICCAVR编写128*64液晶程序测试已经通过
💻 S
📖 第 1 页 / 共 3 页
字号:
	.even
_set_start_line_R::
	xcall push_gset1
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 116
; }
; 
; void set_start_line_R(unsigned char line) /*设置显示起始行*/ //0-63
; {
	.dbline 117
;    write_LCD(RIGHT,CMD,0xc0|line);
	mov R24,R20
	ori R24,192
	std y+0,R24
	clr R18
	ldi R16,1
	xcall _write_LCD
	.dbline -2
L24:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r line 20 c
	.dbend
	.dbfunc e set_page_L _set_page_L fV
;           page -> R20
	.even
_set_page_L::
	xcall push_gset1
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 121
; }
; 
; void set_page_L(unsigned char page)	/*设置X地址 设置页*/  //0-7
; {
	.dbline 122
;    write_LCD(LEFT,CMD,0xb8|page);
	mov R24,R20
	ori R24,184
	std y+0,R24
	clr R18
	clr R16
	xcall _write_LCD
	.dbline -2
L25:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r page 20 c
	.dbend
	.dbfunc e set_page_R _set_page_R fV
;           page -> R20
	.even
_set_page_R::
	xcall push_gset1
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 125
; }
; void set_page_R(unsigned char page)	/*设置X地址 设置页*/ //0-7
; {
	.dbline 126
;    write_LCD(RIGHT,CMD,0xb8|page);
	mov R24,R20
	ori R24,184
	std y+0,R24
	clr R18
	ldi R16,1
	xcall _write_LCD
	.dbline -2
L26:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r page 20 c
	.dbend
	.dbfunc e set_col_addr_L _set_col_addr_L fV
;            col -> R20
	.even
_set_col_addr_L::
	xcall push_gset1
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 130
; }
; 
; void set_col_addr_L(unsigned char col) /*设置Y地址*/ //0-63
; {
	.dbline 131
;    write_LCD(LEFT,CMD,0x40|col);
	mov R24,R20
	ori R24,64
	std y+0,R24
	clr R18
	clr R16
	xcall _write_LCD
	.dbline -2
L27:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r col 20 c
	.dbend
	.dbfunc e set_col_addr_R _set_col_addr_R fV
;            col -> R20
	.even
_set_col_addr_R::
	xcall push_gset1
	mov R20,R16
	sbiw R28,1
	.dbline -1
	.dbline 135
; }
; 
; void set_col_addr_R(unsigned char col) /*设置Y地址*/ //0-63
; {
	.dbline 136
;    write_LCD(RIGHT,CMD,0x40|col);
	mov R24,R20
	ori R24,64
	std y+0,R24
	clr R18
	ldi R16,1
	xcall _write_LCD
	.dbline -2
L28:
	adiw R28,1
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r col 20 c
	.dbend
	.dbfunc e LCD_Init _LCD_Init fV
	.even
_LCD_Init::
	sbiw R28,1
	.dbline -1
	.dbline 142
; }
; 
; 
; //------------液晶初始化函数-----------------------
; void LCD_Init(void) 
; {
	.dbline 143
;    LCD_DIR_PORT = 0xff;
	ldi R24,255
	out 0x1a,R24
	.dbline 144
;    LCD_OP_PORT = 0xff;
	out 0x1b,R24
	.dbline 145
;    LCD_EN_DDR    |=  LCD_EN_BIT;
	sbi 0x17,2
	.dbline 146
;    LCD_DI_DDR    |=  LCD_DI_BIT;
	sbi 0x17,0
	.dbline 147
;    LCD_CS1_DDR   |=  LCD_CS1_BIT;
	sbi 0x17,3
	.dbline 148
;    LCD_CS2_DDR   |=  LCD_CS2_BIT;
	sbi 0x17,4
	.dbline 149
;    LCD_RW_DDR    |=  LCD_RW_BIT;
	sbi 0x17,1
	.dbline 150
;    LCD_RW_PORT   &= ~LCD_RW_BIT;
	cbi 0x18,1
	.dbline 151
;    LCD_reset();
	xcall _LCD_reset
	.dbline 152
;    set_start_line_L(0);             /*显示起始行为0*/
	clr R16
	xcall _set_start_line_L
	.dbline 153
;    set_start_line_R(0);             /*显示起始行为0*/
	clr R16
	xcall _set_start_line_R
	.dbline 154
;    write_LCD(LEFT,CMD,DISPLAY_ON);  /*  开显示  */
	ldi R24,63
	std y+0,R24
	clr R18
	clr R16
	xcall _write_LCD
	.dbline 155
;    write_LCD(RIGHT,CMD,DISPLAY_ON); /*  开显示  */
	ldi R24,63
	std y+0,R24
	clr R18
	ldi R16,1
	xcall _write_LCD
	.dbline -2
L29:
	adiw R28,1
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCD_clr _LCD_clr fV
;          pages -> R20
;              i -> R22
	.even
_LCD_clr::
	xcall push_gset2
	sbiw R28,1
	.dbline -1
	.dbline 161
; }
; 
; 
; //-----------清屏函数---------------------------
; void LCD_clr(void)                 
; {
	.dbline 163
;    unsigned char pages,i;
;    for(pages=0;pages<8;pages++)
	clr R20
	xjmp L34
L31:
	.dbline 164
;    {
	.dbline 165
;       set_page_L(pages);            /* X 页地址 */
	mov R16,R20
	xcall _set_page_L
	.dbline 166
;       set_page_R(pages);            /* X 页地址 */
	mov R16,R20
	xcall _set_page_R
	.dbline 167
;       for(i=0;i<64;i++)
	clr R22
	xjmp L38
L35:
	.dbline 168
	.dbline 169
	mov R16,R22
	xcall _set_col_addr_L
	.dbline 170
	mov R16,R22
	xcall _set_col_addr_R
	.dbline 171
	clr R2
	std y+0,R2
	ldi R18,1
	clr R16
	xcall _write_LCD
	.dbline 172
	clr R2
	std y+0,R2
	ldi R18,1
	ldi R16,1
	xcall _write_LCD
	.dbline 173
L36:
	.dbline 167
	inc R22
L38:
	.dbline 167
	cpi R22,64
	brlo L35
	.dbline 174
L32:
	.dbline 163
	inc R20
L34:
	.dbline 163
	cpi R20,8
	brlo L31
	.dbline -2
L30:
	adiw R28,1
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r pages 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e GetPage _GetPage fc
	.even
_GetPage::
	.dbline -1
	.dbline 180
;       {
;          set_col_addr_L(i);//Y
;          set_col_addr_R(i);//Y
;          write_LCD(LEFT,DATA,0x0);
;          write_LCD(RIGHT,DATA,0x0);
;       }
;    }
; }
; 
; 
; //---------当前行列获得函数-----------------------
; unsigned char GetPage(void) /*得到当前页*/
; {
	.dbline 181
;    return CurPage;
	lds R16,_CurPage
	.dbline -2
L39:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e GetCol _GetCol fc
	.even
_GetCol::
	.dbline -1
	.dbline 185
; }
; 
; unsigned char GetCol(void) /*得到当前列*/
; {
	.dbline 186
;    return CurCol;
	lds R16,_CurCol
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e SetPageCol _SetPageCol fV
;           ucol -> R20
;          upage -> R22
	.even
_SetPageCol::
	xcall push_gset2
	mov R20,R18
	mov R22,R16
	.dbline -1
	.dbline 191
; }
; 
; //-----------------页置函数-----------------
; void SetPageCol(unsigned char upage, unsigned char ucol) 
; {
	.dbline 192
;    CurPage = upage;
	sts _CurPage,R22
	.dbline 193
;    CurCol = ucol;
	sts _CurCol,R20
	.dbline 194
;    if(ucol<64)
	cpi R20,64
	brsh L42
	.dbline 195
;    {
	.dbline 196
;       set_page_L(upage);
	mov R16,R22
	xcall _set_page_L
	.dbline 197
;       set_col_addr_L(ucol);
	mov R16,R20
	xcall _set_col_addr_L
	.dbline 198
;    }
	xjmp L43
L42:
	.dbline 200
	.dbline 201
	mov R16,R22
	xcall _set_page_R
	.dbline 202
	mov R16,R20
	subi R16,64
	xcall _set_col_addr_R
	.dbline 203
L43:
	.dbline -2
L41:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r ucol 20 c
	.dbsym r upage 22 c
	.dbend
	.dbfunc e SetRowCol _SetRowCol fV
;           page -> R20
;           ucol -> R22
;           urow -> R20
	.even
_SetRowCol::
	xcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 208
;    else
;    {
;       set_page_R(upage);
;       set_col_addr_R(ucol-64);
;    }
; }
; 
; //---------------行列设置函数---------------------------
; void SetRowCol(unsigned char urow, unsigned char ucol) 
; {
	.dbline 210
;    unsigned char page;
;    CurRow = urow;
	sts _CurRow,R20
	.dbline 211
;    CurCol = ucol;
	sts _CurCol,R22
	.dbline 213
; 	
;    switch(urow)
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L48
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L49
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L50
	cpi R20,4
	ldi R30,0
	cpc R21,R30
	breq L51
	cpi R20,5
	ldi R30,0
	cpc R21,R30
	breq L52
	xjmp L45
X0:
	.dbline 214
;    {
L48:
	.dbline 216
;       case 1:
;              page=0;
	clr R20
	.dbline 217
;              CurOffset=1;
	ldi R24,1
	sts _CurOffset,R24
	.dbline 218
;              break;
	xjmp L46
L49:
	.dbline 220
;       case 2:
;              page=1;
	ldi R20,1
	.dbline 221
;              CurOffset=2;
	ldi R24,2
	sts _CurOffset,R24
	.dbline 222
;              break;
	xjmp L46
L50:
	.dbline 224
;       case 3:
;              page=3;
	ldi R20,3
	.dbline 225
;              CurOffset=1;
	ldi R24,1
	sts _CurOffset,R24
	.dbline 226
;              break;
	xjmp L46
L51:
	.dbline 228
;       case 4:
;              page=4;
	ldi R20,4
	.dbline 229
;              CurOffset=2;
	ldi R24,2
	sts _CurOffset,R24
	.dbline 230
;              break;
	xjmp L46
L52:
	.dbline 232
;       case 5:
;              page=6;
	ldi R20,6
	.dbline 233
;              CurOffset=1;
	ldi R24,1
	sts _CurOffset,R24
	.dbline 234
;              break;
L45:
L46:
	.dbline 236
;    }
;    SetPageCol(page,ucol);
	mov R18,R22
	mov R16,R20
	xcall _SetPageCol
	.dbline -2
L44:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r page 20 c
	.dbsym r ucol 22 c
	.dbsym r urow 20 c
	.dbend
	.dbfunc e disp_char _disp_char fV
;          width -> R22
;            len -> R22
;          uPage -> y+2
;           ch_r -> R10
;           uCol -> y+1
;           ch_w -> R14
;              k -> R20
;              j -> R12
;              c -> R10
	.even
_disp_char::
	xcall push_gset5
	mov R10,R16
	sbiw R28,3
	.dbline -1
	.dbline 242
; }
; 
; 
; //----------------字符显示函数------------------
; void disp_char(unsigned char c)
; {
	.dbline 246
;    unsigned char k,j,uPage,uCol,ch_r,ch_w;
;    unsigned char width;
;    unsigned char len;
;    uPage = GetPage();
	xcall _GetPage
	std y+2,R16
	.dbline 247
;    uCol = GetCol();
	xcall _GetCol
	std y+1,R16
	.dbline 248
;    len=sizeof(ASC_16)/sizeof(ASC_16[0]);
	ldi R22,30
	.dbline 249
;    for(k=0;k<len;k++)
	clr R20
	xjmp L57
L54:
	.dbline 250
;    {
	.dbline 251
;       if(c == ASC_16[k].Index[0] )
	ldi R24,17
	mul R24,R20
	movw R30,R0
	ldi R24,<_ASC_16
	ldi R25,>_ASC_16
	add R30,R24
	adc R31,R25
	lpm R30,Z
	cp R10,R30
	brne L58
	.dbline 252
;          break;
	xjmp L56
L58:
	.dbline 253
L55:
	.dbline 249
	inc R20
L57:
	.dbline 249
	cp R20,R22
	brlo L54
L56:
	.dbline 254
;    }
;    if(k<len)
	cp R20,R22
	brlo X1
	xjmp L60
X1:
	.dbline 255
;    {
	.dbline 256
;       if(c=='-'||c==':')
	mov R24,R10
	cpi R24,45
	breq L64
	cpi R24,58
	brne L62
L64:
	.dbline 257
;          width=ASC_CHR_WIDTH-2;
	ldi R22,6
	xjmp L63
L62:
	.dbline 258
;       else if(c=='|')
	mov R24,R10
	cpi R24,124
	brne L65
	.dbline 259
;          width=ASC_HZ_WIDTH-ASC_CHR_WIDTH;
	ldi R22,4
	xjmp L66
L65:
	.dbline 261
;       else
;          width=ASC_CHR_WIDTH;
	ldi R22,8
L66:
L63:
	.dbline 263
; 		
;       if(CurOffset==1) //下半部是写半个字节
	lds R24,_CurOffset
	cpi R24,1
	breq X2
	xjmp L67
X2:
	.dbline 264
;       {
	.dbline 265
;          for(j=0;j<width;j++)
	clr R12
	xjmp L72
L69:
	.dbline 266
;          {
	.dbline 267
;             SetPageCol(uPage,uCol+j);
	ldd R18,y+1
	add R18,R12
	ldd R16,y+2
	xcall _SetPageCol
	.dbline 268
;             ch_w=ASC_16[k].Msk[j];
	ldi R24,17
	mul R24,R20
	movw R2,R0
	ldi R24,<_ASC_16+1
	ldi R25,>_ASC_16+1
	add R2,R24
	adc R3,R25
	mov R30,R12
	clr R31
	add R30,R2
	adc R31,R3
	lpm R14,Z
	.dbline 269
;             if(uCol+j<64)
	ldd R24,y+1
	add R24,R12
	cpi R24,64
	brsh L74
	.dbline 270
;                write_LCD(LEFT,DATA,ch_w);
	std y+0,R14
	ldi R18,1
	clr R16
	xcall _write_LCD
	xjmp L75
L74:
	.dbline 272
;             else
;                write_LCD(RIGHT,DATA,ch_w);
	std y+0,R14
	ldi R18,1
	ldi R16,1
	xcall _write_LCD
L75:
	.dbline 273
L70:
	.dbline 265
	inc R12
L72:
	.dbline 265
	cp R12,R22
	brlo L69
	.dbline 274
;          }
;          SetPageCol(uPage+1,uCol);
	ldd R18,y+1
	ldd R16,y+2
	subi R16,255    ; addi 1
	xcall _SetPageCol
	.dbline 276
; 			
;          for(j=0;j<width;j++)
	clr R12
	xjmp L79
L76:
	.dbline 277
;          {
	.dbline 278
;             SetPageCol(uPage+1,uCol+j);
	ldd R18,y+1
	add R18,R12
	ldd R16,y+2
	subi R16,255    ; addi 1
	xcall _SetPageCol
	.dbline 279
;             if(uCol+j<64)
	ldd R24,y+1
	add R24,R12
	cpi R24,64
	brsh L80
	.dbline 280
;                ch_r=read_LCD(LEFT);
	clr R16
	xcall _read_LCD
	mov R10,R16
	xjmp L81
L80:
	.dbline 282
;             else
;                ch_r=read_LCD(RIGHT);
	ldi R16,1
	xcall _read_LCD
	mov R10,R16
L81:
	.dbline 283
;             ch_r&=0xf0;
	mov R24,R10
	andi R24,240
	mov R10,R24
	.dbline 284
;             ch_w=ASC_16[k].Msk[ASC_CHR_WIDTH+j]&0x0f;
	ldi R24,17
	mul R24,R20
	movw R2,R0
	ldi R24,<_ASC_16+1
	ldi R25,>_ASC_16+1
	add R2,R24
	adc R3,R25
	mov R30,R12
	clr R31
	adiw R30,8
	add R30,R2
	adc R31,R3
	lpm R30,Z
	andi R30,15
	mov R14,R30
	.dbline 285
;             ch_w|=ch_r;
	or R14,R10
	.dbline 286
;             SetPageCol(uPage+1,uCol+j);
	ldd R18,y+1
	add R18,R12
	ldd R16,y+2
	subi R16,255    ; addi 1
	xcall _SetPageCol
	.dbline 287
;             if(uCol+j<64)
	ldd R24,y+1
	add R24,R12
	cpi R24,64
	brsh L83
	.dbline 288
;                write_LCD(LEFT,DATA,ch_w);
	std y+0,R14
	ldi R18,1
	clr R16
	xcall _write_LCD
	xjmp L84
L83:
	.dbline 290
;             else
;                write_LCD(RIGHT,DATA,ch_w);
	std y+0,R14
	ldi R18,1
	ldi R16,1
	xcall _write_LCD
L84:
	.dbline 291
L77:
	.dbline 276
	inc R12
L79:
	.dbline 276
	cp R12,R22
	brsh X3
	xjmp L76
X3:
	.dbline 292
;          }
;       }
	xjmp L68
L67:
	.dbline 294
;       else //上半部是写半个字节
;       {
	.dbline 295
;          for(j=0;j<width;j++)
	clr R12
	xjmp L88
L85:
	.dbline 296
;          {
	.dbline 297
;             SetPageCol(uPage,uCol+j);
	ldd R18,y+1
	add R18,R12
	ldd R16,y+2
	xcall _SetPageCol
	.dbline 298
;             if(uCol+j<64)
	ldd R24,y+1
	add R24,R12
	cpi R24,64
	brsh L89
	.dbline 299
;                ch_r=read_LCD(LEFT);
	clr R16
	xcall _read_LCD
	mov R10,R16
	xjmp L90
L89:
	.dbline 301
;             else
;                ch_r=read_LCD(RIGHT);
	ldi R16,1
	xcall _read_LCD
	mov R10,R16
L90:
	.dbline 302
;             ch_r&=0x0f;
	mov R24,R10
	andi R24,15
	mov R10,R24
	.dbline 303
;             ch_w=ASC_16[k].Msk[j];
	ldi R24,17
	mul R24,R20
	movw R2,R0
	ldi R24,<_ASC_16+1
	ldi R25,>_ASC_16+1
	add R2,R24
	adc R3,R25
	mov R30,R12
	clr R31
	add R30,R2
	adc R31,R3
	lpm R14,Z
	.dbline 304
;             ch_w=ch_w<<4;
	mov R24,R14
	andi R24,#0x0F
	swap R24
	mov R14,R24
	.dbline 305
;             ch_w|=ch_r;
	or R14,R10
	.dbline 306
;             SetPageCol(uPage,uCol+j);
	ldd R18,y+1
	add R18,R12
	ldd R16,y+2
	xcall _SetPageCol
	.dbline 307
;             if(uCol+j<64)
	ldd R24,y+1
	add R24,R12
	cpi R24,64
	brsh L92
	.dbline 308
;                write_LCD(LEFT,DATA,ch_w);
	std y+0,R14
	ldi R18,1
	clr R16
	xcall _write_LCD
	xjmp L93
L92:
	.dbline 310
;             else
;                write_LCD(RIGHT,DATA,ch_w);
	std y+0,R14
	ldi R18,1
	ldi R16,1
	xcall _write_LCD
L93:
	.dbline 311
L86:
	.dbline 295
	inc R12
L88:
	.dbline 295
	cp R12,R22
	brsh X4
	xjmp L85
X4:
	.dbline 312
;          }

⌨️ 快捷键说明

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