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

📄 uart.s

📁 用AVR单片机做的一些程序,包括跑马灯显示,PWM产生,ADC转换等
💻 S
字号:
	.module uart.c
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\011-UART-485\uart.c
	.dbfunc e uart_init0 _uart_init0 fV
	.even
_uart_init0::
	.dbline -1
	.dbline 13
; /*
; RS485网络驱动函数。
; 
; 	RS485网络和普通的RS232网络从程序上来讲,维一的区别是就是有方向控制。
; 	数据发送时芯片需要工作在输出方式,这样数据才能被有效发出。
; 	不发送数据时一定要把RS485芯片设置为输入状态,否则会影响网络上其它设备。
; */
; 
; #include "iom128v.h"
; #include <macros.h>
; 
; /*串口初始化函数*/
; void uart_init0(void) {
	.dbline 15
; 
; 	UCSR0A = (1 << U2X0);								/*倍速*/
	ldi R24,2
	out 0xb,R24
	.dbline 16
; 	UCSR0B = (1 << TXEN0) | (1 << RXEN0);				/*允许接收和发送*/
	ldi R24,24
	out 0xa,R24
	.dbline 17
; 	UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);				/*8位数据、1 位停止、异步、无校验*/
	ldi R24,6
	sts 149,R24
	.dbline 18
; 	UBRR0H = 0x00;
	clr R2
	sts 144,R2
	.dbline 19
; 	UBRR0L = 12;										/*波特率9600*/
	ldi R24,12
	out 0x9,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart_transmit0 _uart_transmit0 fV
;              i -> R16
	.even
_uart_transmit0::
	.dbline -1
	.dbline 23
; }
; 
; /*数据发送,查询方式*/
; void uart_transmit0(unsigned char i) {
	.dbline 25
; 
; 	PORTG |= (1 << PG3);								/*设置RS485为输出状态*/
	lds R24,101
	ori R24,8
	sts 101,R24
	.dbline 26
; 	UDR0 = i;											/*发送数据*/
	out 0xc,R16
L3:
	.dbline 27
L4:
	.dbline 27
; 	while (!(UCSR0A & (1<<TXC0)));						/*等待发送完成*/
	sbis 0xb,6
	rjmp L3
	.dbline 28
; 	UCSR0A |= (1 << TXC0);								/*清除发送标志*/
	sbi 0xb,6
	.dbline 29
; 	PORTG &= ~(1 << PG3);								/*设置RS485为输入状态*/
	lds R24,101
	andi R24,247
	sts 101,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e uart_receive0 _uart_receive0 fc
	.even
_uart_receive0::
	.dbline -1
	.dbline 33
; }
; 
; /*数据接收,等待查询方式*/
; unsigned char uart_receive0(void) {
L7:
	.dbline 35
L8:
	.dbline 35
; 
; 	while (!(UCSR0A & (1<<RXC0)));						/* 等待接收数据*/
	sbis 0xb,7
	rjmp L7
	.dbline 36
; 	return UDR0;										/* 获取并返回数据*/
	in R16,0xc
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart_init1 _uart_init1 fV
	.even
_uart_init1::
	.dbline -1
	.dbline 40
; }
; 
; /*串口初始化函数*/
; void uart_init1(void) {
	.dbline 42
; 
; 	UCSR1A = (1 << U2X1);								/*倍速*/
	ldi R24,2
	sts 155,R24
	.dbline 43
; 	UCSR1B = (1 << TXEN1) | (1 << RXEN1);				/*允许接收和发送*/
	ldi R24,24
	sts 154,R24
	.dbline 44
; 	UCSR1C = (1 << UCSZ11) | (1 << UCSZ10);				/*8位数据、1 位停止、异步、无校验*/
	ldi R24,6
	sts 157,R24
	.dbline 45
; 	UBRR1H = 0x00;
	clr R2
	sts 152,R2
	.dbline 46
; 	UBRR1L = 12;										/*波特率9600*/
	ldi R24,12
	sts 153,R24
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart_transmit1 _uart_transmit1 fV
;              i -> R16
	.even
_uart_transmit1::
	.dbline -1
	.dbline 50
; }
; 
; /*数据发送,查询方式*/
; void uart_transmit1(unsigned char i) {
	.dbline 52
; 
; 	PORTG |= (1 << PG4);								/*设置RS485为输出状态*/
	lds R24,101
	ori R24,16
	sts 101,R24
	.dbline 53
; 	UDR1 = i;											/* 发送数据*/
	sts 156,R16
L12:
	.dbline 54
L13:
	.dbline 54
; 	while (!(UCSR1A & (1<<TXC1)));						/* 等待发送完成*/
	lds R2,155
	sbrs R2,6
	rjmp L12
	.dbline 55
; 	UCSR1A |= (1 << TXC1);								/*清除发送标志*/
	lds R24,155
	ori R24,64
	sts 155,R24
	.dbline 56
; 	PORTG &= ~(1 << PG4);								/*设置RS485为输入状态*/
	lds R24,101
	andi R24,239
	sts 101,R24
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e uart_receive1 _uart_receive1 fi
	.even
_uart_receive1::
	.dbline -1
	.dbline 60
; }
; 
; /*数据接收,周期查询方式*/
; unsigned int uart_receive1(void) {
	.dbline 62
; 
; 	if ((UCSR1A & (1<<RXC1)) != 0) {					/* 判断接收是否完成*/
	lds R2,155
	sbrs R2,7
	rjmp L16
	.dbline 62
	.dbline 63
; 		return (UDR1 | 0x0100);							/* 返回数据和标志*/
	lds R16,156
	clr R17
	ori R17,1
	xjmp L15
L16:
	.dbline 65
; 		}
; 	else {
	.dbline 66
; 		return 0;										/*返回无效标志*/
	clr R16
	clr R17
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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