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

📄 rtc.s

📁 AVRkaifashili.rar
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module RTC.C
	.area data(ram, con, rel)
_Table::
	.blkb 2
	.area idata
	.byte 63,6
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 91,'O
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 'f,'m
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 125,7
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 127,'o
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 56,'v
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
	.dbsym e Table _Table A[12:12]c
_Data::
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
	.blkb 2
	.area idata
	.byte 0,0
	.area data(ram, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
	.dbsym e Data _Data A[4:4]c
	.area text(rom, con, rel)
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第十章程序\RTC.C
	.dbfunc e DelayMs _DelayMs fV
;              j -> R20
;              i -> R16
	.even
_DelayMs::
	rcall push_gset1
	.dbline -1
	.dbline 18
; //***************************FileName:RTC.C************************//
; //***************************ICCAVR V6.30编译**********************//
; 
; #include <io8535v.h>                   //寄存器定义文件
; #include <macros.h>                    //使用到宏
; #define uchar unsigned char            //数据类型定义
; #define uint unsigned char             //数据类型定义
; #define SD2303 0x64                    //SD2303器件IIC识别码
; 
; 
; uchar Table[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};
;      //显示数据表 0    1    2     3   4    5    6    7    8    9    L    H  
; uchar Data[4]={0,0,0,0};               //DS1722
; uchar Enter_Flag;                      //确定
; uchar F_Flag;                          //数据应答标志
; 
; void DelayMs(uint i)                   //延时函数1
; {uchar j;
	.dbline 19
;  for(;i!=0;i--)
	rjmp L5
L2:
	.dbline 20
	.dbline 20
	ldi R20,208
	rjmp L9
L6:
	.dbline 20
	.dbline 20
	.dbline 20
L7:
	.dbline 20
	dec R20
L9:
	.dbline 20
	tst R20
	brne L6
	.dbline 20
L3:
	.dbline 19
	dec R16
L5:
	.dbline 19
	tst R16
	brne L2
	.dbline -2
	.dbline 21
;   {for(j=2000;j!=0;j--) {;}}
; }
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r i 16 c
	.dbend
	.dbfunc e Display _Display fV
;            sel -> R20
;              i -> R22
;              p -> R10,R11
	.even
_Display::
	rcall push_gset3
	mov R10,R16
	mov R11,R17
	.dbline -1
	.dbline 24
; 
; void Display(uchar *p)                //显示函数
; {uchar i,sel=0x00;
	.dbline 24
	clr R20
	.dbline 25
;  for(i=0;i<16;i++)
	clr R22
	rjmp L14
L11:
	.dbline 26
	.dbline 26
	out 0x15,R20
	.dbline 27
	mov R30,R22
	clr R31
	add R30,R10
	adc R31,R11
	ldd R30,z+0
	clr R31
	ldi R24,<_Table
	ldi R25,>_Table
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	out 0x1b,R2
	.dbline 28
	ldi R16,10
	rcall _DelayMs
	.dbline 29
	lsl R20
	.dbline 30
L12:
	.dbline 25
	inc R22
L14:
	.dbline 25
	cpi R22,16
	brlo L11
	.dbline -2
	.dbline 31
;   {PORTC=sel;
;    PORTA=Table[p[i]];
;    DelayMs(10);
;    sel=sel<<1;
;   }
; }
L10:
	rcall pop_gset3
	.dbline 0 ; func end
	ret
	.dbsym r sel 20 c
	.dbsym r i 22 c
	.dbsym r p 10 pc
	.dbend
	.dbfunc e NOPNOP _NOPNOP fV
;              i -> R16
	.even
_NOPNOP::
	.dbline -1
	.dbline 35
	.dbline 35
	rjmp L19
L16:
	.dbline 35
	nop
L17:
	.dbline 35
	dec R16
L19:
	.dbline 35
; 
;   
; void NOPNOP(uchar i)                   //延时函数2
; {for(;i!=0;i--) NOP();}
	tst R16
	brne L16
	.dbline -2
	.dbline 35
L15:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e SetSCL _SetSCL fV
;              i -> R16
	.even
_SetSCL::
	.dbline -1
	.dbline 38
; 
; void SetSCL(uchar i)                   //IIC时钟线SCL设置
; {if(i==1) PORTB=PORTB|0x01;
	.dbline 38
	cpi R16,1
	brne L21
	.dbline 38
	sbi 0x18,0
	rjmp L22
L21:
	.dbline 39
	in R24,0x18
	andi R24,254
	out 0x18,R24
L22:
	.dbline -2
	.dbline 39
;  else     PORTB=PORTB&0xFE;}
L20:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e SetSDA _SetSDA fV
;              i -> R16
	.even
_SetSDA::
	.dbline -1
	.dbline 42
;  
; void SetSDA(uchar i)                   //IIC数据线SDA设置
; {if(i==1) PORTB=PORTB|0x02;
	.dbline 42
	cpi R16,1
	brne L24
	.dbline 42
	sbi 0x18,1
	rjmp L25
L24:
	.dbline 43
	in R24,0x18
	andi R24,253
	out 0x18,R24
L25:
	.dbline -2
	.dbline 43
;  else     PORTB=PORTB&0xFD;}
L23:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e Start _Start fV
	.even
_Start::
	.dbline -1
	.dbline 51
;  
; //SCL=PB^0;       SD2303时钟线  
; //SDA=PB^1;       SD2303数据线 
; //INTRB=PB^3;     SD2303中断线A
; //INTRA=PB^2;     SD2303中断线B
; 
; void Start()                           //IIC总线开始信号
; {SetSDA(1);
	.dbline 51
	ldi R16,1
	rcall _SetSDA
	.dbline 52
;  SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 53
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 54
;  SetSDA(0);
	clr R16
	rcall _SetSDA
	.dbline 55
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 56
;  SetSCL(0);
	clr R16
	.dbline -2
	.dbline 57
; }
L26:
	.dbline 0 ; func end
	rjmp _SetSCL
	.dbend
	.dbfunc e Stop _Stop fV
	.even
_Stop::
	.dbline -1
	.dbline 60
; 
; void Stop()                            //IIC总线停止信号
; {SetSDA(0);             
	.dbline 60
	clr R16
	rcall _SetSDA
	.dbline 61
;  SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 62
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 63
;  SetSDA(1);
	ldi R16,1
	rcall _SetSDA
	.dbline 64
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 65
;  SetSCL(0);
	clr R16
	.dbline -2
	.dbline 66
; }
L27:
	.dbline 0 ; func end
	rjmp _SetSCL
	.dbend
	.dbfunc e Ack _Ack fV
	.even
_Ack::
	.dbline -1
	.dbline 69
; 
; void Ack()                             //单片机应答信号
; {SetSDA(0);
	.dbline 69
	clr R16
	rcall _SetSDA
	.dbline 70
;  SetSCL(1);   
	ldi R16,1
	rcall _SetSCL
	.dbline 71
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 72
;  SetSCL(0);
	clr R16
	rcall _SetSCL
	.dbline 73
;  SetSDA(1);     
	ldi R16,1
	.dbline -2
	.dbline 74
; }
L28:
	.dbline 0 ; func end
	rjmp _SetSDA
	.dbend
	.dbfunc e Nack _Nack fV
	.even
_Nack::
	.dbline -1
	.dbline 77
; 
; void Nack()                            //单片机非应答信号
; {SetSDA(1);
	.dbline 77
	ldi R16,1
	rcall _SetSDA
	.dbline 78
;  SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 79
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 80
;  SetSCL(0);
	clr R16
	rcall _SetSCL
	.dbline 81
;  SetSDA(0);
	clr R16
	.dbline -2
	.dbline 82
; }
L29:
	.dbline 0 ; func end
	rjmp _SetSDA
	.dbend
	.dbfunc e Check_Ack _Check_Ack fV
	.even
_Check_Ack::
	.dbline -1
	.dbline 85
; 
; void Check_Ack()                       //器件应答信号检查
; {SetSDA(1);
	.dbline 85
	ldi R16,1
	rcall _SetSDA
	.dbline 86
;  SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 87
;  F_Flag=0;
	clr R2
	sts _F_Flag,R2
	.dbline 88
;  DDRB=DDRB&0xFD; 
	in R24,0x17
	andi R24,253
	out 0x17,R24
	.dbline 89
;  if((PINB&0x02)==0)
	sbic 0x16,1
	rjmp L31
	.dbline 90
;    {SetSCL(0);
	.dbline 90
	clr R16
	rcall _SetSCL
	.dbline 91
;     NOPNOP(50);}
	ldi R16,50
	rcall _NOPNOP
	.dbline 91
	rjmp L32
L31:
	.dbline 93
;  else
;     {F_Flag=1;
	.dbline 93
	ldi R24,1
	sts _F_Flag,R24
	.dbline 94
;      SetSCL(0);
	clr R16
	rcall _SetSCL
	.dbline 95
;      NOPNOP(50);}
	ldi R16,50
	rcall _NOPNOP
	.dbline 95
L32:
	.dbline 96
; DDRB=DDRB|0x02;
	sbi 0x17,1
	.dbline -2
	.dbline 97
; }
L30:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Write_Bit0 _Write_Bit0 fV
	.even
_Write_Bit0::
	.dbline -1
	.dbline 100
; 
; void Write_Bit0()                      //向IIC总线写0
; {SetSDA(0);
	.dbline 100
	clr R16
	rcall _SetSDA
	.dbline 101
;  SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 102
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 103
;  SetSCL(0);
	clr R16
	.dbline -2
	.dbline 104
; }
L33:
	.dbline 0 ; func end
	rjmp _SetSCL
	.dbend
	.dbfunc e Write_Bit1 _Write_Bit1 fV
	.even
_Write_Bit1::
	.dbline -1
	.dbline 107
; 
; void Write_Bit1()                      //向IIC总线写1
; {SetSDA(1);
	.dbline 107
	ldi R16,1
	rcall _SetSDA
	.dbline 108
;  SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 109
;  NOPNOP(50);
	ldi R16,50
	rcall _NOPNOP
	.dbline 110
;  SetSCL(0);
	clr R16
	rcall _SetSCL
	.dbline 111
;  SetSDA(0);
	clr R16
	.dbline -2
	.dbline 112
; }
L34:
	.dbline 0 ; func end
	rjmp _SetSDA
	.dbend
	.dbfunc e Write_Byte _Write_Byte fV
;              i -> R20
;           Data -> R22
	.even
_Write_Byte::
	rcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 115
; 
; void Write_Byte(uchar Data)            //向IIC总线写一字节数据
; {uchar i;
	.dbline 116
;  for(i=0;i<8;i++)
	clr R20
	rjmp L39
L36:
	.dbline 117
;    {if((Data&0x80)>0)       
	.dbline 117
	clr R2
	mov R24,R22
	andi R24,128
	cp R2,R24
	brsh L40
	.dbline 118
;          Write_Bit1();
	rcall _Write_Bit1
	rjmp L41
L40:
	.dbline 120
;     else
;          Write_Bit0();
	rcall _Write_Bit0
L41:
	.dbline 121
	lsl R22
	.dbline 122
L37:
	.dbline 116
	inc R20
L39:
	.dbline 116
	cpi R20,8
	brlo L36
	.dbline -2
	.dbline 123
;     Data<<=1;                        
;     }
; }
L35:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r Data 22 c
	.dbend
	.dbfunc e Read_Byte _Read_Byte fc
;              j -> R20
;             nn -> R22
	.even
_Read_Byte::
	rcall push_gset2
	.dbline -1
	.dbline 127
; 
; 
; uchar Read_Byte()                      //从IIC总线读一字节数据
; {uchar nn=0xff;             
	.dbline 127
	ldi R22,255
	.dbline 129
;  uchar j;
;  for (j=0;j<8;j++)
	clr R20
	rjmp L46
L43:
	.dbline 130
;     {SetSDA(1);
	.dbline 130
	ldi R16,1
	rcall _SetSDA
	.dbline 131
;      SetSCL(1);
	ldi R16,1
	rcall _SetSCL
	.dbline 132
;      DDRB=DDRB&0xFB;
	in R24,0x17
	andi R24,251
	out 0x17,R24
	.dbline 134
; 	
;        if((PINB&0x02)==0)
	sbic 0x16,1
	rjmp L47
	.dbline 135
; 	    {nn<<=1;
	.dbline 135
	lsl R22
	.dbline 136
;          nn=(nn&0xfe);                 
	andi R22,254
	.dbline 137
;          SetSCL(0);}
	clr R16
	rcall _SetSCL
	.dbline 137
	rjmp L48
L47:
	.dbline 139
;      else 
;         {nn<<=1;
	.dbline 139
	lsl R22
	.dbline 140
;          nn=(nn|0x01);                 
	ori R22,1
	.dbline 141
;          SetSCL(0);}
	clr R16
	rcall _SetSCL
	.dbline 141
L48:
	.dbline 142
L44:
	.dbline 129
	inc R20
L46:
	.dbline 129
	cpi R20,8
	brlo L43
	.dbline 143
;     }
;   DDRB=DDRB|0x02;
	sbi 0x17,1
	.dbline 144
;  return(nn);              
	mov R16,R22
	.dbline -2
L42:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r nn 22 c
	.dbend
	.dbfunc e Write_Nbyte _Write_Nbyte fV
;              k -> R20
;         Number -> R22
;          Array -> R10,R11
;        Address -> R12
;          Slave -> R14
	.even
_Write_Nbyte::
	rcall push_gset5
	mov R12,R18
	mov R14,R16
	ldd R10,y+10
	ldd R11,y+11
	ldd R22,y+12
	.dbline -1
	.dbline 154
; }
; 
; //****************************写N个字节子程序**********************//
; //函数参数说明:
; //Slave:IIC器件地址,如上文定义的SD2303
; //Address:起始地址
; //Array:读数据存放的数组
; //Number:读取的字节数
; void Write_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
; {uchar k;
L50:
L51:
	.dbline 156
;  writ:do                     //开始->写IIC器件地址->检查应答位
;     {Start();
	.dbline 156
	rcall _Start
	.dbline 157
;      Write_Byte(Slave);
	mov R16,R14
	rcall _Write_Byte
	.dbline 158
;      Check_Ack();
	rcall _Check_Ack
	.dbline 159
L52:
	.dbline 159
;     }while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L51
L54:
	.dbline 161
;    do
;     {Write_Byte(Address<<4); //送起始地址->检查应答位
	.dbline 161
	mov R16,R12
	andi R16,#0x0F
	swap R16
	rcall _Write_Byte
	.dbline 162
;      Check_Ack();
	rcall _Check_Ack
	.dbline 163
L55:
	.dbline 163
;     }while(F_Flag==1);
	lds R24,_F_Flag
	cpi R24,1
	breq L54
	.dbline 164
;    for(k=0;k<Number;k++)     //写Number个数据
	clr R20
	rjmp L60
L57:
	.dbline 165
	.dbline 165
	mov R30,R10
	mov R31,R11
	ldd R16,z+0
	rcall _Write_Byte
	.dbline 166
	mov R24,R10
	mov R25,R11
	adiw R24,1
	mov R10,R24
	mov R11,R25
	.dbline 167
	rcall _Check_Ack
	.dbline 167
L58:
	.dbline 164
	inc R20
L60:
	.dbline 164
	cp R20,R22
	brlo L57
	.dbline 168
;     {Write_Byte(*Array);
; 	 Array++;
;      Check_Ack();}           //检查应答位
;    Stop();                 
	rcall _Stop
	.dbline -2
	.dbline 169
; }
L49:
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r k 20 c

⌨️ 快捷键说明

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