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

📄 timer0.lis

📁 详细介绍M8两版间通讯
💻 LIS
字号:
                        .module Timer0.c
                        .area data(ram, con, rel)
 0000           _InterruptFlag::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
 0001                   .dbsym e InterruptFlag _InterruptFlag c
                        .area vector(rom, abs)
                        .org 18
 0012 00C0              rjmp _timer0
                        .area data(ram, con, rel)
 0001                   .dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
                        .area lit(rom, con, rel)
 0000           L2:
 0000 00                .byte 0
 0001 00000000          .byte 0,0,0,0
                        .area text(rom, con, rel)
 0000                   .dbfile G:\Mega8程序\TCXO评估板\Main\Timer0.c
 0000                   .dbfunc e timer0 _timer0 fV
 0000           ;        strTemp -> y+0
 0000           ;        intTemp -> R20,R21
 0000           ;              i -> R22
 0000           ;           pStr -> R10,R11
                        .even
 0000           _timer0::
 0000 00D0              rcall push_lset
 0002 00D0              rcall push_gset3
 0004 2597              sbiw R28,5
 0006                   .dbline -1
 0006                   .dbline 22
 0006           ; /*************T/C0作为定时器,触发定时中断,来进行周期性的作业***************/
 0006           ; #include<iom8v.h>
 0006           ; #include <macros.h>
 0006           ; extern unsigned int adc_rel;
 0006           ; extern unsigned char adc_mux;
 0006           ; extern void putchar(unsigned char c);
 0006           ; extern void puts(char *s);
 0006           ; 
 0006           ; extern unsigned char rom_read(unsigned int Address);
 0006           ; extern void rom_write(unsigned int Address,unsigned  char Data);
 0006           ; 
 0006           ; extern unsigned char i2c_read(unsigned char RomAddress);
 0006           ; extern void i2c_write(unsigned char Wdata,unsigned char RomAddress);
 0006           ; 
 0006           ; extern unsigned int eeprom_addr;
 0006           ; extern unsigned char eeprom_val;
 0006           ; 
 0006           ; unsigned char InterruptFlag=0x00;//最小位为有AD转换数据发送请求,次位为UART口转换为普通IO口请求
 0006           ; 
 0006           ; #pragma interrupt_handler timer0:10
 0006           ; void timer0(void)
 0006           ;  {
 0006                   .dbline 23
 0006           ;       unsigned char strTemp[5]={0},i;
 0006 80E0              ldi R24,<L2
 0008 90E0              ldi R25,>L2
 000A FE01              movw R30,R28
 000C 05E0              ldi R16,5
 000E 10E0              ldi R17,0
 0010 FA93              st -y,R31
 0012 EA93              st -y,R30
 0014 9A93              st -y,R25
 0016 8A93              st -y,R24
 0018 00D0              rcall asgncblk
 001A                   .dbline 24
 001A           ;       unsigned char *pStr=strTemp;
 001A CE01              movw R24,R28
 001C 5C01              movw R10,R24
 001E                   .dbline 26
 001E           ;       unsigned int intTemp;
 001E           ;       TIMSK&=0b11111110;
 001E 89B7              in R24,0x39
 0020 8E7F              andi R24,254
 0022 89BF              out 0x39,R24
 0024                   .dbline 27
 0024           ;       if(InterruptFlag&0b00000001)//如果有数据发送请求,则在定时中断中将数据发送出去。
 0024 20900000          lds R2,_InterruptFlag
 0028 20FE              sbrs R2,0
 002A 2BC0              rjmp L3
 002C                   .dbline 28
 002C           ;        {
 002C                   .dbline 29
 002C           ;               pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
 002C C501              movw R24,R10
 002E 0396              adiw R24,3
 0030 5C01              movw R10,R24
 0032                   .dbline 30
 0032           ;               for(i=4;i!=0;i--)
 0032 64E0              ldi R22,4
 0034 1AC0              rjmp L8
 0036           L5:
 0036                   .dbline 31
 0036                   .dbline 32
 0036 2AE0              ldi R18,10
 0038 30E0              ldi R19,0
 003A 00910000          lds R16,_adc_rel
 003E 10910100          lds R17,_adc_rel+1
 0042 00D0              rcall mod16u
 0044 C801              movw R24,R16
 0046 C096              adiw R24,48
 0048 F501              movw R30,R10
 004A 8083              std z+0,R24
 004C                   .dbline 33
 004C 2AE0              ldi R18,10
 004E 30E0              ldi R19,0
 0050 00910000          lds R16,_adc_rel
 0054 10910100          lds R17,_adc_rel+1
 0058 00D0              rcall div16u
 005A 10930100          sts _adc_rel+1,R17
 005E 00930000          sts _adc_rel,R16
 0062                   .dbline 34
 0062 C501              movw R24,R10
 0064 0197              sbiw R24,1
 0066 5C01              movw R10,R24
 0068                   .dbline 35
 0068           L6:
 0068                   .dbline 30
 0068 6A95              dec R22
 006A           L8:
 006A                   .dbline 30
 006A 6623              tst R22
 006C 21F7              brne L5
 006E                   .dbline 36
 006E           ;                {
 006E           ;                       *pStr=adc_rel%10+48;
 006E           ;                       adc_rel/=10;
 006E           ;                       pStr--;
 006E           ;                }
 006E           ;               pStr=strTemp;
 006E CE01              movw R24,R28
 0070 5C01              movw R10,R24
 0072                   .dbline 37
 0072           ;               puts(pStr);
 0072 8C01              movw R16,R24
 0074 00D0              rcall _puts
 0076                   .dbline 38
 0076           ;               InterruptFlag&=0b11111110;
 0076 80910000          lds R24,_InterruptFlag
 007A 8E7F              andi R24,254
 007C 80930000          sts _InterruptFlag,R24
 0080                   .dbline 39
 0080           ;        }
 0080 3DC0              rjmp L4
 0082           L3:
 0082                   .dbline 41
 0082           ; 
 0082           ;       else if(InterruptFlag&0b00000010)//如果有EEPROM读请求,则在定时中断中将数据发送出去。
 0082 20900000          lds R2,_InterruptFlag
 0086 21FE              sbrs R2,1
 0088 29C0              rjmp L9
 008A                   .dbline 42
 008A           ;        {
 008A                   .dbline 43
 008A           ;               intTemp=(int)rom_read(eeprom_addr);//读取内部EEPROM数据
 008A 00910000          lds R16,_eeprom_addr
 008E 10910100          lds R17,_eeprom_addr+1
 0092 00D0              rcall _rom_read
 0094 402F              mov R20,R16
 0096 5527              clr R21
 0098                   .dbline 46
 0098           ;               //intTemp=(int)i2c_read((unsigned char)eeprom_addr);//读取外部EEPROM数据
 0098           ; 
 0098           ;               pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
 0098 C501              movw R24,R10
 009A 0396              adiw R24,3
 009C 5C01              movw R10,R24
 009E                   .dbline 47
 009E           ;               for(i=4;i!=0;i--)
 009E 64E0              ldi R22,4
 00A0 11C0              rjmp L14
 00A2           L11:
 00A2                   .dbline 48
 00A2                   .dbline 49
 00A2 2AE0              ldi R18,10
 00A4 30E0              ldi R19,0
 00A6 8A01              movw R16,R20
 00A8 00D0              rcall mod16u
 00AA C801              movw R24,R16
 00AC C096              adiw R24,48
 00AE F501              movw R30,R10
 00B0 8083              std z+0,R24
 00B2                   .dbline 50
 00B2 2AE0              ldi R18,10
 00B4 30E0              ldi R19,0
 00B6 8A01              movw R16,R20
 00B8 00D0              rcall div16u
 00BA A801              movw R20,R16
 00BC                   .dbline 51
 00BC C501              movw R24,R10
 00BE 0197              sbiw R24,1
 00C0 5C01              movw R10,R24
 00C2                   .dbline 52
 00C2           L12:
 00C2                   .dbline 47
 00C2 6A95              dec R22
 00C4           L14:
 00C4                   .dbline 47
 00C4 6623              tst R22
 00C6 69F7              brne L11
 00C8                   .dbline 53
 00C8           ;                {
 00C8           ;                       *pStr=intTemp%10+48;
 00C8           ;                       intTemp/=10;
 00C8           ;                       pStr--;
 00C8           ;                }
 00C8           ;               pStr=strTemp;
 00C8 CE01              movw R24,R28
 00CA 5C01              movw R10,R24
 00CC                   .dbline 54
 00CC           ;               puts(pStr);
 00CC 8C01              movw R16,R24
 00CE 00D0              rcall _puts
 00D0                   .dbline 55
 00D0           ;               InterruptFlag&=0b11111101;
 00D0 80910000          lds R24,_InterruptFlag
 00D4 8D7F              andi R24,253
 00D6 80930000          sts _InterruptFlag,R24
 00DA                   .dbline 56
 00DA           ;        }
 00DA 10C0              rjmp L10
 00DC           L9:
 00DC                   .dbline 58
 00DC           ; 
 00DC           ;       else if(InterruptFlag&0b00000100)//如果有EEPROM写请求,则在定时中断中将数据写入。
 00DC 20900000          lds R2,_InterruptFlag
 00E0 22FE              sbrs R2,2
 00E2 0CC0              rjmp L15
 00E4                   .dbline 59
 00E4           ;        {
 00E4                   .dbline 62
 00E4           ; 
 00E4           ;               /*调试的目标程序行*/
 00E4           ;               rom_write(eeprom_addr,eeprom_val);//写入内部EEPROM数据
 00E4 20910000          lds R18,_eeprom_val
 00E8 00910000          lds R16,_eeprom_addr
 00EC 10910100          lds R17,_eeprom_addr+1
 00F0 00D0              rcall _rom_write
 00F2                   .dbline 91
 00F2           ;               //i2c_write(eeprom_val,(unsigned char)eeprom_addr);//写入外部EEPROM数据
 00F2           ; 
 00F2           ; /***************以下内容为程序调试内容*************************
 00F2           ;               puts("eeprom地址:");
 00F2           ;               pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
 00F2           ;               for(i=4;i!=0;i--)
 00F2           ;                {
 00F2           ;                       *pStr=eeprom_addr%10+48;
 00F2           ;                       eeprom_addr/=10;
 00F2           ;                       pStr--;
 00F2           ;                }
 00F2           ;               pStr=strTemp;
 00F2           ;               puts(pStr);
 00F2           ; 
 00F2           ;               puts("eeprom数据:");
 00F2           ;               intTemp=(unsigned int)eeprom_val;
 00F2           ;               pStr+=3;//回到指针尾部,因为数据先计算出个位数(需将数据转换为BCD码输出)
 00F2           ;               for(i=4;i!=0;i--)
 00F2           ;                {
 00F2           ;                       *pStr=intTemp%10+48;
 00F2           ;                       intTemp/=10;
 00F2           ;                       pStr--;
 00F2           ;                }
 00F2           ;               pStr=strTemp;
 00F2           ;               puts(pStr);
 00F2           ; //**************以上内容为程序调试内容*************************/
 00F2           ; 
 00F2           ; 
 00F2           ;               InterruptFlag&=0b11111011;
 00F2 80910000          lds R24,_InterruptFlag
 00F6 8B7F              andi R24,251
 00F8 80930000          sts _InterruptFlag,R24
 00FC                   .dbline 92
 00FC           ;        }
 00FC           L15:
 00FC           L10:
 00FC           L4:
 00FC                   .dbline 93
 00FC           ;       TIMSK|=0x01;//Timer0中断允许
 00FC 89B7              in R24,0x39
 00FE 8160              ori R24,1
 0100 89BF              out 0x39,R24
 0102                   .dbline 94
 0102           ;       TCNT0=0x10;//预植16,定时30ms
 0102 80E1              ldi R24,16
 0104 82BF              out 0x32,R24
 0106                   .dbline -2
 0106           L1:
 0106 2596              adiw R28,5
 0108 00D0              rcall pop_gset3
 010A 00D0              rcall pop_lset
 010C                   .dbline 0 ; func end
 010C 1895              reti
 010E                   .dbsym l strTemp 0 A[5:5]c
 010E                   .dbsym r intTemp 20 i
 010E                   .dbsym r i 22 c
 010E                   .dbsym r pStr 10 pc
 010E                   .dbend
 010E                   .dbfunc e timer0_init _timer0_init fV
                        .even
 010E           _timer0_init::
 010E                   .dbline -1
 010E                   .dbline 97
 010E           ;  }
 010E           ; void timer0_init(void)
 010E           ;  {
 010E                   .dbline 98
 010E           ;       TIMSK|=0x01;//Timer0中断允许
 010E 89B7              in R24,0x39
 0110 8160              ori R24,1
 0112 89BF              out 0x39,R24
 0114                   .dbline 99
 0114           ;       TCCR0=0x04;//1024分频,8MHz、TCNT0=0x10下,每次中断大约1/8ms
 0114 84E0              ldi R24,4
 0116 83BF              out 0x33,R24
 0118                   .dbline 100
 0118           ;       TCNT0=0x10;//预植16,累计计数240发生中断,定时30ms
 0118 80E1              ldi R24,16
 011A 82BF              out 0x32,R24
 011C                   .dbline -2
 011C           L17:
 011C                   .dbline 0 ; func end
 011C 0895              ret
 011E                   .dbend

⌨️ 快捷键说明

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