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

📄 demob-16sm.lst

📁 大量ATMEGA16实例, 都可以运行,包括驱动LCD1602, 上位机显示等多功能
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -