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

📄 1602test.lst

📁 基于M16的字符液晶1602的驱动
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0056)         datachar2[n + 1] = '\0';
     17D 01CE      MOVW	R24,R28
     17E 960F      ADIW	R24,0xF
     17F 8DE9      LDD	R30,Y+25
     180 27FF      CLR	R31
     181 0FE8      ADD	R30,R24
     182 1FF9      ADC	R31,R25
     183 2422      CLR	R2
     184 8220      STD	Z+0,R2
(0057)         datachar2[0] = '-';      //加上负号
     185 E28D      LDI	R24,0x2D
     186 878E      STD	Y+14,R24
(0058)     }
     187 C00E      RJMP	0x0196
(0059) 
(0060)     else if( dataint == 0 )        //=0
     188 A02C      LDD	R2,Y+36
     189 A03D      LDD	R3,Y+37
     18A A04E      LDD	R4,Y+38
     18B A05F      LDD	R5,Y+39
     18C 9488      BCLR	0
     18D 2022      TST	R2
     18E 0432      CPC	R3,R2
     18F 0442      CPC	R4,R2
     190 0452      CPC	R5,R2
     191 F421      BNE	0x0196
(0061)     {
(0062)         datachar2[0] = 0x30;
     192 E380      LDI	R24,0x30
     193 878E      STD	Y+14,R24
(0063)         datachar2[1] = '\0';
     194 2422      CLR	R2
     195 862F      STD	Y+15,R2
(0064)     }
(0065) 
(0066)     p1 = datachar2;
     196 01CE      MOVW	R24,R28
     197 960E      ADIW	R24,0xE
     198 015C      MOVW	R10,R24
(0067) 
(0068)     strcpy( p, p1 );
     199 019C      MOVW	R18,R24
     19A A508      LDD	R16,Y+40
     19B A519      LDD	R17,Y+41
     19C 940E 0449 CALL	_strcpy
     19E 966A      ADIW	R28,0x1A
     19F 940E 0501 CALL	pop_xgsetF0FC
     1A1 9624      ADIW	R28,4
     1A2 9508      RET
_float_2_string:
  flag2                --> R12
  flag1                --> R14
  k                    --> R10
  dataftmp             --> Y,+12
  datastr1             --> Y,+2
  i                    --> R20
  p                    --> R22
  datastr              --> Y,+30
  dataf                --> Y,+26
     1A3 940E 045E CALL	push_arg4
     1A5 940E 050C CALL	push_xgsetF0FC
     1A7 9760      SBIW	R28,0x10
     1A8 A168      LDD	R22,Y+32
(0069) }
(0070) 
(0071) /*****************************************
(0072) ** 将一个浮点型数据转化为字符串
(0073) ** 入口参数 要转换的浮点数: dataf, 数组datastr[10], 小数位数 P
(0074) ** 最好小数位数不是
(0075) ** 改变思路:浮点数 --> 整数 -->字符串-->根据各种类型的浮点数不同调整字符位置
(0076) ** 可以转换小于0的浮点数
(0077) *****************************************/
(0078) void float_2_string( float dataf, char *datastr, uchar p )
(0079) {
(0080)     float dataftmp  = dataf;
     1A9 8C2A      LDD	R2,Y+26
     1AA 8C3B      LDD	R3,Y+27
     1AB 8C4C      LDD	R4,Y+28
     1AC 8C5D      LDD	R5,Y+29
     1AD 862C      STD	Y+12,R2
     1AE 863D      STD	Y+13,R3
     1AF 864E      STD	Y+14,R4
     1B0 865F      STD	Y+15,R5
(0081)     char datastr1[10];
(0082)     uchar flag1 = 0;
     1B1 24EE      CLR	R14
(0083)     uchar flag2 = 0;
     1B2 24CC      CLR	R12
(0084)     uchar k;
(0085)     uchar i = 0;
     1B3 2744      CLR	R20
(0086) 
(0087)     if( (long int)dataf == 0 )       // dataf为 -1 --- 1 之间的数
     1B4 8D0A      LDD	R16,Y+26
     1B5 8D1B      LDD	R17,Y+27
     1B6 8D2C      LDD	R18,Y+28
     1B7 8D3D      LDD	R19,Y+29
     1B8 940E 060F CALL	fpint
     1BA 9488      BCLR	0
     1BB 2300      TST	R16
     1BC 0710      CPC	R17,R16
     1BD 0720      CPC	R18,R16
     1BE 0730      CPC	R19,R16
     1BF F009      BEQ	0x01C1
     1C0 C03E      RJMP	0x01FF
(0088)     {
(0089)         dataftmp += 2;          //随便一个整数 只是为了扩大为首位不为0的数
     1C1 842C      LDD	R2,Y+12
     1C2 843D      LDD	R3,Y+13
     1C3 844E      LDD	R4,Y+14
     1C4 845F      LDD	R5,Y+15
     1C5 E600      LDI	R16,0x60
     1C6 E010      LDI	R17,0
     1C7 940E 057D CALL	lpm32
     1C9 933A      ST	R19,-Y
     1CA 932A      ST	R18,-Y
     1CB 931A      ST	R17,-Y
     1CC 930A      ST	R16,-Y
     1CD 0181      MOVW	R16,R2
     1CE 0192      MOVW	R18,R4
     1CF 940E 05F9 CALL	fpadd2
     1D1 870C      STD	Y+12,R16
     1D2 871D      STD	Y+13,R17
     1D3 872E      STD	Y+14,R18
     1D4 873F      STD	Y+15,R19
(0090)         flag1 = 1;
     1D5 24EE      CLR	R14
     1D6 94E3      INC	R14
(0091)         if( dataf < 0 )
     1D7 8C2A      LDD	R2,Y+26
     1D8 8C3B      LDD	R3,Y+27
     1D9 8C4C      LDD	R4,Y+28
     1DA 8C5D      LDD	R5,Y+29
     1DB E50C      LDI	R16,0x5C
     1DC E010      LDI	R17,0
     1DD 940E 057D CALL	lpm32
     1DF 933A      ST	R19,-Y
     1E0 932A      ST	R18,-Y
     1E1 931A      ST	R17,-Y
     1E2 930A      ST	R16,-Y
     1E3 0181      MOVW	R16,R2
     1E4 0192      MOVW	R18,R4
     1E5 940E 0755 CALL	fpcmp2
     1E7 F4BC      BGE	0x01FF
(0092)         {
(0093)             flag2 = 1;
     1E8 24CC      CLR	R12
     1E9 94C3      INC	R12
(0094)             dataftmp -= 4;      //随便一个整数 只是为了扩大为首位不为0的数
     1EA 842C      LDD	R2,Y+12
     1EB 843D      LDD	R3,Y+13
     1EC 844E      LDD	R4,Y+14
     1ED 845F      LDD	R5,Y+15
     1EE E508      LDI	R16,0x58
     1EF E010      LDI	R17,0
     1F0 940E 057D CALL	lpm32
     1F2 933A      ST	R19,-Y
     1F3 932A      ST	R18,-Y
     1F4 931A      ST	R17,-Y
     1F5 930A      ST	R16,-Y
     1F6 0181      MOVW	R16,R2
     1F7 0192      MOVW	R18,R4
     1F8 940E 0604 CALL	fpsub2
     1FA 870C      STD	Y+12,R16
     1FB 871D      STD	Y+13,R17
     1FC 872E      STD	Y+14,R18
     1FD 873F      STD	Y+15,R19
(0095)             flag1 = 0;
     1FE 24EE      CLR	R14
(0096)         }
(0097)     }
(0098) 
(0099)     for( i = 0; i < p + 1; i++ )
     1FF 2744      CLR	R20
     200 C00F      RJMP	0x0210
(0100)         dataftmp = dataftmp * 10;
     201 E504      LDI	R16,0x54
     202 E010      LDI	R17,0
     203 940E 057D CALL	lpm32
     205 01CE      MOVW	R24,R28
     206 960C      ADIW	R24,0xC
     207 939A      ST	R25,-Y
     208 938A      ST	R24,-Y
     209 940E 0733 CALL	fpmule1
     20B 870C      STD	Y+12,R16
     20C 871D      STD	Y+13,R17
     20D 872E      STD	Y+14,R18
     20E 873F      STD	Y+15,R19
     20F 9543      INC	R20
     210 2F86      MOV	R24,R22
     211 5F8F      SUBI	R24,0xFF
     212 1748      CP	R20,R24
     213 F368      BCS	0x0201
(0101) 
(0102)     long_to_string( (long int)dataftmp, datastr1 );
     214 01CE      MOVW	R24,R28
     215 9602      ADIW	R24,2
     216 8399      STD	Y+1,R25
     217 8388      STD	Y+0,R24
     218 850C      LDD	R16,Y+12
     219 851D      LDD	R17,Y+13
     21A 852E      LDD	R18,Y+14
     21B 853F      LDD	R19,Y+15
     21C 940E 060F CALL	fpint
     21E DE8D      RCALL	_long_to_string
(0103)     k = strlen( datastr1 );
     21F 018E      MOVW	R16,R28
     220 5F0E      SUBI	R16,0xFE
     221 4F1F      SBCI	R17,0xFF
     222 940E 0452 CALL	_strlen
     224 2EA0      MOV	R10,R16
(0104) 
(0105)     for( i = 1; i < p + 1; i++ )
     225 E041      LDI	R20,1
     226 C013      RJMP	0x023A
(0106)         *( datastr1 + (k-i) ) =  *( datastr1 + (k-i-1) );
     227 2E24      MOV	R2,R20
     228 2433      CLR	R3
     229 2C4A      MOV	R4,R10
     22A 2455      CLR	R5
     22B 1842      SUB	R4,R2
     22C 0853      SBC	R5,R3
     22D 01CE      MOVW	R24,R28
     22E 9601      ADIW	R24,1
     22F 01F2      MOVW	R30,R4
     230 0FE8      ADD	R30,R24
     231 1FF9      ADC	R31,R25
     232 8020      LDD	R2,Z+0
     233 01CE      MOVW	R24,R28
     234 9602      ADIW	R24,2
     235 01F2      MOVW	R30,R4
     236 0FE8      ADD	R30,R24
     237 1FF9      ADC	R31,R25
     238 8220      STD	Z+0,R2
     239 9543      INC	R20
     23A 2F86      MOV	R24,R22
     23B 5F8F      SUBI	R24,0xFF
     23C 1748      CP	R20,R24
     23D F348      BCS	0x0227
(0107) 
(0108)     *( datastr1 + (k-i) ) = '.';
     23E 2E24      MOV	R2,R20
     23F 2433      CLR	R3
     240 2DEA      MOV	R30,R10
     241 27FF      CLR	R31
     242 19E2      SUB	R30,R2
     243 09F3      SBC	R31,R3
     244 01CE      MOVW	R24,R28
     245 9602      ADIW	R24,2
     246 0FE8      ADD	R30,R24
     247 1FF9      ADC	R31,R25
     248 E28E      LDI	R24,0x2E
     249 8380      STD	Z+0,R24
(0109) 
(0110) 
(0111)     if( flag1 )        //如果为0.00820之类的数
     24A 20EE      TST	R14
     24B F019      BEQ	0x024F
(0112)     {
(0113)         *datastr1 = '0';
     24C E380      LDI	R24,0x30
     24D 838A      STD	Y+2,R24
(0114)         flag1 = 0;
     24E 24EE      CLR	R14
(0115)     }
(0116) 
(0117)     if( flag2 )       //如果为-0.00820之类的数
     24F 20CC      TST	R12
     250 F021      BEQ	0x0255
(0118)     {
(0119)         *datastr1 = '-';
     251 E28D      LDI	R24,0x2D
     252 838A      STD	Y+2,R24
(0120)         *( datastr1 + 1 ) = '0';
     253 E380      LDI	R24,0x30
     254 838B      STD	Y+3,R24
(0121)     }
(0122) 
(0123)     if( p == 0 )
     255 2366      TST	R22
     256 F461      BNE	0x0263
(0124)     {
(0125)         *( datastr1 + (k-i) ) = '\0';
     257 2E24      MOV	R2,R20
     258 2433      CLR	R3
     259 2DEA      MOV	R30,R10
     25A 27FF      CLR	R31
     25B 19E2      SUB	R30,R2
     25C 09F3      SBC	R31,R3
     25D 01CE      MOVW	R24,R28
     25E 9602      ADIW	R24,2
     25F 0FE8      ADD	R30,R24
     260 1FF9      ADC	R31,R25
     261 2422      CLR	R2
     262 8220      STD	Z+0,R2
(0126)     }
(0127) 
(0128)     strcpy( datastr, datastr1 );
     263 019E      MOVW	R18,R28
     264 5F2E      SUBI	R18,0xFE
     265 4F3F      SBCI	R19,0xFF
     266 8D0E      LDD	R16,Y+30
     267 8D1F      LDD	R17,Y+31
     268 940E 0449 CALL	_strcpy
     26A 9660      ADIW	R28,0x10
     26B 940E 0501 CALL	pop_xgsetF0FC
     26D 9624      ADIW	R28,4
     26E 9508      RET
(0129) }
(0130) //*********************************************************************************************
(0131) 
(0132) //==========================================
(0133) //函数名称:液晶模块使能
(0134) //函数作用: 使能液晶
(0135) //入口参数: 无
(0136) //返回类型:无
(0137) //==========================================
(0138) void LCD_en_write(void)
(0139) {
(0140)   EN_SET;
_LCD_en_write:
     26F 9ADB      SBI	0x1B,3
(0141)   delay_nus(4);
     270 E004      LDI	R16,4
     271 E010      LDI	R17,0
     272 940E 0078 CALL	_delay_nus
(0142)   EN_CLR;
     274 98DB      CBI	0x1B,3
     275 9508      RET
_LCD_write_command:
  command              --> R20
     276 934A      ST	R20,-Y
     277 2F40      MOV	R20,R16
(0143) }
(0144) 
(0145) //==========================================
(0146) //函数名称:写指令
(0147) //函数作用:
(0148) //入口参数: 液晶指令command
(0149) //返回类型:无
(0150) //==========================================
(0151) void LCD_write_command(uchar command)
(0152) {
(0153)   delay_nus( 16 );
     278 E100      LDI	R16,0x10
     279 E010      LDI	R17,0
     27A 940E 0078 CALL	_delay_nus
(0154)   RS_CLR;
     27C 98DA      CBI	0x1B,2
(0155)   DB &= 0X0F;           //清高四位
     27D B38B      IN	R24,0x1B
     27E 708F      ANDI	R24,0xF
     27F BB8B      OUT	0x1B,R24
(0156)   DB |= command & 0xf0; //写高四位
     280 2F84      MOV	R24,R20
     281 7F80      ANDI	R24,0xF0
     282 B22B      IN	R2,0x1B
     283 2A28      OR	R2,R24
     284 BA2B      OUT	0x1B,R2
(0157)   LCD_en_write();
     285 DFE9      RCALL	_LCD_en_write
(0158)   command=command << 4;   //低四位移到高四位
     286 2F84      MOV	R24,R20
     287 708F      ANDI	R24,0xF
     288 9582      SWAP	R24
     289 2F48      MOV	R20,R24
(0159)   DB &= 0x0f;             //清高四位
     28A B38B      IN	R24,0x1B
     28B 708F      ANDI	R24,0xF
     28C BB8B      OUT	0x1B,R24
(0160)   DB |= command & 0xf0;   //写低四位
     28D 2F84      MOV	R24,R20
     28E 7F80      ANDI	R24,0xF0
     28F B22B      IN	R2,0x1B
     290 2A28      OR	R2,R24
     291 BA2B      OUT	0x1B,R2
(0161)   LCD_en_write();
     292 DFDC      RCALL	_LCD_en_write
     293 9149      LD	R20,Y+
     294 9508      RET
_LCD_write_data:
  DATA                 --> R20
     295 934A      ST	R20,-Y
     296 2F40      MOV	R20,R16
(0162)   //delay_nms(2);         //清屏指令时间很长, 保险起见,可以增加
(0163) }
(0164) 
(0165) //==========================================
(0166) //函数名称:写数据
(0167) //函数作用:
(0168) //入口参数: 数据DATA
(0169) //返回类型:无
(0170) //==========================================
(0171) void LCD_write_data(uchar DATA)
(0172) {
(0173)   delay_nus(16);
     297 E100      LDI	R16,0x10
     298 E010      LDI	R17,0
     299 940E 0078 CALL	_delay_nus
(0174)   RS_SET;           //RS=1
     29B 9ADA      SBI	0x1B,2
(0175)   DB &= 0X0f;       //清高四位
     29C B38B      IN	R24,0x1B
     29D 708F      ANDI	R24,0xF
     29E BB8B      OUT	0x1B,R24
(0176)   DB |= DATA&0xf0;  //写高四位
     29F 2F84      MOV	R24,R20
     2A0 7F80      ANDI	R24,0xF0
     2A1 B22B      IN	R2,0x1B
     2A2 2A28      OR	R2,R24
     2A3 BA2B      OUT	0x1B,R2
(0177)   LCD_en_write();
     2A4 DFCA      RCALL	_LCD_en_write
(0178)   DATA = DATA << 4; //低四位移到高四位
     2A5 2F84      MOV	R24,R20
     2A6 708F      ANDI	R24,0xF
     2A7 9582      SWAP	R24
     2A8 2F48      MOV	R20,R24
(0179)   DB &= 0X0f;       //清高四位
     2A9 B38B      IN	R24,0x1B
     2AA 708F      ANDI	R24,0xF
     2AB BB8B      OUT	0x1B,R24
(0180)   DB |= DATA&0xf0;  //写低四位
     2AC 2F84      MOV	R24,R20
     2AD 7F80      ANDI	R24,0xF0
     2AE B22B      IN	R2,0x1B

⌨️ 快捷键说明

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