📄 uart.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 + -