?? lcd12864_st7920.lst
字號:
(0052) 2.VCC -------- VCC
(0053) 3.V0 -------- V0
(0054) 4.RS(CS) -------- VCC
(0055) 5.R/W(SID) -------- MOSI/PB5
(0056) 6.E(SCLK) -------- SCK/PB7
(0057) 7.D0 -------- NC
(0058) 8.D1 -------- NC
(0059) 9.D2 -------- NC
(0060) 10.D3 -------- NC
(0061) 11.D4 -------- NC
(0062) 12.D5 -------- NC
(0063) 13.D6 -------- NC
(0064) 14.D7 -------- NC
(0065) 15.PSB -------- GND
(0066) 16.NC -------- NC
(0067) 17.RST -------- NC
(0068) 18.NC -------- NC
(0069) 19.LED+ -------- VCC
(0070) 20.LED- -------- GND
(0071)
(0072) 說明:
(0073) (1)使用ATmega16的硬件SPI操作LCD12864_ST7920
(0074) (2)PIN4/CS接VCC,其實也可接到特定的IO口,但外部程序需要指定
(0075) --------------------------------------------------------------------*/
(0076)
(0077) #ifndef LCD12864_ST7920_H
(0078) #define LCD12864_ST7920_H
(0079)
(0080) #include "D:\ICC_H\CmmIcc.h"
(0081)
(0082) void SPI_init()
(0083) {
(0084) DDRB |= 0xB0;
_SPI_init:
0209 B387 IN R24,0x17
020A 6B80 ORI R24,0xB0
020B BB87 OUT 0x17,R24
(0085) SPCR = 0x50; //setup SPI
020C E580 LDI R24,0x50
020D B98D OUT 0x0D,R24
(0086) SPSR = 0x01; //setup SPI
020E E081 LDI R24,1
020F B98E OUT 0x0E,R24
(0087) SEI();
0210 9478 BSET 7
0211 9508 RET
(0088) }
(0089)
(0090) void lcd_wrByte(uint8 data)
(0091) {
(0092) SPDR = data;
_lcd_wrByte:
data --> R16
0212 B90F OUT 0x0F,R16
(0093) while ((SPSR & 0x80) == 0);
0213 9B77 SBIS 0x0E,7
0214 CFFE RJMP 0x0213
0215 9508 RET
_lcd_wrCmd:
LC --> R20
HC --> R22
0216 940E048C CALL push_gset2
0218 2F42 MOV R20,R18
0219 2F60 MOV R22,R16
(0094) }
(0095)
(0096) void lcd_wrCmd(uint8 HC,uint8 LC)
(0097) {
(0098) lcd_wrByte(0xF8);
021A EF08 LDI R16,0xF8
021B DFF6 RCALL _lcd_wrByte
(0099) lcd_wrByte(HC); //傳輸高四位
021C 2F06 MOV R16,R22
021D DFF4 RCALL _lcd_wrByte
(0100) lcd_wrByte(LC); //傳輸低四位
021E 2F04 MOV R16,R20
021F DFF2 RCALL _lcd_wrByte
0220 940E047A CALL pop_gset2
0222 9508 RET
_lcd_wrDat:
LD --> R20
HD --> R22
0223 940E048C CALL push_gset2
0225 2F42 MOV R20,R18
0226 2F60 MOV R22,R16
(0101) }
(0102)
(0103) void lcd_wrDat(uint8 HD,uint8 LD)
(0104) {
(0105) lcd_wrByte(0xFA);
0227 EF0A LDI R16,0xFA
0228 DFE9 RCALL _lcd_wrByte
(0106) lcd_wrByte(HD); //傳輸高四位
0229 2F06 MOV R16,R22
022A DFE7 RCALL _lcd_wrByte
(0107) lcd_wrByte(LD); //傳輸低四位
022B 2F04 MOV R16,R20
022C DFE5 RCALL _lcd_wrByte
022D 940E047A CALL pop_gset2
022F 9508 RET
_lcd_set_xy:
adr --> R20
y --> R22
x --> R20
0230 940E048C CALL push_gset2
0232 2F62 MOV R22,R18
0233 2F40 MOV R20,R16
(0108) }
(0109)
(0110) /*
(0111) x表示在第幾行顯示,y表示在第幾列顯示
(0112) */
(0113) void lcd_set_xy(uint8 x,uint8 y)
(0114) {
(0115) uint8 adr;
(0116)
(0117) switch(x)
0234 2755 CLR R21
0235 3041 CPI R20,1
0236 E0E0 LDI R30,0
0237 075E CPC R21,R30
0238 F069 BEQ 0x0246
0239 3042 CPI R20,2
023A E0E0 LDI R30,0
023B 075E CPC R21,R30
023C F061 BEQ 0x0249
023D 3043 CPI R20,3
023E E0E0 LDI R30,0
023F 075E CPC R21,R30
0240 F059 BEQ 0x024C
0241 3044 CPI R20,4
0242 E0E0 LDI R30,0
0243 075E CPC R21,R30
0244 F051 BEQ 0x024F
0245 C00B RJMP 0x0251
(0118) {
(0119) case 1: adr = 0x7F + y;
0246 2F46 MOV R20,R22
0247 5841 SUBI R20,0x81
(0120) break; //在第1行y列顯示
0248 C008 RJMP 0x0251
(0121) case 2: adr = 0x8F + y;
0249 2F46 MOV R20,R22
024A 5741 SUBI R20,0x71
(0122) break; //在第2行y列顯示
024B C005 RJMP 0x0251
(0123) case 3: adr = 0x87 + y;
024C 2F46 MOV R20,R22
024D 5749 SUBI R20,0x79
(0124) break; //在第3行y列顯示
024E C002 RJMP 0x0251
(0125) case 4: adr = 0x97 + y;
024F 2F46 MOV R20,R22
0250 5649 SUBI R20,0x69
(0126) break; //在第4行y列顯示
(0127) default: ;
(0128) }
(0129) lcd_wrCmd(adr&0xF0,(adr&0x0F)<<4);
0251 2F24 MOV R18,R20
0252 702F ANDI R18,0xF
0253 702F ANDI R18,0xF
0254 9522 SWAP R18
0255 2F04 MOV R16,R20
0256 7F00 ANDI R16,0xF0
0257 DFBE RCALL _lcd_wrCmd
0258 940E047A CALL pop_gset2
025A 9508 RET
_lcd_putc:
ch --> Y+4
y --> R22
x --> R20
025B 940E048C CALL push_gset2
025D 2F62 MOV R22,R18
025E 2F40 MOV R20,R16
(0130) }
(0131)
(0132) void lcd_putc(uint8 x,uint8 y,uint8 ch)
(0133) {
(0134) lcd_set_xy(x,y);
025F 2F26 MOV R18,R22
0260 2F04 MOV R16,R20
0261 DFCE RCALL _lcd_set_xy
(0135) delay50us(20);
0262 E104 LDI R16,0x14
0263 E010 LDI R17,0
0264 DF7C RCALL _delay50us
(0136) lcd_wrDat(ch&0xF0,(ch&0x0F)<<4);
0265 812C LDD R18,Y+4
0266 702F ANDI R18,0xF
0267 702F ANDI R18,0xF
0268 9522 SWAP R18
0269 810C LDD R16,Y+4
026A 7F00 ANDI R16,0xF0
026B DFB7 RCALL _lcd_wrDat
026C 940E047A CALL pop_gset2
026E 9508 RET
_lcd_putd0:
i --> R20
length --> Y+9
dat --> Y+5
y --> R22
x --> R20
026F 940E048C CALL push_gset2
0271 2F62 MOV R22,R18
0272 2F40 MOV R20,R16
0273 9721 SBIW R28,1
(0137) }
(0138)
(0139) void lcd_putd0(uint8 x,uint8 y,uint32 dat,uint8 length)
(0140) {
(0141) sint8 i;
(0142)
(0143) speaData(dat,length);
0274 8409 LDD R0,Y+9
0275 8208 STD Y+0,R0
0276 01FE MOVW R30,R28
0277 8105 LDD R16,Z+5
0278 8116 LDD R17,Z+6
0279 8127 LDD R18,Z+7
027A 8530 LDD R19,Z+8
027B DDDE RCALL _speaData
(0144) lcd_set_xy(x,y);
027C 2F26 MOV R18,R22
027D 2F04 MOV R16,R20
027E DFB1 RCALL _lcd_set_xy
(0145) delay50us(40);
027F E208 LDI R16,0x28
0280 E010 LDI R17,0
0281 DF5F RCALL _delay50us
(0146) for(i=length-1;i>=0;i--)
0282 8549 LDD R20,Y+9
0283 5041 SUBI R20,1
0284 C01E RJMP 0x02A3
(0147) {
(0148) lcd_wrDat( (dataElem[i]+0x30)&0xF0 ,( (dataElem[i]+0x30)&0x0F )<<4 );
0285 E78D LDI R24,0x7D
0286 E090 LDI R25,0
0287 2FE4 MOV R30,R20
0288 27FF CLR R31
0289 FDE7 SBRC R30,7
028A 95F0 COM R31
028B 0FE8 ADD R30,R24
028C 1FF9 ADC R31,R25
028D 8180 LDD R24,Z+0
028E 2799 CLR R25
028F 96C0 ADIW R24,0x30
0290 2F28 MOV R18,R24
0291 702F ANDI R18,0xF
0292 7030 ANDI R19,0
0293 0F22 LSL R18
0294 1F33 ROL R19
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 2F08 MOV R16,R24
029C 7F00 ANDI R16,0xF0
029D 7010 ANDI R17,0
029E DF84 RCALL _lcd_wrDat
(0149) delay50us(40);
029F E208 LDI R16,0x28
02A0 E010 LDI R17,0
02A1 DF3F RCALL _delay50us
02A2 954A DEC R20
02A3 3040 CPI R20,0
02A4 F704 BGE 0x0285
02A5 9621 ADIW R28,1
02A6 940E047A CALL pop_gset2
02A8 9508 RET
_lcd_putd:
effectLen --> R12
i --> R10
length --> Y+15
dat --> Y+11
y --> R14
x --> R10
02A9 940E0486 CALL push_gset5
02AB 2EE2 MOV R14,R18
02AC 2EA0 MOV R10,R16
02AD 9721 SBIW R28,1
(0150) }
(0151) }
(0152)
(0153) void lcd_putd(uint8 x,uint8 y,uint32 dat,uint8 length)
(0154) {
(0155) sint8 i;
(0156) sint8 effectLen;
(0157)
(0158) if(dat>999999)
02AE E34F LDI R20,0x3F
02AF E452 LDI R21,0x42
02B0 E06F LDI R22,0xF
02B1 E070 LDI R23,0
02B2 01FE MOVW R30,R28
02B3 8423 LDD R2,Z+11
02B4 8434 LDD R3,Z+12
02B5 8445 LDD R4,Z+13
02B6 8456 LDD R5,Z+14
02B7 1542 CP R20,R2
02B8 0553 CPC R21,R3
02B9 0564 CPC R22,R4
02BA 0575 CPC R23,R5
02BB F418 BCC 0x02BF
(0159) effectLen=7;
02BC E087 LDI R24,7
02BD 2EC8 MOV R12,R24
02BE C057 RJMP 0x0316
(0160) else if(dat>99999)
02BF E94F LDI R20,0x9F
02C0 E856 LDI R21,0x86
02C1 E061 LDI R22,1
02C2 E070 LDI R23,0
02C3 01FE MOVW R30,R28
02C4 8423 LDD R2,Z+11
02C5 8434 LDD R3,Z+12
02C6 8445 LDD R4,Z+13
02C7 8456 LDD R5,Z+14
02C8 1542 CP R20,R2
02C9 0553 CPC R21,R3
02CA 0564 CPC R22,R4
02CB 0575 CPC R23,R5
02CC F418 BCC 0x02D0
(0161) effectLen=6;
02CD E086 LDI R24,6
02CE 2EC8 MOV R12,R24
02CF C046 RJMP 0x0316
(0162) else if(dat>9999)
02D0 E04F LDI R20,0xF
02D1 E257 LDI R21,0x27
02D2 E060 LDI R22,0
02D3 E070 LDI R23,0
02D4 01FE MOVW R30,R28
02D5 8423 LDD R2,Z+11
02D6 8434 LDD R3,Z+12
02D7 8445 LDD R4,Z+13
02D8 8456 LDD R5,Z+14
02D9 1542 CP R20,R2
02DA 0553 CPC R21,R3
02DB 0564 CPC R22,R4
02DC 0575 CPC R23,R5
02DD F418 BCC 0x02E1
(0163) effectLen=5;
02DE E085 LDI R24,5
02DF 2EC8 MOV R12,R24
02E0 C035 RJMP 0x0316
(0164) else if(dat>999)
02E1 EE47 LDI R20,0xE7
02E2 E053 LDI R21,3
02E3 E060 LDI R22,0
02E4 E070 LDI R23,0
02E5 01FE MOVW R30,R28
02E6 8423 LDD R2,Z+11
02E7 8434 LDD R3,Z+12
02E8 8445 LDD R4,Z+13
02E9 8456 LDD R5,Z+14
02EA 1542 CP R20,R2
02EB 0553 CPC R21,R3
02EC 0564 CPC R22,R4
02ED 0575 CPC R23,R5
02EE F418 BCC 0x02F2
(0165) effectLen=4;
02EF E084 LDI R24,4
02F0 2EC8 MOV R12,R24
02F1 C024 RJMP 0x0316
(0166) else if(dat>99)
02F2 E643 LDI R20,0x63
02F3 E050 LDI R21,0
02F4 E060 LDI R22,0
02F5 E070 LDI R23,0
02F6 01FE MOVW R30,R28
02F7 8423 LDD R2,Z+11
02F8 8434 LDD R3,Z+12
02F9 8445 LDD R4,Z+13
02FA 8456 LDD R5,Z+14
02FB 1542 CP R20,R2
02FC 0553 CPC R21,R3
02FD 0564 CPC R22,R4
02FE 0575 CPC R23,R5
02FF F418 BCC 0x0303
(0167) effectLen=3;
0300 E083 LDI R24,3
0301 2EC8 MOV R12,R24
0302 C013 RJMP 0x0316
(0168) else if(dat>9)
0303 E049 LDI R20,0x9
0304 E050 LDI R21,0
0305 E060 LDI R22,0
0306 E070 LDI R23,0
0307 01FE MOVW R30,R28
0308 8423 LDD R2,Z+11
0309 8434 LDD R3,Z+12
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -