📄 1602test.lst
字号:
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 + -