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

📄 1302-162.lst

📁 1302_18b20_8515基于AVR单片机的开发系统。 在使用中通过仿真来实现。可以将此程序扩展成其他外围设备的基础
💻 LST
📖 第 1 页 / 共 3 页
字号:
    00E9 D104      RCALL	_init_lcd
(0045) init_time();
    00EA DFD3      RCALL	_init_time
    00EB C098      RJMP	0x0184
(0046)    while(1)
(0047)     {
(0048) 	 LCD_set_xy(0,0);
    00EC 2722      CLR	R18
    00ED 2700      CLR	R16
    00EE D0D1      RCALL	_LCD_set_xy
(0049) 	 for(i=0;i<9;i+=2)
    00EF 2400      CLR	R0
    00F0 820A      STD	Y+2,R0
    00F1 C018      RJMP	0x010A
(0050) 	 {
(0051)    	  s=read_data(0x89-i);
    00F2 802A      LDD	R2,Y+2
    00F3 2433      CLR	R3
    00F4 E809      LDI	R16,0x89
    00F5 1902      SUB	R16,R2
    00F6 0913      SBC	R17,R3
    00F7 DF7D      RCALL	_read_data
    00F8 2F60      MOV	R22,R16
(0052) 	  tl=s&0x0f;
    00F9 2F46      MOV	R20,R22
    00FA 704F      ANDI	R20,0xF
(0053)    	  th=(s>>4);
    00FB 2F86      MOV	R24,R22
    00FC 9582      SWAP	R24
    00FD 708F      ANDI	R24,0xF
    00FE 2EC8      MOV	R12,R24
(0054)    	  LCD_write_char(th+48);
    00FF 2F08      MOV	R16,R24
    0100 5D00      SUBI	R16,0xD0
    0101 D0CE      RCALL	_LCD_write_char
(0055)       LCD_write_char(tl+48);
    0102 2F04      MOV	R16,R20
    0103 5D00      SUBI	R16,0xD0
    0104 D0CB      RCALL	_LCD_write_char
(0056) 	  LCD_write_char(':');
    0105 E30A      LDI	R16,0x3A
    0106 D0C9      RCALL	_LCD_write_char
    0107 818A      LDD	R24,Y+2
    0108 5F8E      SUBI	R24,0xFE
    0109 838A      STD	Y+2,R24
    010A 818A      LDD	R24,Y+2
    010B 3089      CPI	R24,0x9
    010C F328      BCS	0x00F2
(0057) 	 }
(0058) 	  s=read_data(0x8b);
    010D E80B      LDI	R16,0x8B
    010E DF66      RCALL	_read_data
    010F 2F60      MOV	R22,R16
(0059) 	  tl=s&0x0f;
    0110 2F46      MOV	R20,R22
    0111 704F      ANDI	R20,0xF
(0060)       LCD_write_char(tl+48);
    0112 2F04      MOV	R16,R20
    0113 5D00      SUBI	R16,0xD0
    0114 D0BB      RCALL	_LCD_write_char
(0061) 	  
(0062) 	 a=init_1820();               //复位18b20   
    0115 D0F8      RCALL	_init_1820
    0116 2EA0      MOV	R10,R16
(0063) if(a==0x01)
    0117 3001      CPI	R16,1
    0118 F441      BNE	0x0121
(0064) {
(0065) LCD_write_string(0,1,"wrong"); //初始化失败
    0119 E68D      LDI	R24,0x6D
    011A E090      LDI	R25,0
    011B 8399      STD	Y+1,R25
    011C 8388      STD	Y+0,R24
    011D E021      LDI	R18,1
    011E 2700      CLR	R16
    011F D0B8      RCALL	_LCD_write_string
(0066) }
    0120 C007      RJMP	0x0128
(0067) else
(0068) {
(0069) LCD_write_string(0,1,"temper is");//初始化成功
    0121 E683      LDI	R24,0x63
    0122 E090      LDI	R25,0
    0123 8399      STD	Y+1,R25
    0124 8388      STD	Y+0,R24
    0125 E021      LDI	R18,1
    0126 2700      CLR	R16
    0127 D0B0      RCALL	_LCD_write_string
(0070) }                  
(0071)      write_1820(0xCC);              // SKIP THE ROM
    0128 EC0C      LDI	R16,0xCC
    0129 D0F8      RCALL	_write_1820
(0072)       write_1820(0x44);              //启动温度转换
    012A E404      LDI	R16,0x44
    012B D0F6      RCALL	_write_1820
(0073) 	  for(i=0;i<200;i++)           //每次转换需要延时200ms以上 
    012C 2400      CLR	R0
    012D 820A      STD	Y+2,R0
    012E C005      RJMP	0x0134
(0074)         delay(200);   
    012F EC08      LDI	R16,0xC8
    0130 DF06      RCALL	_delay
    0131 800A      LDD	R0,Y+2
    0132 9403      INC	R0
    0133 820A      STD	Y+2,R0
    0134 818A      LDD	R24,Y+2
    0135 3C88      CPI	R24,0xC8
    0136 F3C0      BCS	0x012F
(0075)       a=init_1820();               //复位18b20 
    0137 D0D6      RCALL	_init_1820
    0138 2EA0      MOV	R10,R16
(0076)       write_1820(0xCC);               //SKIP THE ROM
    0139 EC0C      LDI	R16,0xCC
    013A D0E7      RCALL	_write_1820
(0077)       write_1820(0xBE);               //读寄存器命令
    013B EB0E      LDI	R16,0xBE
    013C D0E5      RCALL	_write_1820
(0078)       teml=read_1820();              //读低字节数据 
    013D D107      RCALL	_read_1820
    013E 2EE0      MOV	R14,R16
(0079)       temh=read_1820();              //读高字节数据 
    013F D105      RCALL	_read_1820
    0140 2EC0      MOV	R12,R16
(0080) 	  temm=teml;
    0141 2D4E      MOV	R20,R14
(0081) 	  temm&=0x0F;
    0142 704F      ANDI	R20,0xF
(0082) 	  teml>>=4;
    0143 2D8E      MOV	R24,R14
    0144 9582      SWAP	R24
    0145 708F      ANDI	R24,0xF
    0146 2EE8      MOV	R14,R24
(0083) 	  temh<<=4;
    0147 2D8C      MOV	R24,R12
    0148 708F      ANDI	R24,0xF
    0149 9582      SWAP	R24
    014A 2EC8      MOV	R12,R24
(0084) 	  count=teml|temh;
    014B 2D6E      MOV	R22,R14
    014C 2B68      OR	R22,R24
(0085) 	  temh_d=count/10;
    014D E01A      LDI	R17,0xA
    014E 2F06      MOV	R16,R22
    014F D158      RCALL	div8u
    0150 93000075  STS	temh_d,R16
(0086) 	  temm_d=(temm*6)/10;
    0152 2F24      MOV	R18,R20
    0153 2733      CLR	R19
    0154 E006      LDI	R16,6
    0155 E010      LDI	R17,0
    0156 D190      RCALL	mpy16s
    0157 E02A      LDI	R18,0xA
    0158 E030      LDI	R19,0
    0159 D117      RCALL	div16s
    015A 93000073  STS	temm_d,R16
(0087) 	  teml_d=count%10;
    015C E01A      LDI	R17,0xA
    015D 2F06      MOV	R16,R22
    015E D147      RCALL	mod8u
    015F 93000074  STS	teml_d,R16
(0088)       delay(200);  
    0161 EC08      LDI	R16,0xC8
    0162 DED4      RCALL	_delay
(0089) 	  LCD_set_xy(10,1);
    0163 E021      LDI	R18,1
    0164 E00A      LDI	R16,0xA
    0165 D05A      RCALL	_LCD_set_xy
(0090) 	  LCD_write_char(temh_d+48);       
    0166 91000075  LDS	R16,temh_d
    0168 5D00      SUBI	R16,0xD0
    0169 D066      RCALL	_LCD_write_char
(0091) 	  LCD_set_xy(11,1);
    016A E021      LDI	R18,1
    016B E00B      LDI	R16,0xB
    016C D053      RCALL	_LCD_set_xy
(0092) 	  LCD_write_char(teml_d+48);  
    016D 91000074  LDS	R16,teml_d
    016F 5D00      SUBI	R16,0xD0
    0170 D05F      RCALL	_LCD_write_char
(0093) 	  LCD_set_xy(12,1);
    0171 E021      LDI	R18,1
    0172 E00C      LDI	R16,0xC
    0173 D04C      RCALL	_LCD_set_xy
(0094) 	  LCD_write_char('.');     
    0174 E20E      LDI	R16,0x2E
    0175 D05A      RCALL	_LCD_write_char
(0095) 	  LCD_set_xy(13,1);
    0176 E021      LDI	R18,1
    0177 E00D      LDI	R16,0xD
    0178 D047      RCALL	_LCD_set_xy
(0096) 	  LCD_write_char(temm_d+48); 
    0179 91000073  LDS	R16,temm_d
    017B 5D00      SUBI	R16,0xD0
    017C D053      RCALL	_LCD_write_char
(0097) 	  LCD_write_string(14,1,"`c");     
    017D E680      LDI	R24,0x60
    017E E090      LDI	R25,0
    017F 8399      STD	Y+1,R25
    0180 8388      STD	Y+0,R24
    0181 E021      LDI	R18,1
    0182 E00E      LDI	R16,0xE
    0183 D054      RCALL	_LCD_write_string
    0184 CF67      RJMP	0x00EC
    0185 9623      ADIW	R28,3
    0186 9508      RET
_delay_ms:
  a                    --> R20
  b                    --> R22
  n                    --> R16
    0187 D140      RCALL	push_gset2
FILE: D:\时钟芯片\1302\1302-162\162.c
(0001) #include <io8515v.h>
(0002) #include <macros.h>
(0003) #include <162-1302.h>
(0004) void delay_ms(unsigned char n)
(0005) 	{
(0006) 	unsigned char a, b;
(0007) 	for (a = 1; a<n; a++)
    0188 E041      LDI	R20,1
    0189 C006      RJMP	0x0190
(0008) 		for (b = 1; b; b++)
    018A E061      LDI	R22,1
    018B C001      RJMP	0x018D
    018C 9563      INC	R22
    018D 2366      TST	R22
    018E F7E9      BNE	0x018C
    018F 9543      INC	R20
    0190 1740      CP	R20,R16
    0191 F3C0      BCS	0x018A
    0192 D12B      RCALL	pop_gset2
    0193 9508      RET
_delay_us:
  b                    --> R20
  n                    --> R16
    0194 D135      RCALL	push_gset1
(0009) 			;
(0010) 	}
(0011) void delay_us(unsigned int n)
(0012) 	{
(0013) 	unsigned char  b;
(0014) 		for (b = 1; b<n; b++)
    0195 E041      LDI	R20,1
    0196 C001      RJMP	0x0198
    0197 9543      INC	R20
    0198 2E24      MOV	R2,R20
    0199 2433      CLR	R3
    019A 1620      CP	R2,R16
    019B 0631      CPC	R3,R17
    019C F3D0      BCS	0x0197
    019D D12F      RCALL	pop_gset1
    019E 9508      RET
(0015) 			;
(0016) 	}
(0017) 	
(0018) void LCD_wait(void)   	 	    //等待LCD空闲
(0019) {
(0020) LCD_DATA_PORT&=~BIT(7);
_LCD_wait:
    019F 98DF      CBI	0x1B,7
(0021) PORTB&=~BIT(0);
    01A0 98C0      CBI	0x18,0
(0022) PORTB|=BIT(1);
    01A1 9AC1      SBI	0x18,1
(0023) PORTB|=BIT(2);
    01A2 9AC2      SBI	0x18,2
(0024) while(!(LCD_DATA_PIN &0x80)==0);
    01A3 B389      IN	R24,0x19
    01A4 7880      ANDI	R24,0x80
    01A5 F419      BNE	0x01A9
    01A6 E001      LDI	R16,1
    01A7 E010      LDI	R17,0
    01A8 C002      RJMP	0x01AB
    01A9 2700      CLR	R16
    01AA 2711      CLR	R17
    01AB 3000      CPI	R16,0
    01AC 0701      CPC	R16,R17
    01AD F3A9      BEQ	0x01A3
(0025) LCD_DATA_DDR|=0xFF;
    01AE B38A      IN	R24,0x1A
    01AF 6F8F      ORI	R24,0xFF
    01B0 BB8A      OUT	0x1A,R24
(0026) PORTB&=~BIT(2);
    01B1 98C2      CBI	0x18,2
    01B2 9508      RET
(0027) }
(0028) 
(0029) void command_enable()  		   	//写指令使能
(0030) { 
(0031) PORTB&=~(BIT(0)|BIT(1));
_command_enable:
    01B3 B388      IN	R24,0x18
    01B4 7F8C      ANDI	R24,0xFC
    01B5 BB88      OUT	0x18,R24
(0032) PORTB|=BIT(2);
    01B6 9AC2      SBI	0x18,2
(0033) asm("nop");
    01B7 0000      NOP
(0034) PORTB&=~BIT(2);
    01B8 98C2      CBI	0x18,2
    01B9 9508      RET
(0035) }
(0036) void data_enable()				//写数据使能
(0037) {
(0038) PORTB|=BIT(0);
_data_enable:
    01BA 9AC0      SBI	0x18,0
(0039) PORTB&=~BIT(1);
    01BB 98C1      CBI	0x18,1
(0040) PORTB|=BIT(2);
    01BC 9AC2      SBI	0x18,2
(0041) asm("nop");
    01BD 0000      NOP
(0042) PORTB&=~BIT(2);
    01BE 98C2      CBI	0x18,2
    01BF 9508      RET
_LCD_set_xy:
  address              --> R20
  y                    --> R20
  x                    --> R22
    01C0 D107      RCALL	push_gset2
    01C1 2F42      MOV	R20,R18
    01C2 2F60      MOV	R22,R16
(0043) }
(0044) 
(0045) /*设置LCD显示的起始位置输入参数:x、y
(0046) 显示字符串的位置,X:0-15,Y:0-1
(0047) LCD第一行显示寄存器地址:0X80-0X8F
(0048) LCD第一行显示寄存器地址:0XC0-0XCF*/
(0049) void LCD_set_xy( unsigned char x, unsigned char y )
(0050) {
(0051) unsigned char address;
(0052) if (y==0)
    01C3 2344      TST	R20
    01C4 F419      BNE	0x01C8
(0053)   address=0x80+x;
    01C5 2F46      MOV	R20,R22
    01C6 5840      SUBI	R20,0x80
    01C7 C002      RJMP	0x01CA
(0054)  else
(0055)  address=0xC0+x;
    01C8 2F46      MOV	R20,R22
    01C9 5440      SUBI	R20,0x40
(0056) LCD_DATA_PORT=address;     	   //输入开始显示地址
    01CA BB4B      OUT	0x1B,R20
(0057) command_enable();
    01CB DFE7      RCALL	_command_enable
(0058) delay_ms(10);
    01CC E00A      LDI	R16,0xA
    01CD DFB9      RCALL	_delay_ms
    01CE D0EF      RCALL	pop_gset2
    01CF 9508      RET
_LCD_write_char:
  data                 --> R20
    01D0 D0F9      RCALL	push_gset1
    01D1 2F40      MOV	R20,R16
(0059) }
(0060) //写一个字符
(0061) void LCD_write_char(unsigned char data)
(0062) {
(0063) LCD_DATA_PORT=data;     		
    01D2 BB4B      OUT	0x1B,R20
(0064) data_enable();
    01D3 DFE6      RCALL	_data_enable
(0065) delay_ms(10);
    01D4 E00A      LDI	R16,0xA
    01D5 DFB1      RCALL	_delay_ms
    01D6 D0F6      RCALL	pop_gset1
    01D7 9508      RET
_LCD_write_string:
  s                    --> R20
  y                    --> R10
  x                    --> R22
    01D8 D0ED      RCALL	push_gset3
    01D9 2EA2      MOV	R10,R18
    01DA 2F60      MOV	R22,R16
    01DB 814E      LDD	R20,Y+6
    01DC 815F      LDD	R21,Y+7
(0066) }
(0067) //写一字符串
(0068) void LCD_write_string(unsigned char x, unsigned char y,unsigned char *s)
(0069) {
(0070) LCD_set_xy(x,y);
    01DD 2D2A      MOV	R18,R10
    01DE 2F06      MOV	R16,R22
    01DF DFE0      RCALL	_LCD_set_xy
    01E0 C006      RJMP	0x01E7
(0071) while(*s)
(0072) 	{
(0073) 	LCD_write_char(*s);
    01E1 2FE4      MOV	R30,R20
    01E2 2FF5      MOV	R31,R21
    01E3 8100      LDD	R16,Z+0
    01E4 DFEB      RCALL	_LCD_write_char
(0074) 	s++;
    01E5 5F4F      SUBI	R20,0xFF
    01E6 4F5F      SBCI	R21,0xFF
    01E7 2FE4      MOV	R30,R20
    01E8 2FF5      MOV	R31,R21
    01E9 8020      LDD	R2,Z+0
    01EA 2022      TST	R2
    01EB F7A9      BNE	0x01E1
    01EC D0D3      RCALL	pop_gset3
    01ED 9508      RET

⌨️ 快捷键说明

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