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

📄 1820.lst

📁 基于ATMEGA16的温度传感器原代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    01D4 2F48      MOV	R20,R24
(0076) 	 lcd_out(s);
    01D5 2F08      MOV	R16,R24
    01D6 DFDA      RCALL	_lcd_out
    01D7 940E0446  CALL	pop_gset2
    01D9 9508      RET
_WR_control:
  s                    --> R20
  dat                  --> R22
    01DA 940E0452  CALL	push_gset2
    01DC 2F60      MOV	R22,R16
(0077) }
(0078) //**************************************************************************
(0079) void WR_control(unsigned char dat)
(0080) {
(0081)      unsigned char s;
(0082) 	 s=dat&0xf0;
    01DD 2F46      MOV	R20,R22
    01DE 7F40      ANDI	R20,0xF0
(0083) 	 lcd_out(0xf8);
    01DF EF08      LDI	R16,0xF8
    01E0 DFD0      RCALL	_lcd_out
(0084) 	 lcd_out(s);
    01E1 2F04      MOV	R16,R20
    01E2 DFCE      RCALL	_lcd_out
(0085) 	 s=dat&0x0f;
    01E3 2F46      MOV	R20,R22
    01E4 704F      ANDI	R20,0xF
(0086) 	 s<<=4;
    01E5 2F84      MOV	R24,R20
    01E6 708F      ANDI	R24,0xF
    01E7 9582      SWAP	R24
    01E8 2F48      MOV	R20,R24
(0087) 	 lcd_out(s);
    01E9 2F08      MOV	R16,R24
    01EA DFC6      RCALL	_lcd_out
    01EB 940E0446  CALL	pop_gset2
    01ED 9508      RET
(0088) }
(0089) //**************************************************************************
(0090) void lcd_control()
(0091) {
(0092) 	WR_control(0x30);
_lcd_control:
    01EE E300      LDI	R16,0x30
    01EF DFEA      RCALL	_WR_control
(0093) 	WR_control(0x0c);
    01F0 E00C      LDI	R16,0xC
    01F1 DFE8      RCALL	_WR_control
    01F2 9508      RET
_lcd_clear:
  i                    --> R20
    01F3 940E0454  CALL	push_gset1
(0094) }
(0095) //**************************************************************************
(0096) void lcd_clear()
(0097) {
(0098)   int i;
(0099)   WR_control(0x01);
    01F5 E001      LDI	R16,1
    01F6 DFE3      RCALL	_WR_control
(0100)   for(i=0;i<5000;i++)	//	延时5ms
    01F7 2744      CLR	R20
    01F8 2755      CLR	R21
(0101) 	{
(0102) 		asm("nop");
    01F9 0000      NOP
(0103) 		asm("nop");
    01FA 0000      NOP
    01FB 5F4F      SUBI	R20,0xFF
    01FC 4F5F      SBCI	R21,0xFF
    01FD 3848      CPI	R20,0x88
    01FE E1E3      LDI	R30,0x13
    01FF 075E      CPC	R21,R30
    0200 F3C4      BLT	0x01F9
    0201 940E0457  CALL	pop_gset1
    0203 9508      RET
_LCD_address:
  address              --> R20
  y                    --> R22
  x                    --> R20
    0204 940E0452  CALL	push_gset2
    0206 2F62      MOV	R22,R18
    0207 2F40      MOV	R20,R16
(0104) 	} 
(0105) }
(0106) /*******************************************************/
(0107) /******   函数名称: LCD_set_xy()                  ******/
(0108) /******   功    能: 设置LCD显示坐标               ******/
(0109) /******   参    数: 显示字符串的位置,X:0-15,Y:0-1*****/
(0110) /******   返回值  : 无                            ******/
(0111) /*******************************************************/
(0112) void LCD_address( unsigned char x, unsigned char y )
(0113) {
(0114)  	unsigned char address;
(0115) 	switch(x)
    0208 2755      CLR	R21
    0209 3040      CPI	R20,0
    020A 0745      CPC	R20,R21
    020B F069      BEQ	0x0219
    020C 3041      CPI	R20,1
    020D E0E0      LDI	R30,0
    020E 075E      CPC	R21,R30
    020F F061      BEQ	0x021C
    0210 3042      CPI	R20,2
    0211 E0E0      LDI	R30,0
    0212 075E      CPC	R21,R30
    0213 F059      BEQ	0x021F
    0214 3043      CPI	R20,3
    0215 E0E0      LDI	R30,0
    0216 075E      CPC	R21,R30
    0217 F051      BEQ	0x0222
    0218 C00C      RJMP	0x0225
(0116) 	{
(0117) 	 	case 0:
(0118) 			   address = 0x80 + y;		   //计算显示地址
    0219 2F46      MOV	R20,R22
    021A 5840      SUBI	R20,0x80
(0119) 			   break;
    021B C00B      RJMP	0x0227
(0120) 		case 1:
(0121) 			   address = 0x90 + y;		   //计算显示地址
    021C 2F46      MOV	R20,R22
    021D 5740      SUBI	R20,0x70
(0122) 			   break;
    021E C008      RJMP	0x0227
(0123) 		case 2:
(0124) 			   address = 0x88 + y;		   //计算显示地址
    021F 2F46      MOV	R20,R22
    0220 5748      SUBI	R20,0x78
(0125) 			   break;
    0221 C005      RJMP	0x0227
(0126) 		case 3:
(0127) 			   address = 0x98 + y;		   //计算显示地址
    0222 2F46      MOV	R20,R22
    0223 5648      SUBI	R20,0x68
(0128) 			   break;
    0224 C002      RJMP	0x0227
(0129) 		default:address = 0x80 + y;
    0225 2F46      MOV	R20,R22
    0226 5840      SUBI	R20,0x80
(0130) 	}
(0131) 	WR_control( address);	  	   	   		   //写地址命令
    0227 2F04      MOV	R16,R20
    0228 DFB1      RCALL	_WR_control
    0229 940E0446  CALL	pop_gset2
    022B 9508      RET
_LCD_Write_string:
  s                    --> R20
  Y                    --> R10
  X                    --> R22
    022C 940E0450  CALL	push_gset3
    022E 2EA2      MOV	R10,R18
    022F 2F60      MOV	R22,R16
    0230 814E      LDD	R20,Y+6
    0231 815F      LDD	R21,Y+7
(0132) }
(0133) //**************************************************************************
(0134) /*******************************************************/
(0135) /******   函数名称: LCD_write_string()            ******/
(0136) /******   功    能: 中英文字符串显示函数          ******/
(0137) /******   参    数: *s--英文字符串指针            ******/
(0138) /******             X、Y--显示字符串的位置        ******/
(0139) /******   返回值  : 无                            ******/
(0140) /*******************************************************/
(0141) void LCD_Write_string(unsigned char X,unsigned char Y,unsigned char *s)
(0142) {
(0143)     
(0144)  	LCD_address( X, Y );		   				//写显示地址
    0232 2D2A      MOV	R18,R10
    0233 2F06      MOV	R16,R22
    0234 DFCF      RCALL	_LCD_address
    0235 C005      RJMP	0x023B
(0145)     while (*s) 	   	 						//是否到字符串尾
(0146)     {
(0147)      	WR_dat (*s );						//写显示数据
    0236 01FA      MOVW	R30,R20
    0237 8100      LDD	R16,Z+0
    0238 DF8D      RCALL	_WR_dat
(0148) 		s ++;								//字符串地址加1
    0239 5F4F      SUBI	R20,0xFF
    023A 4F5F      SBCI	R21,0xFF
    023B 01FA      MOVW	R30,R20
    023C 8020      LDD	R2,Z+0
    023D 2022      TST	R2
    023E F7B9      BNE	0x0236
    023F 940E0449  CALL	pop_gset3
    0241 9508      RET
(0149)  	}
(0150) }
(0151) 
(0152) 
(0153) /******************************************************************************/ 
(0154) //函数功能:将BCD码转换为ASCII码函数 
(0155) //输入数据:BCD
(0156) //输出:ASCII
(0157) //作者:韩红瑞
(0158) //修改时间:2006-08-31
(0159) /******************************************************************************/ 
(0160) unsigned char BCD_ASCII(unsigned char bcd) 
(0161) { 
(0162)     bcd &= 0x0F; 
_BCD_ASCII:
  bcd                  --> R16
    0242 700F      ANDI	R16,0xF
(0163)     if(bcd > 9)  
    0243 E089      LDI	R24,0x9
    0244 1780      CP	R24,R16
    0245 F410      BCC	0x0248
(0164)     bcd +=('7');     // 将A~F转换为ASCII 
    0246 5C09      SUBI	R16,0xC9
    0247 C001      RJMP	0x0249
(0165)     else 
(0166)     bcd += '0';         // 将0~9转换为ASCII 0~9 
    0248 5D00      SUBI	R16,0xD0
(0167)     return(bcd); 
    0249 9508      RET
_LCD_writeasc:
  data                 --> Y+4
  y                    --> R22
  x                    --> R20
    024A 940E0452  CALL	push_gset2
    024C 2F62      MOV	R22,R18
    024D 2F40      MOV	R20,R16
(0168) } 
(0169)  
(0170) 
(0171) void  LCD_writeasc(unsigned char x, unsigned char y, unsigned char data)
(0172) {
(0173)     LCD_address(x,y);
    024E 2F26      MOV	R18,R22
    024F 2F04      MOV	R16,R20
    0250 DFB3      RCALL	_LCD_address
(0174) 	WR_dat(data);
    0251 810C      LDD	R16,Y+4
    0252 DF73      RCALL	_WR_dat
    0253 940E0446  CALL	pop_gset2
    0255 9508      RET
(0175) }
(0176)   
(0177) void Lcd_INT()
(0178) {
(0179)   //DDRD|=0X03;
(0180)   //PORTD=0X03;
(0181)   lcd_control();
_Lcd_INT:
    0256 DF97      RCALL	_lcd_control
    0257 9508      RET
_lcd_writechar:
  number               --> Y+4
  Y                    --> R22
  X                    --> R20
    0258 940E0452  CALL	push_gset2
    025A 2F62      MOV	R22,R18
    025B 2F40      MOV	R20,R16
(0182) }
(0183) 
(0184) void lcd_writechar(unsigned char X,unsigned char Y,unsigned char number)
(0185) {
(0186)     LCD_address(X,Y);
    025C 2F26      MOV	R18,R22
    025D 2F04      MOV	R16,R20
    025E DFA5      RCALL	_LCD_address
(0187) 	WR_dat(BCD_ASCII(number>>4));
    025F 810C      LDD	R16,Y+4
    0260 9502      SWAP	R16
    0261 700F      ANDI	R16,0xF
    0262 DFDF      RCALL	_BCD_ASCII
    0263 DF62      RCALL	_WR_dat
(0188) 	WR_dat(BCD_ASCII(number));
    0264 810C      LDD	R16,Y+4
    0265 DFDC      RCALL	_BCD_ASCII
    0266 DF5F      RCALL	_WR_dat
    0267 940E0446  CALL	pop_gset2
    0269 9508      RET
_lcd_write2:
  number               --> Y+4
  Y                    --> R22
  X                    --> R20
    026A 940E0452  CALL	push_gset2
    026C 2F62      MOV	R22,R18
    026D 2F40      MOV	R20,R16
(0189) }
(0190) 
(0191) void lcd_write2(unsigned char X,unsigned char Y,unsigned int number)
(0192) {
(0193)     LCD_address(X,Y);
    026E 2F26      MOV	R18,R22
    026F 2F04      MOV	R16,R20
    0270 DF93      RCALL	_LCD_address
(0194) 	
(0195) 	//WR_dat(BCD_ASCII(number));//%1000/100
(0196) 	//WR_dat(BCD_ASCII(number));//%1000%100/10
(0197)     WR_dat(BCD_ASCII(number));//%10
    0271 810C      LDD	R16,Y+4
    0272 811D      LDD	R17,Y+5
    0273 DFCE      RCALL	_BCD_ASCII
    0274 DF51      RCALL	_WR_dat
    0275 940E0446  CALL	pop_gset2
    0277 9508      RET
_show_time:
  temp                 --> R20
  time                 --> R22
    0278 940E0452  CALL	push_gset2
    027A 01B8      MOVW	R22,R16
    027B 9721      SBIW	R28,1
(0198) }
(0199) void show_time(unsigned int time)
(0200) {
(0201)     
(0202) 	unsigned char temp;
(0203) 	temp=time/60;
    027C E32C      LDI	R18,0x3C
    027D E030      LDI	R19,0
    027E 018B      MOVW	R16,R22
    027F 940E0404  CALL	div16u
    0281 2F40      MOV	R20,R16
(0204) 	lcd_writechar(1,3,((temp/10)<<4)+(temp%10)); //  显示分 
    0282 E01A      LDI	R17,0xA
    0283 940E041E  CALL	mod8u
    0285 2E20      MOV	R2,R16
    0286 E01A      LDI	R17,0xA
    0287 2F04      MOV	R16,R20
    0288 940E0420  CALL	div8u
    028A 2F80      MOV	R24,R16
    028B 708F      ANDI	R24,0xF
    028C 9582      SWAP	R24
    028D 0D82      ADD	R24,R2
    028E 8388      STD	Y+0,R24
    028F E023      LDI	R18,3
    0290 E001      LDI	R16,1
    0291 DFC6      RCALL	_lcd_writechar
(0205) 	//LCD_Write_string(1,2,"分");
(0206) 	temp=time%60; //  显示秒 
    0292 E32C      LDI	R18,0x3C
    0293 E030      LDI	R19,0
    0294 018B      MOVW	R16,R22
    0295 940E0402  CALL	mod16u
    0297 2F40      MOV	R20,R16
(0207) 	lcd_writechar(1,5,((temp/10)<<4)+(temp%10));
    0298 E01A      LDI	R17,0xA
    0299 940E041E  CALL	mod8u
    029B 2E20      MOV	R2,R16
    029C E01A      LDI	R17,0xA
    029D 2F04      MOV	R16,R20
    029E 940E0420  CALL	div8u
    02A0 2F80      MOV	R24,R16
    02A1 708F      ANDI	R24,0xF
    02A2 9582      SWAP	R24
    02A3 0D82      ADD	R24,R2
    02A4 8388      STD	Y+0,R24
    02A5 E025      LDI	R18,5
    02A6 E001      LDI	R16,1
    02A7 DFB0      RCALL	_lcd_writechar
    02A8 9621      ADIW	R28,1
    02A9 940E0446  CALL	pop_gset2
    02AB 9508      RET
_lcd_writejd:
  number               --> Y+4
  Y                    --> R22
  X                    --> R20
    02AC 940E0452  CALL	push_gset2
    02AE 2F62      MOV	R22,R18
    02AF 2F40      MOV	R20,R16
(0208) 	
(0209) }
(0210) 
(0211) 
(0212) unsigned char JD[11]={'5','4','3','2','1','0','1','2','3','4','5'};
(0213) 
(0214) void lcd_writejd(unsigned char X,unsigned char Y,unsigned char number)
(0215) {
(0216)     LCD_address(X,Y);
    02B0 2F26      MOV	R18,R22
    02B1 2F04      MOV	R16,R20
    02B2 DF51      RCALL	_LCD_address
(0217) 	if(number<5)
    02B3 818C      LDD	R24,Y+4
    02B4 3085      CPI	R24,5
    02B5 F418      BCC	0x02B9
(0218) 	{
(0219) 	    WR_dat('+');
    02B6 E20B      LDI	R16,0x2B
    02B7 DF0E      RCALL	_WR_dat
(0220) 	}
    02B8 C008      RJMP	0x02C1
(0221) 	else if(number==5)
    02B9 818C      LDD	R24,Y+4
    02BA 3085      CPI	R24,5
    02BB F419      BNE	0x02BF
(0222) 	{

⌨️ 快捷键说明

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