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

📄 ds1302.lst

📁 1302+lcd时钟显示C语言程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    003D E5CF      LDI	R28,0x5F
    003E E0D4      LDI	R29,4
    003F BFCD      OUT	0x3D,R28
    0040 BFDE      OUT	0x3E,R29
    0041 51C0      SUBI	R28,0x10
    0042 40D0      SBCI	R29,0
    0043 EA0A      LDI	R16,0xAA
    0044 8308      STD	Y+0,R16
    0045 2400      CLR	R0
    0046 E6E3      LDI	R30,0x63
    0047 E0F0      LDI	R31,0
    0048 E010      LDI	R17,0
    0049 36E5      CPI	R30,0x65
    004A 07F1      CPC	R31,R17
    004B F011      BEQ	0x004E
    004C 9201      ST	R0,Z+
    004D CFFB      RJMP	0x0049
    004E 8300      STD	Z+0,R16
    004F E7E6      LDI	R30,0x76
    0050 E0F0      LDI	R31,0
    0051 E6A0      LDI	R26,0x60
    0052 E0B0      LDI	R27,0
    0053 E010      LDI	R17,0
    0054 37E9      CPI	R30,0x79
    0055 07F1      CPC	R31,R17
    0056 F021      BEQ	0x005B
    0057 95C8      LPM
    0058 9631      ADIW	R30,1
    0059 920D      ST	R0,X+
    005A CFF9      RJMP	0x0054
    005B 940E0294  CALL	_main
_exit:
    005D CFFF      RJMP	_exit
FILE: D:\单片机\ds1302\ds1302_end\delay.c
(0001) /*-----------------------------------------------------------------------
(0002) 延时函数
(0003) 系统时钟:11.0592M
(0004) -----------------------------------------------------------------------*/
(0005) void delay_1us(void)                 //1us延时函数
(0006)   {
(0007)    asm("nop");
_delay_1us:
    005E 0000      NOP
    005F 9508      RET
_delay_nus:
  i                    --> R20
  n                    --> R22
    0060 940E02CB  CALL	push_gset2
    0062 01B8      MOVW	R22,R16
(0008)   }
(0009) 
(0010) void delay_nus(unsigned int n)       //N us延时函数
(0011)   {
(0012)    unsigned int i=0;
    0063 2744      CLR	R20
    0064 2755      CLR	R21
(0013)    for (i=0;i<n;i++)
    0065 C003      RJMP	0x0069
(0014)    delay_1us();
    0066 DFF7      RCALL	_delay_1us
    0067 5F4F      SUBI	R20,0xFF
    0068 4F5F      SBCI	R21,0xFF
    0069 1746      CP	R20,R22
    006A 0757      CPC	R21,R23
    006B F3D0      BCS	0x0066
    006C 940E02BF  CALL	pop_gset2
    006E 9508      RET
(0015)   }
(0016)   
(0017) void delay_1ms(void)                 //1ms延时函数
(0018)   {
(0019)    unsigned int i;
(0020)    for (i=0;i<1140;i++);
_delay_1ms:
  i                    --> R16
    006F 2700      CLR	R16
    0070 2711      CLR	R17
    0071 C002      RJMP	0x0074
    0072 5F0F      SUBI	R16,0xFF
    0073 4F1F      SBCI	R17,0xFF
    0074 3704      CPI	R16,0x74
    0075 E0E4      LDI	R30,4
    0076 071E      CPC	R17,R30
    0077 F3D0      BCS	0x0072
    0078 9508      RET
_delay_nms:
  i                    --> R20
  n                    --> R22
    0079 940E02CB  CALL	push_gset2
    007B 01B8      MOVW	R22,R16
(0021)   }
(0022)   
(0023) void delay_nms(unsigned int n)       //N ms延时函数
(0024)   {
(0025)    unsigned int i=0;
    007C 2744      CLR	R20
    007D 2755      CLR	R21
(0026)    for (i=0;i<n;i++)
    007E C003      RJMP	0x0082
(0027)    delay_1ms();
    007F DFEF      RCALL	_delay_1ms
    0080 5F4F      SUBI	R20,0xFF
    0081 4F5F      SBCI	R21,0xFF
    0082 1746      CP	R20,R22
    0083 0757      CPC	R21,R23
    0084 F3D0      BCS	0x007F
    0085 940E02BF  CALL	pop_gset2
    0087 9508      RET
_delay:
  i                    --> R20
  n                    --> R22
    0088 940E02CB  CALL	push_gset2
    008A 01B8      MOVW	R22,R16
(0028)   }
(0029)   void delay(uint n)//适应粘过来的延时函数
(0030)   {
(0031)    uint i=0;
    008B 2744      CLR	R20
    008C 2755      CLR	R21
(0032)    for (i=0;i<n;i++)
    008D C003      RJMP	0x0091
(0033)    delay_1ms();
    008E DFE0      RCALL	_delay_1ms
    008F 5F4F      SUBI	R20,0xFF
    0090 4F5F      SBCI	R21,0xFF
    0091 1746      CP	R20,R22
    0092 0757      CPC	R21,R23
    0093 F3D0      BCS	0x008E
    0094 940E02BF  CALL	pop_gset2
    0096 9508      RET
FILE: D:\单片机\ds1302\ds1302_end\1602B_LCD.C
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "delay.c"
(0004) #define LCD_EN_PORT    PORTC
(0005) #define LCD_RS_PORT    PORTC
(0006) #define LCD_DATA_PORT  PORTC
(0007) #define LCD_DATA_DDR   DDRC
(0008) 
(0009) #define LCD_EN         BIT(PC3)   //portC5         out
(0010) #define LCD_RS         BIT(PC2)   //portC4         out
(0011) #define LCD_DATA       0xF0  //portC7/6/5/4   out
(0012) unsigned  data_temp;
(0013) 
(0014) 
(0015) /*-----------------------------------------------------------------------
(0016) LCD_write_char    : 英文字符串显示函数
(0017) 
(0018) 输入参数:*s      :英文字符串指针;
(0019)           X、Y    : 显示字符串的位置,X:0-15,Y:0-1
(0020)                     LCD第一行显示寄存器地址:0X80-0X8F
(0021)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0022) 
(0023) 编写日期          :2003-11-19 
(0024) 最后修改日期      :2004-8-19 	
(0025) -----------------------------------------------------------------------*/	
(0026) /*---------写高4bit到LCD----*/
(0027) void LCD_Write_half_char(void)
(0028)   {
(0029)    	 PORTC &= 0x0F; //portc0~3=0 
_LCD_Write_half_char:
    0097 B385      IN	R24,0x15
    0098 708F      ANDI	R24,0xF
    0099 BB85      OUT	0x15,R24
(0030)    	 PORTC |= (data_temp<<4)&0xF0; //send LOW 4bit
    009A 91800063  LDS	R24,data_temp
    009C 91900064  LDS	R25,data_temp+1
    009E 0F88      LSL	R24
    009F 1F99      ROL	R25
    00A0 0F88      LSL	R24
    00A1 1F99      ROL	R25
    00A2 0F88      LSL	R24
    00A3 1F99      ROL	R25
    00A4 0F88      LSL	R24
    00A5 1F99      ROL	R25
    00A6 7F80      ANDI	R24,0xF0
    00A7 7090      ANDI	R25,0
    00A8 B225      IN	R2,0x15
    00A9 2433      CLR	R3
    00AA 2A28      OR	R2,R24
    00AB 2A39      OR	R3,R25
    00AC BA25      OUT	0x15,R2
(0031) 	 PORTC |= LCD_EN; //EN端产生一个由低电平变高电平,写LCD
    00AD 9AAB      SBI	0x15,3
(0032) 	 delay(2);
    00AE E002      LDI	R16,2
    00AF E010      LDI	R17,0
    00B0 DFD7      RCALL	_delay
(0033)      PORTC &= ~LCD_EN; //EN端产生一个由高电平变低电平,写LCD
    00B1 98AB      CBI	0x15,3
(0034)    	 PORTC &= 0X0F; 
    00B2 B385      IN	R24,0x15
    00B3 708F      ANDI	R24,0xF
    00B4 BB85      OUT	0x15,R24
(0035) 	 delay(2); 
    00B5 E002      LDI	R16,2
    00B6 E010      LDI	R17,0
    00B7 DFD0      RCALL	_delay
    00B8 9508      RET
_LCD_write_char:
  data                 --> R20
  command              --> R22
    00B9 940E02CB  CALL	push_gset2
    00BB 01A9      MOVW	R20,R18
    00BC 01B8      MOVW	R22,R16
(0036)    }
(0037) 
(0038) void LCD_write_char(uint command,uint data)
(0039)   {  
(0040)     PORTC &= ~LCD_EN;     
    00BD 98AB      CBI	0x15,3
(0041)     if (command == 0)
    00BE 3060      CPI	R22,0
    00BF 0767      CPC	R22,R23
    00C0 F411      BNE	0x00C3
(0042)    	PORTC &=~LCD_RS;   //RS=0  发送命令
    00C1 98AA      CBI	0x15,2
    00C2 C001      RJMP	0x00C4
(0043) 	else
(0044)     PORTC |=LCD_RS;    //RS=1  发送数据
    00C3 9AAA      SBI	0x15,2
(0045) 	
(0046)     data_temp = data;
    00C4 93500064  STS	data_temp+1,R21
    00C6 93400063  STS	data_temp,R20
(0047) 	data_temp=data_temp >>4;
    00C8 011A      MOVW	R2,R20
    00C9 9436      LSR	R3
    00CA 9427      ROR	R2
    00CB 9436      LSR	R3
    00CC 9427      ROR	R2
    00CD 9436      LSR	R3
    00CE 9427      ROR	R2
    00CF 9436      LSR	R3
    00D0 9427      ROR	R2
    00D1 92300064  STS	data_temp+1,R3
    00D3 92200063  STS	data_temp,R2
(0048)     LCD_Write_half_char();
    00D5 DFC1      RCALL	_LCD_Write_half_char
(0049) 	data_temp = data;
    00D6 93500064  STS	data_temp+1,R21
    00D8 93400063  STS	data_temp,R20
(0050)     LCD_Write_half_char();
    00DA DFBC      RCALL	_LCD_Write_half_char
(0051) 	delay(1);
    00DB E001      LDI	R16,1
    00DC E010      LDI	R17,0
    00DD DFAA      RCALL	_delay
    00DE 940E02BF  CALL	pop_gset2
    00E0 9508      RET
_LCD_set_xy:
  address              --> R20
    00E1 940E02CD  CALL	push_gset1
    00E3 2F40      MOV	R20,R16
(0052)   }
(0053) 
(0054) 
(0055) /*-----------------------------------------------------------------------
(0056) LCD_set_xy        : 设置LCD显示的起始位置
(0057) 
(0058) 输入参数:x、y    : 显示字符串的位置,X:0-15,Y:0-1
(0059)                     LCD第一行显示寄存器地址:0X80-0X8F
(0060)                     LCD第一行显示寄存器地址:0XC0-0XCF
(0061) 
(0062) 编写日期          :2004-8-19 
(0063) 最后修改日期      :2004-8-19 		
(0064) -----------------------------------------------------------------------*/
(0065) 
(0066) void LCD_set_xy( unsigned char address )
(0067)   { 
(0068)        LCD_write_char(0,address);
    00E4 2F24      MOV	R18,R20
    00E5 2733      CLR	R19
    00E6 2700      CLR	R16
    00E7 2711      CLR	R17
    00E8 DFD0      RCALL	_LCD_write_char
    00E9 940E02D0  CALL	pop_gset1
    00EB 9508      RET
_LCD_write_string:
  s                    --> R20
  address              --> R22
    00EC 940E02CB  CALL	push_gset2
    00EE 01A9      MOVW	R20,R18
    00EF 2F60      MOV	R22,R16
(0069)   }  
(0070) 
(0071) /*-----------------------------------------------------------------------
(0072) LCD_write_string  : 英文字符串显示函数
(0073) 
(0074) 输入参数:*s      :英文字符串指针;
(0075)           X、Y    : 显示字符串的位置
(0076) 
(0077) 编写日期          :2004-8-19 
(0078) 最后修改日期      :2004-8-19 		
(0079) -----------------------------------------------------------------------*/
(0080) /*void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0081)   {
(0082)     LCD_set_xy( X, Y );
(0083)     
(0084)     while (*s) 
(0085)       {
(0086)         LCD_write_char(1,*s);
(0087) 	s ++;
(0088)       }
(0089)   }*/
(0090)   void LCD_write_string(unsigned char address,unsigned char *s)
(0091)   {
(0092)    LCD_set_xy(address);
    00F0 2F06      MOV	R16,R22
    00F1 DFEF      RCALL	_LCD_set_xy
    00F2 C008      RJMP	0x00FB
(0093)     while (*s) 
(0094)       {
(0095)         LCD_write_char(1,*s);
    00F3 01FA      MOVW	R30,R20
    00F4 8120      LDD	R18,Z+0
    00F5 2733      CLR	R19
    00F6 E001      LDI	R16,1
    00F7 E010      LDI	R17,0
    00F8 DFC0      RCALL	_LCD_write_char
(0096) 	s ++;
    00F9 5F4F      SUBI	R20,0xFF
    00FA 4F5F      SBCI	R21,0xFF
    00FB 01FA      MOVW	R30,R20
    00FC 8020      LDD	R2,Z+0
    00FD 2022      TST	R2
    00FE F7A1      BNE	0x00F3
    00FF 940E02BF  CALL	pop_gset2
    0101 9508      RET
_LCD_write_onechar:
  data                 --> R20
  address              --> R22
    0102 940E02CB  CALL	push_gset2
    0104 2F42      MOV	R20,R18
    0105 2F60      MOV	R22,R16
(0097)       }
(0098)   }
(0099)   
(0100) /*---------------------------------------------------------
(0101) 显示单个字符函数
(0102) 输入参数:data    :'w'或字符型数据0x37(数字7的ascii码)
(0103)           X、Y    : 显示字符串的位置
(0104) ---------------------------------------------------------*/
(0105) /*void LCD_write_onechar(unsigned char X,unsigned char Y,unsigned char data)
(0106) {
(0107)  LCD_set_xy( X, Y );
(0108)  LCD_write_char( 1, data );
(0109) 
(0110) } */
(0111) 
(0112) void LCD_write_onechar(unsigned char address,unsigned char data)
(0113) {
(0114)  LCD_set_xy( address );
    0106 2F06      MOV	R16,R22
    0107 DFD9      RCALL	_LCD_set_xy
(0115)  LCD_write_char( 1, data );
    0108 2F24      MOV	R18,R20
    0109 2733      CLR	R19
    010A E001      LDI	R16,1
    010B E010      LDI	R17,0
    010C DFAC      RCALL	_LCD_write_char
    010D 940E02BF  CALL	pop_gset2
    010F 9508      RET
(0116) }
(0117) 
(0118) 
(0119) void LCD_init(void)
(0120) {
(0121)   LCD_write_char(0,0x38);         
_LCD_init:
    0110 E328      LDI	R18,0x38
    0111 E030      LDI	R19,0
    0112 2700      CLR	R16
    0113 2711      CLR	R17
    0114 DFA4      RCALL	_LCD_write_char
(0122)   delay(1);  
    0115 E001      LDI	R16,1
    0116 E010      LDI	R17,0
    0117 DF70      RCALL	_delay
(0123)   LCD_write_char(0,0x02);                
    0118 E022      LDI	R18,2
    0119 E030      LDI	R19,0
    011A 2700      CLR	R16
    011B 2711      CLR	R17
    011C DF9C      RCALL	_LCD_write_char
(0124)   delay(1);  
    011D E001      LDI	R16,1
    011E E010      LDI	R17,0
    011F DF68      RCALL	_delay
(0125)   LCD_write_char(0,0x28);     // 显示模式设置(不检测忙信号)  
    0120 E228      LDI	R18,0x28
    0121 E030      LDI	R19,0
    0122 2700      CLR	R16
    0123 2711      CLR	R17
    0124 DF94      RCALL	_LCD_write_char
(0126)   delay(1);   
    0125 E001      LDI	R16,1
    0126 E010      LDI	R17,0
    0127 DF60      RCALL	_delay
(0127)   LCD_write_char(0,0x08);   // 显示关闭  
    0128 E028      LDI	R18,0x8
    0129 E030      LDI	R19,0
    012A 2700      CLR	R16
    012B 2711      CLR	R17
    012C DF8C      RCALL	_LCD_write_char
(0128)   delay(1);  
    012D E001      LDI	R16,1
    012E E010      LDI	R17,0
    012F DF58      RCALL	_delay
(0129)   LCD_write_char(0,0x01);    // 显示清屏  

⌨️ 快捷键说明

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