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

📄 ec1602.lst

📁 ATmega系列单片机驱动1602字符型液晶显示器
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0065 E5CF      LDI	R28,0x5F
    0066 E0D4      LDI	R29,4
    0067 BFCD      OUT	0x3D,R28
    0068 BFDE      OUT	0x3E,R29
    0069 51C0      SUBI	R28,0x10
    006A 40D0      SBCI	R29,0
    006B EA0A      LDI	R16,0xAA
    006C 8308      STD	Y+0,R16
    006D 2400      CLR	R0
    006E E9E6      LDI	R30,0x96
    006F E0F0      LDI	R31,0
    0070 E010      LDI	R17,0
    0071 39E9      CPI	R30,0x99
    0072 07F1      CPC	R31,R17
    0073 F011      BEQ	0x0076
    0074 9201      ST	R0,Z+
    0075 CFFB      RJMP	0x0071
    0076 8300      STD	Z+0,R16
    0077 E9E4      LDI	R30,0x94
    0078 E0F0      LDI	R31,0
    0079 E6A0      LDI	R26,0x60
    007A E0B0      LDI	R27,0
    007B E010      LDI	R17,0
    007C 3CEA      CPI	R30,0xCA
    007D 07F1      CPC	R31,R17
    007E F021      BEQ	0x0083
    007F 95C8      LPM
    0080 9631      ADIW	R30,1
    0081 920D      ST	R0,X+
    0082 CFF9      RJMP	0x007C
    0083 940E01FF  CALL	_main
_exit:
    0085 CFFF      RJMP	_exit
_DelayUs:
  i                    --> R20
  Xus                  --> R16
    0086 940E023C  CALL	push_gset1
FILE: H:\ICC_Test\EC1602\inc\idelay.c
(0001) //#include <util/delay.h>
(0002) 
(0003) // Delay Xus US
(0004) void DelayUs(uint8 Xus)
(0005) {
    0088 C005      RJMP	0x008E
(0006) 	uint8 i;
(0007) 	while(--Xus != 0)
(0008) 	for(i=0;i<65;i++)
    0089 2744      CLR	R20
    008A C001      RJMP	0x008C
    008B 9543      INC	R20
    008C 3441      CPI	R20,0x41
    008D F3E8      BCS	0x008B
    008E 2F80      MOV	R24,R16
    008F 5081      SUBI	R24,1
    0090 2F08      MOV	R16,R24
    0091 2388      TST	R24
    0092 F7B1      BNE	0x0089
    0093 940E023F  CALL	pop_gset1
    0095 9508      RET
_DelayMs:
  i                    --> R20
  Xms                  --> R16
    0096 940E023C  CALL	push_gset1
(0009) 	;
(0010) 	//_delay_us(1);
(0011) }
(0012) 
(0013) // Delay Xms MS
(0014) void DelayMs(uint16 Xms)
(0015) {
    0098 C009      RJMP	0x00A2
(0016) 	uint16 i;
(0017) 	while(--Xms != 0)
(0018) 	for(i=0;i<655;i++)
    0099 2744      CLR	R20
    009A 2755      CLR	R21
    009B C002      RJMP	0x009E
    009C 5F4F      SUBI	R20,0xFF
    009D 4F5F      SBCI	R21,0xFF
    009E 384F      CPI	R20,0x8F
    009F E0E2      LDI	R30,2
    00A0 075E      CPC	R21,R30
    00A1 F3D0      BCS	0x009C
    00A2 01C8      MOVW	R24,R16
    00A3 9701      SBIW	R24,1
    00A4 018C      MOVW	R16,R24
    00A5 3000      CPI	R16,0
    00A6 0701      CPC	R16,R17
    00A7 F789      BNE	0x0099
    00A8 940E023F  CALL	pop_gset1
    00AA 9508      RET
_delay100ms:
  i                    --> R20
    00AB 940E023C  CALL	push_gset1
(0019) 	;
(0020) 	//_delay_ms(1);
(0021) }
(0022) 
(0023) void delay100ms(void)
(0024) {
(0025) 	uint8 i;
(0026) 	for (i = 0 ; i < 5 ; i++)
    00AD 2744      CLR	R20
    00AE C004      RJMP	0x00B3
(0027) 	{
(0028) 		DelayMs(20);//_delay_ms(20);
    00AF E104      LDI	R16,0x14
    00B0 E010      LDI	R17,0
    00B1 DFE4      RCALL	_DelayMs
    00B2 9543      INC	R20
    00B3 3045      CPI	R20,5
    00B4 F3D0      BCS	0x00AF
    00B5 940E023F  CALL	pop_gset1
    00B7 9508      RET
_delay500ms:
  i                    --> R20
    00B8 940E023C  CALL	push_gset1
(0029) 	}
(0030) }
(0031) 
(0032) void delay500ms(void)
(0033) {
(0034) 	uint8 i;
(0035) 	for (i = 0 ; i < 5 ; i++)
    00BA 2744      CLR	R20
    00BB C002      RJMP	0x00BE
(0036) 	{
(0037) 		delay100ms();
    00BC DFEE      RCALL	_delay100ms
    00BD 9543      INC	R20
    00BE 3045      CPI	R20,5
    00BF F3E0      BCS	0x00BC
    00C0 940E023F  CALL	pop_gset1
    00C2 9508      RET
(0038) 	}
(0039) }
(0040) 
(0041) void delay1s(void)
(0042) {
(0043) 	DelayMs(1000);	
_delay1s:
    00C3 EE08      LDI	R16,0xE8
    00C4 E013      LDI	R17,3
    00C5 DFD0      RCALL	_DelayMs
    00C6 9508      RET
_RvsByte:
  tmp                  --> R20
  i                    --> R22
  dByte                --> R10
    00C7 940E0238  CALL	push_gset3
    00C9 2EA0      MOV	R10,R16
FILE: H:\ICC_Test\EC1602\inc\convert.c
(0001) // -------------------------------------------------------------------------
(0002) // -					Functions for data convertion					   -
(0003) // -------------------------------------------------------------------------
(0004) 
(0005) // Reverse the direction of a Byte
(0006) uint8 RvsByte(uint8 dByte)
(0007) {
(0008) 	uint8 i;
(0009) 	uint8 tmp = 0;
    00CA 2744      CLR	R20
(0010) 	for (i = 0; i < 8; i++)
    00CB 2766      CLR	R22
    00CC C00B      RJMP	0x00D8
(0011) 	{
(0012) 		tmp = (tmp<<1) | ((dByte>>i) & 0x01);
    00CD 2D0A      MOV	R16,R10
    00CE 2F16      MOV	R17,R22
    00CF 940E0253  CALL	lsr8
    00D1 2F80      MOV	R24,R16
    00D2 7081      ANDI	R24,1
    00D3 2E24      MOV	R2,R20
    00D4 0C22      LSL	R2
    00D5 2A28      OR	R2,R24
    00D6 2D42      MOV	R20,R2
    00D7 9563      INC	R22
    00D8 3068      CPI	R22,0x8
    00D9 F398      BCS	0x00CD
(0013) 	}
(0014) 	return tmp;
    00DA 2F04      MOV	R16,R20
    00DB 940E0231  CALL	pop_gset3
    00DD 9508      RET
_NumberToChar:
  Number               --> R20
    00DE 940E023C  CALL	push_gset1
    00E0 2F40      MOV	R20,R16
(0015) }
(0016) 
(0017) // Convert 123 to '1','2','3'
(0018) uint8* NumberToChar(uint8 Number)
(0019) {
(0020) 	// Base code + ASCII offset
(0021) 	static uint8 Dest[3];
(0022) 	Dest[0] = Number/100 + 48;
    00E1 E614      LDI	R17,0x64
    00E2 2F04      MOV	R16,R20
    00E3 940E0218  CALL	div8u
    00E5 2F80      MOV	R24,R16
    00E6 5D80      SUBI	R24,0xD0
    00E7 93800096  STS	Dest,R24
(0023) 	Dest[1] = (Number%100)/10 + 48;
    00E9 E614      LDI	R17,0x64
    00EA 2F04      MOV	R16,R20
    00EB 940E0216  CALL	mod8u
    00ED E01A      LDI	R17,0xA
    00EE 940E0218  CALL	div8u
    00F0 2F80      MOV	R24,R16
    00F1 5D80      SUBI	R24,0xD0
    00F2 93800097  STS	Dest+1,R24
(0024) 	Dest[2] = (Number%100)%10 + 48;
    00F4 E614      LDI	R17,0x64
    00F5 2F04      MOV	R16,R20
    00F6 940E0216  CALL	mod8u
    00F8 E01A      LDI	R17,0xA
    00F9 940E0216  CALL	mod8u
    00FB 2F80      MOV	R24,R16
    00FC 5D80      SUBI	R24,0xD0
    00FD 93800098  STS	Dest+2,R24
(0025) 	return Dest;
    00FF E906      LDI	R16,0x96
    0100 E010      LDI	R17,0
    0101 940E023F  CALL	pop_gset1
    0103 9508      RET
FILE: H:\ICC_Test\EC1602\inc\780.c
(0001) // Functions for SPLC780X 16com/40seg LCD Controller and Driver
(0002) //#include "idelay.h"
(0003) //#include "convert.h"
(0004) //#include "780.h"
(0005) // PORT initialization
(0006) /*void port_ini(void)
(0007) {
(0008) 	LCD_CTRL_DDR = 0x07;
(0009) 	LCD_DATA_DDR = 0xFF;
(0010) }*/
(0011) 
(0012) //Busy check
(0013) void CheckBusy(void)
(0014) {
(0015) 	//uint8 readByte=0x00;
(0016) 	LCD_DATA_DDR = 0x00;
_CheckBusy:
    0104 2422      CLR	R2
    0105 BA21      OUT	0x11,R2
(0017) 	DelayMs(7);
    0106 E007      LDI	R16,7
    0107 E010      LDI	R17,0
    0108 DF8D      RCALL	_DelayMs
(0018) 	LCD_DO=0xff;
    0109 EF8F      LDI	R24,0xFF
    010A BB82      OUT	0x12,R24
(0019) 	CLR_RS;
    010B 98C0      CBI	0x18,0
(0020) 	SET_RW;
    010C 9AC1      SBI	0x18,1
(0021) 	SET_E;
    010D 9AC2      SBI	0x18,2
(0022) 	while((LCD_DI&0x80)==0x80);
    010E B220      IN	R2,0x10
    010F 2433      CLR	R3
    0110 FC27      SBRC	R2,7
    0111 CFFC      RJMP	0x010E
(0023) 	CLR_E;
    0112 98C2      CBI	0x18,2
(0024) 	//CLR_RW;
(0025) 	//SET_RS;
(0026) 
(0027) 	LCD_DATA_DDR = 0xff;
    0113 EF8F      LDI	R24,0xFF
    0114 BB81      OUT	0x11,R24
    0115 9508      RET
_SendByte:
  dByte                --> R20
  DatCmd               --> R22
    0116 940E023A  CALL	push_gset2
    0118 2F42      MOV	R20,R18
    0119 2F60      MOV	R22,R16
(0028) }
(0029) // Write a Data or Command to LCD
(0030) void SendByte(uint8 DatCmd, uint8 dByte)
(0031) {
(0032) 	CheckBusy();
    011A DFE9      RCALL	_CheckBusy
(0033) 	//DelayMs(10);
(0034) 	//LCD_DATA_DDR = 0xFF;
(0035) 	if (DatCmd == 0)
    011B 2366      TST	R22
    011C F411      BNE	0x011F
(0036) 		CLR_RS;
    011D 98C0      CBI	0x18,0
    011E C001      RJMP	0x0120
(0037) 	else
(0038) 		SET_RS;
    011F 9AC0      SBI	0x18,0
(0039) 	CLR_RW;
    0120 98C1      CBI	0x18,1
(0040) 	#ifdef LCD_4BIT
(0041) 		SET_E;
(0042) 		LCD_DO = dByte & 0xF0;	//Higher 4-bit
(0043) 		CLR_E;
(0044) 		SET_E;
(0045) 		LCD_DO = dByte << 4;	//Lower 4-bit
(0046) 		CLR_E;
(0047) 	#elif defined(LCD_8BIT)
(0048) 		SET_E;
    0121 9AC2      SBI	0x18,2
(0049) 		LCD_DO = dByte;
    0122 BB42      OUT	0x12,R20
(0050) 		CLR_E;
    0123 98C2      CBI	0x18,2
    0124 940E022E  CALL	pop_gset2
    0126 9508      RET
_SendStr:
  ptString             --> R20
    0127 940E023C  CALL	push_gset1
    0129 01A8      MOVW	R20,R16
(0051) 	#endif
(0052) }
(0053) 
(0054) // Write a string to LCD
(0055) void SendStr(uint8 *ptString)
(0056) {
    012A C005      RJMP	0x0130
(0057) 	while((*ptString)!='\0')
(0058) 	{
(0059) 		SendByte(iDat, *ptString++);
    012B 01FA      MOVW	R30,R20
    012C 9121      LD	R18,Z+
    012D 01AF      MOVW	R20,R30
    012E E001      LDI	R16,1
    012F DFE6      RCALL	_SendByte
    0130 01FA      MOVW	R30,R20
    0131 8020      LDD	R2,Z+0
    0132 2022      TST	R2
    0133 F7B9      BNE	0x012B
    0134 940E023F  CALL	pop_gset1
    0136 9508      RET
_SendNbr:
  temp                 --> R20
  Number               --> R20
    0137 940E023C  CALL	push_gset1
    0139 2F40      MOV	R20,R16
(0060) 	}
(0061) }
(0062) 
(0063) // Send a Number less than 255
(0064) void SendNbr(uint8 Number)
(0065) {
(0066) 	uint8 *temp;
(0067) 	temp = NumberToChar(Number);
    013A 2F04      MOV	R16,R20
    013B DFA2      RCALL	_NumberToChar
    013C 01A8      MOVW	R20,R16
(0068) 	SendByte(iDat, *temp++);
    013D 01FA      MOVW	R30,R20
    013E 9121      LD	R18,Z+
    013F 01AF      MOVW	R20,R30
    0140 E001      LDI	R16,1
    0141 DFD4      RCALL	_SendByte
(0069) 	SendByte(iDat, *temp++);
    0142 01FA      MOVW	R30,R20
    0143 9121      LD	R18,Z+
    0144 01AF      MOVW	R20,R30
    0145 E001      LDI	R16,1
    0146 DFCF      RCALL	_SendByte
(0070) 	SendByte(iDat, *temp);
    0147 01FA      MOVW	R30,R20
    0148 8120      LDD	R18,Z+0
    0149 E001      LDI	R16,1
    014A DFCB      RCALL	_SendByte
    014B 940E023F  CALL	pop_gset1
    014D 9508      RET
_Move:
  dir                  --> R20
    014E 940E023C  CALL	push_gset1
    0150 2F40      MOV	R20,R16
(0071) }
(0072) // Move Cursor or display
(0073) void Move(uint8 dir)
(0074) {
(0075) 	SendByte(iCmd, dir);
    0151 2F24      MOV	R18,R20
    0152 2700      CLR	R16
    0153 DFC2      RCALL	_SendByte
    0154 940E023F  CALL	pop_gset1
    0156 9508      RET
_Gotoxy:
  Col                  --> R20
  Row                  --> R22
    0157 940E023A  CALL	push_gset2
    0159 2F42      MOV	R20,R18
    015A 2F60      MOV	R22,R16
(0076) }
(0077) 
(0078) // Goto specific location
(0079) void Gotoxy(uint8 Row, uint8 Col)
(0080) {
(0081) 	
(0082) 	switch (Row)
    015B 2777      CLR	R23
    015C 3062      CPI	R22,2
    015D E0E0      LDI	R30,0
    015E 077E      CPC	R23,R30
    015F F009      BEQ	0x0161
    0160 C005      RJMP	0x0166
(0083) 	{
(0084) 		#if defined(LCD_L2)
(0085) 		case 2:
(0086) 			SendByte(iCmd, LCD_L2 + Col); break;
    0161 2F24      MOV	R18,R20
    0162 5420      SUBI	R18,0x40
    0163 2700      CLR	R16
    0164 DFB1      RCALL	_SendByte
    0165 C004      RJMP	0x016A
(0087) 		#endif
(0088) 		#if defined(LCD_L3)
(0089) 		case 3:
(0090) 			SendByte(iCmd, LCD_L3 + Col); break;
(0091) 		#endif
(0092) 		#if defined(LCD_L4)
(0093) 		case 4:
(0094) 			SendByte(iCmd, LCD_L4 + Col); break;
(0095) 		#endif
(0096) 		default:
(0097) 			SendByte(iCmd, LCD_L1 + Col); break;
    0166 2F24      MOV	R18,R20
    0167 5820      SUBI	R18,0x80
    0168 2700      CLR	R16
    0169 DFAC      RCALL	_SendByte
    016A 940E022E  CALL	pop_gset2
    016C 9508      RET

⌨️ 快捷键说明

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