📄 ks0108_12864lcd.lis
字号:
0242 ; LCD_INSTR_PORT &= ~LCD_CS2;
0242 9598 cbi 0x12,5
0244 .dbline 185
0244 ;
0244 ; LCD_Send_Byte(DISPLAY_PAGE_SET + Page, COMMAND, NORMAL); // Sweep pages
0244 2224 clr R2
0246 2882 std y+0,R2
0248 2227 clr R18
024A 042F mov R16,R20
024C 0854 subi R16,72 ; addi 184
024E 42D0 xcall _LCD_Send_Byte
0250 .dbline 186
0250 ; LCD_Send_Byte(DISPLAY_COLUMN_SET, COMMAND, NORMAL);
0250 2224 clr R2
0252 2882 std y+0,R2
0254 2227 clr R18
0256 00E4 ldi R16,64
0258 3DD0 xcall _LCD_Send_Byte
025A .dbline 188
025A ;
025A ; for (Column = 0; Column < 128; Column++)
025A 6627 clr R22
025C 14C0 xjmp L48
025E L45:
025E .dbline 189
025E ; {
025E .dbline 191
025E ; // Clear right side
025E ; if(Column == 64)
025E 6034 cpi R22,64
0260 69F4 brne L49
0262 X9:
0262 .dbline 192
0262 ; {
0262 .dbline 193
0262 ; LCD_INSTR_PORT &= ~LCD_CS1; // Select right side
0262 9498 cbi 0x12,4
0264 .dbline 194
0264 ; LCD_INSTR_PORT |= LCD_CS2;
0264 959A sbi 0x12,5
0266 .dbline 197
0266 ;
0266 ; // Sweep pages
0266 ; LCD_Send_Byte(DISPLAY_PAGE_SET + Page, COMMAND, NORMAL);
0266 2224 clr R2
0268 2882 std y+0,R2
026A 2227 clr R18
026C 042F mov R16,R20
026E 0854 subi R16,72 ; addi 184
0270 31D0 xcall _LCD_Send_Byte
0272 .dbline 198
0272 ; LCD_Send_Byte(DISPLAY_COLUMN_SET, COMMAND, NORMAL);
0272 2224 clr R2
0274 2882 std y+0,R2
0276 2227 clr R18
0278 00E4 ldi R16,64
027A 2CD0 xcall _LCD_Send_Byte
027C .dbline 199
027C ; }
027C L49:
027C .dbline 201
027C ; // For each set of 8 pixels, write 0x00 or 0xFF(depend on Vedio_Mode)
027C ; LCD_Send_Byte(0x00, D_DATA, Vedio_Mode);
027C A882 std y+0,R10
027E 21E0 ldi R18,1
0280 0027 clr R16
0282 28D0 xcall _LCD_Send_Byte
0284 .dbline 202
0284 ; }
0284 L46:
0284 .dbline 188
0284 6395 inc R22
0286 L48:
0286 .dbline 188
0286 6038 cpi R22,128
0288 50F3 brlo L45
028A X10:
028A .dbline 203
028A ; }
028A L42:
028A .dbline 180
028A 4395 inc R20
028C L44:
028C .dbline 180
028C 4830 cpi R20,8
028E C0F2 brlo L41
0290 X11:
0290 .dbline -2
0290 L40:
0290 .dbline 0 ; func end
0290 2196 adiw R28,1
0292 0C940000 xjmp pop_xgsetF00C
0296 .dbsym r Page 20 c
0296 .dbsym r Column 22 c
0296 .dbsym r Vedio_Mode 10 c
0296 .dbend
0296 .dbfunc s LCD_Read_Busy _LCD_Read_Busy fV
0296 ; LCD_Timeout -> R16,R17
.even
0296 _LCD_Read_Busy:
0296 .dbline -1
0296 .dbline 214
0296 ; }
0296 ;
0296 ; /*----------------------------------------------------------------------------*-
0296 ;
0296 ; LCD_Read_Busy()
0296 ;
0296 ; Check out if the LCD is in operation or ready for writing data.
0296 ;
0296 ; -*----------------------------------------------------------------------------*/
0296 ; static void LCD_Read_Busy(void)
0296 ; {
0296 .dbline 217
0296 ; uInt16 LCD_Timeout; // Software timeout
0296 ;
0296 ; LCD_DATA_PORT = 0xFF;
0296 8FEF ldi R24,255
0298 8BBB out 0x1b,R24
029A .dbline 218
029A ; LCD_DATA_PORT_DIR = INPUT; // Set data PORT direction
029A 2224 clr R2
029C 2ABA out 0x1a,R2
029E .dbline 220
029E ;
029E ; LCD_INSTR_PORT &= ~LCD_DI; // Set instruction
029E 9098 cbi 0x12,0
02A0 .dbline 221
02A0 ; LCD_INSTR_PORT |= LCD_RW; // Set read
02A0 919A sbi 0x12,1
02A2 .dbline 223
02A2 ;
02A2 ; LCD_INSTR_PORT |= LCD_EN;
02A2 929A sbi 0x12,2
02A4 .dbline 224
02A4 ; asm("nop");
02A4 0000 nop
02A6 .dbline 225
02A6 ; asm("nop");
02A6 0000 nop
02A8 .dbline 227
02A8 ;
02A8 ; LCD_INSTR_PORT &= ~LCD_EN; // Toggle enable
02A8 9298 cbi 0x12,2
02AA .dbline 228
02AA ; asm("nop");
02AA 0000 nop
02AC .dbline 229
02AC ; asm("nop");
02AC 0000 nop
02AE 06C0 xjmp L53
02B0 L52:
02B0 .dbline 233
02B0 ;
02B0 ; // See if busy with software timeout
02B0 ; while((LCD_BUSY & LCD_DATA_PORT_VL) && ++LCD_Timeout)
02B0 ; {
02B0 .dbline 234
02B0 ; LCD_INSTR_PORT &= ~LCD_EN; // Toggle enable
02B0 9298 cbi 0x12,2
02B2 .dbline 235
02B2 ; asm("nop");
02B2 0000 nop
02B4 .dbline 236
02B4 ; asm("nop");
02B4 0000 nop
02B6 .dbline 238
02B6 ;
02B6 ; LCD_INSTR_PORT |= LCD_EN;
02B6 929A sbi 0x12,2
02B8 .dbline 239
02B8 ; asm("nop");
02B8 0000 nop
02BA .dbline 240
02BA ; asm("nop");
02BA 0000 nop
02BC .dbline 241
02BC ; }
02BC L53:
02BC .dbline 232
02BC CF9B sbis 0x19,7
02BE 06C0 rjmp L55
02C0 X12:
02C0 C801 movw R24,R16
02C2 0196 adiw R24,1
02C4 8C01 movw R16,R24
02C6 8030 cpi R24,0
02C8 8907 cpc R24,R25
02CA 91F7 brne L52
02CC X13:
02CC L55:
02CC .dbline 242
02CC ; LCD_DATA_PORT_DIR = OUTPUT; // Set data PORT direction back to an output
02CC 8FEF ldi R24,255
02CE 8ABB out 0x1a,R24
02D0 .dbline 243
02D0 ; LCD_INSTR_PORT &= ~LCD_EN;
02D0 9298 cbi 0x12,2
02D2 .dbline -2
02D2 L51:
02D2 .dbline 0 ; func end
02D2 0895 ret
02D4 .dbsym r LCD_Timeout 16 s
02D4 .dbend
02D4 .dbfunc s LCD_Send_Byte _LCD_Send_Byte fV
02D4 ; IVERSE -> y+2
02D4 ; DATA_FLAG -> R12
02D4 ; DATA -> R10
.even
02D4 _LCD_Send_Byte:
02D4 AA92 st -y,R10
02D6 CA92 st -y,R12
02D8 C22E mov R12,R18
02DA A02E mov R10,R16
02DC .dbline -1
02DC .dbline 264
02DC ; }
02DC ;
02DC ; /*----------------------------------------------------------------------------*-
02DC ;
02DC ; LCD_Send_Byte()
02DC ;
02DC ; This function writes a byte to the LCD panel.
02DC ;
02DC ; Parameters:
02DC ; ---------------------------------------------------------------------------
02DC ; Data : The byte to be written to the LCD
02DC ;
02DC ; DATA_FLAG : If DATA_FLAG == 1, a data byte is sent
02DC ; If DATA_FLAG == 0, a command byte is sent
02DC ;
02DC ; IVERSE : If IVERSE == 1, inverse video mode
02DC ; If IVERSE == 0, normal video mode
02DC ;
02DC ; -*----------------------------------------------------------------------------*/
02DC ; static void LCD_Send_Byte(uInt8 DATA, uInt8 DATA_FLAG, uInt8 IVERSE)
02DC ; {
02DC .dbline 265
02DC ; LCD_Read_Busy();
02DC DCDF xcall _LCD_Read_Busy
02DE .dbline 267
02DE ;
02DE ; LCD_INSTR_PORT |= LCD_EN;
02DE 929A sbi 0x12,2
02E0 .dbline 268
02E0 ; asm("nop");
02E0 0000 nop
02E2 .dbline 269
02E2 ; asm("nop");
02E2 0000 nop
02E4 .dbline 271
02E4 ;
02E4 ; if (DATA_FLAG)
02E4 CC20 tst R12
02E6 11F0 breq L57
02E8 X14:
02E8 .dbline 272
02E8 ; LCD_INSTR_PORT |= LCD_DI; // Set data
02E8 909A sbi 0x12,0
02EA 01C0 xjmp L58
02EC L57:
02EC .dbline 274
02EC ; else
02EC ; LCD_INSTR_PORT &= ~LCD_DI; // Set instruction
02EC 9098 cbi 0x12,0
02EE L58:
02EE .dbline 276
02EE ;
02EE ; LCD_INSTR_PORT &= ~LCD_RW; // Set write
02EE 9198 cbi 0x12,1
02F0 .dbline 278
02F0 ;
02F0 ; if (IVERSE && DATA_FLAG)
02F0 0A80 ldd R0,y+2
02F2 0020 tst R0
02F4 51F0 breq L59
02F6 X15:
02F6 CC20 tst R12
02F8 41F0 breq L59
02FA X16:
02FA .dbline 279
02FA ; LCD_DATA_PORT = 255 - DATA; // Send inverse data
02FA 2A2C mov R2,R10
02FC 3324 clr R3
02FE 8FEF ldi R24,255
0300 90E0 ldi R25,0
0302 8219 sub R24,R2
0304 9309 sbc R25,R3
0306 8BBB out 0x1b,R24
0308 01C0 xjmp L60
030A L59:
030A .dbline 281
030A ; else
030A ; LCD_DATA_PORT = DATA; // Send data or instruction
030A ABBA out 0x1b,R10
030C L60:
030C .dbline 283
030C ;
030C ; LCD_INSTR_PORT &= ~LCD_EN; // Toggle enable
030C 9298 cbi 0x12,2
030E .dbline 284
030E ; asm("nop");
030E 0000 nop
0310 .dbline 285
0310 ; asm("nop");
0310 0000 nop
0312 .dbline -2
0312 L56:
0312 .dbline 0 ; func end
0312 C990 ld R12,y+
0314 A990 ld R10,y+
0316 0895 ret
0318 .dbsym l IVERSE 2 c
0318 .dbsym r DATA_FLAG 12 c
0318 .dbsym r DATA 10 c
0318 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -