📄 test.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E00D3 CALL _main
_exit:
004A CFFF RJMP _exit
FILE: E:\WaveShare\微雪电子CD1\开发板试验器\SD系列\M16SD\试验教程\外围模块相关试验\NOKIA3~1\Nokia3510i\test\test.c
(0001) //ICC-AVR application builder : 2005-4-16 21:20:40
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #define csl asm("cbi 0x18,0") //PB0
(0009) #define csh asm("sbi 0x18,0")
(0010)
(0011) #define restl asm("cbi 0x12,1") //PB4
(0012) #define resth asm("sbi 0x12,1")
(0013)
(0014) #define sclkl asm("cbi 0x18,7") //PB5
(0015) #define sclkh asm("sbi 0x18,7")
(0016)
(0017) #define sdatal asm("cbi 0x18,5") //PB3
(0018) #define sdatah asm("sbi 0x18,5")
(0019) #define CS 3
(0020) #define SCLK 7
(0021) #define SDATA 5
(0022) #define RESET 2
(0023)
(0024) #define CMD 0
(0025) #define DATA 1
(0026)
(0027) void port_init(void)
(0028) {
(0029) PORTB = 0xFF;
_port_init:
004B EF8F LDI R24,0xFF
004C BB88 OUT 0x18,R24
(0030) DDRB = 0x00;
004D 2422 CLR R2
004E BA27 OUT 0x17,R2
(0031) PORTC = 0x7F; //m103 output only
004F E78F LDI R24,0x7F
0050 BB85 OUT 0x15,R24
(0032) DDRC = 0x00;
0051 BA24 OUT 0x14,R2
(0033) PORTD = 0xFF;
0052 EF8F LDI R24,0xFF
0053 BB82 OUT 0x12,R24
(0034) DDRD = 0x00;
0054 BA21 OUT 0x11,R2
0055 9508 RET
(0035) }
(0036)
(0037) //call this routine to initialise all peripherals
(0038) void init_devices(void)
(0039) {
(0040) //stop errant interrupts until set up
(0041) //CLI(); //disable all interrupts
(0042) port_init();
_init_devices:
0056 DFF4 RCALL _port_init
(0043)
(0044) MCUCR = 0x00;
0057 2422 CLR R2
0058 BE25 OUT 0x35,R2
(0045) GICR = 0x00;
0059 BE2B OUT 0x3B,R2
(0046) TIMSK = 0x00; //timer interrupt sources
005A BE29 OUT 0x39,R2
005B 9508 RET
_delay5ms:
i --> Y+0
005C 9722 SBIW R28,2
(0047) //SEI(); //re-enable interrupts
(0048) //all peripherals are now initialised
(0049) }
(0050)
(0051) //
(0052) //ICC-AVR application builder : 2005-4-16 21:20:40
(0053) // Target : M8
(0054) // Crystal: 8.0000Mhz
(0055)
(0056)
(0057)
(0058)
(0059) void delay5ms(void) {
(0060) volatile int i;
(0061) for(i=0; i<2200; i++);
005D 2422 CLR R2
005E 2433 CLR R3
005F 8239 STD Y+1,R3
0060 8228 STD Y+0,R2
0061 8188 LDD R24,Y+0
0062 8199 LDD R25,Y+1
0063 9601 ADIW R24,1
0064 8399 STD Y+1,R25
0065 8388 STD Y+0,R24
0066 3988 CPI R24,0x98
0067 E0E8 LDI R30,0x8
0068 079E CPC R25,R30
0069 F3BC BLT 0x0061
006A 9622 ADIW R28,2
006B 9508 RET
(0062) }
(0063)
(0064) //----------------------------
(0065) //发送指令或数据 硬件SPI
(0066) //速度快,没有刷屏现象
(0067) //----------------------------
(0068) void send(unsigned char myData,unsigned char cd)
(0069) {
(0070) if(cd==DATA)
_send:
cd --> R18
myData --> R16
006C 3021 CPI R18,1
006D F429 BNE 0x0073
(0071) {
(0072) csl;
006E 98C0 CBI 0x18,0
(0073) sclkl;
006F 98C7 CBI 0x18,7
(0074) sdatah;
0070 9AC5 SBI 0x18,5
(0075) sclkh;
0071 9AC7 SBI 0x18,7
(0076) }
0072 C004 RJMP 0x0077
(0077) else
(0078) {
(0079) csl;
0073 98C0 CBI 0x18,0
(0080)
(0081) sclkl;
0074 98C7 CBI 0x18,7
(0082) sdatal;
0075 98C5 CBI 0x18,5
(0083) sclkh;
0076 9AC7 SBI 0x18,7
(0084)
(0085) }
(0086) SPCR = 0x50; //setup SPI
0077 E580 LDI R24,0x50
0078 B98D OUT 0x0D,R24
(0087)
(0088) SPDR = myData;
0079 B90F OUT 0x0F,R16
(0089)
(0090) while(!(SPSR & 0x80));
007A 9B77 SBIS 0x0E,7
007B CFFE RJMP 0x007A
(0091)
(0092) csh;
007C 9AC0 SBI 0x18,0
(0093) SPCR = 0x00;
007D 2422 CLR R2
007E B82D OUT 0x0D,R2
007F 9508 RET
(0094)
(0095)
(0096) }
(0097)
(0098) //----------------------------
(0099) //发送指令或数据 软件模拟SPI
(0100) //速度较慢,有刷屏现象
(0101) //----------------------------
(0102) void send2(char data, char cd)
(0103) {
(0104) // CS auf Low setzen
(0105) PORTD &= ~(0x01 << CS);
_send2:
cd --> R18
data --> R16
0080 9893 CBI 0x12,3
(0106)
(0107) // Kommando oder Daten?
(0108) PORTB &= ~(0x01 << SCLK);
0081 98C7 CBI 0x18,7
(0109) if(cd == CMD)
0082 2322 TST R18
0083 F411 BNE 0x0086
(0110) PORTB &= ~(0x01 << SDATA);
0084 98C5 CBI 0x18,5
0085 C001 RJMP 0x0087
(0111) else
(0112) PORTB |= 0x01 << SDATA;
0086 9AC5 SBI 0x18,5
(0113) PORTB |= 0x01 << SCLK;
0087 9AC7 SBI 0x18,7
(0114)
(0115) // 1. Bit (MSB)
(0116) PORTB &= ~(0x01 << SCLK);
0088 98C7 CBI 0x18,7
(0117) if((data & 0x80) == 0x80)
0089 2F80 MOV R24,R16
008A 7880 ANDI R24,0x80
008B 3880 CPI R24,0x80
008C F411 BNE 0x008F
(0118) PORTB |= 0x01 << SDATA;
008D 9AC5 SBI 0x18,5
008E C001 RJMP 0x0090
(0119) else
(0120) PORTB &= ~(0x01 << SDATA);
008F 98C5 CBI 0x18,5
(0121) PORTB |= 0x01 << SCLK;
0090 9AC7 SBI 0x18,7
(0122)
(0123) // 2. Bit (MSB)
(0124) PORTB &= ~(0x01 << SCLK);
0091 98C7 CBI 0x18,7
(0125) if((data & 0x40) == 0x40)
0092 2F80 MOV R24,R16
0093 7480 ANDI R24,0x40
0094 3480 CPI R24,0x40
0095 F411 BNE 0x0098
(0126) PORTB |= 0x01 << SDATA;
0096 9AC5 SBI 0x18,5
0097 C001 RJMP 0x0099
(0127) else
(0128) PORTB &= ~(0x01 << SDATA);
0098 98C5 CBI 0x18,5
(0129) PORTB |= 0x01 << SCLK;
0099 9AC7 SBI 0x18,7
(0130)
(0131) // 3. Bit (MSB)
(0132) PORTB &= ~(0x01 << SCLK);
009A 98C7 CBI 0x18,7
(0133) if((data & 0x20) == 0x20)
009B 2F80 MOV R24,R16
009C 7280 ANDI R24,0x20
009D 3280 CPI R24,0x20
009E F411 BNE 0x00A1
(0134) PORTB |= 0x01 << SDATA;
009F 9AC5 SBI 0x18,5
00A0 C001 RJMP 0x00A2
(0135) else
(0136) PORTB &= ~(0x01 << SDATA);
00A1 98C5 CBI 0x18,5
(0137) PORTB |= 0x01 << SCLK;
00A2 9AC7 SBI 0x18,7
(0138)
(0139) // 4. Bit (MSB)
(0140) PORTB &= ~(0x01 << SCLK);
00A3 98C7 CBI 0x18,7
(0141) if((data & 0x10) == 0x10)
00A4 2F80 MOV R24,R16
00A5 7180 ANDI R24,0x10
00A6 3180 CPI R24,0x10
00A7 F411 BNE 0x00AA
(0142) PORTB |= 0x01 << SDATA;
00A8 9AC5 SBI 0x18,5
00A9 C001 RJMP 0x00AB
(0143) else
(0144) PORTB &= ~(0x01 << SDATA);
00AA 98C5 CBI 0x18,5
(0145) PORTB |= 0x01 << SCLK;
00AB 9AC7 SBI 0x18,7
(0146)
(0147) // 5. Bit (MSB)
(0148) PORTB &= ~(0x01 << SCLK);
00AC 98C7 CBI 0x18,7
(0149) if((data & 0x08) == 0x08)
00AD 2F80 MOV R24,R16
00AE 7088 ANDI R24,0x8
00AF 3088 CPI R24,0x8
00B0 F411 BNE 0x00B3
(0150) PORTB |= 0x01 << SDATA;
00B1 9AC5 SBI 0x18,5
00B2 C001 RJMP 0x00B4
(0151) else
(0152) PORTB &= ~(0x01 << SDATA);
00B3 98C5 CBI 0x18,5
(0153) PORTB |= 0x01 << SCLK;
00B4 9AC7 SBI 0x18,7
(0154)
(0155) // 6. Bit (MSB)
(0156) PORTB &= ~(0x01 << SCLK);
00B5 98C7 CBI 0x18,7
(0157) if((data & 0x04) == 0x04)
00B6 2F80 MOV R24,R16
00B7 7084 ANDI R24,4
00B8 3084 CPI R24,4
00B9 F411 BNE 0x00BC
(0158) PORTB |= 0x01 << SDATA;
00BA 9AC5 SBI 0x18,5
00BB C001 RJMP 0x00BD
(0159) else
(0160) PORTB &= ~(0x01 << SDATA);
00BC 98C5 CBI 0x18,5
(0161) PORTB |= 0x01 << SCLK;
00BD 9AC7 SBI 0x18,7
(0162)
(0163) // 7. Bit (MSB)
(0164) PORTB &= ~(0x01 << SCLK);
00BE 98C7 CBI 0x18,7
(0165) if((data & 0x02) == 0x02)
00BF 2F80 MOV R24,R16
00C0 7082 ANDI R24,2
00C1 3082 CPI R24,2
00C2 F411 BNE 0x00C5
(0166) PORTB |= 0x01 << SDATA;
00C3 9AC5 SBI 0x18,5
00C4 C001 RJMP 0x00C6
(0167) else
(0168) PORTB &= ~(0x01 << SDATA);
00C5 98C5 CBI 0x18,5
(0169) PORTB |= 0x01 << SCLK;
00C6 9AC7 SBI 0x18,7
(0170)
(0171) // 8. Bit (MSB)
(0172) PORTB &= ~(0x01 << SCLK);
00C7 98C7 CBI 0x18,7
(0173) if((data & 0x01) == 0x01)
00C8 2F80 MOV R24,R16
00C9 7081 ANDI R24,1
00CA 3081 CPI R24,1
00CB F411 BNE 0x00CE
(0174) PORTB |= 0x01 << SDATA;
00CC 9AC5 SBI 0x18,5
00CD C001 RJMP 0x00CF
(0175) else
(0176) PORTB &= ~(0x01 << SDATA);
00CE 98C5 CBI 0x18,5
(0177) PORTB |= 0x01 << SCLK;
00CF 9AC7 SBI 0x18,7
00D0 9508 RET
(0178) }
(0179)
(0180) void cs(void) {
(0181) PORTD |= 0x01 << CS; // CS wieder auf 1
_cs:
00D1 9A93 SBI 0x12,3
00D2 9508 RET
(0182) }
(0183)
(0184) int main(void) {
(0185) int i;
(0186) char s;
(0187) init_devices();
_main:
s --> R22
i --> R20
00D3 DF82 RCALL _init_devices
(0188) DDRB = 0xFF; // PortB = Output
00D4 EF8F LDI R24,0xFF
00D5 BB87 OUT 0x17,R24
(0189) DDRD = 0xff;
00D6 BB81 OUT 0x11,R24
(0190) // LCD Hardware Reset
(0191) PORTD &= ~(0x01 << 0);
00D7 9890 CBI 0x12,0
(0192) delay5ms();
00D8 DF83 RCALL _delay5ms
(0193) PORTD |= 0x01 << 0;
00D9 9A90 SBI 0x12,0
(0194)
(0195) PORTD |= 0x01 << CS;
00DA 9A93 SBI 0x12,3
(0196) PORTB |= 0x01 << SCLK;
00DB 9AC7 SBI 0x18,7
(0197) PORTB |= 0x01 << SDATA;
00DC 9AC5 SBI 0x18,5
(0198)
(0199) send(0x01, CMD); // LCD Software Reset
00DD 2722 CLR R18
00DE E001 LDI R16,1
00DF DF8C RCALL _send
(0200) cs();
00E0 DFF0 RCALL _cs
(0201) delay5ms();
00E1 DF7A RCALL _delay5ms
(0202)
(0203) send(0xC6, CMD); // Initial Escape
00E2 2722 CLR R18
00E3 EC06 LDI R16,0xC6
00E4 DF87 RCALL _send
(0204) cs();
00E5 DFEB RCALL _cs
(0205)
(0206) send(0xB9, CMD); // Refresh set
00E6 2722 CLR R18
00E7 EB09 LDI R16,0xB9
00E8 DF83 RCALL _send
(0207) send(0x00, DATA);
00E9 E021 LDI R18,1
00EA 2700 CLR R16
00EB DF80 RCALL _send
(0208) cs();
00EC DFE4 RCALL _cs
(0209)
(0210) send(0xB6, CMD); // Display Control
00ED 2722 CLR R18
00EE EB06 LDI R16,0xB6
00EF DF7C RCALL _send
(0211) send(128, DATA);
00F0 E021 LDI R18,1
00F1 E800 LDI R16,0x80
00F2 DF79 RCALL _send
(0212) send(128, DATA);
00F3 E021 LDI R18,1
00F4 E800 LDI R16,0x80
00F5 DF76 RCALL _send
(0213) send(129, DATA);
00F6 E021 LDI R18,1
00F7 E801 LDI R16,0x81
00F8 DF73 RCALL _send
(0214) send(84, DATA);
00F9 E021 LDI R18,1
00FA E504 LDI R16,0x54
00FB DF70 RCALL _send
(0215) send(69, DATA);
00FC E021 LDI R18,1
00FD E405 LDI R16,0x45
00FE DF6D RCALL _send
(0216) send(82, DATA);
00FF E021 LDI R18,1
0100 E502 LDI R16,0x52
0101 DF6A RCALL _send
(0217) send(67, DATA);
0102 E021 LDI R18,1
0103 E403 LDI R16,0x43
0104 DF67 RCALL _send
(0218) cs();
0105 DFCB RCALL _cs
(0219)
(0220) send(0xB3, CMD); // Gray Scale Position
0106 2722 CLR R18
0107 EB03 LDI R16,0xB3
0108 DF63 RCALL _send
(0221) send(1, DATA);
0109 E021 LDI R18,1
010A E001 LDI R16,1
010B DF60 RCALL _send
(0222) send(2, DATA);
010C E021 LDI R18,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -