📄 串口通信.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 940E009A CALL _main
_exit:
004A CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\串口通信\delay.h
(0001) #define xtal 8 //8MS
(0002) /************************************************************
(0003) * 函数名称:void DelayUS(unsigned int time)
(0004) * 功 能:软件延时1.1Us
(0005) * 入口参数:time 延时时间
(0006) * 出口参数:无
(0007) ************************************************************/
(0008) void DelayUS(unsigned int time)
(0009) {
_DelayUS:
time --> R16
004B C002 RJMP 0x004E
(0010) while(time>1)
(0011) time--;
004C 5001 SUBI R16,1
004D 4010 SBCI R17,0
004E E081 LDI R24,1
004F E090 LDI R25,0
0050 1780 CP R24,R16
0051 0791 CPC R25,R17
0052 F3C8 BCS 0x004C
0053 9508 RET
_DelayMS:
i --> R20
time --> R16
0054 940E00A7 CALL push_gset1
(0012) }
(0013) /************************************************************
(0014) * 函数名称:void DelayMS(unsigned int time)
(0015) * 功 能:软件延时 1/1000s
(0016) * 入口参数:time 延时时间 MS
(0017) * 出口参数:无
(0018) ************************************************************/
(0019) void DelayMS (unsigned int time)
(0020) {
0056 C009 RJMP 0x0060
(0021) unsigned int i;
(0022) while(time--)
(0023) {
(0024) for(i=1;i<(unsigned int)(xtal*143-2);i++)
0057 E041 LDI R20,1
0058 E050 LDI R21,0
0059 C002 RJMP 0x005C
005A 5F4F SUBI R20,0xFF
005B 4F5F SBCI R21,0xFF
005C 3746 CPI R20,0x76
005D E0E4 LDI R30,4
005E 075E CPC R21,R30
005F F3D0 BCS 0x005A
0060 0118 MOVW R2,R16
0061 5001 SUBI R16,1
0062 4010 SBCI R17,0
0063 2022 TST R2
0064 F791 BNE 0x0057
0065 2033 TST R3
0066 F781 BNE 0x0057
0067 940E00AA CALL pop_gset1
0069 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\精雅系列单片机实验开发板演示程序\串口通信\串口通信.c
(0001) //内部晶振 8M
(0002) #include <ioM16v.h>
(0003) #include <macros.h>
(0004) #include"delay.h"
(0005)
(0006)
(0007)
(0008) /*------宏定义------*/
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011)
(0012)
(0013)
(0014) //端口初始化
(0015) void port_init(void)
(0016) {
(0017) PORTA = 0x00;//设置端口方向、数据
_port_init:
006A 2422 CLR R2
006B BA2B OUT 0x1B,R2
(0018) DDRA = 0x00;
006C BA2A OUT 0x1A,R2
(0019) PORTB = 0x00;
006D BA28 OUT 0x18,R2
(0020) DDRB = 0x00;
006E BA27 OUT 0x17,R2
(0021) PORTC = 0x00;
006F BA25 OUT 0x15,R2
(0022) DDRC = 0x00;
0070 BA24 OUT 0x14,R2
(0023) PORTD = 0x00;
0071 BA22 OUT 0x12,R2
(0024) DDRD = 0x03;
0072 E083 LDI R24,3
0073 BB81 OUT 0x11,R24
0074 9508 RET
(0025) }
(0026)
(0027)
(0028) //串口通信初始化
(0029) void usart_init(void)
(0030) {
(0031) UCSRB = 0x00;//禁止中断
_usart_init:
0075 2422 CLR R2
0076 B82A OUT 0x0A,R2
(0032) UCSRA = 0x00;//数据发送、接受位、数据帧错误、奇偶校验、溢出、多机模式
0077 B82B OUT 0x0B,R2
(0033) UCSRC = BIT(URSEL) | 0x06;//使用UBRRH寄存器、数据位数8位
0078 E886 LDI R24,0x86
0079 BD80 OUT 0x20,R24
(0034) UBRRL = 0x19;//设置波特率
007A E189 LDI R24,0x19
007B B989 OUT 0x09,R24
(0035) UBRRH = 0x00;
007C BC20 OUT 0x20,R2
(0036) UCSRB = 0x98;//接受中断使能、接受、发送使能、不使用第9数据位
007D E988 LDI R24,0x98
007E B98A OUT 0x0A,R24
007F 9508 RET
(0037) }
(0038) void uart_putchar(char x)
(0039) {
(0040) while (!(UCSRA&0x20))//查询发送区是否为空
_uart_putchar:
x --> R16
0080 9B5D SBIS 0x0B,5
0081 CFFE RJMP _uart_putchar
(0041) ;
(0042) UDR=x; //发送数据
0082 B90C OUT 0x0C,R16
0083 9508 RET
_usart_rx_isr:
y --> R20
0084 940E00BE CALL push_lset
0086 940E00A7 CALL push_gset1
(0043) }
(0044)
(0045) //串行接收结束中断服务程序
(0046) #pragma interrupt_handler usart_rx_isr:12
(0047) void usart_rx_isr(void)
(0048) {
(0049) char y;
(0050) y=UDR;
0088 B14C IN R20,0x0C
(0051) uart_putchar(y);//把接收到的数据返回给上位机
0089 2F04 MOV R16,R20
008A DFF5 RCALL _uart_putchar
008B 940E00AA CALL pop_gset1
008D 940E00D5 CALL pop_lset
008F 9518 RETI
(0052) }
(0053)
(0054)
(0055) void init_devices(void)
(0056) {
(0057) CLI(); //禁止所有中断
_init_devices:
0090 94F8 BCLR 7
(0058) MCUCR = 0x00;//INT0、INT1中断触发方式
0091 2422 CLR R2
0092 BE25 OUT 0x35,R2
(0059) MCUCSR = 0x80;//禁止JTAG
0093 E880 LDI R24,0x80
0094 BF84 OUT 0x34,R24
(0060) GICR = 0x00;//外部中断使能
0095 BE2B OUT 0x3B,R2
(0061) port_init();
0096 DFD3 RCALL _port_init
(0062) usart_init();
0097 DFDD RCALL _usart_init
(0063) SEI();//开全局中断
0098 9478 BSET 7
0099 9508 RET
(0064) }
(0065) //主函数
(0066) void main(void)
(0067) {
(0068) init_devices();
_main:
009A DFF5 RCALL _init_devices
009B C001 RJMP 0x009D
(0069) //在这继续添加你的代码
(0070) while(1)
(0071) {
(0072) NOP();
FILE: <library>
009C 0000 NOP
009D CFFE RJMP 0x009C
009E 9508 RET
push_gset5:
009F 92FA ST R15,-Y
00A0 92EA ST R14,-Y
push_gset4:
00A1 92DA ST R13,-Y
00A2 92CA ST R12,-Y
push_gset3:
00A3 92BA ST R11,-Y
00A4 92AA ST R10,-Y
push_gset2:
00A5 937A ST R23,-Y
00A6 936A ST R22,-Y
push_gset1:
00A7 935A ST R21,-Y
00A8 934A ST R20,-Y
00A9 9508 RET
pop_gset1:
00AA E0E1 LDI R30,1
pop:
00AB 9149 LD R20,Y+
00AC 9159 LD R21,Y+
00AD FDE0 SBRC R30,0
00AE 9508 RET
00AF 9169 LD R22,Y+
00B0 9179 LD R23,Y+
00B1 FDE1 SBRC R30,1
00B2 9508 RET
00B3 90A9 LD R10,Y+
00B4 90B9 LD R11,Y+
00B5 FDE2 SBRC R30,2
00B6 9508 RET
00B7 90C9 LD R12,Y+
00B8 90D9 LD R13,Y+
00B9 FDE3 SBRC R30,3
00BA 9508 RET
00BB 90E9 LD R14,Y+
00BC 90F9 LD R15,Y+
00BD 9508 RET
push_lset:
00BE 93FA ST R31,-Y
00BF 93EA ST R30,-Y
00C0 93BA ST R27,-Y
00C1 93AA ST R26,-Y
00C2 939A ST R25,-Y
00C3 938A ST R24,-Y
00C4 933A ST R19,-Y
00C5 932A ST R18,-Y
00C6 931A ST R17,-Y
00C7 930A ST R16,-Y
00C8 929A ST R9,-Y
00C9 928A ST R8,-Y
00CA 927A ST R7,-Y
00CB 926A ST R6,-Y
00CC 925A ST R5,-Y
00CD 924A ST R4,-Y
00CE 923A ST R3,-Y
00CF 922A ST R2,-Y
00D0 921A ST R1,-Y
00D1 920A ST R0,-Y
00D2 B60F IN R0,0x3F
00D3 920A ST R0,-Y
00D4 9508 RET
pop_lset:
00D5 9009 LD R0,Y+
00D6 BE0F OUT 0x3F,R0
00D7 9009 LD R0,Y+
00D8 9019 LD R1,Y+
00D9 9029 LD R2,Y+
00DA 9039 LD R3,Y+
00DB 9049 LD R4,Y+
00DC 9059 LD R5,Y+
00DD 9069 LD R6,Y+
00DE 9079 LD R7,Y+
00DF 9089 LD R8,Y+
00E0 9099 LD R9,Y+
00E1 9109 LD R16,Y+
00E2 9119 LD R17,Y+
00E3 9129 LD R18,Y+
00E4 9139 LD R19,Y+
00E5 9189 LD R24,Y+
00E6 9199 LD R25,Y+
00E7 91A9 LD R26,Y+
00E8 91B9 LD R27,Y+
00E9 91E9 LD R30,Y+
00EA 91F9 LD R31,Y+
00EB 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -