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

📄 display.lst

📁 PC通过串口控制LCD1602显示!MCU为AVR单片机!
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0034 E5CF      LDI	R28,0x5F
    0035 E0D4      LDI	R29,4
    0036 BFCD      OUT	0x3D,R28
    0037 BFDE      OUT	0x3E,R29
    0038 51C0      SUBI	R28,0x10
    0039 40D0      SBCI	R29,0
    003A EA0A      LDI	R16,0xAA
    003B 8308      STD	Y+0,R16
    003C 2400      CLR	R0
    003D E6E6      LDI	R30,0x66
    003E E0F0      LDI	R31,0
    003F E010      LDI	R17,0
    0040 37E8      CPI	R30,0x78
    0041 07F1      CPC	R31,R17
    0042 F011      BEQ	0x0045
    0043 9201      ST	R0,Z+
    0044 CFFB      RJMP	0x0040
    0045 8300      STD	Z+0,R16
    0046 E6E2      LDI	R30,0x62
    0047 E0F0      LDI	R31,0
    0048 E6A0      LDI	R26,0x60
    0049 E0B0      LDI	R27,0
    004A E010      LDI	R17,0
    004B 36E8      CPI	R30,0x68
    004C 07F1      CPC	R31,R17
    004D F021      BEQ	0x0052
    004E 95C8      LPM
    004F 9631      ADIW	R30,1
    0050 920D      ST	R0,X+
    0051 CFF9      RJMP	0x004B
    0052 940E00DA  CALL	_main
_exit:
    0054 CFFF      RJMP	_exit
FILE: F:\我的设计\delphi\uartdispy\mcu\main.c
(0001) /*********************************Copyright (c)*********************************
(0002) **                              
(0003) ** 文   件   名: main.c
(0004) ** 最后修改日期: 2005年06月8日
(0005) ** 描        述: 主函数
(0006) ** 版	     本: V1.0
(0007) ** 主  控  芯 片:M16  晶振频率:8 MHZ
(0008) *******************************************************************************/
(0009) #include <iom16v.h>
(0010) #include <macros.h>
(0011) #include "define.h"
(0012) #include "function.h"
(0013) #include "defineDS18B20.h"
(0014) #include "defineLCD.h"
(0015) #define b9600   0x33
(0016) #define baud   b9600
(0017) #define fone   0x2a
(0018) #define ftwo   0x2b
(0019) #define fclr   0x2d
(0020) #define fend   0x3c
(0021) #define floop  0x3e
(0022) /******************************************************************************
(0023)                   定义全局变量
(0024) *******************************************************************************/
(0025) const unsigned char table[]="0123456789.C "  ;         //显示常量
(0026) unsigned char i=0                            ;         //中断里的计数变量
(0027) char string[18]                              ;         //字符串
(0028) unsigned char  clr   = 0                      ;         //清屏命令标志
(0029) unsigned char  two   = 0                      ;		   //第二行显示标志
(0030) unsigned char   end  = 0						 ;	  // 结束标志
(0031) unsigned char  start = 0                      ;         //接收完成标志
(0032) unsigned char  one   = 0						 ;		   //第一行显示标志
(0033) 
(0034) 
(0035) //void draw(unsigned long int m );
(0036) /*****************************************************************************
(0037)                        函数声明
(0038) ******************************************************************************/
(0039) void puts(unsigned int data );
(0040) void display(void)           ;
(0041) void port_init(void)
(0042) {
(0043)  PORTA = 0x00;
_port_init:
    0055 2422      CLR	R2
    0056 BA2B      OUT	0x1B,R2
(0044)  DDRA  = 0x00;
    0057 BA2A      OUT	0x1A,R2
(0045)  PORTB = 0x00;
    0058 BA28      OUT	0x18,R2
(0046)  DDRB  = 0x00; 				  			   		 //输出
    0059 BA27      OUT	0x17,R2
(0047)  PORTC = 0x00;  								 //m103 output only
    005A BA25      OUT	0x15,R2
(0048)  DDRC  = 0x00;  								 //输出 
    005B BA24      OUT	0x14,R2
(0049)  DDRD  = 0x00;
    005C BA21      OUT	0x11,R2
(0050)  PORTD = 0x00;
    005D BA22      OUT	0x12,R2
    005E 9508      RET
(0051) }
(0052) 
(0053) /******************************************************************************
(0054) 
(0055)   		//字符输入函数 
(0056) *******************************************************************************/		 
(0057) unsigned char getchar(void)
(0058)   	{
(0059) 	 while(!(UCSRA& (1<<RXC)));
_getchar:
    005F 9B5F      SBIS	0x0B,7
    0060 CFFE      RJMP	_getchar
(0060)      return UDR;
    0061 B10C      IN	R16,0x0C
    0062 9508      RET
_uart0_rx_isr:
    0063 922A      ST	R2,-Y
    0064 930A      ST	R16,-Y
    0065 931A      ST	R17,-Y
    0066 938A      ST	R24,-Y
    0067 939A      ST	R25,-Y
    0068 93EA      ST	R30,-Y
    0069 93FA      ST	R31,-Y
    006A B62F      IN	R2,0x3F
    006B 922A      ST	R2,-Y
(0061) 	}
(0062) 	
(0063) 	
(0064) /*******************************************************************************
(0065)         串行口接收中断
(0066) *******************************************************************************/	
(0067) #pragma interrupt_handler uart0_rx_isr:12
(0068) void uart0_rx_isr(void)
(0069) {
(0070)  string[i]= UDR ;
    006C E686      LDI	R24,0x66
    006D E090      LDI	R25,0
    006E 91E00060  LDS	R30,i
    0070 27FF      CLR	R31
    0071 0FE8      ADD	R30,R24
    0072 1FF9      ADC	R31,R25
    0073 B02C      IN	R2,0x0C
    0074 8220      STD	Z+0,R2
(0071)  if(i==0)
    0075 90200060  LDS	R2,i
    0077 2022      TST	R2
    0078 F579      BNE	0x00A8
(0072)   {switch (string[0])
    0079 91000066  LDS	R16,string
    007B 2711      CLR	R17
    007C 320A      CPI	R16,0x2A
    007D E0E0      LDI	R30,0
    007E 071E      CPC	R17,R30
    007F F049      BEQ	0x0089
    0080 320B      CPI	R16,0x2B
    0081 E0E0      LDI	R30,0
    0082 071E      CPC	R17,R30
    0083 F089      BEQ	0x0095
    0084 320D      CPI	R16,0x2D
    0085 E0E0      LDI	R30,0
    0086 071E      CPC	R17,R30
    0087 F0C9      BEQ	0x00A1
    0088 C037      RJMP	0x00C0
(0073)    {
(0074)     case fone : {one=1;two=0;i++;}break;
    0089 E081      LDI	R24,1
    008A 93800065  STS	one,R24
    008C 2422      CLR	R2
    008D 92200062  STS	two,R2
    008F 91800060  LDS	R24,i
    0091 5F8F      SUBI	R24,0xFF
    0092 93800060  STS	i,R24
    0094 C02B      RJMP	0x00C0
(0075) 	case ftwo : {two=1;one=0;i++;}break;
    0095 E081      LDI	R24,1
    0096 93800062  STS	two,R24
    0098 2422      CLR	R2
    0099 92200065  STS	one,R2
    009B 91800060  LDS	R24,i
    009D 5F8F      SUBI	R24,0xFF
    009E 93800060  STS	i,R24
    00A0 C01F      RJMP	0x00C0
(0076) 	case fclr : {clr=1;i=0;}      break;
    00A1 E081      LDI	R24,1
    00A2 93800061  STS	clr,R24
    00A4 2422      CLR	R2
    00A5 92200060  STS	i,R2
(0077) 	default:                      break ;
(0078) 	}
(0079) 	}
    00A7 C018      RJMP	0x00C0
(0080)  else if (string[i]==fend) {end=i-1;start=1;}
    00A8 E686      LDI	R24,0x66
    00A9 E090      LDI	R25,0
    00AA 91E00060  LDS	R30,i
    00AC 27FF      CLR	R31
    00AD 0FE8      ADD	R30,R24
    00AE 1FF9      ADC	R31,R25
    00AF 8180      LDD	R24,Z+0
    00B0 338C      CPI	R24,0x3C
    00B1 F449      BNE	0x00BB
    00B2 91800060  LDS	R24,i
    00B4 5081      SUBI	R24,1
    00B5 93800063  STS	end,R24
    00B7 E081      LDI	R24,1
    00B8 93800064  STS	start,R24
    00BA C005      RJMP	0x00C0
(0081)  
(0082)  else i++;
    00BB 91800060  LDS	R24,i
    00BD 5F8F      SUBI	R24,0xFF
    00BE 93800060  STS	i,R24
    00C0 9029      LD	R2,Y+
    00C1 BE2F      OUT	0x3F,R2
    00C2 91F9      LD	R31,Y+
    00C3 91E9      LD	R30,Y+
    00C4 9199      LD	R25,Y+
    00C5 9189      LD	R24,Y+
    00C6 9119      LD	R17,Y+
    00C7 9109      LD	R16,Y+
    00C8 9029      LD	R2,Y+
    00C9 9518      RETI
(0083) 
(0084) }
(0085) 
(0086) /******************************************************************************
(0087) 函数名称:1号通道采集函数
(0088) 函数功能:返回采集一次的模拟量
(0089) 函数参数:无
(0090) 返回值 : 16 位型 ,变量
(0091) 
(0092) ******************************************************************************/
(0093) 
(0094) unsigned int ad_1(void)       //ad0采集函数,返回ad0的值
(0095)  {
(0096)   unsigned int value;
(0097)   ADMUX=0xc1;
_ad_1:
  value                --> R16
    00CA EC81      LDI	R24,0xC1
    00CB B987      OUT	0x07,R24
(0098)   ADCSR=0x86;
    00CC E886      LDI	R24,0x86
    00CD B986      OUT	0x06,R24
(0099)   BIT_SET(ADCSR,ADSC);
    00CE 9A36      SBI	0x06,6
(0100)   while(ADCSR & (1<<ADSC));   //waitting ADC complete 
    00CF 9936      SBIC	0x06,6
    00D0 CFFE      RJMP	0x00CF
(0101)   value=ADCL;                 //Read 8 low bits first (important) 
    00D1 B104      IN	R16,0x04
    00D2 2711      CLR	R17
(0102)   value|=( int)ADCH << 8;      //read 2 high bits and shift into top byte 
    00D3 B025      IN	R2,0x05
    00D4 2433      CLR	R3
    00D5 2C32      MOV	R3,R2
    00D6 2422      CLR	R2
    00D7 2902      OR	R16,R2
    00D8 2913      OR	R17,R3
(0103)   return(value);
    00D9 9508      RET
_main:
  temp                 --> Y+1
  vdata                --> R10
  data                 --> R12
  m                    --> Y+0
    00DA 9724      SBIW	R28,4
(0104)   }
(0105) 
(0106)   
(0107)  
(0108) void main(void)
(0109) {    
(0110) /*****************************************************************************
(0111)                                变量定义
(0112) *******************************************************************************/     
(0113) 	 unsigned long int  m=0         ;             //温度采集后的值
    00DB E040      LDI	R20,0
    00DC E050      LDI	R21,0
    00DD E060      LDI	R22,0
    00DE E070      LDI	R23,0
    00DF 01FE      MOVW	R30,R28
    00E0 8340      STD	Z+0,R20
    00E1 8351      STD	Z+1,R21
    00E2 8362      STD	Z+2,R22
    00E3 8373      STD	Z+3,R23
(0114) 	 char temp                      ;			//循环变量
(0115) 	 unsigned int data,vdata        ;          //温度和电压的值
(0116) /******************************************************************************
(0117)                                 端口初始化和晶体频率校正
(0118) ******************************************************************************/
(0119) 	 
(0120) 	 
(0121) 	 port_init()                     ;            //端口初始话~~~!
    00E4 DF70      RCALL	_port_init
(0122) 	 OSCCAL=0xb0					 ;
    00E5 EB80      LDI	R24,0xB0
    00E6 BF81      OUT	0x31,R24
(0123) 	 
(0124) /*------------------------------------------------------------------
(0125)  初始化完成,初始化温度计,初始化液晶
(0126) --------------------------------------------------------------------*/
(0127) 
(0128)      resetDS18B20()                  ;       	  //初始化温度计
    00E7 940E01C0  CALL	_resetDS18B20
(0129)      DDRA|=LCD_DATA                  ;            // 数据为输出
    00E9 B38A      IN	R24,0x1A
    00EA 6F80      ORI	R24,0xF0
    00EB BB8A      OUT	0x1A,R24
(0130) 	 DDRC|=LCD_RS|LCD_EN             ;       	  //置位RS.EN
    00EC B384      IN	R24,0x14
    00ED 6C80      ORI	R24,0xC0
    00EE BB84      OUT	0x14,R24
(0131)      LCD_init()                      ;    	 	  //液晶初始化 
    00EF 940E025A  CALL	_LCD_init
(0132) 	 
(0133) /*****************************************************************************
(0134) 					 初始化串口
(0135) ******************************************************************************/
(0136) 	// UBRR=0x33;						 ;		     //波特率9600
(0137) 	// UCR=0x18						 ;			 //设置串口接收发送有效
(0138)  UCSRB = 0x00; //disable while setting baud rate
    00F1 2422      CLR	R2
    00F2 B82A      OUT	0x0A,R2
(0139)  UCSRA = 0x00;
    00F3 B82B      OUT	0x0B,R2
(0140)  UCSRC = BIT(URSEL) | 0x06;
    00F4 E886      LDI	R24,0x86
    00F5 BD80      OUT	0x20,R24
(0141)  UBRRL = baud; //set baud rate lo
    00F6 E383      LDI	R24,0x33
    00F7 B989      OUT	0x09,R24
(0142)  UBRRH = 0x00; //set baud rate hi
    00F8 BC20      OUT	0x20,R2
(0143)  UCSRB = 0x98;
    00F9 E988      LDI	R24,0x98
    00FA B98A      OUT	0x0A,R24
(0144)  
(0145) /****************************************************************************
(0146) 					初始化ad口
(0147) 使用内部基准2.56 v , 使用 pa1(ad1)口采集电压,并发送到串口														   
(0148) *****************************************************************************/
(0149)     BIT_CLR(DDRA,1);
    00FB 98D1      CBI	0x1A,1
(0150) 	BIT_CLR(PORTA,1);//设置采集端口为高祖状态
    00FC 98D9      CBI	0x1B,1
(0151) 	SEI();
    00FD 9478      BSET	7
    00FE C035      RJMP	0x0134
(0152) 
(0153) /******************************************************************************
(0154)  主循环体,循环测温,电压,并发送到上位机
(0155) ******************************************************************************/	
(0156) 
(0157)      while(1)
(0158) 	 
(0159)        {
(0160) 	     resetDS18B20()              	  ;
    00FF 940E01C0  CALL	_resetDS18B20
(0161) 	     m=readTempDS18B20()		      ;       //测试终端温度
    0101 940E0241  CALL	_readTempDS18B20
    0103 0118      MOVW	R2,R16
    0104 2444      CLR	R4
    0105 2455      CLR	R5
    0106 01FE      MOVW	R30,R28
    0107 8220      STD	Z+0,R2
    0108 8231      STD	Z+1,R3
    0109 8242      STD	Z+2,R4
    010A 8253      STD	Z+3,R5
(0162) 		 
(0163) 		 data=m;
    010B 01FE      MOVW	R30,R28
    010C 80C0      LDD	R12,Z+0
    010D 80D1      LDD	R13,Z+1
(0164) 		  vdata = ad_1()                     ;     //测试终端工作电压
    010E DFBB      RCALL	_ad_1
    010F 0158      MOVW	R10,R16
(0165) 		  puts(data)                         ;
    0110 0186      MOVW	R16,R12
    0111 D025      RCALL	_puts
(0166) 		  puts(vdata)                        ;     //发送电压和温度到上位机
    0112 0185      MOVW	R16,R10
    0113 D023      RCALL	_puts
(0167) 		  if(start==1)      display() 		 ;     // 普通模式
    0114 91800064  LDS	R24,start
    0116 3081      CPI	R24,1
    0117 F411      BNE	0x011A
    0118 D031      RCALL	_display
    0119 C01A      RJMP	0x0134
(0168) 		  else if(clr==1)   
    011A 91800061  LDS	R24,clr
    011C 3081      CPI	R24,1
    011D F491      BNE	0x0130
(0169) 		  {
(0170) 		   LCD_write_char(0x01,0);
    011E 2722      CLR	R18
    011F 2733      CLR	R19
    0120 E001      LDI	R16,1
    0121 E010      LDI	R17,0
    0122 940E02A1  CALL	_LCD_write_char
(0171) 		   clr=0;
    0124 2422      CLR	R2
    0125 92200061  STS	clr,R2
(0172) 		   one=0;
    0127 92200065  STS	one,R2
(0173) 		   two=0;
    0129 92200062  STS	two,R2
(0174) 		   start=0;
    012B 92200064  STS	start,R2
(0175) 		   end=0;
    012D 92200063  STS	end,R2
(0176) 		   }
    012F C004      RJMP	0x0134
(0177) 		  else
(0178) 		  delay_nms(1000)					 ;
    0130 EE08      LDI	R16,0xE8
    0131 E013      LDI	R17,3
    0132 940E01B1  CALL	_delay_nms
    0134 CFCA      RJMP	0x00FF
    0135 9624      ADIW	R28,4

⌨️ 快捷键说明

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