📄 lcd_240128.lst
字号:
(0184) glcd_ce_low(); // CE置低
(0185) _NOP();
(0186) _NOP();
(0187) glcd_byte = LCD_DATA_PIN; // 读取数据
(0188) glcd_rd_high(); // RD置高
(0189) glcd_ce_high(); // CE置高
(0190) return(glcd_byte);
(0191) }
(0192) */
(0193) //*************************************************************************************************//
(0194) //设置文本指针地址
(0195) void Lcd_Locate(unsigned char x,unsigned char y)
(0196) {
(0197) unsigned int addr;
(0198) addr = y * LCD_WIDTH + x + LCD_TEXT_BASE;
(0199) Lcd_SendCom2((unsigned char)(addr),(addr>>8),COMM_SET_POSITION);
(0200) }
(0201)
00A6 DFC7 RCALL _Lcd_SendDat
00A7 2F04 MOV R16,R20
00A8 DFC5 RCALL _Lcd_SendDat
00A9 810C LDD R16,Y+4
00AA DFD7 RCALL _Lcd_SendCom0
00AB 940E03DA CALL pop_gset2
00AD 9508 RET
(0202) //*************************************************************************************************//
_Lcd_Locate:
00AE 940E03E9 CALL push_gset2
00B0 2F62 MOV R22,R18
00B1 2F40 MOV R20,R16
00B2 9721 SBIW R28,1
00B3 E18E LDI R24,0x1E
00B4 9F86 MUL R24,R22
00B5 0110 MOVW R2,R0
00B6 2E44 MOV R4,R20
00B7 2455 CLR R5
00B8 0C24 ADD R2,R4
00B9 1C35 ADC R3,R5
00BA 01A1 MOVW R20,R2
00BB E284 LDI R24,0x24
(0203)
(0204) //**************************************************************************************************//
(0205) //清全部32KB内存
(0206) void Lcd_ClrScreen(void)
(0207) {
(0208) unsigned int i;
(0209) Lcd_SendCom2(0,0,COMM_SET_POSITION); //设置指针地址为0
(0210) for (i=0;i<0x8000;i++)
(0211) Lcd_SendCom1(0x00,COMM_WRITE_PUP); // 0xc0为数据写入、增加指针 命令
(0212) }
00BC 8388 STD Y+0,R24
00BD 0191 MOVW R18,R2
00BE 2F23 MOV R18,R19
00BF 2733 CLR R19
00C0 2D02 MOV R16,R2
(0213)
00C1 DFDF RCALL _Lcd_SendCom2
00C2 9621 ADIW R28,1
00C3 940E03DA CALL pop_gset2
(0214) //文本清屏
00C5 9508 RET
_Lcd_ClrScreen:
i --> R20
00C6 940E03EB CALL push_gset1
00C8 9721 SBIW R28,1
00C9 E284 LDI R24,0x24
00CA 8388 STD Y+0,R24
00CB 2722 CLR R18
00CC 2700 CLR R16
00CD DFD3 RCALL _Lcd_SendCom2
00CE 2744 CLR R20
00CF 2755 CLR R21
00D0 C005 RJMP 0x00D6
00D1 EC20 LDI R18,0xC0
00D2 2700 CLR R16
00D3 DFC2 RCALL _Lcd_SendCom1
(0215) void Lcd_ClrText(void)
(0216) {
(0217) unsigned int i;
(0218) Lcd_SendCom2((unsigned char)(LCD_TEXT_BASE),(LCD_TEXT_BASE>>8),COMM_SET_POSITION); // 设置地址为文本区基地址
(0219) for (i=0;i<480;i++)
(0220) Lcd_SendCom1(0,COMM_WRITE_PUP); // 0xc0为数据写入、增加指针 命令
(0221) }
00D4 5F4F SUBI R20,0xFF
00D5 4F5F SBCI R21,0xFF
00D6 3040 CPI R20,0
00D7 E8E0 LDI R30,0x80
00D8 075E CPC R21,R30
(0222)
00D9 F3B8 BCS 0x00D1
00DA 9621 ADIW R28,1
(0223) // 图形清屏
00DB 940E03EE CALL pop_gset1
00DD 9508 RET
_Lcd_ClrText:
i --> R20
00DE 940E03EB CALL push_gset1
00E0 9721 SBIW R28,1
00E1 E284 LDI R24,0x24
00E2 8388 STD Y+0,R24
00E3 2722 CLR R18
00E4 2700 CLR R16
00E5 DFBB RCALL _Lcd_SendCom2
00E6 2744 CLR R20
00E7 2755 CLR R21
00E8 C005 RJMP 0x00EE
00E9 EC20 LDI R18,0xC0
00EA 2700 CLR R16
(0224) void Lcd_ClrGraph(void)
(0225) {
(0226) unsigned int i;
(0227) Lcd_SendCom2((unsigned char)(LCD_GRAPH_BASE),(LCD_GRAPH_BASE>>8),COMM_SET_POSITION); // 设置地址为图形区基地址
(0228) for (i=0;i<3840;i++) // 必须为3840
(0229) Lcd_SendCom1(0x00,COMM_WRITE_PUP); // 0xc0为数据写入、增加指针 命令
(0230) }
00EB DFAA RCALL _Lcd_SendCom1
00EC 5F4F SUBI R20,0xFF
00ED 4F5F SBCI R21,0xFF
00EE 3E40 CPI R20,0xE0
00EF E0E1 LDI R30,1
(0231) //**************************************************************************************************//
00F0 075E CPC R21,R30
00F1 F3B8 BCS 0x00E9
(0232)
00F2 9621 ADIW R28,1
00F3 940E03EE CALL pop_gset1
00F5 9508 RET
_Lcd_ClrGraph:
i --> R20
00F6 940E03EB CALL push_gset1
00F8 9721 SBIW R28,1
00F9 E284 LDI R24,0x24
00FA 8388 STD Y+0,R24
00FB E023 LDI R18,3
00FC E000 LDI R16,0
00FD DFA3 RCALL _Lcd_SendCom2
00FE 2744 CLR R20
00FF 2755 CLR R21
0100 C005 RJMP 0x0106
0101 EC20 LDI R18,0xC0
0102 2700 CLR R16
0103 DF92 RCALL _Lcd_SendCom1
0104 5F4F SUBI R20,0xFF
(0233)
(0234) //**************************************************************************************************//
(0235) // 显示字符串RAM
(0236) void Lcd_PrintText(unsigned char x,unsigned char y, unsigned char *str)
(0237) {
(0238) unsigned char c;
(0239) Lcd_Locate(x,y);
(0240) while (c=*str)
(0241) {
(0242) Lcd_SendCom1(c-0x20,COMM_WRITE_PUP); // 转换ASCII码为屏幕内码, 写字符,增加内部RAM指针
0105 4F5F SBCI R21,0xFF
0106 3040 CPI R20,0
0107 E0EF LDI R30,0xF
0108 075E CPC R21,R30
(0243) str++;
(0244) }
(0245) }
0109 F3B8 BCS 0x0101
010A 9621 ADIW R28,1
010B 940E03EE CALL pop_gset1
010D 9508 RET
(0246)
_Lcd_PrintText:
c --> Y+1
str --> R20
y --> R10
x --> R22
010E 940E03E7 CALL push_gset3
0110 2EA2 MOV R10,R18
0111 2F60 MOV R22,R16
0112 814E LDD R20,Y+6
0113 815F LDD R21,Y+7
0114 2D2A MOV R18,R10
0115 2F06 MOV R16,R22
0116 DF97 RCALL _Lcd_Locate
0117 C006 RJMP 0x011E
0118 EC20 LDI R18,0xC0
0119 2F06 MOV R16,R22
011A 5200 SUBI R16,0x20
011B DF7A RCALL _Lcd_SendCom1
(0247)
(0248) //画、清点函数
(0249) //column为水平点数,row为垂直点数
(0250) //show=1画点,show=0清点
(0251) void Lcd_Point(unsigned char x, unsigned char y, unsigned char draw)
(0252) {
(0253) unsigned int addr; // memory address of byte containing pixel to write
(0254) if( (x >= LCD_X_MAX) || (y >= LCD_Y_MAX) ) return;
(0255) addr = (y * LCD_WIDTH) + (x>>3) + LCD_GRAPH_BASE;
(0256) Lcd_SendCom2 ((unsigned char)(addr),(addr>>8),COMM_SET_POSITION); // set LCD addr. pointer
(0257) if(draw)
011C 5F4F SUBI R20,0xFF
011D 4F5F SBCI R21,0xFF
011E 01FA MOVW R30,R20
011F 8020 LDD R2,Z+0
0120 2D62 MOV R22,R2
(0258) Lcd_SendCom0(COMM_BIT_SET|(7-x&0x07)); // 0xf8为画点命令
0121 2366 TST R22
0122 F7A9 BNE 0x0118
0123 940E03DD CALL pop_gset3
0125 9508 RET
_Lcd_Point:
addr --> R22
draw --> Y+5
y --> R22
x --> R20
0126 940E03E9 CALL push_gset2
0128 2F62 MOV R22,R18
0129 2F40 MOV R20,R16
012A 9721 SBIW R28,1
012B 3F40 CPI R20,0xF0
012C F410 BCC 0x012F
012D 3860 CPI R22,0x80
012E F008 BCS 0x0130
012F C024 RJMP 0x0154
(0259) else
0130 E18E LDI R24,0x1E
0131 9F86 MUL R24,R22
0132 01B0 MOVW R22,R0
0133 2E24 MOV R2,R20
0134 2433 CLR R3
0135 9435 ASR R3
0136 9427 ROR R2
0137 9435 ASR R3
0138 9427 ROR R2
(0260) Lcd_SendCom0(COMM_BIT_CLR|(7-x&0x07)); // 0xf0为清点命令
0139 9435 ASR R3
013A 9427 ROR R2
013B 0D62 ADD R22,R2
(0261) }
013C 1D73 ADC R23,R3
013D 5060 SUBI R22,0
013E 4F7D SBCI R23,0xFD
013F E284 LDI R24,0x24
0140 8388 STD Y+0,R24
0141 019B MOVW R18,R22
(0262)
(0263) /***********************************************************************
0142 2F23 MOV R18,R19
0143 2733 CLR R19
0144 2F06 MOV R16,R22
0145 DF5B RCALL _Lcd_SendCom2
0146 800D LDD R0,Y+5
0147 2000 TST R0
0148 F031 BEQ 0x014F
0149 E007 LDI R16,7
014A 1B04 SUB R16,R20
014B 7007 ANDI R16,7
014C 6F08 ORI R16,0xF8
014D DF34 RCALL _Lcd_SendCom0
014E C005 RJMP 0x0154
014F E007 LDI R16,7
0150 1B04 SUB R16,R20
(0264) 画一条x1,y1到x2,y2的直线
(0265) (show=1画点,show=0清点)
(0266) ***********************************************************************/
(0267) void Lcd_Line(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char draw)
(0268) {
(0269) int dx,dy,e,t;
(0270) if (x1 == x2) //画水平线
(0271) {
(0272) if (y1 > y2) e=-1;
(0273) else e=1;
0151 7007 ANDI R16,7
0152 6F00 ORI R16,0xF0
0153 DF2E RCALL _Lcd_SendCom0
(0274) for (;y1 != y2; y1+=e) Lcd_Point(x1,y1,draw);
(0275) Lcd_Point(x1,y1,draw);
0154 9621 ADIW R28,1
0155 940E03DA CALL pop_gset2
0157 9508 RET
_Lcd_Line:
t --> R20
dy --> R22
dx --> R10
e --> R12
draw --> R14
y2 --> Y+13
x2 --> Y+11
y1 --> R4
x1 --> R6
0158 940E03D5 CALL push_arg4
015A 940E03E3 CALL push_gset5
(0276) return;
015C 9721 SBIW R28,1
015D 88EB LDD R14,Y+19
(0277) }
015E 840B LDD R0,Y+11
015F 850F LDD R16,Y+15
0160 1600 CP R0,R16
0161 F4F1 BNE 0x0180
0162 8809 LDD R0,Y+17
0163 850D LDD R16,Y+13
0164 1600 CP R0,R16
0165 F420 BCC 0x016A
0166 EF8F LDI R24,0xFF
0167 EF9F LDI R25,0xFF
0168 016C MOVW R12,R24
0169 C00D RJMP 0x0177
016A E081 LDI R24,1
016B E090 LDI R25,0
016C 016C MOVW R12,R24
016D C009 RJMP 0x0177
016E 82E8 STD Y+0,R14
(0278)
016F 852D LDD R18,Y+13
(0279) if (y1 == y2) //画竖直线
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -