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

📄 uart.s

📁 详细介绍M8两版间通讯
💻 S
字号:
	.module Uart.c
	.area text(rom, con, rel)
	.dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
	.dbfunc e getchar _getchar fc
	.even
_getchar::
	.dbline -1
	.dbline 19
L2:
	.dbline 19
L3:
	.dbline 19
; /*
; 串口通信模块,使用之前,应该在Main 函数中对串口进行初始化,
; 串口数据接收方式采用中断进行
; */
; #include <iom8v.h>
; #include <macros.h>
; #define fosc 8000000 //晶振8MHZ
; #define baud 19200	 //波特率
; extern void adc_init(void);
; extern unsigned int adc_rel;//AD转换结果
; extern unsigned char adc_mux;//AD通道,默认为0通道
; extern unsigned char InterruptFlag;
; 
; extern unsigned char ExtendRomAddr,ExtendRomVal;//定义片外EEPROM
; extern unsigned char ExtendRomRW;
; 
; unsigned int eeprom_addr;
; unsigned char eeprom_val;
; unsigned char getchar(void) {while(!(UCSRA& (1<<RXC)));return UDR;}
	sbis 0xb,7
	rjmp L2
	.dbline 19
	in R16,0xc
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e putchar _putchar fV
;              c -> R16
	.even
_putchar::
	.dbline -1
	.dbline 22
