📄 demob-16sm.lst
字号:
__text_start:
__start:
BA EFCF LDI R28,0xFF
BB E2D1 LDI R29,0x21
BC BFCD OUT 0x3D,R28
BD BFDE OUT 0x3E,R29
BE 51CE SUBI R28,0x1E
BF 40D0 SBCI R29,0
C0 EA0A LDI R16,0xAA
C1 8308 STD Y+0,R16
C2 2400 CLR R0
C3 E1E0 LDI R30,0x10
C4 E0F2 LDI R31,2
C5 E012 LDI R17,2
C6 33EE CPI R30,0x3E
C7 07F1 CPC R31,R17
C8 F011 BEQ 0x00CB
C9 9201 ST R0,Z+
CA CFFB RJMP 0x00C6
CB 8300 STD Z+0,R16
CC E6E4 LDI R30,0x64
CD E0F1 LDI R31,1
CE E0A0 LDI R26,0
CF E0B2 LDI R27,2
D0 E011 LDI R17,1
D1 E000 LDI R16,0
D2 BF0B OUT 0x3B,R16
D3 37E4 CPI R30,0x74
D4 07F1 CPC R31,R17
D5 F021 BEQ 0x00DA
D6 95C8 LPM
D7 9631 ADIW R30,1
D8 920D ST R0,X+
D9 CFF9 RJMP 0x00D3
DA 940E 0139 CALL _main
_exit:
DC CFFF RJMP _exit
_uart_rx_isr:
DD 922A ST R2,-Y
DE 923A ST R3,-Y
DF 938A ST R24,-Y
E0 939A ST R25,-Y
E1 93EA ST R30,-Y
E2 93FA ST R31,-Y
E3 B62F IN R2,0x3F
E4 922A ST R2,-Y
FILE: C:\+samples-16small\DEMOB-16sm\DEMOB-16sm.c
(0001) /*
(0002) Title: DEMOB-16sm.c
(0003) Connection: RS232 connection to PC
(0004) PC runs a terminal program such as Tera Term Pro
(0005) Set Baudrate to 38400, 1 Start, 8 Data and 1 Stop
(0006) Operation:
(0007) 1. Messages "Baudrate=38400" displayed on LCD panel for about 1 minuite
(0008) 2. LCD panel is cleared and cursor goes to Home (firat line, first coloumn)
(0009) 3. Any key typed on PC's keyboard will be on LCD panel
(0010) 4. When 'CR' key pressed, the cursor of LCD panel will starts from next line
(0011) Attention: A terminal program "Tera Term Pro" is contained in CD
(0012) for PC to communicate with the AVR Study Board
(0013) */
(0014) /* UCSRA: Control & Status Register A
(0015) b7-RXC: USART receive complete
(0016) b6-TXC: USART transmit complete
(0017) b5-UDRE: USART Data register empty
(0018) b4-FE: Frame Error
(0019) b3-DOR: Data overtun
(0020) b2-PE: Parity error
(0021) b1-U2X: double the USART transmission speed
(0022) b0-MPCM: multi-processor communication mode
(0023)
(0024) USARB
(0025) * b7-RXCIE: RX complete interrupt enable
(0026) b6-TXCIE: TX complete interrupt enable
(0027) b5-UDRIE: USART data register empty interrupt enable
(0028) * b4-RXEN: Receiver enable
(0029) * b3-TXEN: Transmitter enable
(0030) b2-UCSZ2: chracter size ------->0
(0031) b1-RXB8 receive data bit 8
(0032) b0-TXB8: Transmit data 8
(0033)
(0034) UCSRC
(0035) * b7-URSEL: register select 0/UBRRH, 1/UCSRC
(0036) b6-UMSEL: USART mode select 0/Asyn 1/Synchronous
(0037) b5-UPM1: -------- Parity mode 00/disable, 01 reserved
(0038) b4-UPM0: -------- 10 even, 11 odd
(0039) b3-USBS: stop bit selection 0/1-bit, 1/2-bit
(0040) * b2-UCSZ1 --------> 1
(0041) * b1-UCSZ0 --------> 1
(0042) b0-UCPOL: clock polarity 0 rising XCK edge, 1 falling XCK edge
(0043) */
(0044)
(0045)
(0046) #include <iom16v.h>
(0047) #include <macros.h>
(0048)
(0049) #pragma interrupt_handler uart_rx_isr: 12
(0050)
(0051) // external definition from LCD-16sn.c
(0052) extern unsigned char lcd_enable, lcd_disable;
(0053) extern unsigned char in_instr_wr, in_data_wr;
(0054) extern unsigned char in_instr_rd, in_data_rd;
(0055) extern int indexhead, indextail, indexcount;
(0056) extern int cursor_index;
(0057) extern unsigned char swin, swin2;
(0058) extern const char message1[];
(0059) extern const char message2[];
(0060) extern const char message3[];
(0061) extern const char message4[];
(0062) extern const char message5[];
(0063) extern const char message6[];
(0064) extern const char message7[];
(0065) extern const char message8[];
(0066)
(0067) extern void port_init(void);
(0068) extern void WDT_off(void);
(0069) extern void delay(int);
(0070) extern void ldelay(int);
(0071) extern void wr_instruction(unsigned char);
(0072) extern void wr_data(unsigned char);
(0073) extern void wr_instruction2(unsigned char);
(0074) extern void wr_data2(unsigned char);
(0075) extern void cursor_home(void);
(0076) extern void cursor_line1(void);
(0077) extern void cursor_line2(void);
(0078) extern void space(void);
(0079) extern void out_string(const char array[]);
(0080) extern void lcd_on(void);
(0081) void clear_line1(void);
(0082) void clear_line2(void);
(0083)
(0084) //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(0085)
(0086) unsigned char RecBuf[40];
(0087) int rec_head=0, rec_tail=0;
(0088) unsigned rec_data;
(0089)
(0090) void uart_rx_isr(void)
(0091) {
(0092) RecBuf[rec_head]=UDR;
E5 E182 LDI R24,0x12
E6 E092 LDI R25,2
E7 91E0 0200 LDS R30,rec_head
E9 91F0 0201 LDS R31,rec_head+1
EB 0FE8 ADD R30,R24
EC 1FF9 ADC R31,R25
ED B02C IN R2,0x0C
EE 8220 STD Z+0,R2
(0093) rec_head++;
EF 9180 0200 LDS R24,rec_head
F1 9190 0201 LDS R25,rec_head+1
F3 9601 ADIW R24,1
F4 9390 0201 STS rec_head+1,R25
F6 9380 0200 STS rec_head,R24
(0094) if(rec_head>=40)
F8 3288 CPI R24,0x28
F9 E0E0 LDI R30,0
FA 079E CPC R25,R30
FB F034 BLT 0x0102
(0095) rec_head=0;
FC 2422 CLR R2
FD 2433 CLR R3
FE 9230 0201 STS rec_head+1,R3
100 9220 0200 STS rec_head,R2
102 9029 LD R2,Y+
103 BE2F OUT 0x3F,R2
104 91F9 LD R31,Y+
105 91E9 LD R30,Y+
106 9199 LD R25,Y+
107 9189 LD R24,Y+
108 9039 LD R3,Y+
109 9029 LD R2,Y+
10A 9518 RETI
(0096) }
(0097)
(0098) void port_init(void)
(0099) {
(0100) DDRA = 0xFF; //set PortA output
_port_init:
10B EF8F LDI R24,0xFF
10C BB8A OUT 0x1A,R24
(0101) DDRB = 0xff; //set PORTB output
10D BB87 OUT 0x17,R24
(0102) DDRC = 0x00; //set PORTC output
10E 2422 CLR R2
10F BA24 OUT 0x14,R2
(0103) PORTC = 0xff;
110 BB85 OUT 0x15,R24
(0104) DDRD = 0x7f; //set PD.7 input for RX
111 E78F LDI R24,0x7F
112 BB81 OUT 0x11,R24
113 9508 RET
_USART_init:
114 9722 SBIW R28,2
(0105) }
(0106)
(0107) void USART_init(void)
(0108) {
(0109) UCSRB=0x00;
115 2422 CLR R2
116 B82A OUT 0x0A,R2
(0110) UCSRA=0x00;
117 B82B OUT 0x0B,R2
(0111) UCSRB=0b10011000; //b7: RXCIE enabeled, b4: RXEN enabled, B3: TXEN enabled
118 E988 LDI R24,0x98
119 B98A OUT 0x0A,R24
(0112) UBRRH=0x00; //
11A BC20 OUT 0x20,R2
(0113) //Crystal=16MHx
(0114) //UBRRL=103; //Bausdrate=9600 tested work fine
(0115) //UBRRL=51; //Baudrate=19200 tested work fine
(0116) UBRRL=25; //Baudrate=38400 tested work fine
11B E189 LDI R24,0x19
11C B989 OUT 0x09,R24
(0117) //UBRRL=8; //Baurate=115200 tested work fine
(0118) UCSRC=0b10000110; //Asyn, No parity, 1-stop, 8-bit, rising edge
11D E886 LDI R24,0x86
11E BD80 OUT 0x20,R24
(0119) memset(RecBuf, 0, sizeof(RecBuf));
11F E288 LDI R24,0x28
120 E090 LDI R25,0
121 8399 STD Y+1,R25
122 8388 STD Y+0,R24
123 2722 CLR R18
124 2733 CLR R19
125 E102 LDI R16,0x12
126 E012 LDI R17,2
127 940E 02DC CALL _memset
(0120) rec_head=0;
129 2422 CLR R2
12A 2433 CLR R3
12B 9230 0201 STS rec_head+1,R3
12D 9220 0200 STS rec_head,R2
(0121) rec_tail=0;
12F 9230 0203 STS rec_tail+1,R3
131 9220 0202 STS rec_tail,R2
133 9622 ADIW R28,2
134 9508 RET
(0122) }
(0123)
(0124) /*
(0125) void delay2(int count)
(0126) {
(0127) int i, j;
(0128) for(i=count; i>0; i--)
(0129) for(j=10; j>0; j--)
(0130) ;
(0131) }*/
(0132)
(0133) void transmit(unsigned char abyte)
(0134) {
(0135) UDR=abyte;
_transmit:
abyte --> R16
135 B90C OUT 0x0C,R16
(0136) while(!(UCSRA&0b01000000)) //b6=1 TXE
136 9B5E SBIS 0x0B,6
137 CFFE RJMP 0x0136
138 9508 RET
(0137) ;
(0138) }
(0139)
(0140) //*****************************************************************
(0141) void main(void)
(0142) {
(0143) unsigned char outa=0b01010101, outb=0b10101010, outc=0x00, outd=0x00;
_main:
outd --> R10
outc --> R10
outb --> R20
outa --> R20
dswin --> R10
139 EA4A LDI R20,0xAA
13A 24AA CLR R10
(0144) int dswin;
(0145) port_init();
13B DFCF RCALL _port_init
(0146) USART_init();
13C DFD7 RCALL _USART_init
(0147) SEI();
13D 9478 BSET 7
(0148) WDT_off();
13E 940E 01BC CALL _WDT_off
(0149) ldelay(50);
140 E302 LDI R16,0x32
141 E010 LDI R17,0
142 940E 01D1 CALL _ldelay
(0150) lcd_on();
144 940E 02A6 CALL _lcd_on
(0151) PORTD=0x50;
146 E580 LDI R24,0x50
147 BB82 OUT 0x12,R24
(0152) ldelay(50);
148 E302 LDI R16,0x32
149 E010 LDI R17,0
14A 940E 01D1 CALL _ldelay
(0153) PORTD=0x05;
14C E085 LDI R24,5
14D BB82 OUT 0x12,R24
(0154) ldelay(50);
14E E302 LDI R16,0x32
14F E010 LDI R17,0
150 940E 01D1 CALL _ldelay
(0155) out_string(message1);
152 EE04 LDI R16,0xE4
153 E010 LDI R17,0
154 940E 028F CALL _out_string
(0156) cursor_line2();
156 940E 025E CALL _cursor_line2
(0157) out_string(message2);
158 EF05 LDI R16,0xF5
159 E010 LDI R17,0
15A 940E 028F CALL _out_string
(0158) ldelay(500);
15C EF04 LDI R16,0xF4
15D E011 LDI R17,1
15E 940E 01D1 CALL _ldelay
(0159) clear_line2();
160 940E 027E CALL _clear_line2
(0160) clear_line1();
162 940E 026D CALL _clear_line1
164 C055 RJMP 0x01BA
(0161) while(1)
(0162) {
(0163) WDR(); //Watchdog reset
165 95A8 WDR
(0164) if(rec_head!=rec_tail)
166 9020 0202 LDS R2,rec_tail
168 9030 0203 LDS R3,rec_tail+1
16A 9040 0200 LDS R4,rec_head
16C 9050 0201 LDS R5,rec_head+1
16E 1442 CP R4,R2
16F 0453 CPC R5,R3
170 F409 BNE 0x0172
171 C048 RJMP 0x01BA
(0165) {
(0166) rec_data=RecBuf[rec_tail];
172 E182 LDI R24,0x12
173 E092 LDI R25,2
174 01F1 MOVW R30,R2
175 0FE8 ADD R30,R24
176 1FF9 ADC R31,R25
177 8020 LDD R2,Z+0
178 2433 CLR R3
179 9230 0211 STS rec_data+1,R3
17B 9220 0210 STS rec_data,R2
(0167) rec_tail++;
17D 9180 0202 LDS R24,rec_tail
17F 9190 0203 LDS R25,rec_tail+1
181 9601 ADIW R24,1
182 9390 0203 STS rec_tail+1,R25
184 9380 0202 STS rec_tail,R24
(0168) if(rec_tail>=40)
186 3288 CPI R24,0x28
187 E0E0 LDI R30,0
188 079E CPC R25,R30
189 F02C BLT 0x018F
(0169) rec_tail=0;
18A 2422 CLR R2
18B 9230 0203 STS rec_tail+1,R3
18D 9220 0202 STS rec_tail,R2
(0170)
(0171) dswin=rec_head<<2;
18F 90A0 0200 LDS R10,rec_head
191 90B0 0201 LDS R11,rec_head+1
193 0CAA LSL R10
194 1CBB ROL R11
195 0CAA LSL R10
196 1CBB ROL R11
(0172) PORTD=dswin;
197 BAA2 OUT 0x12,R10
(0173)
(0174) if(rec_data==13)
198 9180 0210 LDS R24,rec_data
19A 9190 0211 LDS R25,rec_data+1
19C 308D CPI R24,0xD
19D E0E0 LDI R30,0
19E 079E CPC R25,R30
19F F499 BNE 0x01B3
(0175) {
(0176) transmit(13);
1A0 E00D LDI R16,0xD
1A1 DF93 RCALL _transmit
(0177) transmit(10);
1A2 E00A LDI R16,0xA
1A3 DF91 RCALL _transmit
(0178) if(cursor_index<=15)
1A4 E08F LDI R24,0xF
1A5 E090 LDI R25,0
1A6 9020 020E LDS R2,cursor_index
1A8 9030 020F LDS R3,cursor_index+1
1AA 1582 CP R24,R2
1AB 0593 CPC R25,R3
1AC F01C BLT 0x01B0
(0179) clear_line2();
1AD 940E 027E CALL _clear_line2
1AF C00A RJMP 0x01BA
(0180) else
(0181) clear_line1();
1B0 940E 026D CALL _clear_line1
(0182) }
1B2 C007 RJMP 0x01BA
(0183) else
(0184) {
(0185) transmit(rec_data);
1B3 9100 0210 LDS R16,rec_data
1B5 DF7F RCALL _transmit
(0186) wr_data2(rec_data);
1B6 9100 0210 LDS R16,rec_data
1B8 940E 021C CALL _wr_data2
1BA CFAA RJMP 0x0165
1BB 9508 RET
FILE: C:\+samples-16small\DEMOB-16sm\LCD-16sn.c
(0001) /*
(0002) Title: LCD-16sn.c
(0003) Function program used by DEMOB-16sm.c
(0004) */
(0005)
(0006) #include <iom16v.h>
(0007) #include <macros.h>
(0008) #include <stdlib.h>
(0009)
(0010) unsigned char lcd_enable = 0b00000001, lcd_disable = 0b11111110;
(0011) unsigned char in_instr_wr = 0b00000000, in_data_wr = 0b00000100;
(0012) unsigned char in_instr_rd = 0b00000010, in_data_rd = 0b00000110;
(0013)
(0014) void wr_instruction(unsigned char instr);
(0015) void wr_data(unsigned char data);
(0016)
(0017) int indexhead=0, indextail=0, indexcount;
(0018) int cursor_index=0;
(0019)
(0020)
(0021) const char message1[]= {" RS232 Demo "};
(0022) const char message2[]= {"Baudrate=38400 "};
(0023) const char message3[]= {" Happy New Year"};
(0024) const char message4[]= {" 2008 is coming"};
(0025) const char message5[]= {" Greeting From"};
(0026) const char message6[]= {"www.inovacs.com"};
(0027) const char message7[]= {"Contact Inova"};
(0028) const char message8[]= {"Tel:0592 5563570"};
(0029)
(0030) void cursor_home(void);
(0031) void cursor_line1(void);
(0032) void cursor_line2(void);
(0033) int ifr_decode(void);
(0034) unsigned char swin, swin2;
(0035)
(0036) //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(0037)
(0038) void WDT_off(void)
(0039) {
(0040) WDR();
_WDT_off:
1BC 95A8 WDR
(0041) WDTCR=0b00010111;
1BD E187 LDI R24,0x17
1BE BD81 OUT 0x21,R24
(0042) WDTCR=0b00000111;
1BF E087 LDI R24,7
1C0 BD81 OUT 0x21,R24
1C1 9508 RET
_delay:
b --> R10
a --> R20
count --> R16
1C2 940E 02E7 CALL push_xgset300C
(0043) }
(0044)
(0045) void delay(int count)
(0046) {
(0047) int a,b;
(0048) b=2*count;
1C4 0158 MOVW R10,R16
1C5 0CAA LSL R10
1C6 1CBB ROL R11
(0049) for(a=0; a<b; a++)
1C7 2744 CLR R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -