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

📄 uart_to_twi_m8.s

📁 usart的驱动程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module uart_to_twi_m8.c
	.area text(rom, con, rel)
	.dbfile H:\UART_TO_TWI\uart_to_twi_m8.c
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 56
; /*****************************************************************
; ICC-AVR application builder : 2005-8-19 14:40:53
;  Target : M8
;  Crystal: 7.3728Mhz
; // Crystal: 4.6080Mhz
; 
; 实验:做usart串行通讯实验
; 目的:了解及会使用usart串口
; CPU:atmega8L
; 相关的5个寄存器:UCSRA,UCSRB,UCSRC,UDR,UBRR(UBRRH,UBRRL)
; 	         其中:UBRRH和UCSRC共用一个地址
; ******************************************************************/
; /*配置:CKOPT=0,CKSEL3..0=1111,SUT1..0=11(65ms慢速上升电源)*/
; #include <iom8v.h>
; #include <macros.h>
; #include "usart_m8.h"
; #include "twi_master_polling.h"
; 
; //#define test
; 
; #define LED_ON   1
; #define LED_OFF  0
; 
; #define IO_OUT_MAIN_LED   3 //PD3 pin1
; #define IO_OUT_SLAVE_LED  2 //PD2 pin32
; 
; #define  Main_Led_Off()    PORTD |= BIT(IO_OUT_MAIN_LED)
; #define  Slave_Led_Off()   PORTD |= BIT(IO_OUT_SLAVE_LED)
; #define  Main_Led_On()     PORTD &= ~BIT(IO_OUT_MAIN_LED)
; #define  Slave_Led_On()    PORTD &= ~BIT(IO_OUT_SLAVE_LED)
; 
; void init_data(void);
; void port_init(void);
; void init_devices(void);
; void timer0_init(void);
; void check_watchdog(void);
; void process_data_pack(void);
; void twi_transmint(void);
; void watchdog_init(void);
; void check_main_led(void);
; void check_slave_led(void);
; void ascii_to_hex(void);
; void show_data(unsigned char dat);
; 
; unsigned char Twi_Hex_Data[3];
; unsigned char Twi_ASCI_Data[6];
; unsigned char Twi_Write_Flag,Twi_Read_Flag;
; unsigned char Twi_ASCI_Data_Flag,Twi_Hex_Data_Flag;
; //LED指示灯
; unsigned char Slave_Led_Status;
; unsigned char Main_Led_Status,Cur_Main_Led_Status,Count_10ms;
; 
; 
; 
; void main(void)
; {
	.dbline 57
; 	init_devices();
	rcall _init_devices
	.dbline 58
; 	init_data();
	rcall _init_data
	.dbline 60
;     
; 	USART_Transmit( "read go!" );//用来指示,是不是看门狗复位
	ldi R16,<L2
	ldi R17,>L2
	rcall _USART_Transmit
	rjmp L4
L3:
	.dbline 62
	.dbline 63
	rcall _UART_Receive
	.dbline 64
	rcall _check_watchdog
	.dbline 65
	rcall _process_data_pack
	.dbline 67
	rcall _twi_transmint
	.dbline 69
	rcall _check_main_led
	.dbline 70
L4:
	.dbline 61
	rjmp L3
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e process_data_pack _process_data_pack fV
;            dat -> R22
;            cnt -> R20
	.even
_process_data_pack::
	rcall push_gset2
	.dbline -1
	.dbline 75
; 	while(1)  //forever
; 	   {
; 		  UART_Receive();
; 		  check_watchdog();//喂狗
; 	      process_data_pack();//解包
; 		  //while(1)WDR();
; 		  twi_transmint();
; 	      //while(1)WDR();
; 		  check_main_led();
; 		}
;        
; }
; //>>>>>>>>>>>>>>>>>>>>>>>>解包
; void process_data_pack(void)
; {
	.dbline 78
;    unsigned char cnt,dat;
;    
;    if(Rx_Over_Pack_Flag == true)
	lds R24,_Rx_Over_Pack_Flag
	cpi R24,1
	breq X1
	rjmp L7
X1:
	.dbline 79
;     {   
	.dbline 81
; 	    //从灯
; 		Slave_Led_Status = LED_ON;
	ldi R24,1
	sts _Slave_Led_Status,R24
	.dbline 82
; 		check_slave_led();//先让通讯亮一下
	rcall _check_slave_led
	.dbline 83
; 		Rx_Over_Pack_Flag = false;
	clr R2
	sts _Rx_Over_Pack_Flag,R2
	.dbline 84
; 		Slave_Led_Status = LED_OFF;
	sts _Slave_Led_Status,R2
	.dbline 86
; 
; 		if(UART_RX_buff[1] == 0x57)
	lds R24,_UART_RX_buff+1
	cpi R24,87
	brne L9
	.dbline 87
; 		{
	.dbline 88
; 		   for(cnt =0;cnt<6;cnt++)
	clr R20
	rjmp L15
L12:
	.dbline 89
; 		    {
	.dbline 90
; 			   dat = UART_RX_buff[cnt+2];//前面两个字节是'x','w'或'R'
	ldi R24,<_UART_RX_buff+2
	ldi R25,>_UART_RX_buff+2
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 91
; 			   if((dat >= 0x30)&&(dat <=0x39))
	cpi R22,48
	brlo L17
	ldi R24,57
	cp R24,R22
	brlo L17
	.dbline 92
; 			    {
	.dbline 93
; 				  Twi_ASCI_Data[cnt] = dat - 0x30;
	ldi R24,<_Twi_ASCI_Data
	ldi R25,>_Twi_ASCI_Data
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	mov R24,R22
	subi R24,48
	std z+0,R24
	.dbline 94
; 				}
	rjmp L18
L17:
	.dbline 95
; 			   else if((dat>=0x41)&&(dat<=0x46))
	cpi R22,65
	brlo L19
	ldi R24,70
	cp R24,R22
	brlo L19
	.dbline 96
; 			    {
	.dbline 97
; 				  Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
	ldi R24,<_Twi_ASCI_Data
	ldi R25,>_Twi_ASCI_Data
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	mov R24,R22
	subi R24,55
	std z+0,R24
	.dbline 98
; 				}
L19:
L18:
	.dbline 99
L13:
	.dbline 88
	inc R20
L15:
	.dbline 88
	cpi R20,6
	brlo L12
	.dbline 100
; 		    }
; 			ascii_to_hex();//组合成数据
	rcall _ascii_to_hex
	.dbline 101
; 		   Twi_Write_Flag = true;
	ldi R24,1
	sts _Twi_Write_Flag,R24
	.dbline 102
; 		}
L9:
	.dbline 103
; 		if(UART_RX_buff[1] == 0x52)
	lds R24,_UART_RX_buff+1
	cpi R24,82
	brne L21
	.dbline 104
; 		{
	.dbline 105
; 		   for(cnt =0;cnt<4;cnt++)
	clr R20
	rjmp L27
L24:
	.dbline 106
; 		    {
	.dbline 107
; 			   dat = UART_RX_buff[cnt+2];
	ldi R24,<_UART_RX_buff+2
	ldi R25,>_UART_RX_buff+2
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 108
; 			   if((dat >= 0x30)&&(dat <=0x39))
	cpi R22,48
	brlo L29
	ldi R24,57
	cp R24,R22
	brlo L29
	.dbline 109
; 			    {
	.dbline 110
; 				  Twi_ASCI_Data[cnt] = dat - 0x30;
	ldi R24,<_Twi_ASCI_Data
	ldi R25,>_Twi_ASCI_Data
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	mov R24,R22
	subi R24,48
	std z+0,R24
	.dbline 111
; 				}
	rjmp L30
L29:
	.dbline 112
; 			   else if((dat>=0x41)&&(dat<=0x46))
	cpi R22,65
	brlo L31
	ldi R24,70
	cp R24,R22
	brlo L31
	.dbline 113
; 			    {
	.dbline 114
; 				  Twi_ASCI_Data[cnt] = dat - 0x37;//如果是字母,那么减去0x37
	ldi R24,<_Twi_ASCI_Data
	ldi R25,>_Twi_ASCI_Data
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	mov R24,R22
	subi R24,55
	std z+0,R24
	.dbline 115
; 				}
L31:
L30:
	.dbline 116
L25:
	.dbline 105
	inc R20
L27:
	.dbline 105
	cpi R20,4
	brlo L24
	.dbline 117
; 		    }
; 			ascii_to_hex();
	rcall _ascii_to_hex
	.dbline 118
; 		   Twi_Read_Flag = true;
	ldi R24,1
	sts _Twi_Read_Flag,R24
	.dbline 119
; 		}
L21:
	.dbline 120
; 		Twi_Hex_Data_Flag = true;
	ldi R24,1
	sts _Twi_Hex_Data_Flag,R24
	.dbline 122
; 		//处理完,先把数据放在UART_TX_buff[]绶冲区,且接收绶冲区清零
; 		for(cnt=0;cnt<9;cnt++)
	clr R20
	rjmp L36
L33:
	.dbline 123
	.dbline 124
	ldi R24,<_UART_RX_buff
	ldi R25,>_UART_RX_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_UART_TX_buff
	ldi R25,>_UART_TX_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 125
	ldi R24,<_UART_RX_buff
	ldi R25,>_UART_RX_buff
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	clr R2
	std z+0,R2
	.dbline 126
L34:
	.dbline 122
	inc R20
L36:
	.dbline 122
	cpi R20,9
	brlo L33
	.dbline 127
	wdr
	.dbline 128
L7:
	.dbline -2
L6:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r dat 22 c
	.dbsym r cnt 20 c
	.dbend
	.dbfunc e ascii_to_hex _ascii_to_hex fV
;              i -> R16
;            cnt -> R18
	.even
_ascii_to_hex::
	.dbline -1
	.dbline 132
; 		{
; 		   UART_TX_buff[cnt] = UART_RX_buff[cnt];
; 		   UART_RX_buff[cnt] = 0;
; 		}
; 		WDR();
; 	}
; }
; //继续解包,=>两个ASCII码组成一个数
; void ascii_to_hex(void)
; {
	.dbline 135
;     unsigned char cnt,i;
;    
; 	for(cnt=0,i=0;cnt<6;cnt++,cnt++,i++)
	clr R18
	clr R16
	rjmp L41
L38:
	.dbline 136
	.dbline 137
	ldi R24,<_Twi_ASCI_Data
	ldi R25,>_Twi_ASCI_Data
	mov R30,R18
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldi R24,<_Twi_Hex_Data
	ldi R25,>_Twi_Hex_Data
	mov R30,R16
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R2
	.dbline 138
	mov R2,R16
	clr R3
	add R2,R24
	adc R3,R25
	movw R30,R2
	ldd R24,z+0
	andi R24,#0x0F
	swap R24
	std z+0,R24
	.dbline 139
	ldi R24,<_Twi_Hex_Data
	ldi R25,>_Twi_Hex_Data
	mov R2,R16
	clr R3
	add R2,R24
	adc R3,R25
	ldi R24,<_Twi_ASCI_Data+1
	ldi R25,>_Twi_ASCI_Data+1
	mov R30,R18
	clr R31
	add R30,R24
	adc R31,R25
	ldd R4,z+0
	movw R30,R2
	ldd R5,z+0
	add R5,R4
	std z+0,R5
	.dbline 140
L39:
	.dbline 135
	inc R18
	inc R18
	inc R16
L41:
	.dbline 135
	cpi R18,6
	brsh X2
	rjmp L38
X2:
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbsym r cnt 18 c
	.dbend
	.dbfunc e hex_to_ascii _hex_to_ascii fV
;       dat_buff -> R20
;            dat -> R16
	.even
_hex_to_ascii::
	rcall push_gset1
	.dbline -1
	.dbline 143
; 	{
; 	  Twi_Hex_Data[i] = Twi_ASCI_Data[cnt];//先放ASCII的高位(四位)
; 	  Twi_Hex_Data[i] <<= 4;
; 	  Twi_Hex_Data[i] += Twi_ASCI_Data[cnt+1];
; 	}
; }
; void hex_to_ascii(unsigned char dat)
; {
	.dbline 146
;     unsigned char dat_buff;
;   
;     dat_buff = dat;
	mov R20,R16
	.dbline 147
;     dat = dat&0x0f;
	andi R16,15
	.dbline 148
;     if((dat>=0)&&(dat<=9))
	cpi R16,0
	brlo L44
	ldi R24,9
	cp R24,R16
	brlo L44
	.dbline 149
;     {
	.dbline 150
;        dat += 0x30;
	subi R16,208    ; addi 48
	.dbline 151
;     }
	rjmp L45
L44:
	.dbline 153
;     else
;        dat += 0x37;
	subi R16,201    ; addi 55
L45:
	.dbline 154
; 	UART_TX_buff[7] = dat;
	sts _UART_TX_buff+7,R16
	.dbline 156
; 	  
;     dat = dat_buff;
	mov R16,R20
	.dbline 157
; 	dat >>= 4;
	mov R24,R16
	swap R24
	andi R24,#0x0F
	mov R16,R24
	.dbline 158
; 	dat = dat&0x0f;
	andi R16,15
	.dbline 159
;     if((dat>=0)&&(dat<=9))
	cpi R16,0
	brlo L47
	ldi R24,9
	cp R24,R16
	brlo L47
	.dbline 160
;     {
	.dbline 161
;       dat += 0x30;
	subi R16,208    ; addi 48
	.dbline 162
;     }
	rjmp L48
L47:
	.dbline 164
;     else
;       dat += 0x37;
	subi R16,201    ; addi 55
L48:
	.dbline 165
; 	UART_TX_buff[6] = dat;
	sts _UART_TX_buff+6,R16
	.dbline -2
L43:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r dat_buff 20 c
	.dbsym r dat 16 c
	.dbend
	.dbfunc e general_hex_to_ascii _general_hex_to_ascii fc
;            dat -> R16
	.even
_general_hex_to_ascii::
	.dbline -1
	.dbline 172
; }
; //<<<<<<<<<<<<<<<<<<<<<
; /***********************************************************************
; 通用的hex转成ascii
; ************************************************************************/
; unsigned char general_hex_to_ascii(unsigned char dat)
; {
	.dbline 173
;     dat = dat & 0x0f;
	andi R16,15
	.dbline 174
;     if((dat >= 0)&&(dat <= 9))
	cpi R16,0
	brlo L51
	ldi R24,9
	cp R24,R16
	brlo L51
	.dbline 175
;     {
	.dbline 176
; 	  dat = dat + 0x30;
	subi R16,208    ; addi 48
	.dbline 177
; 	}
	rjmp L52
L51:
	.dbline 179
; 	else
; 	{
	.dbline 180
; 	  dat += 0x37;
	subi R16,201    ; addi 55
	.dbline 181
; 	}
L52:
	.dbline 182
; 	return dat;
	.dbline -2
L50:
	.dbline 0 ; func end
	ret
	.dbsym r dat 16 c
	.dbend
	.dbfunc e show_data _show_data fV
;       dat_buff -> R22
;            dat -> R20

⌨️ 快捷键说明

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