; /*字符输出函数*/
; void putchar(unsigned char c)
;  {
L6:
	.dbline 23
L7:
	.dbline 23
; 	while (!(UCSRA&(1<<UDRE)));
	sbis 0xb,5
	rjmp L6
	.dbline 24
; 	UDR=c;
	out 0xc,R16
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbsym r c 16 c
	.dbend
	.dbfunc e puts _puts fV
;              s -> R20,R21
	.even
_puts::
	rcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 29
;  }
; 
; /*字符串输出函数*/
; void puts(char *s)
;  {
	rjmp L11
L10:
	.dbline 31
	.dbline 32
	movw R30,R20
	ldd R16,z+0
	rcall _putchar
	.dbline 33
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 34
L11:
	.dbline 30
; 	while (*s)
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L10
	.dbline 35
; 	 {
; 		putchar(*s);
; 		s++;
; 	 }
; 	putchar(13);
	ldi R16,13
	rcall _putchar
	.dbline 36
; 	putchar(10);
	ldi R16,10
	rcall _putchar
	.dbline -2
L9:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r s 20 pc
	.dbend
	.dbfunc e uart_init _uart_init fV
	.even
_uart_init::
	.dbline -1
	.dbline 40
;  }
; 
; void uart_init(void)
;  {
	.dbline 42
; 	//OSCCAL=0xA1;//在主程序中设置
; 	UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
	ldi R24,152
	out 0xa,R24
	.dbline 44
; 	//允许接收中断、发送和接收
; 	  UBRRL=(fosc/16/baud-1)%256;
	ldi R24,25
	out 0x9,R24
	.dbline 45
; 	  UBRRH=((fosc/16/baud-1)/256)&0b01111111;
	clr R2
	out 0x20,R2
	.dbline 46
; 	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
	ldi R24,134
	out 0x20,R24
	.dbline -2
L13:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 22
	rjmp _UartGet
	.area text(rom, con, rel)
	.dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
	.area data(ram, con, rel)
	.dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
L15:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
	.area text(rom, con, rel)
	.dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
	.dbfunc e UartGet _UartGet fV
	.dbsym s LED_state L15 c
;        channel -> R14
;            val -> R20,R21
;              i -> R22
;           temp -> R10,R11
;      charInput -> R12
	.even
_UartGet::
	rcall push_lset
	rcall push_gset5
	.dbline -1
	.dbline 52
; 	//8位数据+1位STOP位
;  }
; 
; #pragma interrupt_handler UartGet:12
; void UartGet(void)//使用中断方式接收UART的输入字符
;  {
	.dbline 53
; 	unsigned char charInput,channel='0',i;
	ldi R24,48
	mov R14,R24
	.dbline 54
; 	unsigned int val=0,temp=1000;
	clr R20
	clr R21
	.dbline 54
	ldi R24,1000
	ldi R25,3
	movw R10,R24
	.dbline 56
; 	static unsigned char LED_state=0;
; 	charInput=UDR;
	in R12,0xc
	.dbline 57
; 	switch (charInput)
	mov R22,R12
	clr R23
	cpi R22,87
	ldi R30,0
	cpc R23,R30
	brne X1
	rjmp L41
X1:
	ldi R24,87
	ldi R25,0
	cp R24,R22
	cpc R25,R23
	brlt L60
L59:
	cpi R22,77
	ldi R30,0
	cpc R23,R30
	brne X2
	rjmp L30
X2:
	cpi R22,79
	ldi R30,0
	cpc R23,R30
	breq L19
	cpi R22,82
	ldi R30,0
	cpc R23,R30
	brne X3
	rjmp L31
X3:
	rjmp L16
L60:
	cpi R22,114
	ldi R30,0
	cpc R23,R30
	brne X4
	rjmp L36
X4:
	cpi R22,114
	ldi R30,0
	cpc R23,R30
	brge X5
	rjmp L16
X5:
L61:
	cpi R22,119
	ldi R30,0
	cpc R23,R30
	brne X6
	rjmp L50
X6:
	rjmp L16
X0:
	.dbline 58
; 	 {
L19:
	.dbline 60
; 		case 'O'://调节输出电压'O'
; 		 {
	.dbline 61
; 			channel=getchar();
	rcall _getchar
	mov R14,R16
	.dbline 62
; 			charInput=getchar();//无用的前导空格字符
	rcall _getchar
	mov R12,R16
	.dbline 63
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
	clr R22
	rjmp L23
L20:
	.dbline 64
	.dbline 65
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 66
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 67
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 68
L21:
	.dbline 63
	inc R22
L23:
	.dbline 63
	cpi R22,4
	brlo L20
	.dbline 69
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			if (val>0xfff) val=0xfff;
	ldi R24,4095
	ldi R25,15
	cp R24,R20
	cpc R25,R21
	brsh L24
	.dbline 69
	ldi R20,4095
	ldi R21,15
L24:
	.dbline 70
; 			if (channel=='0') OCR1A=val;
	mov R24,R14
	cpi R24,48
	brne L26
	.dbline 70
	out 0x2b,R21
	out 0x2a,R20
	rjmp L17
L26:
	.dbline 71
; 			else if (channel=='1') OCR1B=val;
	mov R24,R14
	cpi R24,49
	breq X7
	rjmp L17
X7:
	.dbline 71
	out 0x29,R21
	out 0x28,R20
	.dbline 72
; 			break;
	rjmp L17
L30:
	.dbline 75
; 		 }
; 		case 'M'://读取ADC通道及ADC转换结果
; 		 {
	.dbline 76
; 			channel=getchar();
	rcall _getchar
	mov R14,R16
	.dbline 77
; 			adc_mux=channel-48;//将ASCII码转换为数字
	mov R24,R14
	subi R24,48
	sts _adc_mux,R24
	.dbline 78
; 			TCNT0=0x10;//防止串口接受信息时,Timer0中断即将发生。
	ldi R24,16
	out 0x32,R24
	.dbline 79
; 			InterruptFlag|=0b00000001;//通知Timer0中断程序,需要发送测试数据
	lds R24,_InterruptFlag
	ori R24,1
	sts _InterruptFlag,R24
	.dbline 80
; 			break;
	rjmp L17
L31:
	.dbline 84
; 		 }
; 
; 		case 'R'://读取片内EEPROM
; 		 {
	.dbline 85
; 			charInput=getchar();//无用的前导空格字符
	rcall _getchar
	mov R12,R16
	.dbline 86
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
	clr R22
	rjmp L35
L32:
	.dbline 87
	.dbline 88
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 89
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 90
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 91
L33:
	.dbline 86
	inc R22
L35:
	.dbline 86
	cpi R22,4
	brlo L32
	.dbline 92
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			eeprom_addr=val;
	sts _eeprom_addr+1,R21
	sts _eeprom_addr,R20
	.dbline 93
; 			InterruptFlag|=0b00000010;//通知Timer0中断程序,需要发送数据
	lds R24,_InterruptFlag
	ori R24,2
	sts _InterruptFlag,R24
	.dbline 94
; 			break;
	rjmp L17
L36:
	.dbline 98
; 		 }
; 
; 		case 'r'://读取AT2402(或者另外一块模拟AT2402的8Mega2#)EEPROM
; 		 {
	.dbline 99
; 			charInput=getchar();//无用的前导空格字符
	rcall _getchar
	mov R12,R16
	.dbline 100
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
	clr R22
	rjmp L40
L37:
	.dbline 101
	.dbline 102
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 103
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 104
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 105
L38:
	.dbline 100
	inc R22
L40:
	.dbline 100
	cpi R22,4
	brlo L37
	.dbline 106
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			ExtendRomAddr=val;
	sts _ExtendRomAddr,R20
	.dbline 107
; 			ExtendRomRW|=0b00000010;//通知Main程序,需要发送At2402(或者Mega8 2#)EEPROM数据
	lds R24,_ExtendRomRW
	ori R24,2
	sts _ExtendRomRW,R24
	.dbline 108
; 			break;
	rjmp L17
L41:
	.dbline 112
; 		 }
; 
; 		case 'W'://写入片内EEPROM
; 		 {
	.dbline 113
; 			charInput=getchar();//无效的空格字符
	rcall _getchar
	mov R12,R16
	.dbline 114
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(integer地址)
	clr R22
	rjmp L45
L42:
	.dbline 115
	.dbline 116
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 117
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 118
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 119
L43:
	.dbline 114
	inc R22
L45:
	.dbline 114
	cpi R22,4
	brlo L42
	.dbline 120
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			eeprom_addr=val;
	sts _eeprom_addr+1,R21
	sts _eeprom_addr,R20
	.dbline 122
; 
; 			charInput=getchar();//无用的前导空格字符
	rcall _getchar
	mov R12,R16
	.dbline 123
; 			val=0;//复位
	clr R20
	clr R21
	.dbline 124
; 			temp=1000;//复位
	ldi R24,1000
	ldi R25,3
	movw R10,R24
	.dbline 125
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(需转换为char数据)
	clr R22
	rjmp L49
L46:
	.dbline 126
	.dbline 127
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 128
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 129
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 130
L47:
	.dbline 125
	inc R22
L49:
	.dbline 125
	cpi R22,4
	brlo L46
	.dbline 131
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			eeprom_val=(unsigned char)val;
	sts _eeprom_val,R20
	.dbline 132
; 			InterruptFlag|=0b00000100;//通知Timer0中断程序,需要写入数据
	lds R24,_InterruptFlag
	ori R24,4
	sts _InterruptFlag,R24
	.dbline 133
; 			break;
	rjmp L17
L50:
	.dbline 137
; 		 }
; 
; 		case 'w'://写入AT2402(或者另外一块模拟AT2402的8Mega2#)珽EPROM
; 		 {
	.dbline 138
; 			charInput=getchar();//无效的空格字符
	rcall _getchar
	mov R12,R16
	.dbline 139
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(integer地址)
	clr R22
	rjmp L54
L51:
	.dbline 140
	.dbline 141
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 142
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 143
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 144
L52:
	.dbline 139
	inc R22
L54:
	.dbline 139
	cpi R22,4
	brlo L51
	.dbline 145
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			ExtendRomAddr=val;
	sts _ExtendRomAddr,R20
	.dbline 147
; 
; 			charInput=getchar();//无用的前导空格字符
	rcall _getchar
	mov R12,R16
	.dbline 148
; 			val=0;//复位
	clr R20
	clr R21
	.dbline 149
; 			temp=1000;//复位
	ldi R24,1000
	ldi R25,3
	movw R10,R24
	.dbline 150
; 			for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer(需转换为char数据)
	clr R22
	rjmp L58
L55:
	.dbline 151
	.dbline 152
	rcall _getchar
	mov R24,R16
	subi R24,48
	mov R12,R24
	.dbline 153
	mov R16,R24
	clr R17
	movw R18,R10
	rcall empy16s
	add R20,R16
	adc R21,R17
	.dbline 154
	ldi R18,10
	ldi R19,0
	movw R16,R10
	rcall div16u
	movw R10,R16
	.dbline 155
L56:
	.dbline 150
	inc R22
L58:
	.dbline 150
	cpi R22,4
	brlo L55
	.dbline 156
; 			 {
; 				charInput=getchar()-48;
; 				val+=charInput*temp;
; 				temp/=10;
; 			 }
; 			ExtendRomVal=(unsigned char)val;
	sts _ExtendRomVal,R20
	.dbline 157
; 			ExtendRomRW|=0b00000100;//通知Main程序,需要写入At2402(或者Mega8 2#)EEPROM数据
	lds R24,_ExtendRomRW
	ori R24,4
	sts _ExtendRomRW,R24
	.dbline 158
; 			break;
L16:
	.dbline 163
	.dbline 165
	.dbline 166
L17:
	.dbline -2
L14:
	rcall pop_gset5
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r channel 14 c
	.dbsym r val 20 i
	.dbsym r i 22 c
	.dbsym r temp 10 i
	.dbsym r charInput 12 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
_eeprom_val::
	.blkb 1
	.dbsym e eeprom_val _eeprom_val c
_eeprom_addr::
	.blkb 2
	.dbsym e eeprom_addr _eeprom_addr i

⌨️ 快捷键说明

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