⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864_st7920.lst

📁 12864的实例程序 根据自己需要选择自己需要的部分
💻 LST
📖 第 1 页 / 共 5 页
字号:
(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 + -