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

📄 ds1203.lst

📁 1602液晶显示模块
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    0023 E5CF      LDI	R28,0x5F
    0024 E0D4      LDI	R29,4
    0025 BFCD      OUT	0x3D,R28
    0026 BFDE      OUT	0x3E,R29
    0027 51C0      SUBI	R28,0x10
    0028 40D0      SBCI	R29,0
    0029 EA0A      LDI	R16,0xAA
    002A 8308      STD	Y+0,R16
    002B 2400      CLR	R0
    002C E7E6      LDI	R30,0x76
    002D E0F0      LDI	R31,0
    002E E010      LDI	R17,0
    002F 38E4      CPI	R30,0x84
    0030 07F1      CPC	R31,R17
    0031 F011      BEQ	0x0034
    0032 9201      ST	R0,Z+
    0033 CFFB      RJMP	0x002F
    0034 8300      STD	Z+0,R16
    0035 E3E0      LDI	R30,0x30
    0036 E0F0      LDI	R31,0
    0037 E6A0      LDI	R26,0x60
    0038 E0B0      LDI	R27,0
    0039 E010      LDI	R17,0
    003A 34E6      CPI	R30,0x46
    003B 07F1      CPC	R31,R17
    003C F021      BEQ	0x0041
    003D 95C8      LPM
    003E 9631      ADIW	R30,1
    003F 920D      ST	R0,X+
    0040 CFF9      RJMP	0x003A
    0041 D191      RCALL	_main
_exit:
    0042 CFFF      RJMP	_exit
FILE: E:\biyesheji\TESTBE~1\DS1302\程序\ds1302.h
(0001) //ICC-AVR 修改日期: 2006-11-06 15:38:44
(0002) //姓名:荣俊齐
(0003) // Target : M8
(0004) // Crystal: 1.0000Mhz
(0005) #define uchar   unsigned char  
(0006) /******************************************************************************
(0007)                         定义DS1302
(0008) ********************************************************************************/
(0009) #define DS1302_RESET1       PORTC|=(1<<PC0)  
(0010) #define DS1302_RESET0       PORTC&=~(1<<PC0)  
(0011) #define DS1302_CLK1         PORTC|=(1<<PC1)
(0012) #define DS1302_CLK0         PORTC&=~(1<<PC1) 
(0013) #define DS1302_READ_DATA    PINC&0X04
(0014) #define DS1302_WRITE_DATA1  PORTC|=(1<<PC2)
(0015) #define DS1302_WRITE_DATA0  PORTC&=~(1<<PC2) 
(0016) #define DS1302_DATA_OUTPUT  DDRC|=(1<<PC2)
(0017) #define DS1302_DATA_INPUT   DDRC&=~(1<<PC2) 
(0018) /****************************************************************************
(0019)                      定义读写单元地址
(0020) *****************************************************************************/
(0021) //读
(0022) #define Rsec  0x81            //秒
(0023) #define Rmin  0x83            //分
(0024) #define Rhou  0x85            //时
(0025) #define Rdat  0x87            //日
(0026) #define Rmon  0x89            //月
(0027) #define Rwee  0x8b            //周
(0028) #define Ryea  0x8d            //年
(0029) //写
(0030) #define Wsec1  0x80            //秒
(0031) #define Wmin1  0x82            //分
(0032) #define Whou1  0x84            //时
(0033) #define Wdat1  0x86            //日
(0034) #define Wmon1  0x88            //月
(0035) #define Wwee1  0x8a            //周
(0036) #define Wyea1  0x8c            //年
(0037) int second,minute,hour,date,week,month,year;   //读出后的时间存储单元
(0038) char WriteAddress[7]={Wyea1,Wmon1,Wdat1,Whou1,Wmin1,Wsec1,Wwee1};  //写地址
(0039) char    WriteTime[7]={0x10,0x12,0x31,0x24,0x50,0x30,0x00};//写的时间
(0040) /******************************************************************************
(0041)                         定义DS1302初始化程序
(0042) ********************************************************************************/
(0043) void DS1302_set(void) 
(0044) {  char i;
(0045)    DS1302_CLK0;            
_DS1302_set:
  i                    --> R16
    0043 98A9      CBI	0x15,1
(0046)    DS1302_RESET0; 
    0044 98A8      CBI	0x15,0
(0047)    for(i=0;i<8;i++)
    0045 2700      CLR	R16
    0046 C002      RJMP	0x0049
(0048)    {
(0049)      NOP();
    0047 0000      NOP
    0048 9503      INC	R16
    0049 3008      CPI	R16,0x8
    004A F3E0      BCS	0x0047
(0050)    }
(0051)     DS1302_RESET1; 
    004B 9AA8      SBI	0x15,0
    004C 9508      RET
_DS1302_Write:
  i                    --> R20
  x                    --> R22
    004D D1C5      RCALL	push_gset2
    004E 2F60      MOV	R22,R16
(0052) }
(0053) /******************************************************************************
(0054)                         定义m8向DS1302发送程序
(0055) ********************************************************************************/
(0056) void DS1302_Write(char x)
(0057) {
(0058)   int i;
(0059)  
(0060)   DS1302_CLK0;             
    004F 98A9      CBI	0x15,1
(0061)   DS1302_DATA_OUTPUT;              //控制数据线
    0050 9AA2      SBI	0x14,2
(0062)  for(i=0;i<8;i++)
    0051 2744      CLR	R20
    0052 2755      CLR	R21
(0063)         {  DS1302_CLK0;             //输出
    0053 98A9      CBI	0x15,1
(0064)         if((x&(1<<i)))
    0054 E001      LDI	R16,1
    0055 E010      LDI	R17,0
    0056 019A      MOVW	R18,R20
    0057 D202      RCALL	lsl16
    0058 2E26      MOV	R2,R22
    0059 2433      CLR	R3
    005A 2220      AND	R2,R16
    005B 2231      AND	R3,R17
    005C 2022      TST	R2
    005D F411      BNE	0x0060
    005E 2033      TST	R3
    005F F011      BEQ	0x0062
(0065)             DS1302_WRITE_DATA1 ;
    0060 9AAA      SBI	0x15,2
    0061 C001      RJMP	0x0063
(0066)         else 
(0067)            DS1302_WRITE_DATA0 ;
    0062 98AA      CBI	0x15,2
(0068) 	       NOP();
    0063 0000      NOP
(0069) 		DS1302_CLK1; 
    0064 9AA9      SBI	0x15,1
(0070) 		  NOP();
    0065 0000      NOP
    0066 5F4F      SUBI	R20,0xFF
    0067 4F5F      SBCI	R21,0xFF
    0068 3048      CPI	R20,0x8
    0069 E0E0      LDI	R30,0
    006A 075E      CPC	R21,R30
    006B F33C      BLT	0x0053
(0071)           }
(0072)   DS1302_CLK0;
    006C 98A9      CBI	0x15,1
    006D D199      RCALL	pop_gset2
    006E 9508      RET
_DS1302_WriteT:
  time                 --> R20
  ddr                  --> R22
    006F D1A3      RCALL	push_gset2
    0070 2F42      MOV	R20,R18
    0071 2F60      MOV	R22,R16
(0073) }
(0074) //单独矫正某个时间单元
(0075) void DS1302_WriteT(char ddr,char time)
(0076) {
(0077) DS1302_set();
    0072 DFD0      RCALL	_DS1302_set
(0078) DS1302_Write(ddr);
    0073 2F06      MOV	R16,R22
    0074 DFD8      RCALL	_DS1302_Write
(0079) DS1302_Write(time);
    0075 2F04      MOV	R16,R20
    0076 DFD6      RCALL	_DS1302_Write
    0077 D18F      RCALL	pop_gset2
    0078 9508      RET
_DS1302_Read:
  temp                 --> R20
  temp2                --> R22
  temp1                --> R10
  k                    --> R12
  n                    --> R14
  xx                   --> R12
    0079 D193      RCALL	push_gset5
    007A 2EC0      MOV	R12,R16
(0080) } 
(0081) /******************************************************************************
(0082)                         定义m8由DS1302接收程序
(0083) ********************************************************************************/
(0084) uchar DS1302_Read(char xx) 
(0085) {     
(0086)     uchar temp=0,k,n; 
    007B 2744      CLR	R20
(0087)     uchar   temp1=0; 
    007C 24AA      CLR	R10
(0088) 	uchar  temp2=0;
    007D 2766      CLR	R22
(0089) 	 DS1302_set();	  
    007E DFC4      RCALL	_DS1302_set
(0090) 	DS1302_Write(xx);
    007F 2D0C      MOV	R16,R12
    0080 DFCC      RCALL	_DS1302_Write
(0091)   	DS1302_DATA_INPUT;              //释放数据线
    0081 98A2      CBI	0x14,2
(0092) 	DS1302_CLK0;     //时钟线拉低
    0082 98A9      CBI	0x15,1
(0093)     for(n=0;n<4;n++) 
    0083 24EE      CLR	R14
    0084 C015      RJMP	0x009A
(0094)        { DS1302_CLK0;     //时钟线拉低
    0085 98A9      CBI	0x15,1
(0095) 	       NOP();  
    0086 0000      NOP
(0096)       k=DS1302_READ_DATA;    //读数据,从低位开始 
    0087 B383      IN	R24,0x13
    0088 7084      ANDI	R24,4
    0089 2EC8      MOV	R12,R24
(0097)       if(k==0x04) 
    008A 3084      CPI	R24,4
    008B F429      BNE	0x0091
(0098)       temp1|=(1<<n); 
    008C E001      LDI	R16,1
    008D 2D1E      MOV	R17,R14
    008E D1D2      RCALL	lsl8
    008F 2AA0      OR	R10,R16
    0090 C006      RJMP	0x0097
(0099)       else 
(0100)       temp1&=~(1<<n);
    0091 E001      LDI	R16,1
    0092 2D1E      MOV	R17,R14
    0093 D1CD      RCALL	lsl8
    0094 2E20      MOV	R2,R16
    0095 9420      COM	R2
    0096 20A2      AND	R10,R2
(0101) 	   DS1302_CLK1;     //时钟线拉高
    0097 9AA9      SBI	0x15,1
(0102)         NOP();     
    0098 0000      NOP
    0099 94E3      INC	R14
    009A 2D8E      MOV	R24,R14
    009B 3084      CPI	R24,4
    009C F340      BCS	0x0085
(0103)    } 
(0104)     for(n=0;n<3;n++) 
    009D 24EE      CLR	R14
    009E C015      RJMP	0x00B4
(0105)        { DS1302_CLK0;     //时钟线拉低
    009F 98A9      CBI	0x15,1
(0106) 	       NOP();  
    00A0 0000      NOP
(0107)       k=DS1302_READ_DATA;    //读数据,从低位开始 
    00A1 B383      IN	R24,0x13
    00A2 7084      ANDI	R24,4
    00A3 2EC8      MOV	R12,R24
(0108)       if(k==0x04) 
    00A4 3084      CPI	R24,4
    00A5 F429      BNE	0x00AB
(0109)       temp2|=(1<<n); 
    00A6 E001      LDI	R16,1
    00A7 2D1E      MOV	R17,R14
    00A8 D1B8      RCALL	lsl8
    00A9 2B60      OR	R22,R16
    00AA C006      RJMP	0x00B1
(0110)       else 
(0111)       temp2&=~(1<<n);
    00AB E001      LDI	R16,1
    00AC 2D1E      MOV	R17,R14
    00AD D1B3      RCALL	lsl8
    00AE 2E20      MOV	R2,R16
    00AF 9420      COM	R2
    00B0 2162      AND	R22,R2
(0112) 	   DS1302_CLK1;     //时钟线拉高
    00B1 9AA9      SBI	0x15,1
(0113)         NOP(); //60~120us      
    00B2 0000      NOP
    00B3 94E3      INC	R14
    00B4 2D8E      MOV	R24,R14
    00B5 3083      CPI	R24,3
    00B6 F340      BCS	0x009F
(0114)    } 
(0115)    temp=10*temp1+temp2;
    00B7 E08A      LDI	R24,0xA
    00B8 9D8A      MUL	R24,R10
    00B9 2D40      MOV	R20,R0
    00BA 0F46      ADD	R20,R22
(0116)    	   DS1302_CLK0;     //时钟线拉低
    00BB 98A9      CBI	0x15,1
(0117)    return (temp); 
    00BC 2F04      MOV	R16,R20
    00BD D14D      RCALL	pop_gset5
    00BE 9508      RET
(0118) } 
(0119) /******************************************************************************
(0120)                         定义DS1302读出时间程序
(0121) ********************************************************************************/
(0122) void DS1302_ReadTime(void)
(0123)  {
(0124)    second=DS1302_Read(Rsec);
_DS1302_ReadTime:
    00BF E801      LDI	R16,0x81
    00C0 DFB8      RCALL	_DS1302_Read
    00C1 2E20      MOV	R2,R16
    00C2 2433      CLR	R3
    00C3 92300083  STS	second+1,R3
    00C5 92200082  STS	second,R2
(0125)    minute=DS1302_Read(Rmin);
    00C7 E803      LDI	R16,0x83
    00C8 DFB0      RCALL	_DS1302_Read
    00C9 2E20      MOV	R2,R16
    00CA 2433      CLR	R3
    00CB 92300081  STS	minute+1,R3
    00CD 92200080  STS	minute,R2
(0126)    hour=DS1302_Read(Rhou);
    00CF E805      LDI	R16,0x85
    00D0 DFA8      RCALL	_DS1302_Read
    00D1 2E20      MOV	R2,R16
    00D2 2433      CLR	R3
    00D3 9230007F  STS	hour+1,R3
    00D5 9220007E  STS	hour,R2
(0127)    date=DS1302_Read(Rdat);
    00D7 E807      LDI	R16,0x87
    00D8 DFA0      RCALL	_DS1302_Read
    00D9 2E20      MOV	R2,R16
    00DA 2433      CLR	R3
    00DB 9230007D  STS	date+1,R3
    00DD 9220007C  STS	date,R2
(0128)    month=DS1302_Read(Rmon);
    00DF E809      LDI	R16,0x89
    00E0 DF98      RCALL	_DS1302_Read
    00E1 2E20      MOV	R2,R16
    00E2 2433      CLR	R3
    00E3 92300079  STS	month+1,R3
    00E5 92200078  STS	month,R2
(0129)    year=DS1302_Read(Ryea);
    00E7 E80D      LDI	R16,0x8D
    00E8 DF90      RCALL	_DS1302_Read
    00E9 2E20      MOV	R2,R16
    00EA 2433      CLR	R3
    00EB 92300077  STS	year+1,R3
    00ED 92200076  STS	year,R2
    00EF 9508      RET
_DS1302_WriteTime:
  time                 --> R20
  ddr                  --> R22
    00F0 D122      RCALL	push_gset2
(0130)  
(0131)  }
(0132) /******************************************************************************
(0133)                         定义DS1302矫正时间程序
(0134) ********************************************************************************/
(0135) void DS1302_WriteTime(void)
(0136) {char *ddr,*time;
(0137)  ddr=WriteAddress;
    00F1 E660      LDI	R22,0x60
    00F2 E070      LDI	R23,0
(0138)  time=WriteTime;
    00F3 E647      LDI	R20,0x67
    00F4 E050      LDI	R21,0
    00F5 C009      RJMP	0x00FF
(0139)  while(*ddr)
(0140)  {
(0141)  DS1302_WriteT(*ddr,*time);
    00F6 01FA      MOVW	R30,R20
    00F7 8120      LDD	R18,Z+0
    00F8 01FB      MOVW	R30,R22
    00F9 8100      LDD	R16,Z+0
    00FA DF74      RCALL	_DS1302_WriteT
(0142)  ddr++;
    00FB 5F6F      SUBI	R22,0xFF
    00FC 4F7F      SBCI	R23,0xFF
(0143)  time++;
    00FD 5F4F      SUBI	R20,0xFF
    00FE 4F5F      SBCI	R21,0xFF
    00FF 01FB      MOVW	R30,R22
    0100 8020      LDD	R2,Z+0
    0101 2022      TST	R2
    0102 F799      BNE	0x00F6
    0103 D103      RCALL	pop_gset2
    0104 9508      RET
FILE: E:\biyesheji\TESTBE~1\DS1302\程序\DELAY.C
(0001) 
(0002) #define XTAL 1    //晶振频率,单位MHz  定义为全局变量
(0003) 
(0004) void delay_1us(void)                 //1us延时函数
(0005)   {
(0006)    asm("nop");
_delay_1us:
    0105 0000      NOP
    0106 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0107 D10B      RCALL	push_gset2
    0108 01B8      MOVW	R22,R16
(0007)   }
(0008) 
(0009) void delay_nus(unsigned int n)       //N us延时函数
(0010)   {
(0011)    unsigned int i=0;
    0109 2744      CLR	R20
    010A 2755      CLR	R21
(0012)    for (i=0;i<n;i++)
    010B C003      RJMP	0x010F
(0013)    delay_1us();
    010C DFF8      RCALL	_delay_1us
    010D 5F4F      SUBI	R20,0xFF
    010E 4F5F      SBCI	R21,0xFF
    010F 1746      CP	R20,R22
    0110 0757      CPC	R21,R23
    0111 F3D0      BCS	0x010C
    0112 D0F4      RCALL	pop_gset2
    0113 9508      RET
(0014)   }
(0015)   
(0016) void delay_1ms(void)                 //1ms延时函数
(0017)   {
(0018)    unsigned int i;
(0019)    for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
  i                    --> R16
    0114 2700      CLR	R16
    0115 2711      CLR	R17
    0116 C002      RJMP	0x0119
    0117 5F0F      SUBI	R16,0xFF
    0118 4F1F      SBCI	R17,0xFF
    0119 380D      CPI	R16,0x8D
    011A E0E0      LDI	R30,0
    011B 071E      CPC	R17,R30
    011C F3D0      BCS	0x0117
    011D 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    011E D0F4      RCALL	push_gset2
    011F 01B8      MOVW	R22,R16
(0020)   }
(0021)   
(0022) void delay_nms(unsigned int n)       //N ms延时函数
(0023)   {
(0024)    unsigned int i=0;
    0120 2744      CLR	R20
    0121 2755      CLR	R21
(0025)    for (i=0;i<n;i++)
    0122 C003      RJMP	0x0126
(0026)    {
(0027)       delay_1ms();
    0123 DFF0      RCALL	_delay_1ms
    0124 5F4F      SUBI	R20,0xFF
    0125 4F5F      SBCI	R21,0xFF
    0126 1746      CP	R20,R22
    0127 0757      CPC	R21,R23
    0128 F3D0      BCS	0x0123
    0129 D0DD      RCALL	pop_gset2
    012A 9508      RET
FILE: E:\biyesheji\TESTBE~1\DS1302\程序\DS1302.c
(0001) //ICC-AVR 修改日期: 2006-10-29 15:38:44
(0002) //姓名:荣俊齐
(0003) // Target : M8
(0004) // Crystal: 1.0000Mhz
(0005) 
(0006) #include <iom8v.h>
(0007) #include <macros.h>
(0008) #include "ds1302.h"
(0009) #include "DELAY.C"
(0010) const char SEG_table[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
(0011) char  Sec_buffer[4]={0,0,0,0};
(0012) char  Min_buffer[4]={0,0,0,0};
(0013) 
(0014) /******************************************************************************
(0015)                         定义164的时钟和数据线
(0016) ********************************************************************************/
(0017) #define DATA_1  PORTD|=(1<<0)
(0018) #define DATA_0  PORTD&=~(1<<0)

⌨️ 快捷键说明

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