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

📄 uart.lst

📁 uart软件仿真实现
💻 LST
字号:
__start:
__text_start:
      2A E5CF      LDI	R28,0x5F
      2B E0D4      LDI	R29,4
      2C BFCD      OUT	0x3D,R28
      2D BFDE      OUT	0x3E,R29
      2E 51C0      SUBI	R28,0x10
      2F 40D0      SBCI	R29,0
      30 EA0A      LDI	R16,0xAA
      31 8308      STD	Y+0,R16
      32 2400      CLR	R0
      33 E6E0      LDI	R30,0x60
      34 E0F0      LDI	R31,0
      35 E010      LDI	R17,0
      36 36E0      CPI	R30,0x60
      37 07F1      CPC	R31,R17
      38 F011      BEQ	0x003B
      39 9201      ST	R0,Z+
      3A CFFB      RJMP	0x0036
      3B 8300      STD	Z+0,R16
      3C E5E4      LDI	R30,0x54
      3D E0F0      LDI	R31,0
      3E E6A0      LDI	R26,0x60
      3F E0B0      LDI	R27,0
      40 E010      LDI	R17,0
      41 E000      LDI	R16,0
      42 BF0B      OUT	0x3B,R16
      43 35E4      CPI	R30,0x54
      44 07F1      CPC	R31,R17
      45 F021      BEQ	0x004A
      46 95C8      LPM
      47 9631      ADIW	R30,1
      48 920D      ST	R0,X+
      49 CFF9      RJMP	0x0043
      4A 940E 008A CALL	_main
_exit:
      4C CFFF      RJMP	_exit
FILE: D:\iccavr\mega16\11\UART\uart.h
(0001) /**********串口端口定义**********/
(0002) #define RxD  PD0
(0003) #define TxD  PD1
(0004) 
(0005) #define baudrate  9600      	//波特率
(0006) #define F_CPU     8000000UL     //定义晶振频率
(0007) 
(0008) void uart_init(void)
(0009) {
(0010)   /*****RS232口线设置*****/
(0011)   PORTD|=BIT(RxD)|BIT(TxD);
_uart_init:
      4D B382      IN	R24,0x12
      4E 6083      ORI	R24,3
      4F BB82      OUT	0x12,R24
(0012)   DDRD&=~BIT(RxD);
      50 9888      CBI	0x11,0
(0013)   DDRD|=BIT(TxD);
      51 9A89      SBI	0x11,1
(0014)   
(0015)   /* 设置波特率*/
(0016)   UBRRL=(F_CPU/baudrate/16-1)%256; //本设置波特率不加倍及U2X=0
      52 E383      LDI	R24,0x33
      53 B989      OUT	0x09,R24
(0017)   UBRRH=(F_CPU/baudrate/16-1)/256;
      54 2422      CLR	R2
      55 BC20      OUT	0x20,R2
(0018)   /*U2X=1的设置波特率*/
(0019)   //UBRRL= (F_CPU/BAUDRATE/8-1)%256;
(0020)   //UBRRH= (F_CPU/BAUDRATE/8-1)/256;
(0021) 
(0022)   /* 接收器与发送器使能*/
(0023)   //UCSRB=(1<<RXEN)|(1<<TXEN);
(0024)   UCSRB|=BIT(4)|BIT(3);
      56 B18A      IN	R24,0x0A
      57 6188      ORI	R24,0x18
      58 B98A      OUT	0x0A,R24
(0025)   
(0026)   /*设置传输格式*/
(0027)   //异步,8位数据,无奇偶校验,一个停止位,无倍速
(0028)   //UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
(0029)   UCSRC|=BIT(7)|BIT(2)|BIT(1);  
      59 B580      IN	R24,0x20
      5A 6886      ORI	R24,0x86
      5B BD80      OUT	0x20,R24
      5C 9508      RET
(0030) }
(0031) 
(0032) //串口数据发送,查询方式
(0033) void putc(unsigned char c)
(0034) {
(0035)    /* 等待发送缓冲器为空 */
(0036)    while (!(UCSRA&(1<<UDRE)));
_putc:
  c                    --> R16
      5D 9B5D      SBIS	0x0B,5
      5E CFFE      RJMP	_putc
(0037)   /* 将数据放入缓冲器,发送数据 */
(0038)    UDR = c;
      5F B90C      OUT	0x0C,R16
      60 9508      RET
_puts:
  s                    --> R20
      61 934A      ST	R20,-Y
      62 935A      ST	R21,-Y
      63 01A8      MOVW	R20,R16
(0039) }
(0040) 
(0041) //串口字符串发送,查询方式
(0042) void puts(unsigned char *s)
(0043) {
      64 C005      RJMP	0x006A
(0044)   while(*s)
(0045)   {
(0046)    putc(*s);
      65 01FA      MOVW	R30,R20
      66 8100      LDD	R16,Z+0
      67 DFF5      RCALL	_putc
(0047)    s++;
      68 5F4F      SUBI	R20,0xFF
      69 4F5F      SBCI	R21,0xFF
      6A 01FA      MOVW	R30,R20
      6B 8020      LDD	R2,Z+0
      6C 2022      TST	R2
      6D F7B9      BNE	0x0065
(0048)   }
(0049)   putc('\n');
      6E E00A      LDI	R16,0xA
      6F DFED      RCALL	_putc
      70 9159      LD	R21,Y+
      71 9149      LD	R20,Y+
      72 9508      RET
(0050)   //return 1;
(0051) }
(0052) 
(0053) //串口数据接收,查询方式
(0054) unsigned char getc(void)
(0055) {
(0056)   /* 等待接收数据*/
(0057)   while (!(UCSRA&(1<<RXC)));
_getc:
      73 9B5F      SBIS	0x0B,7
      74 CFFE      RJMP	_getc
(0058)   /* 从缓冲器中获取并返回数据*/
(0059)   return UDR;
      75 B10C      IN	R16,0x0C
      76 9508      RET
_get_s:
  i                    --> R20
  num                  --> R10
  js                   --> R12
      77 940E 0090 CALL	push_xgset303C
      79 0159      MOVW	R10,R18
      7A 0168      MOVW	R12,R16
(0060) }
(0061) 
(0062) //串口接收数据存储,存储到数组中
(0063) void get_s(unsigned char *js,unsigned int num)
(0064) {
(0065)  unsigned int i; 
(0066)    for(i=0;i<num;i++)
      7B 2744      CLR	R20
      7C 2755      CLR	R21
      7D C007      RJMP	0x0085
(0067)    {
(0068) 	 js[i]=getc();		//保存数据到数组里面
      7E DFF4      RCALL	_getc
      7F 01FA      MOVW	R30,R20
      80 0DEC      ADD	R30,R12
      81 1DFD      ADC	R31,R13
      82 8300      STD	Z+0,R16
      83 5F4F      SUBI	R20,0xFF
      84 4F5F      SBCI	R21,0xFF
      85 154A      CP	R20,R10
      86 055B      CPC	R21,R11
      87 F3B0      BCS	0x007E
      88 940C 0097 JMP	pop_xgset303C
FILE: D:\iccavr\mega16\11\UART\TEST.C
(0001) //ICC-AVR application builder : 2008-11-4 12:34:31
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #include "uart.h"
(0009) 
(0010) void main(void)
(0011) {
(0012)  uart_init();
_main:
      8A DFC2      RCALL	_uart_init
      8B C002      RJMP	0x008E
(0013)  while(1)
(0014)  {
(0015)   putc(getc());
FILE: <library>
      8C DFE6      RCALL	_getc
      8D DFCF      RCALL	_putc
      8E CFFD      RJMP	0x008C
      8F 9508      RET
push_xgset303C:
      90 935A      ST	R21,-Y
      91 934A      ST	R20,-Y
      92 92DA      ST	R13,-Y
      93 92CA      ST	R12,-Y
      94 92BA      ST	R11,-Y
      95 92AA      ST	R10,-Y
      96 9508      RET
pop_xgset303C:
      97 90A9      LD	R10,Y+
      98 90B9      LD	R11,Y+
      99 90C9      LD	R12,Y+
      9A 90D9      LD	R13,Y+
      9B 9149      LD	R20,Y+
      9C 9159      LD	R21,Y+
      9D 9508      RET

⌨️ 快捷键说明

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