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

📄 lcd.lst

📁 采用Mega128控制LCD12864液晶显示器
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
      EE EFCF      LDI	R28,0xFF
      EF E1D0      LDI	R29,0x10
      F0 BFCD      OUT	0x3D,R28
      F1 BFDE      OUT	0x3E,R29
      F2 51CE      SUBI	R28,0x1E
      F3 40D0      SBCI	R29,0
      F4 EA0A      LDI	R16,0xAA
      F5 8308      STD	Y+0,R16
      F6 2400      CLR	R0
      F7 E0E0      LDI	R30,0
      F8 E0F1      LDI	R31,1
      F9 E011      LDI	R17,1
      FA 30E0      CPI	R30,0
      FB 07F1      CPC	R31,R17
      FC F011      BEQ	0x00FF
      FD 9201      ST	R0,Z+
      FE CFFB      RJMP	0x00FA
      FF 8300      STD	Z+0,R16
     100 EDEC      LDI	R30,0xDC
     101 E0F1      LDI	R31,1
     102 E0A0      LDI	R26,0
     103 E0B1      LDI	R27,1
     104 E011      LDI	R17,1
     105 E000      LDI	R16,0
     106 BF0B      OUT	0x3B,R16
     107 3DEC      CPI	R30,0xDC
     108 07F1      CPC	R31,R17
     109 F021      BEQ	0x010E
     10A 95C8      LPM
     10B 9631      ADIW	R30,1
     10C 920D      ST	R0,X+
     10D CFF9      RJMP	0x0107
     10E 940E 01AD CALL	_main
_exit:
     110 CFFF      RJMP	_exit
FILE: F:\avr\mega128\lcd12864\so12864.c
(0001) #include "so12864.h"
(0002) 
(0003) /*************************************************/
(0004) //Init LCD
(0005) /*************************************************/
(0006) void Init_LCD(void)
(0007) {
(0008) 	//Make the CS AO RST pin as output
(0009) 	DDR_SPI_CTL = (1 << LCD_AO_TRIS) | (1 << LCD_RST_TRIS) | (1 << LCD_CS_TRIS);
_Init_LCD:
     111 E087      LDI	R24,7
     112 BB81      OUT	0x11,R24
(0010) 
(0011) 	DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);				//设置MOSI,SCK,SS 为OUTPUT,其它为INPUT 
     113 E086      LDI	R24,6
     114 BB87      OUT	0x17,R24
(0012) 	SPCR = (1<<SPE)|(1<<MSTR);						//SPI使能,主机方式,设置SCK为fosc/4,上升沿,MSB First 
     115 E580      LDI	R24,0x50
     116 B98D      OUT	0x0D,R24
(0013) 
(0014) 	/* 一定要先重启LCD,再设置SPI,否则通讯不成功 */
(0015) 
(0016) 	LCD_RST_IO |= BIT(LCD_RST_PIN);
     117 9A91      SBI	0x12,1
(0017) 	LCD_CS_IO |= BIT(LCD_CS_PIN);
     118 9A92      SBI	0x12,2
(0018) 	LCD_AO_IO |= BIT(LCD_AO_PIN);
     119 9A90      SBI	0x12,0
(0019) 
(0020) 	LCD_CS_IO &= ~BIT(LCD_CS_PIN);			//select 12864
     11A 9892      CBI	0x12,2
(0021) 	
(0022) 	LCD_RST_IO &= ~BIT(LCD_RST_PIN);			//reset
     11B 9891      CBI	0x12,1
(0023) 	nop();
     11C 0000      NOP
(0024) 	nop();
     11D 0000      NOP
(0025) 	nop();
     11E 0000      NOP
(0026) 	LCD_RST_IO |= BIT(LCD_RST_PIN);
     11F 9A91      SBI	0x12,1
(0027) 	
(0028) 	//write command
(0029) 	Write_LCDCOM(DISPLAY_ON);				//ON DISPLAY
     120 EA0F      LDI	R16,0xAF
     121 D016      RCALL	_Write_LCDCOM
(0030) 	Write_LCDCOM(START_LINE_0);				//STAR DISPLAY
     122 E400      LDI	R16,0x40
     123 D014      RCALL	_Write_LCDCOM
(0031) 	Write_LCDCOM(ADC_NORMAL);				//ADC NORMAL
     124 EA00      LDI	R16,0xA0
     125 D012      RCALL	_Write_LCDCOM
(0032) 	Write_LCDCOM(DISPLAY_NORMAL);			//Display normal
     126 EA06      LDI	R16,0xA6
     127 D010      RCALL	_Write_LCDCOM
(0033) 	Write_LCDCOM(ALL_POINT_NORMAL);			//CLEAR
     128 EA04      LDI	R16,0xA4
     129 D00E      RCALL	_Write_LCDCOM
(0034) 	Write_LCDCOM(BIAS_1_9);					//1/9BIAS
     12A EA02      LDI	R16,0xA2
     12B D00C      RCALL	_Write_LCDCOM
(0035) 	Write_LCDCOM(OUTPUT_MPDE_REVERSE);		//COMMON OUTPUT DIRECTION
     12C EC08      LDI	R16,0xC8
     12D D00A      RCALL	_Write_LCDCOM
(0036) 	Write_LCDCOM(POWER);					//POWER CONTROL
     12E E20F      LDI	R16,0x2F
     12F D008      RCALL	_Write_LCDCOM
(0037) 	Write_LCDCOM(RESISTOR_RATION);			//RESISTER RATIO
     130 E204      LDI	R16,0x24
     131 D006      RCALL	_Write_LCDCOM
(0038) 	Write_LCDCOM(HIBYTE(ELECTRONIC_VOLUME));//VOLUM MODE SET
     132 E801      LDI	R16,0x81
     133 D004      RCALL	_Write_LCDCOM
(0039) 	Write_LCDCOM(LOBYTE(ELECTRONIC_VOLUME));
     134 E204      LDI	R16,0x24
     135 D002      RCALL	_Write_LCDCOM
(0040) 	
(0041) 	Clear_LCD();
     136 D00D      RCALL	_Clear_LCD
     137 9508      RET
(0042) }
(0043) 
(0044) 
(0045) /*************************************************/
(0046) //Write command
(0047) /*************************************************/
(0048) void Write_LCDCOM(BYTE command)
(0049) {
(0050) 	LCD_AO_IO &= ~BIT(LCD_AO_PIN);
_Write_LCDCOM:
  command              --> R16
     138 9890      CBI	0x12,0
(0051) 	LCD_CS_IO &= ~BIT(LCD_CS_PIN);
     139 9892      CBI	0x12,2
(0052) 	SPDR = (unsigned char)command; 
     13A B90F      OUT	0x0F,R16
(0053) 	while(!(SPSR&(1<<SPIF)));		//Wait for transmission finish 
     13B 9B77      SBIS	0x0E,7
     13C CFFE      RJMP	0x013B
     13D 9508      RET
(0054) }
(0055) /*************************************************/
(0056) //Write data
(0057) /*************************************************/
(0058) void Write_LCDDATA(BYTE data)
(0059) {
(0060) 	LCD_AO_IO |= BIT(LCD_AO_PIN);
_Write_LCDDATA:
  data                 --> R16
     13E 9A90      SBI	0x12,0
(0061) 	LCD_CS_IO &= ~BIT(LCD_CS_PIN);
     13F 9892      CBI	0x12,2
(0062) 	SPDR = (unsigned char)data; 
     140 B90F      OUT	0x0F,R16
(0063) 	while(!(SPSR&(1<<SPIF)));		//Wait for transmission finish 
     141 9B77      SBIS	0x0E,7
     142 CFFE      RJMP	0x0141
     143 9508      RET
_Clear_LCD:
  page                 --> R20
  seg                  --> R22
     144 934A      ST	R20,-Y
     145 936A      ST	R22,-Y
(0064) }
(0065) 
(0066) /*************************************************/
(0067) //Clear LCD
(0068) /*************************************************/
(0069) void Clear_LCD()
(0070) {
(0071) 	unsigned char seg;
(0072) 	unsigned char page;
(0073) 	for(page = PAGE_0; page < PAGE_8; page++) 	//写页地址共8 页0xb0----0xb8
     146 EB40      LDI	R20,0xB0
     147 C00E      RJMP	0x0156
(0074) 	{
(0075) 		Write_LCDCOM(page);
     148 2F04      MOV	R16,R20
     149 DFEE      RCALL	_Write_LCDCOM
(0076) 		Write_LCDCOM(0x10); 					//列地址,高低字节两次写入,从第0列开始
     14A E100      LDI	R16,0x10
     14B DFEC      RCALL	_Write_LCDCOM
(0077) 		Write_LCDCOM(0x00);
     14C 2700      CLR	R16
     14D DFEA      RCALL	_Write_LCDCOM
(0078) 		for(seg = 0; seg < 128; seg++)			//写128列
     14E 2766      CLR	R22
     14F C003      RJMP	0x0153
(0079) 		{ 
(0080) 			Write_LCDDATA(0x00);
     150 2700      CLR	R16
     151 DFEC      RCALL	_Write_LCDDATA
     152 9563      INC	R22
     153 3860      CPI	R22,0x80
     154 F3D8      BCS	0x0150
     155 9543      INC	R20
     156 3B48      CPI	R20,0xB8
     157 F380      BCS	0x0148
     158 9169      LD	R22,Y+
     159 9149      LD	R20,Y+
     15A 9508      RET
_DispEN_LCD:
  seg                  --> R20
  ptr                  --> R10
  column               --> R12
  page                 --> R14
     15B 940E 0224 CALL	push_xgset30FC
     15D 0169      MOVW	R12,R18
     15E 2EE0      MOV	R14,R16
     15F 84A8      LDD	R10,Y+8
     160 84B9      LDD	R11,Y+9
(0081) 		}
(0082) 	}
(0083) }
(0084) 
(0085) /*************************************************/
(0086) //Display English words
(0087) /*************************************************/
(0088) void DispEN_LCD(BYTE page, WORD column, BYTE *ptr)
(0089) {
(0090) 	unsigned char seg;
(0091) 	
(0092) 	Write_LCDCOM(page);
     161 2D0E      MOV	R16,R14
     162 DFD5      RCALL	_Write_LCDCOM
(0093) 	Write_LCDCOM(HIBYTE(column)); 	//列地址,高低字节两次写入
     163 0186      MOVW	R16,R12
     164 2F01      MOV	R16,R17
     165 2711      CLR	R17
     166 7010      ANDI	R17,0
     167 DFD0      RCALL	_Write_LCDCOM
(0094) 	Write_LCDCOM(LOBYTE(column));
     168 2D0C      MOV	R16,R12
     169 DFCE      RCALL	_Write_LCDCOM
(0095) 
(0096) 	for(seg = 0; seg < 8; seg++)	//写8列
     16A 2744      CLR	R20
     16B C005      RJMP	0x0171
(0097) 	{ 
(0098) 		Write_LCDDATA((BYTE)(*ptr++));
     16C 01F5      MOVW	R30,R10
     16D 9101      LD	R16,Z+
     16E 015F      MOVW	R10,R30
     16F DFCE      RCALL	_Write_LCDDATA
     170 9543      INC	R20
     171 3048      CPI	R20,0x8
     172 F3C8      BCS	0x016C
     173 940C 020E JMP	pop_xgset30FC
_DispCN_LCD:
  offset               --> R20
  seg                  --> R22
  ptr                  --> R10
  column               --> R12
  page                 --> R14
     175 940E 0222 CALL	push_xgsetF0FC
     177 0169      MOVW	R12,R18
     178 2EE0      MOV	R14,R16
     179 84AA      LDD	R10,Y+10
     17A 84BB      LDD	R11,Y+11
(0099) 	}
(0100) }
(0101) 
(0102) /*************************************************/
(0103) //Display Chinese words
(0104) /*************************************************/
(0105) void DispCN_LCD(BYTE page, WORD column, BYTE *ptr)
(0106) {
(0107) 	unsigned char seg;
(0108) 	unsigned char offset;
(0109) 	for(offset = 0; offset < 2; offset++)
     17B 2744      CLR	R20
     17C C018      RJMP	0x0195
(0110) 	{
(0111) 		Write_LCDCOM((BYTE)(page + offset));
     17D 2E24      MOV	R2,R20
     17E 2433      CLR	R3
     17F 2D0E      MOV	R16,R14

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -