📄 spilcd12864.lst
字号:
(0058) ---------------------------------------------------
(0059) ---------------------------------------------------------------*/
(0060)
(0061) #ifndef SPILCD_H
(0062) #define SPILCD_H
(0063)
(0064) #include "D:\ICC_H\CmmIcc.h"
(0065)
(0066) void SPI_init()
(0067) {
(0068) OUT_LCD_CS;
_SPI_init:
0209 9ABB SBI 0x17,3
(0069) SET_LCD_CS;
020A 9AC3 SBI 0x18,3
(0070) DDRB |= 0xB0;
020B B387 IN R24,0x17
020C 6B80 ORI R24,0xB0
020D BB87 OUT 0x17,R24
(0071) SPCR = 0x50; //setup SPI
020E E580 LDI R24,0x50
020F B98D OUT 0x0D,R24
(0072) SPSR = 0x01; //setup SPI
0210 E081 LDI R24,1
0211 B98E OUT 0x0E,R24
(0073) SEI();
0212 9478 BSET 7
0213 9508 RET
(0074) }
(0075)
(0076) void lcd_wrByte(uint8 data)
(0077) {
(0078) SPDR = data;
_lcd_wrByte:
data --> R16
0214 B90F OUT 0x0F,R16
(0079) while ((SPSR & 0x80) == 0);
0215 9B77 SBIS 0x0E,7
0216 CFFE RJMP 0x0215
0217 9508 RET
_lcd_wrCmd:
LC --> R20
HC --> R22
0218 940E0489 CALL push_gset2
021A 2F42 MOV R20,R18
021B 2F60 MOV R22,R16
(0080) }
(0081)
(0082) void lcd_wrCmd(uint8 HC,uint8 LC)
(0083) {
(0084) lcd_wrByte(0xF8);
021C EF08 LDI R16,0xF8
021D DFF6 RCALL _lcd_wrByte
(0085) lcd_wrByte(HC); //传输高四位
021E 2F06 MOV R16,R22
021F DFF4 RCALL _lcd_wrByte
(0086) lcd_wrByte(LC); //传输低四位
0220 2F04 MOV R16,R20
0221 DFF2 RCALL _lcd_wrByte
0222 940E0477 CALL pop_gset2
0224 9508 RET
_lcd_wrDat:
LD --> R20
HD --> R22
0225 940E0489 CALL push_gset2
0227 2F42 MOV R20,R18
0228 2F60 MOV R22,R16
(0087) }
(0088)
(0089) void lcd_wrDat(uint8 HD,uint8 LD)
(0090) {
(0091) lcd_wrByte(0xFA);
0229 EF0A LDI R16,0xFA
022A DFE9 RCALL _lcd_wrByte
(0092) lcd_wrByte(HD); //传输高四位
022B 2F06 MOV R16,R22
022C DFE7 RCALL _lcd_wrByte
(0093) lcd_wrByte(LD); //传输低四位
022D 2F04 MOV R16,R20
022E DFE5 RCALL _lcd_wrByte
022F 940E0477 CALL pop_gset2
0231 9508 RET
_lcd_set_xy:
adr --> R20
y --> R22
x --> R20
0232 940E0489 CALL push_gset2
0234 2F62 MOV R22,R18
0235 2F40 MOV R20,R16
(0094) }
(0095)
(0096) /*
(0097) x表示在第几行显示,y表示在第几列显示
(0098) */
(0099) void lcd_set_xy(uint8 x,uint8 y )
(0100) {
(0101) uint8 adr;
(0102) switch(x)
0236 2755 CLR R21
0237 3041 CPI R20,1
0238 E0E0 LDI R30,0
0239 075E CPC R21,R30
023A F069 BEQ 0x0248
023B 3042 CPI R20,2
023C E0E0 LDI R30,0
023D 075E CPC R21,R30
023E F061 BEQ 0x024B
023F 3043 CPI R20,3
0240 E0E0 LDI R30,0
0241 075E CPC R21,R30
0242 F059 BEQ 0x024E
0243 3044 CPI R20,4
0244 E0E0 LDI R30,0
0245 075E CPC R21,R30
0246 F051 BEQ 0x0251
0247 C00B RJMP 0x0253
(0103) {
(0104) case 1: adr = 0x7F + y;
0248 2F46 MOV R20,R22
0249 5841 SUBI R20,0x81
(0105) break; //在第1行y列显示
024A C008 RJMP 0x0253
(0106) case 2: adr = 0x8F + y;
024B 2F46 MOV R20,R22
024C 5741 SUBI R20,0x71
(0107) break; //在第2行y列显示
024D C005 RJMP 0x0253
(0108) case 3: adr = 0x87 + y;
024E 2F46 MOV R20,R22
024F 5749 SUBI R20,0x79
(0109) break; //在第3行y列显示
0250 C002 RJMP 0x0253
(0110) case 4: adr = 0x97 + y;
0251 2F46 MOV R20,R22
0252 5649 SUBI R20,0x69
(0111) break; //在第3行y列显示
(0112) default: ;
(0113) }
(0114) lcd_wrCmd(adr&0xF0,(adr&0x0F)<<4);
0253 2F24 MOV R18,R20
0254 702F ANDI R18,0xF
0255 702F ANDI R18,0xF
0256 9522 SWAP R18
0257 2F04 MOV R16,R20
0258 7F00 ANDI R16,0xF0
0259 DFBE RCALL _lcd_wrCmd
025A 940E0477 CALL pop_gset2
025C 9508 RET
_lcd_putc:
ch --> Y+4
y --> R22
x --> R20
025D 940E0489 CALL push_gset2
025F 2F62 MOV R22,R18
0260 2F40 MOV R20,R16
(0115) }
(0116)
(0117) void lcd_putc(uint8 x,uint8 y,uint8 ch)
(0118) {
(0119) lcd_set_xy(x,y);
0261 2F26 MOV R18,R22
0262 2F04 MOV R16,R20
0263 DFCE RCALL _lcd_set_xy
(0120) delay50us(20);
0264 E104 LDI R16,0x14
0265 E010 LDI R17,0
0266 DF7A RCALL _delay50us
(0121) lcd_wrDat(ch&0xF0,(ch&0x0F)<<4);
0267 812C LDD R18,Y+4
0268 702F ANDI R18,0xF
0269 702F ANDI R18,0xF
026A 9522 SWAP R18
026B 810C LDD R16,Y+4
026C 7F00 ANDI R16,0xF0
026D DFB7 RCALL _lcd_wrDat
026E 940E0477 CALL pop_gset2
0270 9508 RET
_lcd_putd0:
i --> R20
length --> Y+9
dat --> Y+5
y --> R22
x --> R20
0271 940E0489 CALL push_gset2
0273 2F62 MOV R22,R18
0274 2F40 MOV R20,R16
0275 9721 SBIW R28,1
(0122) }
(0123)
(0124) void lcd_putd0(uint8 x,uint8 y,uint32 dat,uint8 length)
(0125) {
(0126) sint8 i;
(0127)
(0128) speaData(dat,length);
0276 8409 LDD R0,Y+9
0277 8208 STD Y+0,R0
0278 01FE MOVW R30,R28
0279 8105 LDD R16,Z+5
027A 8116 LDD R17,Z+6
027B 8127 LDD R18,Z+7
027C 8530 LDD R19,Z+8
027D DDDC RCALL _speaData
(0129) lcd_set_xy(x,y);
027E 2F26 MOV R18,R22
027F 2F04 MOV R16,R20
0280 DFB1 RCALL _lcd_set_xy
(0130) delay50us(40);
0281 E208 LDI R16,0x28
0282 E010 LDI R17,0
0283 DF5D RCALL _delay50us
(0131) for(i=length-1;i>=0;i--)
0284 8549 LDD R20,Y+9
0285 5041 SUBI R20,1
0286 C01E RJMP 0x02A5
(0132) {
(0133) lcd_wrDat( (dataElem[i]+0x30)&0xF0 ,( (dataElem[i]+0x30)&0x0F )<<4 );
0287 E78D LDI R24,0x7D
0288 E090 LDI R25,0
0289 2FE4 MOV R30,R20
028A 27FF CLR R31
028B FDE7 SBRC R30,7
028C 95F0 COM R31
028D 0FE8 ADD R30,R24
028E 1FF9 ADC R31,R25
028F 8180 LDD R24,Z+0
0290 2799 CLR R25
0291 96C0 ADIW R24,0x30
0292 2F28 MOV R18,R24
0293 702F ANDI R18,0xF
0294 7030 ANDI R19,0
0295 0F22 LSL R18
0296 1F33 ROL R19
0297 0F22 LSL R18
0298 1F33 ROL R19
0299 0F22 LSL R18
029A 1F33 ROL R19
029B 0F22 LSL R18
029C 1F33 ROL R19
029D 2F08 MOV R16,R24
029E 7F00 ANDI R16,0xF0
029F 7010 ANDI R17,0
02A0 DF84 RCALL _lcd_wrDat
(0134) delay50us(40);
02A1 E208 LDI R16,0x28
02A2 E010 LDI R17,0
02A3 DF3D RCALL _delay50us
02A4 954A DEC R20
02A5 3040 CPI R20,0
02A6 F704 BGE 0x0287
02A7 9621 ADIW R28,1
02A8 940E0477 CALL pop_gset2
02AA 9508 RET
_lcd_putd:
effectLen --> R12
i --> R10
length --> Y+15
dat --> Y+11
y --> R14
x --> R10
02AB 940E0483 CALL push_gset5
02AD 2EE2 MOV R14,R18
02AE 2EA0 MOV R10,R16
02AF 9721 SBIW R28,1
(0135) }
(0136) }
(0137)
(0138) void lcd_putd(uint8 x,uint8 y,uint32 dat,uint8 length)
(0139) {
(0140) sint8 i;
(0141) sint8 effectLen;
(0142)
(0143) if(dat>999999)
02B0 E34F LDI R20,0x3F
02B1 E452 LDI R21,0x42
02B2 E06F LDI R22,0xF
02B3 E070 LDI R23,0
02B4 01FE MOVW R30,R28
02B5 8423 LDD R2,Z+11
02B6 8434 LDD R3,Z+12
02B7 8445 LDD R4,Z+13
02B8 8456 LDD R5,Z+14
02B9 1542 CP R20,R2
02BA 0553 CPC R21,R3
02BB 0564 CPC R22,R4
02BC 0575 CPC R23,R5
02BD F418 BCC 0x02C1
(0144) effectLen=7;
02BE E087 LDI R24,7
02BF 2EC8 MOV R12,R24
02C0 C057 RJMP 0x0318
(0145) else if(dat>99999)
02C1 E94F LDI R20,0x9F
02C2 E856 LDI R21,0x86
02C3 E061 LDI R22,1
02C4 E070 LDI R23,0
02C5 01FE MOVW R30,R28
02C6 8423 LDD R2,Z+11
02C7 8434 LDD R3,Z+12
02C8 8445 LDD R4,Z+13
02C9 8456 LDD R5,Z+14
02CA 1542 CP R20,R2
02CB 0553 CPC R21,R3
02CC 0564 CPC R22,R4
02CD 0575 CPC R23,R5
02CE F418 BCC 0x02D2
(0146) effectLen=6;
02CF E086 LDI R24,6
02D0 2EC8 MOV R12,R24
02D1 C046 RJMP 0x0318
(0147) else if(dat>9999)
02D2 E04F LDI R20,0xF
02D3 E257 LDI R21,0x27
02D4 E060 LDI R22,0
02D5 E070 LDI R23,0
02D6 01FE MOVW R30,R28
02D7 8423 LDD R2,Z+11
02D8 8434 LDD R3,Z+12
02D9 8445 LDD R4,Z+13
02DA 8456 LDD R5,Z+14
02DB 1542 CP R20,R2
02DC 0553 CPC R21,R3
02DD 0564 CPC R22,R4
02DE 0575 CPC R23,R5
02DF F418 BCC 0x02E3
(0148) effectLen=5;
02E0 E085 LDI R24,5
02E1 2EC8 MOV R12,R24
02E2 C035 RJMP 0x0318
(0149) else if(dat>999)
02E3 EE47 LDI R20,0xE7
02E4 E053 LDI R21,3
02E5 E060 LDI R22,0
02E6 E070 LDI R23,0
02E7 01FE MOVW R30,R28
02E8 8423 LDD R2,Z+11
02E9 8434 LDD R3,Z+12
02EA 8445 LDD R4,Z+13
02EB 8456 LDD R5,Z+14
02EC 1542 CP R20,R2
02ED 0553 CPC R21,R3
02EE 0564 CPC R22,R4
02EF 0575 CPC R23,R5
02F0 F418 BCC 0x02F4
(0150) effectLen=4;
02F1 E084 LDI R24,4
02F2 2EC8 MOV R12,R24
02F3 C024 RJMP 0x0318
(0151) else if(dat>99)
02F4 E643 LDI R20,0x63
02F5 E050 LDI R21,0
02F6 E060 LDI R22,0
02F7 E070 LDI R23,0
02F8 01FE MOVW R30,R28
02F9 8423 LDD R2,Z+11
02FA 8434 LDD R3,Z+12
02FB 8445 LDD R4,Z+13
02FC 8456 LDD R5,Z+14
02FD 1542 CP R20,R2
02FE 0553 CPC R21,R3
02FF 0564 CPC R22,R4
0300 0575 CPC R23,R5
0301 F418 BCC 0x0305
(0152) effectLen=3;
0302 E083 LDI R24,3
0303 2EC8 MOV R12,R24
0304 C013 RJMP 0x0318
(0153) else if(dat>9)
0305 E049 LDI R20,0x9
0306 E050 LDI R21,0
0307 E060 LDI R22,0
0308 E070 LDI R23,0
0309 01FE MOVW R30,R28
030A 8423 LDD R2,Z+11
030B 8434 LDD R3,Z+12
030C 8445 LDD R4,Z+13
030D 8456 LDD R5,Z+14
030E 1542 CP R20,R2
030F 0553 CPC R21,R3
0310 0564 CPC R22,R4
0311 0575 CPC R23,R5
0312 F418 BCC 0x0316
(0154) effectLen=2;
0313 E082 LDI R24,2
0314 2EC8 MOV R12,R24
0315 C002 RJMP 0x0318
(0155) else
(0156) effectLen=1;
0316 24CC CLR R12
0317 94C3 INC R12
(0157) speaData(dat,effectLen);
0318 82C8 STD Y+0,R12
0319 01FE MOVW R30,R28
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -