📄 uart.lis
字号:
.module Uart.c
.area text(rom, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
0000 .dbfunc e getchar _getchar fc
.even
0000 _getchar::
0000 .dbline -1
0000 .dbline 19
0000 L2:
0000 .dbline 19
0000 L3:
0000 .dbline 19
0000 ; /*
0000 ; 串口通信模块,使用之前,应该在Main 函数中对串口进行初始化,
0000 ; 串口数据接收方式采用中断进行
0000 ; */
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #define fosc 8000000 //晶振8MHZ
0000 ; #define baud 19200 //波特率
0000 ; extern void adc_init(void);
0000 ; extern unsigned int adc_rel;//AD转换结果
0000 ; extern unsigned char adc_mux;//AD通道,默认为0通道
0000 ; extern unsigned char InterruptFlag;
0000 ;
0000 ; extern unsigned char ExtendRomAddr,ExtendRomVal;//定义片外EEPROM
0000 ; extern unsigned char ExtendRomRW;
0000 ;
0000 ; unsigned int eeprom_addr;
0000 ; unsigned char eeprom_val;
0000 ; unsigned char getchar(void) {while(!(UCSRA& (1<<RXC)));return UDR;}
0000 5F9B sbis 0xb,7
0002 FECF rjmp L2
0004 .dbline 19
0004 0CB1 in R16,0xc
0006 .dbline -2
0006 L1:
0006 .dbline 0 ; func end
0006 0895 ret
0008 .dbend
0008 .dbfunc e putchar _putchar fV
0008 ; c -> R16
.even
0008 _putchar::
0008 .dbline -1
0008 .dbline 22
0008 ; /*字符输出函数*/
0008 ; void putchar(unsigned char c)
0008 ; {
0008 L6:
0008 .dbline 23
0008 L7:
0008 .dbline 23
0008 ; while (!(UCSRA&(1<<UDRE)));
0008 5D9B sbis 0xb,5
000A FECF rjmp L6
000C .dbline 24
000C ; UDR=c;
000C 0CB9 out 0xc,R16
000E .dbline -2
000E L5:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbsym r c 16 c
0010 .dbend
0010 .dbfunc e puts _puts fV
0010 ; s -> R20,R21
.even
0010 _puts::
0010 00D0 rcall push_gset1
0012 A801 movw R20,R16
0014 .dbline -1
0014 .dbline 29
0014 ; }
0014 ;
0014 ; /*字符串输出函数*/
0014 ; void puts(char *s)
0014 ; {
0014 05C0 rjmp L11
0016 L10:
0016 .dbline 31
0016 .dbline 32
0016 FA01 movw R30,R20
0018 0081 ldd R16,z+0
001A F6DF rcall _putchar
001C .dbline 33
001C 4F5F subi R20,255 ; offset = 1
001E 5F4F sbci R21,255
0020 .dbline 34
0020 L11:
0020 .dbline 30
0020 ; while (*s)
0020 FA01 movw R30,R20
0022 2080 ldd R2,z+0
0024 2220 tst R2
0026 B9F7 brne L10
0028 .dbline 35
0028 ; {
0028 ; putchar(*s);
0028 ; s++;
0028 ; }
0028 ; putchar(13);
0028 0DE0 ldi R16,13
002A EEDF rcall _putchar
002C .dbline 36
002C ; putchar(10);
002C 0AE0 ldi R16,10
002E ECDF rcall _putchar
0030 .dbline -2
0030 L9:
0030 00D0 rcall pop_gset1
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbsym r s 20 pc
0034 .dbend
0034 .dbfunc e uart_init _uart_init fV
.even
0034 _uart_init::
0034 .dbline -1
0034 .dbline 40
0034 ; }
0034 ;
0034 ; void uart_init(void)
0034 ; {
0034 .dbline 42
0034 ; //OSCCAL=0xA1;//在主程序中设置
0034 ; UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
0034 88E9 ldi R24,152
0036 8AB9 out 0xa,R24
0038 .dbline 44
0038 ; //允许接收中断、发送和接收
0038 ; UBRRL=(fosc/16/baud-1)%256;
0038 89E1 ldi R24,25
003A 89B9 out 0x9,R24
003C .dbline 45
003C ; UBRRH=((fosc/16/baud-1)/256)&0b01111111;
003C 2224 clr R2
003E 20BC out 0x20,R2
0040 .dbline 46
0040 ; UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
0040 86E8 ldi R24,134
0042 80BD out 0x20,R24
0044 .dbline -2
0044 L13:
0044 .dbline 0 ; func end
0044 0895 ret
0046 .dbend
.area vector(rom, abs)
.org 22
0016 23C0 rjmp _UartGet
.area text(rom, con, rel)
0046 .dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
.area data(ram, con, rel)
0000 .dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
0000 L15:
0000 .blkb 1
.area idata
0000 00 .byte 0
.area data(ram, con, rel)
0001 .dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
.area text(rom, con, rel)
0046 .dbfile G:\Mega8程序\TCXO评估板\Main\Uart.c
0046 .dbfunc e UartGet _UartGet fV
0046 .dbsym s LED_state L15 c
0046 ; channel -> R14
0046 ; val -> R20,R21
0046 ; i -> R22
0046 ; temp -> R10,R11
0046 ; charInput -> R12
.even
0046 _UartGet::
0046 00D0 rcall push_lset
0048 00D0 rcall push_gset5
004A .dbline -1
004A .dbline 52
004A ; //8位数据+1位STOP位
004A ; }
004A ;
004A ; #pragma interrupt_handler UartGet:12
004A ; void UartGet(void)//使用中断方式接收UART的输入字符
004A ; {
004A .dbline 53
004A ; unsigned char charInput,channel='0',i;
004A 80E3 ldi R24,48
004C E82E mov R14,R24
004E .dbline 54
004E ; unsigned int val=0,temp=1000;
004E 4427 clr R20
0050 5527 clr R21
0052 .dbline 54
0052 88EE ldi R24,1000
0054 93E0 ldi R25,3
0056 5C01 movw R10,R24
0058 .dbline 56
0058 ; static unsigned char LED_state=0;
0058 ; charInput=UDR;
0058 CCB0 in R12,0xc
005A .dbline 57
005A ; switch (charInput)
005A 6C2D mov R22,R12
005C 7727 clr R23
005E 6735 cpi R22,87
0060 E0E0 ldi R30,0
0062 7E07 cpc R23,R30
0064 09F4 brne X1
0066 9CC0 rjmp L41
0068 X1:
0068 87E5 ldi R24,87
006A 90E0 ldi R25,0
006C 8617 cp R24,R22
006E 9707 cpc R25,R23
0070 7CF0 brlt L60
0072 L59:
0072 6D34 cpi R22,77
0074 E0E0 ldi R30,0
0076 7E07 cpc R23,R30
0078 09F4 brne X2
007A 46C0 rjmp L30
007C X2:
007C 6F34 cpi R22,79
007E E0E0 ldi R30,0
0080 7E07 cpc R23,R30
0082 B1F0 breq L19
0084 6235 cpi R22,82
0086 E0E0 ldi R30,0
0088 7E07 cpc R23,R30
008A 09F4 brne X3
008C 4BC0 rjmp L31
008E X3:
008E FFC0 rjmp L16
0090 L60:
0090 6237 cpi R22,114
0092 E0E0 ldi R30,0
0094 7E07 cpc R23,R30
0096 09F4 brne X4
0098 65C0 rjmp L36
009A X4:
009A 6237 cpi R22,114
009C E0E0 ldi R30,0
009E 7E07 cpc R23,R30
00A0 0CF4 brge X5
00A2 F5C0 rjmp L16
00A4 X5:
00A4 L61:
00A4 6737 cpi R22,119
00A6 E0E0 ldi R30,0
00A8 7E07 cpc R23,R30
00AA 09F4 brne X6
00AC B6C0 rjmp L50
00AE X6:
00AE EFC0 rjmp L16
00B0 X0:
00B0 .dbline 58
00B0 ; {
00B0 L19:
00B0 .dbline 60
00B0 ; case 'O'://调节输出电压'O'
00B0 ; {
00B0 .dbline 61
00B0 ; channel=getchar();
00B0 A7DF rcall _getchar
00B2 E02E mov R14,R16
00B4 .dbline 62
00B4 ; charInput=getchar();//无用的前导空格字符
00B4 A5DF rcall _getchar
00B6 C02E mov R12,R16
00B8 .dbline 63
00B8 ; for(i=0;i<4;i++)//将4位(0~4995)BCD转换为为integer
00B8 6627 clr R22
00BA 10C0 rjmp L23
00BC L20:
00BC .dbline 64
00BC .dbline 65
00BC A1DF rcall _getchar
00BE 802F mov R24,R16
00C0 8053 subi R24,48
00C2 C82E mov R12,R24
00C4 .dbline 66
00C4 082F mov R16,R24
00C6 1127 clr R17
00C8 9501 movw R18,R10
00CA 00D0 rcall empy16s
00CC 400F add R20,R16
00CE 511F adc R21,R17
00D0 .dbline 67
00D0 2AE0 ldi R18,10
00D2 30E0 ldi R19,0
00D4 8501 movw R16,R10
00D6 00D0 rcall div16u
00D8 5801 movw R10,R16
00DA .dbline 68
00DA L21:
00DA .dbline 63
00DA 6395 inc R22
00DC L23:
00DC .dbline 63
00DC 6430 cpi R22,4
00DE 70F3 brlo L20
00E0 .dbline 69
00E0 ; {
00E0 ; charInput=getchar()-48;
00E0 ; val+=charInput*temp;
00E0 ; temp/=10;
00E0 ; }
00E0 ; if (val>0xfff) val=0xfff;
00E0 8FEF ldi R24,4095
00E2 9FE0 ldi R25,15
00E4 8417 cp R24,R20
00E6 9507 cpc R25,R21
00E8 10F4 brsh L24
00EA .dbline 69
00EA 4FEF ldi R20,4095
00EC 5FE0 ldi R21,15
00EE L24:
00EE .dbline 70
00EE ; if (channel=='0') OCR1A=val;
00EE 8E2D mov R24,R14
00F0 8033 cpi R24,48
00F2 19F4 brne L26
00F4 .dbline 70
00F4 5BBD out 0x2b,R21
00F6 4ABD out 0x2a,R20
00F8 CAC0 rjmp L17
00FA L26:
00FA .dbline 71
00FA ; else if (channel=='1') OCR1B=val;
00FA 8E2D mov R24,R14
00FC 8133 cpi R24,49
00FE 09F0 breq X7
0100 C6C0 rjmp L17
0102 X7:
0102 .dbline 71
0102 59BD out 0x29,R21
0104 48BD out 0x28,R20
0106 .dbline 72
0106 ; break;
0106 C3C0 rjmp L17
0108 L30:
0108 .dbline 75
0108 ; }
0108 ; case 'M'://读取ADC通道及ADC转换结果
0108 ; {
0108 .dbline 76
0108 ; channel=getchar();
0108 7BDF rcall _getchar
010A E02E mov R14,R16
010C .dbline 77
010C ; adc_mux=channel-48;//将ASCII码转换为数字
010C 8E2D mov R24,R14
010E 8053 subi R24,48
0110 80930000 sts _adc_mux,R24
0114 .dbline 78
0114 ; TCNT0=0x10;//防止串口接受信息时,Timer0中断即将发生。
0114 80E1 ldi R24,16
0116 82BF out 0x32,R24
0118 .dbline 79
0118 ; InterruptFlag|=0b00000001;//通知Timer0中断程序,需要发送测试数据
0118 80910000 lds R24,_InterruptFlag
011C 8160 ori R24,1
011E 80930000 sts _InterruptFlag,R24
0122 .dbline 80
0122 ; break;
0122 B5C0 rjmp L17
0124 L31:
0124 .dbline 84
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -