📄 uart.lst
字号:
__start:
__text_start:
0001 E5CF LDI R28,0x5F
0002 E0D2 LDI R29,2
0003 BFCD OUT 0x3D,R28
0004 BFDE OUT 0x3E,R29
0005 51C0 SUBI R28,0x10
0006 40D0 SBCI R29,0
0007 EA0A LDI R16,0xAA
0008 8308 STD Y+0,R16
0009 C05B RJMP _timer0_ovf_isr
000A E6E1 LDI R30,0x61
000B E0F0 LDI R31,0
000C E010 LDI R17,0
000D 37E6 CPI R30,0x76
000E C07E RJMP _adc_isr
000F F011 BEQ 0x0012
0010 9201 ST R0,Z+
0011 CFFB RJMP 0x000D
0012 8300 STD Z+0,R16
0013 E0E0 LDI R30,0
0014 E0F0 LDI R31,0
0015 E6A0 LDI R26,0x60
0016 E0B0 LDI R27,0
0017 E010 LDI R17,0
0018 30E1 CPI R30,1
0019 07F1 CPC R31,R17
001A F021 BEQ 0x001F
001B 95C8 LPM
001C 9631 ADIW R30,1
001D 920D ST R0,X+
001E CFF9 RJMP 0x0018
001F D0B1 RCALL _main
_exit:
0020 CFFF RJMP _exit
FILE: C:\DOCUME~1\alf\桌面\新建文件夹\usart.c
(0001) // Target : 8535
(0002) // Crystal: 8.0000Mhz
(0003)
(0004) #include <iom8535v.h>///?????????????????????????
(0005) #include <macros.h>
(0006) #include <stdio.h>
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009)
(0010) #define BN 8 // 传送一次的字节数
(0011) #define SLAVE 0xf1 //?????????单片机地址
(0012)
(0013) uchar rdata[9];
(0014) uchar tdata[9];
(0015) uchar addata;
(0016) uchar receive(uchar addrs);
(0017) uchar send();
(0018) uchar j=3;
(0019) char cData[2];//SPI发送数据
(0020) //char b[2];//接受从机来的数据
(0021)
(0022)
(0023)
(0024) //延时函数
(0025) void delay_1ms(void)
(0026) {
(0027) uint i;
(0028) for(i=1;i<(uint)(8*143-2);i++)
_delay_1ms:
i --> R16
0021 E001 LDI R16,1
0022 E010 LDI R17,0
0023 C002 RJMP 0x0026
0024 5F0F SUBI R16,0xFF
0025 4F1F SBCI R17,0xFF
0026 3706 CPI R16,0x76
0027 E0E4 LDI R30,4
0028 071E CPC R17,R30
0029 F3D0 BCS 0x0024
(0029) ;
(0030) }//XTAL为晶振频率,单位为MHZ,,,,,,本例用4Mhz
002A 9508 RET
_delay1:
i --> R20
n --> R22
002B D208 RCALL push_gset2
002C 2F60 MOV R22,R16
002D 2F71 MOV R23,R17
(0031)
(0032) //获得1ms延时
(0033) void delay1(uint n)
(0034) {
(0035) uint i=0;
002E 2744 CLR R20
002F 2755 CLR R21
0030 C003 RJMP 0x0034
(0036) while(i<n)
(0037) {
(0038) delay_1ms();
0031 DFEF RCALL _delay_1ms
(0039) i++;
0032 5F4F SUBI R20,0xFF
0033 4F5F SBCI R21,0xFF
0034 1746 CP R20,R22
0035 0757 CPC R21,R23
0036 F3D0 BCS 0x0031
(0040) }
(0041) }
0037 D1E3 RCALL pop_gset2
0038 9508 RET
_EnableInterrupt:
whichInterrupt --> R16
0039 D1E3 RCALL push_gset1
(0042)
(0043)
(0044)
(0045) //中断使能
(0046) void EnableInterrupt(uchar whichInterrupt)
(0047) {
(0048) switch(whichInterrupt)
003A 2F40 MOV R20,R16
003B 2755 CLR R21
003C 3040 CPI R20,0
003D 0745 CPC R20,R21
003E F049 BEQ 0x0048
003F 3040 CPI R20,0
0040 E0E0 LDI R30,0
0041 075E CPC R21,R30
0042 F054 BLT 0x004D
0043 304A CPI R20,0xA
0044 E0E0 LDI R30,0
0045 075E CPC R21,R30
0046 F019 BEQ 0x004A
0047 C005 RJMP 0x004D
(0049) {
(0050) case 0://全局中断
(0051) asm("SEI");
0048 9478 BSET 7
(0052) break;
0049 C003 RJMP 0x004D
(0053) case iv_TIMER0_OVF://T/C0溢出中断
(0054) TIMSK |= BIT(TOIE0);
004A B789 IN R24,0x39
004B 6081 ORI R24,1
004C BF89 OUT 0x39,R24
(0055) break;
(0056) }
(0057) }
004D D1D2 RCALL pop_gset1
004E 9508 RET
_DisableInterrupt:
whichInterrupt --> R16
004F D1CD RCALL push_gset1
(0058) //中断未使能
(0059) void DisableInterrupt(uchar whichInterrupt)
(0060) {
(0061) switch(whichInterrupt)
0050 2F40 MOV R20,R16
0051 2755 CLR R21
0052 3040 CPI R20,0
0053 0745 CPC R20,R21
0054 F049 BEQ 0x005E
0055 3040 CPI R20,0
0056 E0E0 LDI R30,0
0057 075E CPC R21,R30
0058 F054 BLT 0x0063
0059 304A CPI R20,0xA
005A E0E0 LDI R30,0
005B 075E CPC R21,R30
005C F019 BEQ 0x0060
005D C005 RJMP 0x0063
(0062) {
(0063) case 0://全局中断
(0064) asm("CLI");
005E 94F8 BCLR 7
(0065) break;
005F C003 RJMP 0x0063
(0066) case iv_TIMER0_OVF://T/C0溢出中断
(0067) TIMSK &= ~BIT(TOIE0);
0060 B789 IN R24,0x39
0061 7F8E ANDI R24,0xFE
0062 BF89 OUT 0x39,R24
(0068) break;
(0069) }
(0070) }
0063 D1BC RCALL pop_gset1
0064 9508 RET
_timer0_ovf_isr:
0065 938A ST R24,-Y
0066 B78F IN R24,0x3F
0067 938A ST R24,-Y
(0071)
(0072) //定时器/计数器溢出中断
(0073) #pragma interrupt_handler timer0_ovf_isr:10
(0074) void timer0_ovf_isr(void)
(0075) {
(0076) TCNT0 = 0x83; //reload counter value
0068 E883 LDI R24,0x83
0069 BF82 OUT 0x32,R24
(0077) }
006A 9189 LD R24,Y+
006B BF8F OUT 0x3F,R24
006C 9189 LD R24,Y+
006D 9518 RETI
(0078)
(0079)
(0080)
(0081) ////********************USART异步串口通讯部分******************************////
(0082) // USART initialisation
(0083) /*
(0084) //void USART_Init(void)
(0085) void uart0_init(uint baud)
(0086) {
(0087)
(0088) UBRRH = (unsigned char)(baud>>8);
(0089) UBRRL = (unsigned char)baud;
(0090)
(0091) //设置帧格式: 8 个数据位, 1 个停止位
(0092) UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //选择默认的无奇偶校验位
(0093)
(0094) // 接收器与发送器使能
(0095) UCSRB = (1<<RXEN)|(1<<TXEN);
(0096)
(0097) }
(0098) */
(0099)
(0100) void USART_Init(void)
(0101) {
(0102) //波特率设置
(0103) // desired baud rate: 19200
(0104) // actual: baud rate:19231 (0.2%)
(0105) //UCR = 0x00; //disable while setting baud rate
(0106) UBRR = 0x19; //set baud rate 19200,溢出时间为2.1s
_USART_Init:
006E E189 LDI R24,0x19
006F B989 OUT 0x09,R24
(0107) // UCR = 0xFC; //enable
(0108)
(0109) //设置帧格式: 8 个数据位, 1 个停止位
(0110) UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //选择默认的无奇偶校验位
0070 E886 LDI R24,0x86
0071 BD80 OUT 0x20,R24
(0111) /* UBRRH = (unsigned char)(baud>>8);UBRRL = (unsigned char)baud;*/
(0112) // ???UCSRC = (1<<URSEL)|(3<<UCSZ0); //UCSZ2-0; UCSZ1-1; UCSZ0-1时字符为8位,,USBS为0时停止位为1,,UPM1-1;UPM0-0为偶校验 ,UPM1-1;UPM0-1为奇校验
(0113) // 设置帧格式: 8 个数据位, 2 个停止位*/
(0114) //UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
(0115)
(0116) /* 接收器与发送器使能*/
(0117) UCSRB = (1<<RXEN)|(1<<TXEN);
0072 E188 LDI R24,0x18
0073 B98A OUT 0x0A,R24
(0118)
(0119) }
0074 9508 RET
(0120)
(0121)
(0122) //串口发送数据查询方式
(0123) void USART_Transmit(uchar x)
(0124) {
(0125)
(0126) //等待数据寄存器空
(0127) while(!( UCSRA & (1<<UDRE)))
_USART_Transmit:
x --> R16
0075 9B5D SBIS 0x0B,5
0076 CFFE RJMP _USART_Transmit
(0128) ;
(0129)
(0130) UDR=x;
0077 B90C OUT 0x0C,R16
(0131)
(0132) PORTB|=0x08;//PB4输出高电平,驱动LED灯,打开绿色灯
0078 9AC3 SBI 0x18,3
(0133)
(0134) }
0079 9508 RET
(0135)
(0136) //串口查询方式接受数据
(0137) uchar USART_Receive( void )
(0138) {
(0139) /* 等待接收数据*/
(0140) while ( !(UCSRA&(1<<RXC)) )
_USART_Receive:
007A 9B5F SBIS 0x0B,7
007B CFFE RJMP _USART_Receive
(0141) ;
(0142) /* 从缓冲器中获取并返回数据*/
(0143) return UDR;
007C B10C IN R16,0x0C
007D 9508 RET
(0144) }
(0145)
(0146)
(0147) /////***********************通过SPI接口与从机通信**********************************////
(0148)
(0149) //SPI 主机模式
(0150) void SPI_MasterInit(void)
(0151) {
(0152) /* 设置MOSI 和SCK 为输出,其他为输入 */
(0153) DDRB= (1<<DDB5)|(1<<DDB7)|(1<<DDB4);//SS,sck,mosi为输出
_SPI_MasterInit:
007E EB80 LDI R24,0xB0
007F BB87 OUT 0x17,R24
(0154) /* 使能SPI 主机模式,设置时钟速率为fck/16 */
(0155) SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
0080 E581 LDI R24,0x51
0081 B98D OUT 0x0D,R24
(0156)
(0157) // clock rate: 2Mhz //SPI设置
(0158) // SPCR = 0xF4; //setup SPI
(0159) }
0082 9508 RET
(0160)
(0161) //SPI发送数据给从机
(0162) void SPI_MasterTransmit(char cData )
(0163) {
(0164) //启动数据传输
(0165) // b[i]=SPDR;//接受从机来的数据
(0166) SPDR = cData;
_SPI_MasterTransmit:
cData --> R16
0083 B90F OUT 0x0F,R16
(0167)
(0168) /*
(0169) PORTB|=0x08;//PB4输出高电平,驱动LED灯,打开绿色灯
(0170) delay1(100);//延时500ms
(0171) PORTB&=0x08;//关闭绿灯
(0172) */
(0173)
(0174) // 等待传输结束
(0175) while(!(SPSR & (1<<SPIF)))
0084 9B77 SBIS 0x0E,7
0085 CFFE RJMP 0x0084
(0176) ;
(0177) }
0086 9508 RET
(0178)
(0179) /////****************************ADC转换********************************////
(0180)
(0181) //ADC initialisation
(0182) // Conversion time: 6uS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -