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

📄 rtc.lst

📁 AVRkaifashili.rar
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    0021 E5CF      LDI	R28,0x5F
    0022 E0D2      LDI	R29,2
    0023 BFCD      OUT	0x3D,R28
    0024 BFDE      OUT	0x3E,R29
    0025 51C0      SUBI	R28,0x10
    0026 40D0      SBCI	R29,0
    0027 EA0A      LDI	R16,0xAA
    0028 8308      STD	Y+0,R16
    0029 2400      CLR	R0
    002A E7E0      LDI	R30,0x70
    002B E0F0      LDI	R31,0
    002C E010      LDI	R17,0
    002D 37E2      CPI	R30,0x72
    002E 07F1      CPC	R31,R17
    002F F011      BEQ	0x0032
    0030 9201      ST	R0,Z+
    0031 CFFB      RJMP	0x002D
    0032 8300      STD	Z+0,R16
    0033 E3E2      LDI	R30,0x32
    0034 E0F0      LDI	R31,0
    0035 E6A0      LDI	R26,0x60
    0036 E0B0      LDI	R27,0
    0037 E010      LDI	R17,0
    0038 34E2      CPI	R30,0x42
    0039 07F1      CPC	R31,R17
    003A F021      BEQ	0x003F
    003B 95C8      LPM
    003C 9631      ADIW	R30,1
    003D 920D      ST	R0,X+
    003E CFF9      RJMP	0x0038
    003F D37E      RCALL	_main
_exit:
    0040 CFFF      RJMP	_exit
_DelayMs:
  j                    --> R20
  i                    --> R16
    0041 D437      RCALL	push_gset1
FILE: E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
(0001) //***************************FileName:RTC.C************************//
(0002) //***************************ICCAVR V6.30编译**********************//
(0003) 
(0004) #include <io8535v.h>                   //寄存器定义文件
(0005) #include <macros.h>                    //使用到宏
(0006) #define uchar unsigned char            //数据类型定义
(0007) #define uint unsigned char             //数据类型定义
(0008) #define SD2303 0x64                    //SD2303器件IIC识别码
(0009) 
(0010) 
(0011) uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};
(0012)      //显示数据表 0    1    2     3   4    5    6    7    8    9    L    H  
(0013) uchar Data[4]={0,0,0,0};               //DS1722
(0014) uchar Enter_Flag;                      //确定
(0015) uchar F_Flag;                          //数据应答标志
(0016) 
(0017) void DelayMs(uint i)                   //延时函数1
(0018) {uchar j;
(0019)  for(;i!=0;i--)
    0042 C006      RJMP	0x0049
(0020)   {for(j=2000;j!=0;j--) {;}}
    0043 ED40      LDI	R20,0xD0
    0044 C001      RJMP	0x0046
    0045 954A      DEC	R20
    0046 2344      TST	R20
    0047 F7E9      BNE	0x0045
    0048 950A      DEC	R16
    0049 2300      TST	R16
    004A F7C1      BNE	0x0043
(0021) }
    004B D430      RCALL	pop_gset1
    004C 9508      RET
_Display:
  sel                  --> R20
  i                    --> R22
  p                    --> R10
    004D D445      RCALL	push_gset3
    004E 2EA0      MOV	R10,R16
    004F 2EB1      MOV	R11,R17
(0022) 
(0023) void Display(uchar *p)                //显示函数
(0024) {uchar i,sel=0x00;
    0050 2744      CLR	R20
(0025)  for(i=0;i<16;i++)
    0051 2766      CLR	R22
    0052 C011      RJMP	0x0064
(0026)   {PORTC=sel;
    0053 BB45      OUT	0x15,R20
(0027)    PORTA=Table[p[i]];
    0054 2FE6      MOV	R30,R22
    0055 27FF      CLR	R31
    0056 0DEA      ADD	R30,R10
    0057 1DFB      ADC	R31,R11
    0058 81E0      LDD	R30,Z+0
    0059 27FF      CLR	R31
    005A E680      LDI	R24,0x60
    005B E090      LDI	R25,0
    005C 0FE8      ADD	R30,R24
    005D 1FF9      ADC	R31,R25
    005E 8020      LDD	R2,Z+0
    005F BA2B      OUT	0x1B,R2
(0028)    DelayMs(10);
    0060 E00A      LDI	R16,0xA
    0061 DFDF      RCALL	_DelayMs
(0029)    sel=sel<<1;
    0062 0F44      LSL	R20
    0063 9563      INC	R22
    0064 3160      CPI	R22,0x10
    0065 F368      BCS	0x0053
(0030)   }
(0031) }
    0066 D40C      RCALL	pop_gset3
    0067 9508      RET
(0032) 
(0033)   
(0034) void NOPNOP(uchar i)                   //延时函数2
(0035) {for(;i!=0;i--) NOP();}
_NOPNOP:
  i                    --> R16
    0068 C002      RJMP	0x006B
    0069 0000      NOP
    006A 950A      DEC	R16
    006B 2300      TST	R16
    006C F7E1      BNE	0x0069
    006D 9508      RET
(0036) 
(0037) void SetSCL(uchar i)                   //IIC时钟线SCL设置
(0038) {if(i==1) PORTB=PORTB|0x01;
_SetSCL:
  i                    --> R16
    006E 3001      CPI	R16,1
    006F F411      BNE	0x0072
    0070 9AC0      SBI	0x18,0
    0071 C003      RJMP	0x0075
(0039)  else     PORTB=PORTB&0xFE;}
    0072 B388      IN	R24,0x18
    0073 7F8E      ANDI	R24,0xFE
    0074 BB88      OUT	0x18,R24
    0075 9508      RET
(0040)  
(0041) void SetSDA(uchar i)                   //IIC数据线SDA设置
(0042) {if(i==1) PORTB=PORTB|0x02;
_SetSDA:
  i                    --> R16
    0076 3001      CPI	R16,1
    0077 F411      BNE	0x007A
    0078 9AC1      SBI	0x18,1
    0079 C003      RJMP	0x007D
(0043)  else     PORTB=PORTB&0xFD;}
    007A B388      IN	R24,0x18
    007B 7F8D      ANDI	R24,0xFD
    007C BB88      OUT	0x18,R24
    007D 9508      RET
(0044)  
(0045) //SCL=PB^0;       SD2303时钟线  
(0046) //SDA=PB^1;       SD2303数据线 
(0047) //INTRB=PB^3;     SD2303中断线A
(0048) //INTRA=PB^2;     SD2303中断线B
(0049) 
(0050) void Start()                           //IIC总线开始信号
(0051) {SetSDA(1);
_Start:
    007E E001      LDI	R16,1
    007F DFF6      RCALL	_SetSDA
(0052)  SetSCL(1);
    0080 E001      LDI	R16,1
    0081 DFEC      RCALL	_SetSCL
(0053)  NOPNOP(50);
    0082 E302      LDI	R16,0x32
    0083 DFE4      RCALL	_NOPNOP
(0054)  SetSDA(0);
    0084 2700      CLR	R16
    0085 DFF0      RCALL	_SetSDA
(0055)  NOPNOP(50);
    0086 E302      LDI	R16,0x32
    0087 DFE0      RCALL	_NOPNOP
(0056)  SetSCL(0);
    0088 2700      CLR	R16
(0057) }
    0089 CFE4      RJMP	_SetSCL
(0058) 
(0059) void Stop()                            //IIC总线停止信号
(0060) {SetSDA(0);             
_Stop:
    008A 2700      CLR	R16
    008B DFEA      RCALL	_SetSDA
(0061)  SetSCL(1);
    008C E001      LDI	R16,1
    008D DFE0      RCALL	_SetSCL
(0062)  NOPNOP(50);
    008E E302      LDI	R16,0x32
    008F DFD8      RCALL	_NOPNOP
(0063)  SetSDA(1);
    0090 E001      LDI	R16,1
    0091 DFE4      RCALL	_SetSDA
(0064)  NOPNOP(50);
    0092 E302      LDI	R16,0x32
    0093 DFD4      RCALL	_NOPNOP
(0065)  SetSCL(0);
    0094 2700      CLR	R16
(0066) }
    0095 CFD8      RJMP	_SetSCL
(0067) 
(0068) void Ack()                             //单片机应答信号
(0069) {SetSDA(0);
_Ack:
    0096 2700      CLR	R16
    0097 DFDE      RCALL	_SetSDA
(0070)  SetSCL(1);   
    0098 E001      LDI	R16,1
    0099 DFD4      RCALL	_SetSCL
(0071)  NOPNOP(50);
    009A E302      LDI	R16,0x32
    009B DFCC      RCALL	_NOPNOP
(0072)  SetSCL(0);
    009C 2700      CLR	R16
    009D DFD0      RCALL	_SetSCL
(0073)  SetSDA(1);     
    009E E001      LDI	R16,1
(0074) }
    009F CFD6      RJMP	_SetSDA
(0075) 
(0076) void Nack()                            //单片机非应答信号
(0077) {SetSDA(1);
_Nack:
    00A0 E001      LDI	R16,1
    00A1 DFD4      RCALL	_SetSDA
(0078)  SetSCL(1);
    00A2 E001      LDI	R16,1
    00A3 DFCA      RCALL	_SetSCL
(0079)  NOPNOP(50);
    00A4 E302      LDI	R16,0x32
    00A5 DFC2      RCALL	_NOPNOP
(0080)  SetSCL(0);
    00A6 2700      CLR	R16
    00A7 DFC6      RCALL	_SetSCL
(0081)  SetSDA(0);
    00A8 2700      CLR	R16
(0082) }
    00A9 CFCC      RJMP	_SetSDA
(0083) 
(0084) void Check_Ack()                       //器件应答信号检查
(0085) {SetSDA(1);
_Check_Ack:
    00AA E001      LDI	R16,1
    00AB DFCA      RCALL	_SetSDA
(0086)  SetSCL(1);
    00AC E001      LDI	R16,1
    00AD DFC0      RCALL	_SetSCL
(0087)  F_Flag=0;
    00AE 2422      CLR	R2
    00AF 92200070  STS	_F_Flag,R2
(0088)  DDRB=DDRB&0xFD; 
    00B1 B387      IN	R24,0x17
    00B2 7F8D      ANDI	R24,0xFD
    00B3 BB87      OUT	0x17,R24
(0089)  if((PINB&0x02)==0)
    00B4 99B1      SBIC	0x16,1
    00B5 C005      RJMP	0x00BB
(0090)    {SetSCL(0);
    00B6 2700      CLR	R16
    00B7 DFB6      RCALL	_SetSCL
(0091)     NOPNOP(50);}
    00B8 E302      LDI	R16,0x32
    00B9 DFAE      RCALL	_NOPNOP
    00BA C007      RJMP	0x00C2
(0092)  else
(0093)     {F_Flag=1;
    00BB E081      LDI	R24,1
    00BC 93800070  STS	_F_Flag,R24
(0094)      SetSCL(0);
    00BE 2700      CLR	R16
    00BF DFAE      RCALL	_SetSCL
(0095)      NOPNOP(50);}
    00C0 E302      LDI	R16,0x32
    00C1 DFA6      RCALL	_NOPNOP
(0096) DDRB=DDRB|0x02;
    00C2 9AB9      SBI	0x17,1
(0097) }
    00C3 9508      RET
(0098) 
(0099) void Write_Bit0()                      //向IIC总线写0
(0100) {SetSDA(0);
_Write_Bit0:
    00C4 2700      CLR	R16
    00C5 DFB0      RCALL	_SetSDA
(0101)  SetSCL(1);
    00C6 E001      LDI	R16,1
    00C7 DFA6      RCALL	_SetSCL
(0102)  NOPNOP(50);
    00C8 E302      LDI	R16,0x32
    00C9 DF9E      RCALL	_NOPNOP
(0103)  SetSCL(0);
    00CA 2700      CLR	R16
(0104) }
    00CB CFA2      RJMP	_SetSCL
(0105) 
(0106) void Write_Bit1()                      //向IIC总线写1
(0107) {SetSDA(1);
_Write_Bit1:
    00CC E001      LDI	R16,1
    00CD DFA8      RCALL	_SetSDA
(0108)  SetSCL(1);
    00CE E001      LDI	R16,1
    00CF DF9E      RCALL	_SetSCL
(0109)  NOPNOP(50);
    00D0 E302      LDI	R16,0x32
    00D1 DF96      RCALL	_NOPNOP
(0110)  SetSCL(0);
    00D2 2700      CLR	R16
    00D3 DF9A      RCALL	_SetSCL
(0111)  SetSDA(0);
    00D4 2700      CLR	R16
(0112) }
    00D5 CFA0      RJMP	_SetSDA
_Write_Byte:
  i                    --> R20
  Data                 --> R22
    00D6 D3B9      RCALL	push_gset2
    00D7 2F60      MOV	R22,R16
(0113) 
(0114) void Write_Byte(uchar Data)            //向IIC总线写一字节数据
(0115) {uchar i;
(0116)  for(i=0;i<8;i++)
    00D8 2744      CLR	R20
    00D9 C00A      RJMP	0x00E4
(0117)    {if((Data&0x80)>0)       
    00DA 2422      CLR	R2
    00DB 2F86      MOV	R24,R22
    00DC 7880      ANDI	R24,0x80
    00DD 1628      CP	R2,R24
    00DE F410      BCC	0x00E1
(0118)          Write_Bit1();
    00DF DFEC      RCALL	_Write_Bit1
    00E0 C001      RJMP	0x00E2
(0119)     else
(0120)          Write_Bit0();
    00E1 DFE2      RCALL	_Write_Bit0
(0121)     Data<<=1;                        
    00E2 0F66      LSL	R22
    00E3 9543      INC	R20
    00E4 3048      CPI	R20,0x8
    00E5 F3A0      BCS	0x00DA
(0122)     }
(0123) }
    00E6 D38A      RCALL	pop_gset2
    00E7 9508      RET
_Read_Byte:
  j                    --> R20
  nn                   --> R22
    00E8 D3A7      RCALL	push_gset2
(0124) 
(0125) 
(0126) uchar Read_Byte()                      //从IIC总线读一字节数据
(0127) {uchar nn=0xff;             
    00E9 EF6F      LDI	R22,0xFF
(0128)  uchar j;
(0129)  for (j=0;j<8;j++)
    00EA 2744      CLR	R20
    00EB C013      RJMP	0x00FF
(0130)     {SetSDA(1);
    00EC E001      LDI	R16,1
    00ED DF88      RCALL	_SetSDA
(0131)      SetSCL(1);
    00EE E001      LDI	R16,1
    00EF DF7E      RCALL	_SetSCL
(0132)      DDRB=DDRB&0xFB;
    00F0 B387      IN	R24,0x17
    00F1 7F8B      ANDI	R24,0xFB
    00F2 BB87      OUT	0x17,R24
(0133) 	
(0134)        if((PINB&0x02)==0)
    00F3 99B1      SBIC	0x16,1
    00F4 C005      RJMP	0x00FA
(0135) 	    {nn<<=1;
    00F5 0F66      LSL	R22
(0136)          nn=(nn&0xfe);                 
    00F6 7F6E      ANDI	R22,0xFE
(0137)          SetSCL(0);}
    00F7 2700      CLR	R16
    00F8 DF75      RCALL	_SetSCL
    00F9 C004      RJMP	0x00FE
(0138)      else 
(0139)         {nn<<=1;
    00FA 0F66      LSL	R22
(0140)          nn=(nn|0x01);                 
    00FB 6061      ORI	R22,1
(0141)          SetSCL(0);}
    00FC 2700      CLR	R16
    00FD DF70      RCALL	_SetSCL
    00FE 9543      INC	R20
    00FF 3048      CPI	R20,0x8
    0100 F358      BCS	0x00EC
(0142)     }
(0143)   DDRB=DDRB|0x02;
    0101 9AB9      SBI	0x17,1
(0144)  return(nn);              
    0102 2F06      MOV	R16,R22
    0103 D36D      RCALL	pop_gset2
    0104 9508      RET
_Write_Nbyte:
  k                    --> R20
  Number               --> R22
  Array                --> R10
  Address              --> R12
  Slave                --> R14
    0105 D393      RCALL	push_gset5
    0106 2EC2      MOV	R12,R18
    0107 2EE0      MOV	R14,R16
    0108 84AA      LDD	R10,Y+10
    0109 84BB      LDD	R11,Y+11
    010A 856C      LDD	R22,Y+12
(0145) }
(0146) 
(0147) //****************************写N个字节子程序**********************//
(0148) //函数参数说明:
(0149) //Slave:IIC器件地址,如上文定义的SD2303
(0150) //Address:起始地址
(0151) //Array:读数据存放的数组
(0152) //Number:读取的字节数
(0153) void Write_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
(0154) {uchar k;
(0155)  writ:do                     //开始->写IIC器件地址->检查应答位

⌨️ 快捷键说明

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