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

📄 ds18b20_1602.lst

📁 ds18b20+1602液晶显示 基于atmega16l单片机的编程
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0087) 
(0088) void CurReturn(void)
(0089) {
(0090)  	 WriteCmd(CUR_RET);	
_CurReturn:
    0170 E003      LDI	R16,3
    0171 DFCF      RCALL	_WriteCmd
    0172 9508      RET
_SetInputMode:
  setData              --> R20
  textMove             --> R22
  curDir               --> R10
    0173 940E03BD  CALL	push_gset3
    0175 2F62      MOV	R22,R18
    0176 2EA0      MOV	R10,R16
(0091) }
(0092) 
(0093) void SetInputMode(byte curDir, byte textMove)
(0094) {
(0095)     byte setData = 0x04;
    0177 E044      LDI	R20,4
(0096) 	if (curDir == 1) //光标右移
    0178 2D8A      MOV	R24,R10
    0179 3081      CPI	R24,1
    017A F411      BNE	0x017D
(0097) 		   setData |= 0x02;
    017B 6042      ORI	R20,2
    017C C001      RJMP	0x017E
(0098) 	else
(0099) 	    setData &= ~0x02;
    017D 7F4D      ANDI	R20,0xFD
(0100) 		  
(0101) 	if (textMove == 1)	//文字移动
    017E 3061      CPI	R22,1
    017F F411      BNE	0x0182
(0102) 		   setData |= 0x01;
    0180 6041      ORI	R20,1
    0181 C001      RJMP	0x0183
(0103) 	else                 //文字不移动
(0104) 		   setData &= ~0x01;	
    0182 7F4E      ANDI	R20,0xFE
(0105) 	WriteCmd(setData);		       	   
    0183 2F04      MOV	R16,R20
    0184 DFBC      RCALL	_WriteCmd
    0185 940E03B3  CALL	pop_gset3
    0187 9508      RET
_SetDisMode:
  setData              --> R20
  curFlash             --> Y+6
  curDis               --> R22
  allDis               --> R10
    0188 940E03BD  CALL	push_gset3
    018A 2F62      MOV	R22,R18
    018B 2EA0      MOV	R10,R16
(0106) }
(0107) 
(0108) void SetDisMode(byte allDis, byte curDis, byte curFlash)
(0109) {
(0110)  	 byte setData = 0x08;
    018C E048      LDI	R20,0x8
(0111) 	
(0112) 	if (allDis == 1)   //所有都显示 
    018D 2D8A      MOV	R24,R10
    018E 3081      CPI	R24,1
    018F F411      BNE	0x0192
(0113) 		   setData |= 0x04;
    0190 6044      ORI	R20,4
    0191 C001      RJMP	0x0193
(0114) 	else		    	   //都不显示 
(0115) 	    setData &= ~0x04;
    0192 7F4B      ANDI	R20,0xFB
(0116) 		  
(0117) 	if (curDis == 1)	//光标显示 
    0193 3061      CPI	R22,1
    0194 F411      BNE	0x0197
(0118) 		   setData |= 0x02;
    0195 6042      ORI	R20,2
    0196 C001      RJMP	0x0198
(0119) 	else                 //光标不显示
(0120) 		   setData &= ~0x02;	
    0197 7F4D      ANDI	R20,0xFD
(0121) 	
(0122) 	if (curFlash == 1)	//光标闪烁
    0198 818E      LDD	R24,Y+6
    0199 3081      CPI	R24,1
    019A F411      BNE	0x019D
(0123) 		   setData |= 0x01;
    019B 6041      ORI	R20,1
    019C C001      RJMP	0x019E
(0124) 	else                 ///光标不闪烁
(0125) 		   setData &= ~0x01;		   
    019D 7F4E      ANDI	R20,0xFE
(0126) 	WriteCmd(setData);		  
    019E 2F04      MOV	R16,R20
    019F DFA1      RCALL	_WriteCmd
    01A0 940E03B3  CALL	pop_gset3
    01A2 9508      RET
_SetFunction:
  setData              --> R20
  fDis                 --> Y+6
  lineDis              --> R22
  numBus               --> R10
    01A3 940E03BD  CALL	push_gset3
    01A5 2F62      MOV	R22,R18
    01A6 2EA0      MOV	R10,R16
(0127) }
(0128) /*
(0129) void SetShift(byte cMove, byte cDir)
(0130) {
(0131)  	 byte setData = 0x10;
(0132) 	
(0133) 	if (cMove == 1)   //移动文字
(0134) 		   setData |= 0x08;
(0135) 	else		    	   //移动光标
(0136) 	    setData &= ~0x08;
(0137) 		  
(0138) 	if (cDir == 1)	//右移
(0139) 		   setData |= 0x04;
(0140) 	else                 //左移
(0141) 		   setData &= ~0x04;
(0142) 	WriteCmd(setData);			
(0143) }
(0144) */
(0145) void SetFunction(byte numBus, byte lineDis, byte fDis)
(0146) {
(0147)  	byte setData = 0x20;
    01A7 E240      LDI	R20,0x20
(0148) 	
(0149) 	if (numBus == 1)   //4位总线 
    01A8 2D8A      MOV	R24,R10
    01A9 3081      CPI	R24,1
    01AA F411      BNE	0x01AD
(0150) 		   setData |= 0x10;
    01AB 6140      ORI	R20,0x10
    01AC C001      RJMP	0x01AE
(0151) 	else		    	   //8位总线 
(0152) 	    setData &= ~0x10;
    01AD 7E4F      ANDI	R20,0xEF
(0153) 		  
(0154) 	if (lineDis == 1)	//双行显示 
    01AE 3061      CPI	R22,1
    01AF F411      BNE	0x01B2
(0155) 		   setData |= 0x08;
    01B0 6048      ORI	R20,0x8
    01B1 C001      RJMP	0x01B3
(0156) 	else                 //单行显示
(0157) 		   setData &= ~0x08;	
    01B2 7F47      ANDI	R20,0xF7
(0158) 	
(0159) 	if (fDis == 1)	//5*10点阵
    01B3 818E      LDD	R24,Y+6
    01B4 3081      CPI	R24,1
    01B5 F411      BNE	0x01B8
(0160) 		   setData |= 0x04;
    01B6 6044      ORI	R20,4
    01B7 C001      RJMP	0x01B9
(0161) 	else                 ///5*7点阵
(0162) 		   setData &= ~0x04;		   
    01B8 7F4B      ANDI	R20,0xFB
(0163) 	WriteCmd(setData);		  
    01B9 2F04      MOV	R16,R20
    01BA DF86      RCALL	_WriteCmd
    01BB 940E03B3  CALL	pop_gset3
    01BD 9508      RET
_SetDisAddr:
  ucol                 --> R20
  urow                 --> R22
    01BE 940E03BF  CALL	push_gset2
    01C0 2F42      MOV	R20,R18
    01C1 2F60      MOV	R22,R16
(0164) }
(0165)  /*
(0166) void SetCGRAMAddr(byte ramAddr)
(0167) {
(0168)  	byte setData = 0x40;
(0169) 	setData |= (ramAddr &0x3f);
(0170) 	WriteCmd(setData);		 
(0171) }
(0172) */
(0173) void SetDisAddr(byte urow, byte ucol)
(0174) {
(0175)     if (ucol >= 20)
    01C2 3144      CPI	R20,0x14
    01C3 F008      BCS	0x01C5
(0176) 	ucol= 20;
    01C4 E144      LDI	R20,0x14
(0177) 	if (urow == 0)
    01C5 2366      TST	R22
    01C6 F421      BNE	0x01CB
(0178) 	    WriteCmd( 0x80+ucol);	
    01C7 2F04      MOV	R16,R20
    01C8 5800      SUBI	R16,0x80
    01C9 DF77      RCALL	_WriteCmd
    01CA C003      RJMP	0x01CE
(0179) 	else
(0180) 		WriteCmd( 0xc0+ucol);	
    01CB 2F04      MOV	R16,R20
    01CC 5400      SUBI	R16,0x40
    01CD DF73      RCALL	_WriteCmd
    01CE 940E03B0  CALL	pop_gset2
    01D0 9508      RET
_DisCGRAM:
  ch                   --> Y+4
  ucol                 --> R22
  urow                 --> R20
    01D1 940E03BF  CALL	push_gset2
    01D3 2F62      MOV	R22,R18
    01D4 2F40      MOV	R20,R16
(0181) }
(0182) 
(0183) void DisCGRAM(byte urow, byte ucol, char ch)
(0184) {
(0185)     SetDisAddr(urow, ucol);
    01D5 2F26      MOV	R18,R22
    01D6 2F04      MOV	R16,R20
    01D7 DFE6      RCALL	_SetDisAddr
(0186) 	WriteData(ch);
    01D8 810C      LDD	R16,Y+4
    01D9 DF73      RCALL	_WriteData
    01DA 940E03B0  CALL	pop_gset2
    01DC 9508      RET
_DisString:
  i                    --> R20
  str                  --> R22
  ucol                 --> R12
  urow                 --> R10
    01DD 940E03BB  CALL	push_gset4
    01DF 2EC2      MOV	R12,R18
    01E0 2EA0      MOV	R10,R16
    01E1 8568      LDD	R22,Y+8
    01E2 8579      LDD	R23,Y+9
(0187) }
(0188) /*
(0189) void DisChar(byte row, byte line, char ch)
(0190) {
(0191)     SetDisAddr(row, line);
(0192) 	WriteData(ch);
(0193) }
(0194) */
(0195) void DisString(byte urow, byte ucol, char *str)
(0196) {
(0197)      byte i = 0;
    01E3 2744      CLR	R20
(0198) 		
(0199) 	SetDisAddr(urow, ucol);
    01E4 2D2C      MOV	R18,R12
    01E5 2D0A      MOV	R16,R10
    01E6 DFD7      RCALL	_SetDisAddr
    01E7 C007      RJMP	0x01EF
(0200) 	while (i < strlen(str))
(0201) 	{
(0202) 		WriteData(*(str + i));
    01E8 2FE4      MOV	R30,R20
    01E9 27FF      CLR	R31
    01EA 0FE6      ADD	R30,R22
    01EB 1FF7      ADC	R31,R23
    01EC 8100      LDD	R16,Z+0
    01ED DF5F      RCALL	_WriteData
(0203) 		i++;
    01EE 9543      INC	R20
    01EF 018B      MOVW	R16,R22
    01F0 940E038C  CALL	_strlen
    01F2 2E24      MOV	R2,R20
    01F3 2433      CLR	R3
    01F4 1620      CP	R2,R16
    01F5 0631      CPC	R3,R17
    01F6 F388      BCS	0x01E8
    01F7 940E03B6  CALL	pop_gset4
    01F9 9508      RET
_DisNum:
  num                  --> Y+4
  ucol                 --> R22
  urow                 --> R20
    01FA 940E03BF  CALL	push_gset2
    01FC 2F62      MOV	R22,R18
    01FD 2F40      MOV	R20,R16
(0204) 	}
(0205) }
(0206) 
(0207) 
(0208) void DisNum(byte urow, byte ucol, byte num)
(0209) {
(0210)  		SetDisAddr(urow, ucol);
    01FE 2F26      MOV	R18,R22
    01FF 2F04      MOV	R16,R20
    0200 DFBD      RCALL	_SetDisAddr
(0211) 		 WriteData('0'+ num);
    0201 810C      LDD	R16,Y+4
    0202 5D00      SUBI	R16,0xD0
    0203 DF49      RCALL	_WriteData
    0204 940E03B0  CALL	pop_gset2
    0206 9508      RET
_DisplayTime:
  second               --> Y+6
  minute               --> R20
  hour                 --> R22
    0207 940E03BF  CALL	push_gset2
    0209 2F42      MOV	R20,R18
    020A 2F60      MOV	R22,R16
    020B 9722      SBIW	R28,2
(0212) }
(0213) 
(0214) 
(0215) void DisplayTime(byte hour,byte minute,byte second)
(0216) {
(0217) 	 DisNum(1, 3, hour/16);
    020C 2F86      MOV	R24,R22
    020D 9582      SWAP	R24
    020E 708F      ANDI	R24,0xF
    020F 8388      STD	Y+0,R24
    0210 E023      LDI	R18,3
    0211 E001      LDI	R16,1
    0212 DFE7      RCALL	_DisNum
(0218) 	 DisNum(1, 4, hour%16);
    0213 E110      LDI	R17,0x10
    0214 2F06      MOV	R16,R22
    0215 940E0398  CALL	mod8u
    0217 8308      STD	Y+0,R16
    0218 E024      LDI	R18,4
    0219 E001      LDI	R16,1
    021A DFDF      RCALL	_DisNum
(0219) 	 DisString(1, 5,":");
    021B E880      LDI	R24,0x80
    021C E090      LDI	R25,0
    021D 8399      STD	Y+1,R25
    021E 8388      STD	Y+0,R24
    021F E025      LDI	R18,5
    0220 E001      LDI	R16,1
    0221 DFBB      RCALL	_DisString
(0220) 	 DisNum(1, 6, minute/16);
    0222 2F84      MOV	R24,R20
    0223 9582      SWAP	R24
    0224 708F      ANDI	R24,0xF
    0225 8388      STD	Y+0,R24
    0226 E026      LDI	R18,6
    0227 E001      LDI	R16,1
    0228 DFD1      RCALL	_DisNum
(0221) 	 DisNum(1, 7, minute%16);
    0229 E110      LDI	R17,0x10
    022A 2F04      MOV	R16,R20
    022B 940E0398  CALL	mod8u
    022D 8308      STD	Y+0,R16
    022E E027      LDI	R18,7
    022F E001      LDI	R16,1
    0230 DFC9      RCALL	_DisNum
(0222) 	 DisString(1, 8,":");
    0231 E880      LDI	R24,0x80
    0232 E090      LDI	R25,0
    0233 8399      STD	Y+1,R25
    0234 8388      STD	Y+0,R24
    0235 E028      LDI	R18,0x8
    0236 E001      LDI	R16,1
    0237 DFA5      RCALL	_DisString
(0223) 	 
(0224) 	 DisNum(1, 10, second & 0x0f);
    0238 818E      LDD	R24,Y+6
    0239 708F      ANDI	R24,0xF
    023A 8388      STD	Y+0,R24
    023B E02A      LDI	R18,0xA
    023C E001      LDI	R16,1
    023D DFBC      RCALL	_DisNum
(0225) 	 DisNum(1, 9, (second >> 4) &0x07);
    023E 818E      LDD	R24,Y+6
    023F 9582      SWAP	R24
    0240 708F      ANDI	R24,0xF
    0241 7087      ANDI	R24,7
    0242 8388      STD	Y+0,R24
    0243 E029      LDI	R18,0x9
    0244 E001      LDI	R16,1
    0245 DFB4      RCALL	_DisNum
    0246 9622      ADIW	R28,2
    0247 940E03B0  CALL	pop_gset2
    0249 9508      RET
_LCD_Dis_Float:
  tempdata             --> Y+1
  i                    --> R20
  bvalue               --> Y+11
  ucol                 --> R22
  urow                 --> R10
    024A 940E03BD  CALL	push_gset3
    024C 2F62      MOV	R22,R18
    024D 2EA0      MOV	R10,R16
    024E 9725      SBIW	R28,5
(0226) }
(0227) 
(0228) 
(0229) void LCD_Dis_Float(byte urow,byte ucol,byte bvalue)
(0230) {
(0231)    byte i;
(0232)    byte tempdata[4];
(0233)    
(0234)    tempdata[0] = (bvalue)/100;
    024F E614      LDI	R17,0x64
    0250 850B      LDD	R16,Y+11
    0251 940E039A  CALL	div8u
    0253 8309      STD	Y+1,R16
(0235)    if(tempdata[0]== 0) tempdata[0]= ' '-'0';
    0254 2300      TST	R16
    0255 F411      BNE	0x0258
    0256 EF80      LDI	R24,0xF0
    0257 8389      STD	Y+1,R24
(0236)    tempdata[1] = (bvalue)%100/10;
    0258 E614      LDI	R17,0x64
    0259 850B      LDD	R16,Y+11
    025A 940E0398  CALL	mod8u
    025C E01A      LDI	R17,0xA
    025D 940E039A  CALL	div8u
    025F 830A      STD	Y+2,R16
(0237)    if((tempdata[0] == 0x00)&&(tempdata[1] == 0x00))
    0260 8029      LDD	R2,Y+1
    0261 2022      TST	R2
    0262 F421      BNE	0x0267
    0263 2300      TST	R16
    0264 F411      BNE	0x0267
(0238)    {
(0239)       tempdata[1] = ' '-'0';
    0265 EF80      LDI	R24,0xF0
    0266 838A      STD	Y+2,R24
(0240)    }
(0241)    tempdata[2] = (bvalue)%10;
    0267 E01A      LDI	R17,0xA
    0268 850B      LDD	R16,Y+11
    0269 940E0398  CALL	mod8u
    026B 830B      STD	Y+3,R16
(0242)    tempdata[3] = '.'-'0';
    026C EF8E      LDI	R24,0xFE
    026D 838C      STD	Y+4,R24
(0243) 
(0244)     for(i = 0;i<4;i++) 
    026E 2744      CLR	R20
    026F C00D      RJMP	0x027D
(0245)       DisNum(urow,ucol+i,tempdata[i]);
    0270 01CE      MOVW	R24,R28
    0271 9601      ADIW	R24,1
    0272 2FE4      MOV	R30,R20
    0273 27FF      CLR	R31
    0274 0FE8      ADD	R30,R24
    0275 1FF9      ADC	R31,R25
    0276 8020      LDD	R2,Z+0
    0277 8228      STD	Y+0,R2
    0278 2F26      MOV	R18,R22
    0279 0F24      ADD	R18,R20
    027A 2D0A      MOV	R16,R10
    027B DF7E      RCALL	_DisNum
    027C 9543      INC	R20
    027D 3044      CPI	R20,4
    027E F388      BCS	0x0270
    027F 9625      ADIW	R28,5
    0280 940E03B3  CALL	pop_gset3
    0282 9508      RET
_LCD_Dis_Temperature:
  rValue               --> R10
  ucol                 --> R22
  urow                 --> R20
    0283 940E03BD  CALL	push_gset3
    0285 2F62      MOV	R22,R18
    0286 2F40      MOV	R20,R16
    0287 9722      SBIW	R28,2
    0288 84A8      LDD	R10,Y+8
    0289 84B9      LDD	R11,Y+9
(0246) }
(0247) 
(0248)  void LCD_Dis_Temperature(byte urow,byte ucol, unsigned int rValue)	//温度数据转换和显示函数
(0249) {
(0250)     ClearLcd();
    028A DEE2      RCALL	_ClearLcd
(0251) 	DisString(0,1,"Temperature is:");
    028B E780      LDI	R24,0x70
    028C E090      LDI	R25,0
    028D 8399      STD	Y+1,R25
    028E 8388      STD	Y+0,R24
    028F E021      LDI	R18,1
    0290 2700      CLR	R16
    0291 DF4B      RCALL	_DisString
(0252)    if((rValue &0xf800) == 0xf800)
    0292 01C5      MOVW	R24,R10
    0293 7080      ANDI	R24,0
    0294 7F98      ANDI	R25,0xF8
    0295 3080      CPI	R24,0
    0296 EFE8      LDI	R30,0xF8
    0297 079E      CPC	R25,R30
    0298 F4C1      BNE	0x02B1
(0253)    {
(0254)    	   DisString(urow,ucol,"-");
    0299 E68E      LDI	R24,0x6E
    029A E090      LDI	R25,0
    029B 8399      STD	Y+1,R25
    029C 8388      STD	Y+0,R24
    029D 2F26      MOV	R18,R22
    029E 2F04      MOV	R16,R20
    029F DF3D      RCALL	_DisString
(0255)        LCD_Dis_Float(urow,ucol+1,((byte)(~((rValue>>3)-1)))>>1);
    02A0 01C5      MOVW	R24,R10
    02A1 9596      LSR	R25
    02A2 9587      ROR	R24
    02A3 9596      LSR	R25
    02A4 9587      ROR	R24

⌨️ 快捷键说明

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