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

📄 1602test.lst

📁 基于M16的字符液晶1602的驱动
💻 LST
📖 第 1 页 / 共 5 页
字号:
     2AF 2A28      OR	R2,R24
     2B0 BA2B      OUT	0x1B,R2
(0181)   LCD_en_write();
     2B1 DFBD      RCALL	_LCD_en_write
     2B2 9149      LD	R20,Y+
     2B3 9508      RET
(0182) }
(0183) 
(0184) //==========================================
(0185) //函数名称:液晶初始化函数
(0186) //函数作用:
(0187) //入口参数: 无
(0188) //返回类型:无
(0189) //==========================================
(0190) void LCD_init( void )
(0191) {
(0192)   DB_DDR_OUT;
_LCD_init:
     2B4 B38A      IN	R24,0x1A
     2B5 6F80      ORI	R24,0xF0
     2B6 BB8A      OUT	0x1A,R24
     2B7 B38A      IN	R24,0x1A
     2B8 608C      ORI	R24,0xC
     2B9 BB8A      OUT	0x1A,R24
(0193)   LCD_write_command(0x28);
     2BA E208      LDI	R16,0x28
     2BB DFBA      RCALL	_LCD_write_command
(0194)   LCD_en_write();           //********总结这里一定要加这液晶使能*********
     2BC DFB2      RCALL	_LCD_en_write
(0195)   delay_nus(20);
     2BD E104      LDI	R16,0x14
     2BE E010      LDI	R17,0
     2BF 940E 0078 CALL	_delay_nus
(0196)   LCD_write_command(0x28);  //4位显示
     2C1 E208      LDI	R16,0x28
     2C2 DFB3      RCALL	_LCD_write_command
(0197)   LCD_write_command(0x0c);  //显示开
     2C3 E00C      LDI	R16,0xC
     2C4 DFB1      RCALL	_LCD_write_command
(0198)   LCD_write_command(0x01);  //清屏
     2C5 E001      LDI	R16,1
     2C6 DFAF      RCALL	_LCD_write_command
(0199)   delay_nms(5);             //延时一定要长
     2C7 E005      LDI	R16,5
     2C8 E010      LDI	R17,0
     2C9 940E 0090 CALL	_delay_nms
     2CB 9508      RET
_LCD_set_rc:
  address              --> R20
  c                    --> R22
  r                    --> R10
     2CC 940E 0521 CALL	push_xgsetF00C
     2CE 2F62      MOV	R22,R18
     2CF 2EA0      MOV	R10,R16
(0200) }
(0201) 
(0202) //==========================================
(0203) //函数名称:写地址
(0204) //函数作用:
(0205) //入口参数: 行位置r, 列位置c
(0206) //返回类型:无
(0207) //==========================================
(0208) void LCD_set_rc( uchar r, uchar c )
(0209) {
(0210)     uchar address;
(0211) 
(0212)     if (r == 1)
     2D0 2D8A      MOV	R24,R10
     2D1 3081      CPI	R24,1
     2D2 F419      BNE	0x02D6
(0213)     address = 0x80 + c;
     2D3 2F46      MOV	R20,R22
     2D4 5840      SUBI	R20,0x80
     2D5 C005      RJMP	0x02DB
(0214)     else if(r == 2)
     2D6 2D8A      MOV	R24,R10
     2D7 3082      CPI	R24,2
     2D8 F411      BNE	0x02DB
(0215)     address = 0xc0 + c;
     2D9 2F46      MOV	R20,R22
     2DA 5440      SUBI	R20,0x40
(0216) 
(0217)     LCD_write_command( address );
     2DB 2F04      MOV	R16,R20
     2DC DF99      RCALL	_LCD_write_command
     2DD 940C 0528 JMP	pop_xgsetF00C
_LCD_write_string:
  s                    --> R20
  c                    --> R12
  r                    --> R10
     2DF 940E 052F CALL	push_xgset303C
     2E1 2EC2      MOV	R12,R18
     2E2 2EA0      MOV	R10,R16
     2E3 814E      LDD	R20,Y+6
     2E4 815F      LDD	R21,Y+7
(0218) }
(0219) 
(0220) //==========================================
(0221) //函数名称:写字符串
(0222) //函数作用: 在指定位置写一串字符串
(0223) //入口参数: 行位置r, 列位置c, 字符串*s
(0224) //返回类型:无
(0225) //示例    : LCD_write_string( 1, 2, "dongxixiaonanbei" );
(0226) //==========================================
(0227) void LCD_write_string(uchar r, uchar c, uchar *s)
(0228) {
(0229)     LCD_set_rc( r, c ); //写地址
     2E5 2D2C      MOV	R18,R12
     2E6 2D0A      MOV	R16,R10
     2E7 DFE4      RCALL	_LCD_set_rc
     2E8 C005      RJMP	0x02EE
(0230) 
(0231)     while( *s )     	 	// 写显示字符
(0232)     {
(0233)       LCD_write_data( *s );
     2E9 01FA      MOVW	R30,R20
     2EA 8100      LDD	R16,Z+0
     2EB DFA9      RCALL	_LCD_write_data
(0234)       s++;
     2EC 5F4F      SUBI	R20,0xFF
     2ED 4F5F      SBCI	R21,0xFF
     2EE 01FA      MOVW	R30,R20
     2EF 8020      LDD	R2,Z+0
     2F0 2022      TST	R2
     2F1 F7B9      BNE	0x02E9
     2F2 940C 0536 JMP	pop_xgset303C
_LCD_write_char:
  DATA                 --> Y,+2
  c                    --> R12
  r                    --> R10
     2F4 92AA      ST	R10,-Y
     2F5 92CA      ST	R12,-Y
     2F6 2EC2      MOV	R12,R18
     2F7 2EA0      MOV	R10,R16
(0235)     }
(0236) }
(0237) 
(0238) //写字符
(0239) //示例   : LCD_write_char( 1, 2, 'a' );
(0240) void LCD_write_char(uchar r, uchar c, uchar DATA)				
(0241) {
(0242)  	 LCD_set_rc( r, c );
     2F8 2D2C      MOV	R18,R12
     2F9 2D0A      MOV	R16,R10
     2FA DFD1      RCALL	_LCD_set_rc
(0243) 	 LCD_write_data( DATA );
     2FB 810A      LDD	R16,Y+2
     2FC DF98      RCALL	_LCD_write_data
     2FD 90C9      LD	R12,Y+
     2FE 90A9      LD	R10,Y+
     2FF 9508      RET
_LCD_write_array:
  i                    --> R10
  array                --> R12
  c                    --> R22
  r                    --> R20
     300 940E 053D CALL	push_xgsetF03C
     302 2F62      MOV	R22,R18
     303 2F40      MOV	R20,R16
     304 9721      SBIW	R28,1
     305 84C9      LDD	R12,Y+9
     306 84DA      LDD	R13,Y+10
(0244) }
(0245) 
(0246) //==========================================
(0247) //函数名称:写字符数组
(0248) //函数作用: 在指定位置写一串字符串
(0249) //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
(0250) //返回类型:无
(0251) //示例    : uchar a[] = "dongxixiaonanbei@163.com"
(0252) //          LCD_write_array( 1, 2, a );
(0253) //==========================================
(0254) void LCD_write_array( uchar r, uchar c, uchar array[] )
(0255) {
(0256)  	uchar i = 0;
     307 24AA      CLR	R10
     308 C02A      RJMP	0x0333
(0257)     while( array[i] != '\0' )
(0258) 	{
(0259) 	 	 LCD_write_char( r, c, array[i] );
     309 2DEA      MOV	R30,R10
     30A 27FF      CLR	R31
     30B 0DEC      ADD	R30,R12
     30C 1DFD      ADC	R31,R13
     30D 8020      LDD	R2,Z+0
     30E 8228      STD	Y+0,R2
     30F 2F26      MOV	R18,R22
     310 2F04      MOV	R16,R20
     311 DFE2      RCALL	_LCD_write_char
(0260) 	     if( ++c == 16 )
     312 2F86      MOV	R24,R22
     313 5F8F      SUBI	R24,0xFF
     314 2F68      MOV	R22,R24
     315 3160      CPI	R22,0x10
     316 F4D9      BNE	0x0332
(0261) 		 {
(0262) 		     if( r == 1 )
     317 3041      CPI	R20,1
     318 F461      BNE	0x0325
(0263) 			 {   
(0264) 			     c = 0;
     319 2766      CLR	R22
(0265) 				 r = 2;
     31A E042      LDI	R20,2
(0266) 		  	  	 LCD_write_char( r, c, array[i] );
     31B 2DEA      MOV	R30,R10
     31C 27FF      CLR	R31
     31D 0DEC      ADD	R30,R12
     31E 1DFD      ADC	R31,R13
     31F 8020      LDD	R2,Z+0
     320 8228      STD	Y+0,R2
     321 2F26      MOV	R18,R22
     322 2F04      MOV	R16,R20
     323 DFD0      RCALL	_LCD_write_char
(0267) 			 }
     324 C00D      RJMP	0x0332
(0268) 			 
(0269) 			 else if( r == 2 )
     325 3042      CPI	R20,2
     326 F459      BNE	0x0332
(0270) 			 {
(0271) 			  	 c = 0;
     327 2766      CLR	R22
(0272) 				 r = 1;
     328 E041      LDI	R20,1
(0273) 				 LCD_write_char( r, c, array[i] );
     329 2DEA      MOV	R30,R10
     32A 27FF      CLR	R31
     32B 0DEC      ADD	R30,R12
     32C 1DFD      ADC	R31,R13
     32D 8020      LDD	R2,Z+0
     32E 8228      STD	Y+0,R2
     32F 2F26      MOV	R18,R22
     330 2F04      MOV	R16,R20
     331 DFC2      RCALL	_LCD_write_char
(0274) 		     }
(0275) 	     }
(0276) 		 i++;
     332 94A3      INC	R10
     333 2DEA      MOV	R30,R10
     334 27FF      CLR	R31
     335 0DEC      ADD	R30,R12
     336 1DFD      ADC	R31,R13
     337 8020      LDD	R2,Z+0
     338 2022      TST	R2
     339 F009      BEQ	0x033B
     33A CFCE      RJMP	0x0309
     33B 9621      ADIW	R28,1
     33C 940C 0546 JMP	pop_xgsetF03C
_LCD_write_datalongint:
  a                    --> Y,+2
  datalongint          --> Y,+14
  c                    --> R12
  r                    --> R10
     33E 92AA      ST	R10,-Y
     33F 92CA      ST	R12,-Y
     340 2EC2      MOV	R12,R18
     341 2EA0      MOV	R10,R16
     342 972C      SBIW	R28,0xC
(0277) 	}  
(0278) }
(0279) 
(0280) //写整数
(0281) //例子: LCD_write_datalongint( 1, 5, 89 );  在液晶第一行,第5列显示89
(0282) void LCD_write_datalongint( uchar r, uchar c, long int datalongint )
(0283) {
(0284)     char a[10];
(0285)     long_to_string( datalongint, a ) ;
     343 01CE      MOVW	R24,R28
     344 9602      ADIW	R24,2
     345 8399      STD	Y+1,R25
     346 8388      STD	Y+0,R24
     347 850E      LDD	R16,Y+14
     348 851F      LDD	R17,Y+15
     349 8928      LDD	R18,Y+16
     34A 8939      LDD	R19,Y+17
     34B DD60      RCALL	_long_to_string
(0286) 	LCD_write_string( r, c, a );
     34C 01CE      MOVW	R24,R28
     34D 9602      ADIW	R24,2
     34E 8399      STD	Y+1,R25
     34F 8388      STD	Y+0,R24
     350 2D2C      MOV	R18,R12
     351 2D0A      MOV	R16,R10
     352 DF8C      RCALL	_LCD_write_string
     353 962C      ADIW	R28,0xC
     354 90C9      LD	R12,Y+
     355 90A9      LD	R10,Y+
     356 9508      RET
_LCD_write_datafloat:
  a                    --> Y,+3
  p                    --> Y,+19
  dataf                --> Y,+15
  c                    --> R12
  r                    --> R10
     357 92AA      ST	R10,-Y
     358 92CA      ST	R12,-Y
     359 2EC2      MOV	R12,R18
     35A 2EA0      MOV	R10,R16
     35B 972D      SBIW	R28,0xD
(0287) }
(0288) 
(0289) //写浮点型数据
(0290) //例子: LCD_write_datafloat( 1, 5, -0.33, 4 );  在液晶第一行,第5列显示-0.33, 显示小数点后4位。
(0291) void LCD_write_datafloat( uchar r, uchar c, float dataf, uchar p )
(0292) {
(0293)     char a[10];
(0294)     float_2_string( dataf, a, p );
     35C 880B      LDD	R0,Y+19
     35D 820A      STD	Y+2,R0
     35E 01CE      MOVW	R24,R28
     35F 9603      ADIW	R24,3
     360 8399      STD	Y+1,R25
     361 8388      STD	Y+0,R24
     362 850F      LDD	R16,Y+15
     363 8918      LDD	R17,Y+16
     364 8929      LDD	R18,Y+17
     365 893A      LDD	R19,Y+18
     366 DE3C      RCALL	_float_2_string
(0295)     LCD_write_string( r, c, a );
     367 01CE      MOVW	R24,R28
     368 9603      ADIW	R24,3
     369 8399      STD	Y+1,R25
     36A 8388      STD	Y+0,R24
     36B 2D2C      MOV	R18,R12
     36C 2D0A      MOV	R16,R10
     36D DF71      RCALL	_LCD_write_string
     36E 962D      ADIW	R28,0xD
     36F 90C9      LD	R12,Y+
     370 90A9      LD	R10,Y+
     371 9508      RET
FILE: E:\avr\1602测试程序\main.c
(0001) #include <iom16v.h>
(0002) #include "lcd.h"
(0003) #include "delay.h"
(0004) 
(0005) void init_devices( void )
(0006) {
(0007)  	 LCD_init();
_init_devices:
     372 940E 02B4 CALL	_LCD_init
     374 9508      RET
_main:
  tmp_f                --> Y,+9
  i                    --> Y,+5
     375 972D      SBIW	R28,0xD
(0008) }
(0009) 
(0010) void main( void )
(0011) {
(0012)  	 long int i = 0;
     376 E040      LDI	R20,0
     377 E050      LDI	R21,0
     378 E060      LDI	R22,0
     379 E070      LDI	R23,0
     37A 834D      STD	Y+5,R20
     37B 835E      STD	Y+6,R21
     37C 836F      STD	Y+7,R22
     37D 8778      STD	Y+8,R23
(0013) 	 float tmp_f = 0.00;	 
     37E E60C      LDI	R16,0x6C
     37F E010      LDI	R17,0
     380 940E 057D CALL	lpm32
     382 8709      STD	Y+9,R16
     383 871A      STD	Y+10,R17
     384 872B      STD	Y+11,R18
     385 873C      STD	Y+12,R19
(0014)  	 init_devices();             //目标版初始化
     386 DFEB      RCALL	_init_devices
(0015) 	
(0016) 	 LCD_write_string( 1, 4, "TEST LCD" );     //写字符串
     387 E789      LDI	R24,0x79
     388 E090      LDI	R25,0
     389 8399      STD	Y+1,R25
     38A 8388      STD	Y+0,R24
     38B E024      LDI	R18,4
     38C E001      LDI	R16,1
     38D 940E 02DF CALL	_LCD_write_string
(0017) 	 delay_ns( 1 );  //延时1S
     38F E001      LDI	R16,1
     390 940E 009E CALL	_delay_ns
(0018) 	 LCD_write_string( 1, 0, "                        " );   //清第一行数据
     392 E680      LDI	R24,0x60
     393 E090      LDI	R25,0
     394 8399      STD	Y+1,R25
     395 8388      STD	Y+0,R24
     396 2722      CLR	R18
     397 E001      LDI	R16,1
     398 940E 02DF CALL	_LCD_write_string
(0019) 	 
(0020) 	 for( i = 0; i < 1234; i++ )        //显示整数,小数
     39A E040      LDI	R20,0
     39B E050      LDI	R21,0
     39C E060      LDI	R22,0
     39D E070      LDI	R23,0
     39E 834D      STD	Y+5,R20
     39F 835E      STD	Y+6,R21
     3A0 836F      STD	Y+7,R22
     3A1 8778      STD	Y+8,R23
(0021) 	 {
(0022) 	  	  LCD_write_datalongint( 2, 1, i ); //显示正整数 i
     3A2 802D      LDD	R2,Y+5
     3A3 803E      LDD	R3,Y+6
     3A4 804F      LDD	R4,Y+7
     3A5 8458      LDD	R5,Y+8
     3A6 8228      STD	Y+0,R2
     3A7 8239      STD	Y+1,R3
     3A8 824A      STD	Y+2,R4
     3A9 825B      STD	Y+3,R5
     3AA E021      LDI	R18,1
     3AB E002      LDI	R16,2
     3AC 940E 033E CALL	_LCD_write_datalongint
(0023) 		  LCD_write_datalongint( 1, 0, i*(-1) ); //显示负整数 -i
     3AE 802D      LDD	R2,Y+5
     3AF 803E      LDD	R3,Y+6
     3B0 804F      LDD	R4,Y+7
     3B1 8458      LDD	R5,Y+8
     3B2 EF4F      LDI	R20,0xFF
     3B3 EF5F      LDI	R21,0xFF
     3B4 EF6F      LDI	R22,0xFF
     3B5 EF7F      LDI	R23,0xFF
     3B6 925A      ST	R5,-Y
     3B7 924A      ST	R4,-Y
     3B8 923A      ST	R3,-Y
     3B9 922A      ST	R2,-Y
     3BA 018A      MOVW	R16,R20

⌨️ 快捷键说明

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