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

📄 1820.lst

📁 51单片驱动18b20的源代码程序!供设计者参考!
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
      32 E5CF      LDI	R28,0x5F
      33 E0D4      LDI	R29,4
      34 BFCD      OUT	0x3D,R28
      35 BFDE      OUT	0x3E,R29
      36 51CE      SUBI	R28,0x1E
      37 40D0      SBCI	R29,0
      38 EA0A      LDI	R16,0xAA
      39 8308      STD	Y+0,R16
      3A 2400      CLR	R0
      3B E6EB      LDI	R30,0x6B
      3C E0F0      LDI	R31,0
      3D E010      LDI	R17,0
      3E 37E1      CPI	R30,0x71
      3F 07F1      CPC	R31,R17
      40 F011      BEQ	0x0043
      41 9201      ST	R0,Z+
      42 CFFB      RJMP	0x003E
      43 8300      STD	Z+0,R16
      44 E5E8      LDI	R30,0x58
      45 E0F0      LDI	R31,0
      46 E6A0      LDI	R26,0x60
      47 E0B0      LDI	R27,0
      48 E010      LDI	R17,0
      49 E000      LDI	R16,0
      4A BF0B      OUT	0x3B,R16
      4B 36E3      CPI	R30,0x63
      4C 07F1      CPC	R31,R17
      4D F021      BEQ	0x0052
      4E 95C8      LPM
      4F 9631      ADIW	R30,1
      50 920D      ST	R0,X+
      51 CFF9      RJMP	0x004B
      52 940E 0242 CALL	_main
_exit:
      54 CFFF      RJMP	_exit
FILE: D:\DS18B20\lcd.h
(0001) /****************************端口宏定义**************************************/
(0002) //LCD1602端口连接按照下面方式连接,RW接地.																		 
(0003) #define LCD_EN_PORT   PORTA 
(0004) #define LCD_EN_DDR    DDRA 
(0005) #define LCD_EN        (1<<PA3)
(0006) 
(0007) #define LCD_RS_PORT   PORTA 
(0008) #define LCD_RS_DDR    DDRA 
(0009) #define LCD_RS        (1<<PA1)
(0010) 
(0011) #define LCD_RW_PORT   PORTA 
(0012) #define LCD_RW_DDR    DDRA 
(0013) #define LCD_RW        (1<<PA2)
(0014) 
(0015) #define LCD_DATA_PORT PORTA 
(0016) #define LCD_DATA_DDR  DDRA 
(0017) #define LCD_DATA_PIN  PINA 
(0018) #define LCD_DATA ((1<<4)|(1<<5)|(1<<6)|(1<<7))
(0019) /****************************函数申明****************************************/
(0020) void LCD_init(void);
(0021) void LCD_en_write(void);
(0022) void LCD_WriteControl(unsigned char command);
(0023) void LCD_WriteData(unsigned char data);
(0024) void LCD_Clear(void);
(0025) void LCD_Cursor (char row, char column);
(0026) void LCD_DisplayCharacter (char Char);
(0027) void LCD_DisplayString (char row, char column ,unsigned char *string);
(0028) void LCD_DisplayInt (char row, char column ,unsigned int t);
(0029) void LCD_Displayasc (char row, char column,  char asc);
(0030) void LCD_DisplayLong(char row, char column ,unsigned long t);
(0031) void delay_1us(void);
(0032) void delay_nus(unsigned int n);
(0033) void delay_1ms(void);
(0034) void delay_nms(unsigned int n);
(0035) /*******************************液晶初始化***********************************/
(0036) void LCD_init(void) //液晶初始化 
(0037) { 
(0038)   LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出 
_LCD_init:
      55 B38A      IN	R24,0x1A
      56 6F80      ORI	R24,0xF0
      57 BB8A      OUT	0x1A,R24
(0039)   LCD_EN_DDR|=LCD_EN; //设置EN方向为输出 
      58 9AD3      SBI	0x1A,3
(0040)   LCD_RS_DDR|=LCD_RS; //设置RS方向为输出 
      59 9AD1      SBI	0x1A,1
(0041)   LCD_RS_DDR|=LCD_RW; //
      5A 9AD2      SBI	0x1A,2
(0042)   LCD_WriteControl(0x28); 
      5B E208      LDI	R16,0x28
      5C D014      RCALL	_LCD_WriteControl
(0043)   LCD_en_write(); 
      5D D00D      RCALL	_LCD_en_write
(0044)   delay_nus(40); 
      5E E208      LDI	R16,0x28
      5F E010      LDI	R17,0
      60 D11B      RCALL	_delay_nus
(0045)   LCD_WriteControl(0x28); //4位显示 
      61 E208      LDI	R16,0x28
      62 D00E      RCALL	_LCD_WriteControl
(0046)   LCD_WriteControl(0x0c); //显示开 
      63 E00C      LDI	R16,0xC
      64 D00C      RCALL	_LCD_WriteControl
(0047)   LCD_WriteControl(0x01); //清屏 
      65 E001      LDI	R16,1
      66 D00A      RCALL	_LCD_WriteControl
(0048)   delay_nms(2); 
      67 E002      LDI	R16,2
      68 E010      LDI	R17,0
      69 D12B      RCALL	_delay_nms
      6A 9508      RET
(0049) } 
(0050) /*******************************液晶使能*************************************/
(0051) void LCD_en_write(void) //液晶使能 
(0052) { 
(0053)   LCD_EN_PORT|=LCD_EN; 
_LCD_en_write:
      6B 9ADB      SBI	0x1B,3
(0054)   delay_nus(1); 
      6C E001      LDI	R16,1
      6D E010      LDI	R17,0
      6E D10D      RCALL	_delay_nus
(0055)   LCD_EN_PORT&=~LCD_EN; 
      6F 98DB      CBI	0x1B,3
      70 9508      RET
_LCD_WriteControl:
  command              --> R20
      71 934A      ST	R20,-Y
      72 2F40      MOV	R20,R16
(0056) } 
(0057) /*******************************写指令***************************************/
(0058) void LCD_WriteControl(unsigned char command) //写指令 
(0059) { 
(0060)   delay_nus(16); 
      73 E100      LDI	R16,0x10
      74 E010      LDI	R17,0
      75 D106      RCALL	_delay_nus
(0061)   LCD_RS_PORT&=~LCD_RS; //RS=0 
      76 98D9      CBI	0x1B,1
(0062)   LCD_RW_PORT&=~LCD_RW; //
      77 98DA      CBI	0x1B,2
(0063)   LCD_DATA_PORT&=0X0f; //清高四位 
      78 B38B      IN	R24,0x1B
      79 708F      ANDI	R24,0xF
      7A BB8B      OUT	0x1B,R24
(0064)   LCD_DATA_PORT|=command&0xf0; //写高四位 
      7B 2F84      MOV	R24,R20
      7C 7F80      ANDI	R24,0xF0
      7D B22B      IN	R2,0x1B
      7E 2A28      OR	R2,R24
      7F BA2B      OUT	0x1B,R2
(0065)   LCD_en_write(); 
      80 DFEA      RCALL	_LCD_en_write
(0066)   command=command<<4; //低四位移到高四位 
      81 2F84      MOV	R24,R20
      82 708F      ANDI	R24,0xF
      83 9582      SWAP	R24
      84 2F48      MOV	R20,R24
(0067)   LCD_DATA_PORT&=0x0f; //清高四位 
      85 B38B      IN	R24,0x1B
      86 708F      ANDI	R24,0xF
      87 BB8B      OUT	0x1B,R24
(0068)   LCD_DATA_PORT|=command&0xf0; //写低四位 
      88 2F84      MOV	R24,R20
      89 7F80      ANDI	R24,0xF0
      8A B22B      IN	R2,0x1B
      8B 2A28      OR	R2,R24
      8C BA2B      OUT	0x1B,R2
(0069)   LCD_en_write(); 
      8D DFDD      RCALL	_LCD_en_write
      8E 9149      LD	R20,Y+
      8F 9508      RET
_LCD_WriteData:
  data                 --> R20
      90 934A      ST	R20,-Y
      91 2F40      MOV	R20,R16
(0070) } 
(0071) /*******************************写数据***************************************/
(0072) void LCD_WriteData(unsigned char data) //写数据 
(0073) { 
(0074)   delay_nus(16); 
      92 E100      LDI	R16,0x10
      93 E010      LDI	R17,0
      94 D0E7      RCALL	_delay_nus
(0075)   LCD_RS_PORT|=LCD_RS; //RS=1 
      95 9AD9      SBI	0x1B,1
(0076)   LCD_RW_PORT&=~LCD_RW; //
      96 98DA      CBI	0x1B,2
(0077)   LCD_DATA_PORT&=0X0f; //清高四位 
      97 B38B      IN	R24,0x1B
      98 708F      ANDI	R24,0xF
      99 BB8B      OUT	0x1B,R24
(0078)   LCD_DATA_PORT|=data&0xf0; //写高四位 
      9A 2F84      MOV	R24,R20
      9B 7F80      ANDI	R24,0xF0
      9C B22B      IN	R2,0x1B
      9D 2A28      OR	R2,R24
      9E BA2B      OUT	0x1B,R2
(0079)   LCD_en_write(); 
      9F DFCB      RCALL	_LCD_en_write
(0080)   data=data<<4; //低四位移到高四位 
      A0 2F84      MOV	R24,R20
      A1 708F      ANDI	R24,0xF
      A2 9582      SWAP	R24
      A3 2F48      MOV	R20,R24
(0081)   LCD_DATA_PORT&=0X0f; //清高四位 
      A4 B38B      IN	R24,0x1B
      A5 708F      ANDI	R24,0xF
      A6 BB8B      OUT	0x1B,R24
(0082)   LCD_DATA_PORT|=data&0xf0; //写低四位 
      A7 2F84      MOV	R24,R20
      A8 7F80      ANDI	R24,0xF0
      A9 B22B      IN	R2,0x1B
      AA 2A28      OR	R2,R24
      AB BA2B      OUT	0x1B,R2
(0083)   LCD_en_write(); 
      AC DFBE      RCALL	_LCD_en_write
      AD 9149      LD	R20,Y+
      AE 9508      RET
(0084) }
(0085) 
(0086) /*******************************清屏*****************************************/
(0087) void LCD_Clear(void)
(0088) {
(0089) LCD_WriteControl(0x01);
_LCD_Clear:
      AF E001      LDI	R16,1
      B0 DFC0      RCALL	_LCD_WriteControl
      B1 9508      RET
_LCD_Cursor:
  column               --> R20
  row                  --> R10
      B2 940E 02A3 CALL	push_xgsetF00C
      B4 2F42      MOV	R20,R18
      B5 2EA0      MOV	R10,R16
(0090) }
(0091) 
(0092) void LCD_Cursor (char row, char column)
(0093) {
(0094)   switch (row)
      B6 2D6A      MOV	R22,R10
      B7 2777      CLR	R23
      B8 3061      CPI	R22,1
      B9 E0E0      LDI	R30,0
      BA 077E      CPC	R23,R30
      BB F029      BEQ	0x00C1
      BC 3062      CPI	R22,2
      BD E0E0      LDI	R30,0
      BE 077E      CPC	R23,R30
      BF F031      BEQ	0x00C6
      C0 C009      RJMP	0x00CA
(0095)    {
(0096)     case 1: LCD_WriteControl (0x80 + column - 1); break;
      C1 2F04      MOV	R16,R20
      C2 5800      SUBI	R16,0x80
      C3 5001      SUBI	R16,1
      C4 DFAC      RCALL	_LCD_WriteControl
      C5 C004      RJMP	0x00CA
(0097)     case 2: LCD_WriteControl (0xc0 + column - 1); break;
      C6 2F04      MOV	R16,R20
      C7 5400      SUBI	R16,0x40
      C8 5001      SUBI	R16,1
      C9 DFA7      RCALL	_LCD_WriteControl
(0098)     default: break;
      CA 940C 02AA JMP	pop_xgsetF00C
_LCD_DisplayCharacter:
  Char                 --> R10
      CC 92AA      ST	R10,-Y
      CD 2EA0      MOV	R10,R16
(0099)    }
(0100) }
(0101) 
(0102) void LCD_DisplayCharacter (char Char)
(0103) {
(0104)   LCD_WriteData (Char);
      CE 2D0A      MOV	R16,R10
      CF DFC0      RCALL	_LCD_WriteData
      D0 90A9      LD	R10,Y+
      D1 9508      RET
_LCD_DisplayString:
  string               --> R10
  column               --> R14
  row                  --> R12
      D2 940E 0292 CALL	push_xgset00FC
      D4 2EE2      MOV	R14,R18
      D5 2EC0      MOV	R12,R16
      D6 80AE      LDD	R10,Y+6
      D7 80BF      LDD	R11,Y+7
(0105) }
(0106) 
(0107) void LCD_DisplayString (char row, char column ,unsigned char *string)
(0108) {
(0109)  LCD_Cursor (row, column);
      D8 2D2E      MOV	R18,R14
      D9 2D0C      MOV	R16,R12
      DA DFD7      RCALL	_LCD_Cursor
      DB C004      RJMP	0x00E0
(0110)  while (*string)
(0111)   LCD_DisplayCharacter (*string++);
      DC 01F5      MOVW	R30,R10
      DD 9101      LD	R16,Z+
      DE 015F      MOVW	R10,R30
      DF DFEC      RCALL	_LCD_DisplayCharacter
      E0 01F5      MOVW	R30,R10
      E1 8020      LDD	R2,Z+0
      E2 2022      TST	R2
      E3 F7C1      BNE	0x00DC
      E4 940C 027C JMP	pop_xgset00FC
_LCD_DisplayInt:
  n                    --> R14
  j                    --> R14
  str                  --> R20
  a                    --> Y,+2
  i                    --> R22
  t                    --> R14
  column               --> R12
  row                  --> R10
      E6 940E 028E CALL	push_xgsetF0FC
      E8 2EC2      MOV	R12,R18
      E9 2EA0      MOV	R10,R16
      EA 9727      SBIW	R28,7
      EB 88E9      LDD	R14,Y+17
      EC 88FA      LDD	R15,Y+18
(0112) }
(0113) 
(0114) unsigned char ch1[6];                      //用于存放INT转换成字符串后的数据
(0115) void  LCD_DisplayInt (char row, char column ,unsigned int t)
(0116) { 
(0117)   unsigned char n;
(0118)   unsigned char a[5]; char i, j;   
(0119)   unsigned char *str=ch1;                             
      ED E64B      LDI	R20,0x6B
      EE E050      LDI	R21,0
(0120)   a[0]=(t/10000)%10;         //取得整数值到数组          
      EF E120      LDI	R18,0x10
      F0 E237      LDI	R19,0x27
      F1 0187      MOVW	R16,R14
      F2 940E 025D CALL	div16u
      F4 E02A      LDI	R18,0xA
      F5 E030      LDI	R19,0
      F6 940E 025B CALL	mod16u
      F8 830A      STD	Y+2,R16
(0121)   a[1]=(t/1000)%10;                                      
      F9 EE28      LDI	R18,0xE8
      FA E033      LDI	R19,3
      FB 0187      MOVW	R16,R14
      FC 940E 025D CALL	div16u
      FE E02A      LDI	R18,0xA
      FF E030      LDI	R19,0
     100 940E 025B CALL	mod16u
     102 830B      STD	Y+3,R16
(0122)   a[2]=(t/100)%10;                                       
     103 E624      LDI	R18,0x64
     104 E030      LDI	R19,0
     105 0187      MOVW	R16,R14
     106 940E 025D CALL	div16u
     108 E02A      LDI	R18,0xA
     109 E030      LDI	R19,0
     10A 940E 025B CALL	mod16u
     10C 830C      STD	Y+4,R16
(0123)   a[3]=(t/10)%10;                                        
     10D E02A      LDI	R18,0xA
     10E E030      LDI	R19,0
     10F 0187      MOVW	R16,R14
     110 940E 025D CALL	div16u
     112 E02A      LDI	R18,0xA
     113 E030      LDI	R19,0
     114 940E 025B CALL	mod16u
     116 830D      STD	Y+5,R16
(0124)   a[4]=(t/1)%10;                                         
     117 E02A      LDI	R18,0xA
     118 E030      LDI	R19,0
     119 0187      MOVW	R16,R14
     11A 940E 025B CALL	mod16u
     11C 830E      STD	Y+6,R16
(0125)                                                       
(0126)   for(i=0; i<5; i++)         //转成ASCII码               
     11D 2766      CLR	R22
     11E C00B      RJMP	0x012A
(0127)     a[i]=a[i]+'0';                                     
     11F 01CE      MOVW	R24,R28
     120 9602      ADIW	R24,2
     121 2E26      MOV	R2,R22
     122 2433      CLR	R3
     123 0E28      ADD	R2,R24
     124 1E39      ADC	R3,R25
     125 01F1      MOVW	R30,R2
     126 8180      LDD	R24,Z+0
     127 5D80      SUBI	R24,0xD0
     128 8380      STD	Z+0,R24
     129 9563      INC	R22
     12A 3065      CPI	R22,5
     12B F398      BCS	0x011F
(0128)   for(i=0; a[i]=='0' && i<=3; i++);   
     12C 2766      CLR	R22
     12D C001      RJMP	0x012F
     12E 9563      INC	R22
     12F 01CE      MOVW	R24,R28
     130 9602      ADIW	R24,2
     131 2FE6      MOV	R30,R22
     132 27FF      CLR	R31
     133 0FE8      ADD	R30,R24
     134 1FF9      ADC	R31,R25
     135 8180      LDD	R24,Z+0
     136 3380      CPI	R24,0x30
     137 F419      BNE	0x013B
     138 E083      LDI	R24,3
     139 1786      CP	R24,R22
     13A F798      BCC	0x012E
(0129)     n=5-i;                   
     13B E085      LDI	R24,5
     13C 2EE8      MOV	R14,R24
     13D 1AE6      SUB	R14,R22
(0130)   for(j=5-n; j<i; j++)       //填充空格                  
     13E 198E      SUB	R24,R14
     13F 2EE8      MOV	R14,R24
     140 C006      RJMP	0x0147
(0131)     { *str=' ';  str++; }                              
     141 E280      LDI	R24,0x20
     142 01FA      MOVW	R30,R20
     143 8380      STD	Z+0,R24
     144 5F4F      SUBI	R20,0xFF
     145 4F5F      SBCI	R21,0xFF
     146 94E3      INC	R14
     147 16E6      CP	R14,R22
     148 F3C0      BCS	0x0141
(0132)   for(; i<5; i++)                                        
     149 C00C      RJMP	0x0156
(0133)     { *str=(char)a[i]; str++; }  //加入有效的数字            
     14A 01CE      MOVW	R24,R28
     14B 9602      ADIW	R24,2
     14C 2FE6      MOV	R30,R22
     14D 27FF      CLR	R31
     14E 0FE8      ADD	R30,R24
     14F 1FF9      ADC	R31,R25
     150 8020      LDD	R2,Z+0
     151 01FA      MOVW	R30,R20
     152 8220      STD	Z+0,R2
     153 5F4F      SUBI	R20,0xFF
     154 4F5F      SBCI	R21,0xFF
     155 9563      INC	R22
     156 3065      CPI	R22,5
     157 F390      BCS	0x014A
(0134)   *str='\0'; 
     158 2422      CLR	R2
     159 01FA      MOVW	R30,R20
     15A 8220      STD	Z+0,R2
(0135)   LCD_DisplayString(row,column,ch1);
     15B E68B      LDI	R24,0x6B

⌨️ 快捷键说明

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