📄 uart_to_twi_m8.s
字号:
.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 + -