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

📄 uart.s

📁 详细介绍M8两版间通讯
💻 S
字号:
	.module Uart.c
	.area vector(rom, abs)
	.org 22
	rjmp _UartGet
	.area data(ram, con, rel)
_charInput::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile G:\Mega8程序\测试MegaOSCCAL\Uart.c
	.dbsym e charInput _charInput c
L2:
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile G:\Mega8程序\测试MegaOSCCAL\Uart.c
	.area text(rom, con, rel)
	.dbfile G:\Mega8程序\测试MegaOSCCAL\Uart.c
	.dbfunc e UartGet _UartGet fV
	.dbsym s cAddr L2 c
	.even
_UartGet::
	rcall push_lset
	.dbline -1
	.dbline 17
	.dbline 19
	in R2,0xc
	sts _charInput,R2
	.dbline 20
	mov R24,R2
	cpi R24,99
	brne L3
	.dbline 21
	.dbline 22
	lds R24,L2
	subi R24,255    ; addi 1
	sts L2,R24
	.dbline 23
	in R18,0x31
	mov R16,R24
	clr R17
	rcall _rom_write
	.dbline 24
L3:
	.dbline -2
L1:
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e putchar _putchar fV
;              c -> R16
	.even
_putchar::
	.dbline -1
	.dbline 28
L6:
	.dbline 28
L7:
	.dbline 28
; /*串口通信模块,使用之前,应该在Main 函数中对串口进行初始化,
; 串口数据接收方式采用中断进行,振荡频率修正参数不在EEPROM的
; 0x1ff0中,使用PonyProg可以测试得OSCCAL=0xA1*/
; #include <iom8v.h>
; #include <macros.h>
; 
; extern void rom_write(unsigned int Address,unsigned char Data);
; extern unsigned rom_read(unsigned int Address);
; 
; #define fosc 8000000 //晶振8MHZ
; #define baud 19200	 //波特率
; //使用中断方式接收UART的输入字符
; #pragma interrupt_handler UartGet:12
; 
; unsigned char charInput=0x00;
; void UartGet(void)
;  {
;  	static char cAddr=0;
;  	charInput=UDR;
;  	if(charInput=='c')
;  	 {
;  		cAddr++;
;  		rom_write(cAddr,OSCCAL);
;  	 }
;  }
; 	 
; void putchar(unsigned char c)/*  		字符输出函数 		 */
; 	 {while (!(UCSRA&(1<<UDRE)));
	sbis 0xb,5
	rjmp L6
	.dbline 29
; 	  UDR=c;}	
	out 0xc,R16
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbsym r c 16 c
	.dbend
	.dbfunc e getchar _getchar fc
	.even
_getchar::
	.dbline -1
	.dbline 31
; unsigned char getchar(void)/*  	字符输入函数-查询方式 */
;   	{
L10:
	.dbline 32
L11:
	.dbline 32
; 	 while(!(UCSRA& (1<<RXC)));
	sbis 0xb,7
	rjmp L10
	.dbline 33
;      return UDR;
	in R16,0xc
	.dbline -2
L9:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e puts _puts fI
;              s -> R20,R21
	.even
_puts::
	rcall push_gset1
	movw R20,R16
	.dbline -1
	.dbline 37
; 	}
; /*			字符串输出函数	   	 */	
; int puts(char *s)
; 	{
	rjmp L15
L14:
	.dbline 39
	.dbline 40
	movw R30,R20
	ldd R16,z+0
	rcall _putchar
	.dbline 41
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 42
L15:
	.dbline 38
; 	while (*s)
	movw R30,R20
	ldd R2,z+0
	tst R2
	brne L14
	.dbline 43
; 		{
; 		putchar(*s);
; 		s++;
; 		}	
; 	return 1;
	ldi R16,1
	ldi R17,0
	.dbline -2
L13:
	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 46
; 	}
; void uart_init(void)
; {
	.dbline 47
;  UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//允许接收中断、发送和接收
	ldi R24,152
	out 0xa,R24
	.dbline 50
;  /*UBRRL=(fosc/16/(baud+1))%256;
;  UBRRH=((fosc/16/(baud+1))/256)&0b01111111;*/
;  UBRRL=(fosc/16/baud-1)%256;
	ldi R24,25
	out 0x9,R24
	.dbline 51
;  UBRRH=((fosc/16/baud-1)/256)&0b01111111;
	clr R2
	out 0x20,R2
	.dbline 52
;  UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
	ldi R24,134
	out 0x20,R24
	.dbline -2
L17:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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