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

📄 uart.lis

📁 详细介绍M8两版间通讯
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -