📄 lcd.s
字号:
; // *** Initialize the LCD driver *** //
; // ********************************* //
; void Init_LCD(void)
; {
.dbline 153
; LCD_INIT();
xcall _LCD_INIT
.dbline 154
; LCD_WriteControl (LCD_FUNCTION_SET);
ldi R16,40
xcall _LCD_WriteControl
.dbline 155
; LCD_WriteControl (LCD_OFF);
ldi R16,8
xcall _LCD_WriteControl
.dbline 156
; LCD_WriteControl (LCD_CLEAR);
ldi R16,1
xcall _LCD_WriteControl
.dbline 157
; LCD_WriteControl (LCD_MODE_SET);
ldi R16,6
xcall _LCD_WriteControl
.dbline 158
; LCD_WriteControl (LCD_ON);
ldi R16,12
xcall _LCD_WriteControl
.dbline 159
; LCD_WriteControl (LCD_HOME);
ldi R16,2
.dbline -2
.dbline 160
; }
L8:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e LCD_Clear _LCD_Clear fV
.even
_LCD_Clear::
.dbline -1
.dbline 165
; // ************************************************ //
; // *** Clear the LCD screen (also homes cursor) *** //
; // ************************************************ //
; void LCD_Clear(void)
; {
.dbline 166
; LCD_WriteControl(0x01);
ldi R16,1
.dbline -2
.dbline 167
; }
L9:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e LCD_Home _LCD_Home fV
.even
_LCD_Home::
.dbline -1
.dbline 172
; // *********************************************** //
; // *** Position the LCD cursor at row 1, col 1 *** //
; // *********************************************** //
; void LCD_Home(void)
; {
.dbline 173
; LCD_WriteControl(0x02);
ldi R16,2
.dbline -2
.dbline 174
; }
L10:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e LCD_DisplayCharacter _LCD_DisplayCharacter fV
; Char -> R20
.even
_LCD_DisplayCharacter::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 179
; // ****************************************************************** //
; // *** Display a single character, at the current cursor location *** //
; // ****************************************************************** //
; void LCD_DisplayCharacter (char Char)
; {
.dbline 180
; LCD_WriteData (Char);
mov R16,R20
xcall _LCD_WriteData
.dbline -2
.dbline 181
; }
L11:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r Char 20 c
.dbend
.dbfunc e LCD_DisplayString_F _LCD_DisplayString_F fV
; string -> R20,R21
; column -> R10
; row -> R22
.even
_LCD_DisplayString_F::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 186
; // ********************************************************************* //
; // *** Display a string at the specified row and column, using FLASH *** //
; // ********************************************************************* //
; void LCD_DisplayString_F (char row, char column ,const unsigned char *string)
; {
.dbline 187
; LCD_Cursor (row, column);
mov R18,R10
mov R16,R22
xcall _LCD_Cursor
xjmp L14
L13:
.dbline 189
.dbline 190
movw R2,R20
subi R20,255 ; offset = 1
sbci R21,255
movw R30,R2
lpm R16,Z
xcall _LCD_DisplayCharacter
.dbline 191
L14:
.dbline 188
; while (*string)
movw R30,R20
lpm R30,Z
tst R30
brne L13
.dbline -2
.dbline 192
; {
; LCD_DisplayCharacter (*string++);
; }
; }
L12:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r string 20 pkc
.dbsym r column 10 c
.dbsym r row 22 c
.dbend
.dbfunc e LCD_DisplayString _LCD_DisplayString fV
; string -> R20,R21
; column -> R10
; row -> R22
.even
_LCD_DisplayString::
xcall push_gset3
mov R10,R18
mov R22,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 197
; // ******************************************************************* //
; // *** Display a string at the specified row and column, using RAM *** //
; // ******************************************************************* //
; void LCD_DisplayString (char row, char column ,unsigned char *string)
; {
.dbline 198
; LCD_Cursor (row, column);
mov R18,R10
mov R16,R22
xcall _LCD_Cursor
xjmp L18
L17:
.dbline 200
movw R30,R20
ld R16,Z+
movw R20,R30
xcall _LCD_DisplayCharacter
L18:
.dbline 199
; while (*string)
movw R30,R20
ldd R2,z+0
tst R2
brne L17
.dbline -2
.dbline 201
; LCD_DisplayCharacter (*string++);
; }
L16:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r string 20 pc
.dbsym r column 10 c
.dbsym r row 22 c
.dbend
.dbfunc e LCD_Cursor _LCD_Cursor fV
; column -> R20
; row -> R22
.even
_LCD_Cursor::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 206
; // *************************************************** //
; // *** Position the LCD cursor at "row", "column". *** //
; // *************************************************** //
; void LCD_Cursor (char row, char column)
; {
.dbline 207
clr R23
cpi R22,1
ldi R30,0
cpc R23,R30
breq L24
cpi R22,2
ldi R30,0
cpc R23,R30
breq L25
cpi R22,3
ldi R30,0
cpc R23,R30
breq L26
cpi R22,4
ldi R30,0
cpc R23,R30
breq L27
xjmp L22
X0:
.dbline 207
; switch (row) {
L24:
.dbline 208
; case 1: LCD_WriteControl (0x80 + column - 1); break;
mov R16,R20
subi R16,128 ; addi 128
subi R16,1
xcall _LCD_WriteControl
.dbline 208
xjmp L22
L25:
.dbline 209
; case 2: LCD_WriteControl (0xc0 + column - 1); break;
mov R16,R20
subi R16,64 ; addi 192
subi R16,1
xcall _LCD_WriteControl
.dbline 209
xjmp L22
L26:
.dbline 210
; case 3: LCD_WriteControl (0x94 + column - 1); break;
mov R16,R20
subi R16,108 ; addi 148
subi R16,1
xcall _LCD_WriteControl
.dbline 210
xjmp L22
L27:
.dbline 211
mov R16,R20
subi R16,44 ; addi 212
subi R16,1
xcall _LCD_WriteControl
.dbline 211
.dbline 212
L22:
.dbline -2
.dbline 214
; case 4: LCD_WriteControl (0xd4 + column - 1); break;
; default: break;
; }
; }
L20:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r column 20 c
.dbsym r row 22 c
.dbend
.dbfunc e LCD_Cursor_On _LCD_Cursor_On fV
.even
_LCD_Cursor_On::
.dbline -1
.dbline 219
; // ************************** //
; // *** Turn the cursor on *** //
; // ************************** //
; void LCD_Cursor_On (void)
; {
.dbline 220
; LCD_WriteControl (LCD_CURS_ON);
ldi R16,13
.dbline -2
.dbline 221
; }
L28:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e LCD_Cursor_Off _LCD_Cursor_Off fV
.even
_LCD_Cursor_Off::
.dbline -1
.dbline 226
; // *************************** //
; // *** Turn the cursor off *** //
; // *************************** //
; void LCD_Cursor_Off (void)
; {
.dbline 227
; LCD_WriteControl (LCD_ON);
ldi R16,12
.dbline -2
.dbline 228
; }
L29:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e LCD_Display_Off _LCD_Display_Off fV
.even
_LCD_Display_Off::
.dbline -1
.dbline 233
; // ******************** //
; // *** Turn Off LCD *** //
; // ******************** //
; void LCD_Display_Off (void)
; {
.dbline 234
; LCD_WriteControl(LCD_OFF);
ldi R16,8
.dbline -2
.dbline 235
; }
L30:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e LCD_Display_On _LCD_Display_On fV
.even
_LCD_Display_On::
.dbline -1
.dbline 240
; // ******************* //
; // *** Turn On LCD *** //
; // ******************* //
; void LCD_Display_On (void)
; {
.dbline 241
; LCD_WriteControl(LCD_ON);
ldi R16,12
.dbline -2
.dbline 242
; }
L31:
.dbline 0 ; func end
xjmp _LCD_WriteControl
.dbend
.dbfunc e ClearLine _ClearLine fV
; space -> R22,R23
; line -> R20
.even
_ClearLine::
xcall push_gset2
mov R20,R16
sbiw R28,2
.dbline -1
.dbline 247
; // ******************* //
; // *** Clear line *** //
; // ******************* //
; void ClearLine(unsigned char line)
; {
.dbline 248
; unsigned char *space=" ";
ldi R22,<L33
ldi R23,>L33
.dbline 249
; LCD_DisplayString(line,1,space);
std y+1,R23
std y+0,R22
ldi R18,1
mov R16,R20
xcall _LCD_DisplayString
.dbline -2
.dbline 250
; }
L32:
adiw R28,2
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r space 22 pc
.dbsym r line 20 c
.dbend
.area data(ram, con, rel)
.dbfile D:\NEW\ECHO\LCD.c
L33:
.blkb 17
.area idata
.byte 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32
.byte 0
.area data(ram, con, rel)
.dbfile D:\NEW\ECHO\LCD.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -