📄 ec1602.lst
字号:
__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 + -