📄 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+0
02D4 ; DATA_FLAG -> R18
02D4 ; DATA -> R16
.even
02D4 _LCD_Send_Byte:
02D4 .dbline -1
02D4 .dbline 264
02D4 ; }
02D4 ;
02D4 ; /*----------------------------------------------------------------------------*-
02D4 ;
02D4 ; LCD_Send_Byte()
02D4 ;
02D4 ; This function writes a byte to the LCD panel.
02D4 ;
02D4 ; Parameters:
02D4 ; ---------------------------------------------------------------------------
02D4 ; Data : The byte to be written to the LCD
02D4 ;
02D4 ; DATA_FLAG : If DATA_FLAG == 1, a data byte is sent
02D4 ; If DATA_FLAG == 0, a command byte is sent
02D4 ;
02D4 ; IVERSE : If IVERSE == 1, inverse video mode
02D4 ; If IVERSE == 0, normal video mode
02D4 ;
02D4 ; -*----------------------------------------------------------------------------*/
02D4 ; static void LCD_Send_Byte(uInt8 DATA, uInt8 DATA_FLAG, uInt8 IVERSE)
02D4 ; {
02D4 .dbline 267
02D4 ; // LCD_Read_Busy();
02D4 ;
02D4 ; LCD_INSTR_PORT |= LCD_EN;
02D4 929A sbi 0x12,2
02D6 .dbline 268
02D6 ; asm("nop");
02D6 0000 nop
02D8 .dbline 269
02D8 ; asm("nop");
02D8 0000 nop
02DA .dbline 271
02DA ;
02DA ; if (DATA_FLAG)
02DA 2223 tst R18
02DC 11F0 breq L57
02DE X14:
02DE .dbline 272
02DE ; LCD_INSTR_PORT |= LCD_DI; // Set data
02DE 909A sbi 0x12,0
02E0 01C0 xjmp L58
02E2 L57:
02E2 .dbline 274
02E2 ; else
02E2 ; LCD_INSTR_PORT &= ~LCD_DI; // Set instruction
02E2 9098 cbi 0x12,0
02E4 L58:
02E4 .dbline 276
02E4 ;
02E4 ; LCD_INSTR_PORT &= ~LCD_RW; // Set write
02E4 9198 cbi 0x12,1
02E6 .dbline 278
02E6 ;
02E6 ; if (IVERSE && DATA_FLAG)
02E6 0880 ldd R0,y+0
02E8 0020 tst R0
02EA 51F0 breq L59
02EC X15:
02EC 2223 tst R18
02EE 41F0 breq L59
02F0 X16:
02F0 .dbline 279
02F0 ; LCD_DATA_PORT = 255 - DATA; // Send inverse data
02F0 202E mov R2,R16
02F2 3324 clr R3
02F4 8FEF ldi R24,255
02F6 90E0 ldi R25,0
02F8 8219 sub R24,R2
02FA 9309 sbc R25,R3
02FC 8BBB out 0x1b,R24
02FE 01C0 xjmp L60
0300 L59:
0300 .dbline 281
0300 ; else
0300 ; LCD_DATA_PORT = DATA; // Send data or instruction
0300 0BBB out 0x1b,R16
0302 L60:
0302 .dbline 283
0302 ;
0302 ; LCD_INSTR_PORT &= ~LCD_EN; // Toggle enable
0302 9298 cbi 0x12,2
0304 .dbline 284
0304 ; asm("nop");
0304 0000 nop
0306 .dbline 285
0306 ; asm("nop");
0306 0000 nop
0308 .dbline -2
0308 L56:
0308 .dbline 0 ; func end
0308 0895 ret
030A .dbsym l IVERSE 0 c
030A .dbsym r DATA_FLAG 18 c
030A .dbsym r DATA 16 c
030A .dbend
030A .dbfunc s LCD_Set_XY _LCD_Set_XY fV
030A ; Y -> R20
030A ; X -> R22
.even
030A _LCD_Set_XY:
030A 4A93 st -y,R20
030C 6A93 st -y,R22
030E 422F mov R20,R18
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -