📄 jidong.lst
字号:
(0015) void delay_nus( uint n )
(0016) {
(0017) uint i = 0;
5AF 2744 CLR R20
5B0 2755 CLR R21
(0018) for (i = 0; i < n; i++)
5B1 C003 RJMP 0x05B5
(0019) delay_1us();
5B2 DFED RCALL _delay_1us
5B3 5F4F SUBI R20,0xFF
5B4 4F5F SBCI R21,0xFF
5B5 154A CP R20,R10
5B6 055B CPC R21,R11
5B7 F3D0 BCS 0x05B2
5B8 940C 090F JMP pop_xgset300C
(0020) }
(0021)
(0022) //1ms延时函数
(0023) void delay_1ms( void )
(0024) {
(0025) uint i;
(0026) for (i = 0; i < 1140; i++)
_delay_1ms:
i --> R16
5BA 2700 CLR R16
5BB 2711 CLR R17
5BC C002 RJMP 0x05BF
5BD 5F0F SUBI R16,0xFF
5BE 4F1F SBCI R17,0xFF
5BF 3704 CPI R16,0x74
5C0 E0E4 LDI R30,4
5C1 071E CPC R17,R30
5C2 F3D0 BCS 0x05BD
5C3 9508 RET
_delay_nms:
i --> R20
n --> R10
5C4 940E 090A CALL push_xgset300C
5C6 0158 MOVW R10,R16
(0027) {;}
(0028) }
(0029)
(0030) //nms延时函数
(0031) void delay_nms( uint n )
(0032) {
(0033) uint i = 0;
5C7 2744 CLR R20
5C8 2755 CLR R21
(0034) for (i = 0; i < n; i++)
5C9 C003 RJMP 0x05CD
(0035) delay_1ms();
5CA DFEF RCALL _delay_1ms
5CB 5F4F SUBI R20,0xFF
5CC 4F5F SBCI R21,0xFF
5CD 154A CP R20,R10
5CE 055B CPC R21,R11
5CF F3D0 BCS 0x05CA
5D0 940C 090F JMP pop_xgset300C
_delay_ns:
i --> R10
n --> R12
5D2 92AA ST R10,-Y
5D3 92CA ST R12,-Y
5D4 2EC0 MOV R12,R16
(0036) }
(0037)
(0038) //延时1S
(0039) void delay_ns( uchar n )
(0040) {
(0041) uchar i;
(0042) for( i = 0; i < n; i++ )
5D5 24AA CLR R10
5D6 C004 RJMP 0x05DB
(0043) {
(0044) delay_nms( 1000 );
5D7 EE08 LDI R16,0xE8
5D8 E013 LDI R17,3
5D9 DFEA RCALL _delay_nms
5DA 94A3 INC R10
5DB 14AC CP R10,R12
5DC F3D0 BCS 0x05D7
5DD 90C9 LD R12,Y+
5DE 90A9 LD R10,Y+
5DF 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\自动充电小车\自动充电小车\298\lcd.c
(0001) #define _LCD_C_
(0002) #include "LCD.h"
(0003) #include <iom16v.h>
(0004) //==========================================
(0005) //函数名称:液晶模块使能
(0006) //函数作用: 使能液晶
(0007) //入口参数: 无
(0008) //返回类型:无
(0009) //==========================================
(0010) void LCD_en_write(void)
(0011) {
(0012) EN_SET;
_LCD_en_write:
5E0 9AC7 SBI 0x18,7
(0013) delay_nus(4);
5E1 E004 LDI R16,4
5E2 E010 LDI R17,0
5E3 940E 05AC CALL _delay_nus
(0014) EN_CLR;
5E5 98C7 CBI 0x18,7
5E6 9508 RET
_LCD_write_command:
command --> R20
5E7 934A ST R20,-Y
5E8 2F40 MOV R20,R16
(0015) }
(0016)
(0017) //==========================================
(0018) //函数名称:写指令
(0019) //函数作用:
(0020) //入口参数: 液晶指令command
(0021) //返回类型:无
(0022) //==========================================
(0023) void LCD_write_command(uchar command)
(0024) {
(0025) delay_nus( 16 );
5E9 E100 LDI R16,0x10
5EA E010 LDI R17,0
5EB 940E 05AC CALL _delay_nus
(0026) RS_CLR;
5ED 98C6 CBI 0x18,6
(0027) DB &= 0X0F; //清高四位
5EE B38B IN R24,0x1B
5EF 708F ANDI R24,0xF
5F0 BB8B OUT 0x1B,R24
(0028) DB |= command & 0xf0; //写高四位
5F1 2F84 MOV R24,R20
5F2 7F80 ANDI R24,0xF0
5F3 B22B IN R2,0x1B
5F4 2A28 OR R2,R24
5F5 BA2B OUT 0x1B,R2
(0029) LCD_en_write();
5F6 DFE9 RCALL _LCD_en_write
(0030) command=command << 4; //低四位移到高四位
5F7 2F84 MOV R24,R20
5F8 708F ANDI R24,0xF
5F9 9582 SWAP R24
5FA 2F48 MOV R20,R24
(0031) DB &= 0x0f; //清高四位
5FB B38B IN R24,0x1B
5FC 708F ANDI R24,0xF
5FD BB8B OUT 0x1B,R24
(0032) DB |= command & 0xf0; //写低四位
5FE 2F84 MOV R24,R20
5FF 7F80 ANDI R24,0xF0
600 B22B IN R2,0x1B
601 2A28 OR R2,R24
602 BA2B OUT 0x1B,R2
(0033) LCD_en_write();
603 DFDC RCALL _LCD_en_write
604 9149 LD R20,Y+
605 9508 RET
_LCD_write_data:
DATA --> R20
606 934A ST R20,-Y
607 2F40 MOV R20,R16
(0034) //delay_nms(2); //清屏指令时间很长, 保险起见,可以增加
(0035) }
(0036)
(0037) //==========================================
(0038) //函数名称:写数据
(0039) //函数作用:
(0040) //入口参数: 数据DATA
(0041) //返回类型:无
(0042) //==========================================
(0043) void LCD_write_data(uchar DATA)
(0044) {
(0045) delay_nus(16);
608 E100 LDI R16,0x10
609 E010 LDI R17,0
60A 940E 05AC CALL _delay_nus
(0046) RS_SET; //RS=1
60C 9AC6 SBI 0x18,6
(0047) DB &= 0X0f; //清高四位
60D B38B IN R24,0x1B
60E 708F ANDI R24,0xF
60F BB8B OUT 0x1B,R24
(0048) DB |= DATA&0xf0; //写高四位
610 2F84 MOV R24,R20
611 7F80 ANDI R24,0xF0
612 B22B IN R2,0x1B
613 2A28 OR R2,R24
614 BA2B OUT 0x1B,R2
(0049) LCD_en_write();
615 DFCA RCALL _LCD_en_write
(0050) DATA = DATA << 4; //低四位移到高四位
616 2F84 MOV R24,R20
617 708F ANDI R24,0xF
618 9582 SWAP R24
619 2F48 MOV R20,R24
(0051) DB &= 0X0f; //清高四位
61A B38B IN R24,0x1B
61B 708F ANDI R24,0xF
61C BB8B OUT 0x1B,R24
(0052) DB |= DATA&0xf0; //写低四位
61D 2F84 MOV R24,R20
61E 7F80 ANDI R24,0xF0
61F B22B IN R2,0x1B
620 2A28 OR R2,R24
621 BA2B OUT 0x1B,R2
(0053) LCD_en_write();
622 DFBD RCALL _LCD_en_write
623 9149 LD R20,Y+
624 9508 RET
(0054) }
(0055)
(0056) //==========================================
(0057) //函数名称:液晶初始化函数
(0058) //函数作用:
(0059) //入口参数: 无
(0060) //返回类型:无
(0061) //==========================================
(0062) void LCD_init( void )
(0063) {
(0064) DB_DDR_OUT;
_LCD_init:
625 B38A IN R24,0x1A
626 6F80 ORI R24,0xF0
627 BB8A OUT 0x1A,R24
628 B387 IN R24,0x17
629 6C80 ORI R24,0xC0
62A BB87 OUT 0x17,R24
(0065) LCD_write_command(0x28);
62B E208 LDI R16,0x28
62C DFBA RCALL _LCD_write_command
(0066) LCD_en_write(); //********总结这里一定要加这液晶使能*********
62D DFB2 RCALL _LCD_en_write
(0067) delay_nus(20);
62E E104 LDI R16,0x14
62F E010 LDI R17,0
630 940E 05AC CALL _delay_nus
(0068) LCD_write_command(0x28); //4位显示
632 E208 LDI R16,0x28
633 DFB3 RCALL _LCD_write_command
(0069) LCD_write_command(0x0c); //显示开
634 E00C LDI R16,0xC
635 DFB1 RCALL _LCD_write_command
(0070) LCD_write_command(0x01); //清屏
636 E001 LDI R16,1
637 DFAF RCALL _LCD_write_command
(0071) delay_nms(5); //延时一定要长
638 E005 LDI R16,5
639 E010 LDI R17,0
63A 940E 05C4 CALL _delay_nms
63C 9508 RET
_LCD_set_rc:
address --> R20
c --> R22
r --> R10
63D 940E 0914 CALL push_xgsetF00C
63F 2F62 MOV R22,R18
640 2EA0 MOV R10,R16
(0072) }
(0073)
(0074) //==========================================
(0075) //函数名称:写地址
(0076) //函数作用:
(0077) //入口参数: 行位置r, 列位置c
(0078) //返回类型:无
(0079) //==========================================
(0080) void LCD_set_rc( uchar r, uchar c )
(0081) {
(0082) uchar address;
(0083)
(0084) if (r == 1)
641 2D8A MOV R24,R10
642 3081 CPI R24,1
643 F419 BNE 0x0647
(0085) address = 0x80 + c;
644 2F46 MOV R20,R22
645 5840 SUBI R20,0x80
646 C005 RJMP 0x064C
(0086) else if(r == 2)
647 2D8A MOV R24,R10
648 3082 CPI R24,2
649 F411 BNE 0x064C
(0087) address = 0xc0 + c;
64A 2F46 MOV R20,R22
64B 5440 SUBI R20,0x40
(0088)
(0089) LCD_write_command( address );
64C 2F04 MOV R16,R20
64D DF99 RCALL _LCD_write_command
64E 940C 091B JMP pop_xgsetF00C
_LCD_write_string:
s --> R20
c --> R12
r --> R10
650 940E 0922 CALL push_xgset303C
652 2EC2 MOV R12,R18
653 2EA0 MOV R10,R16
654 814E LDD R20,Y+6
655 815F LDD R21,Y+7
(0090) }
(0091)
(0092) //==========================================
(0093) //函数名称:写字符串
(0094) //函数作用: 在指定位置写一串字符串
(0095) //入口参数: 行位置r, 列位置c, 字符串*s
(0096) //返回类型:无
(0097) //==========================================
(0098) void LCD_write_string(uchar r, uchar c, uchar *s)
(0099) {
(0100) LCD_set_rc( r, c ); //写地址
656 2D2C MOV R18,R12
657 2D0A MOV R16,R10
658 DFE4 RCALL _LCD_set_rc
659 C005 RJMP 0x065F
(0101)
(0102) while( *s ) // 写显示字符
(0103) {
(0104) LCD_write_data( *s );
65A 01FA MOVW R30,R20
65B 8100 LDD R16,Z+0
65C DFA9 RCALL _LCD_write_data
(0105) s++;
65D 5F4F SUBI R20,0xFF
65E 4F5F SBCI R21,0xFF
65F 01FA MOVW R30,R20
660 8020 LDD R2,Z+0
661 2022 TST R2
662 F7B9 BNE 0x065A
663 940C 0929 JMP pop_xgset303C
_LCD_write_char:
DATA --> Y,+2
c --> R12
r --> R10
665 92AA ST R10,-Y
666 92CA ST R12,-Y
667 2EC2 MOV R12,R18
668 2EA0 MOV R10,R16
(0106) }
(0107) }
(0108)
(0109) void LCD_write_char(uchar r, uchar c, uchar DATA) //写字符
(0110) {
(0111) LCD_set_rc( r, c );
669 2D2C MOV R18,R12
66A 2D0A MOV R16,R10
66B DFD1 RCALL _LCD_set_rc
(0112) LCD_write_data( DATA );
66C 810A LDD R16,Y+2
66D DF98 RCALL _LCD_write_data
66E 90C9 LD R12,Y+
66F 90A9 LD R10,Y+
670 9508 RET
_LCD_write_array:
i --> R10
array --> R12
c --> R22
r --> R20
671 940E 0930 CALL push_xgsetF03C
673 2F62 MOV R22,R18
674 2F40 MOV R20,R16
675 9721 SBIW R28,1
676 84C9 LDD R12,Y+9
677 84DA LDD R13,Y+10
(0113) }
(0114)
(0115) //==========================================
(0116) //函数名称:写字符数组
(0117) //函数作用: 在指定位置写一串字符串
(0118) //入口参数: 行位置r, 列位置c, 字符数组chardata[], 字符个数
(0119) //返回类型:无
(0120) //==========================================
(0121) void LCD_write_array( uchar r, uchar c, uchar array[] )
(0122) {
(0123) uchar i = 0;
678 24AA CLR R10
679 C02A RJMP 0x06A4
(0124) while( array[i] != '\0' )
(0125) {
(0126) LCD_write_char( r, c, array[i] );
67A 2DEA MOV R30,R10
67B 27FF CLR R31
67C 0DEC ADD R30,R12
67D 1DFD ADC R31,R13
67E 8020 LDD R2,Z+0
67F 8228 STD Y+0,R2
680 2F26 MOV R18,R22
681 2F04 MOV R16,R20
682 DFE2 RCALL _LCD_write_char
(0127) if( ++c == 16 )
683 2F86 MOV R24,R22
684 5F8F SUBI R24,0xFF
685 2F68 MOV R22,R24
686 3160 CPI R22,0x10
687 F4D9 BNE 0x06A3
(0128) {
(0129) if( r == 1 )
688 3041 CPI R20,1
689 F461 BNE 0x0696
(0130) {
(0131) c = 0;
68A 2766 CLR R22
(0132) r = 2;
68B E042 LDI R20,2
(0133) LCD_write_char( r, c, array[i] );
68C 2DEA MOV R30,R10
68D 27FF CLR R31
68E 0DEC ADD R30,R12
68F 1DFD ADC R31,R13
690 8020 LDD R2,Z+0
691 8228 STD Y+0,R2
692 2F26 MOV R18,R22
693 2F04 MOV R16,R20
694 DFD0 RCALL _LCD_write_char
(0134)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -