📄 1602xi.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E8ED LDI R30,0x8D
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 38ED CPI R30,0x8D
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E2E6 LDI R30,0x26
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E3 CPI R30,0x53
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 D0C3 RCALL _main
_exit:
0049 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\1602\delay.c
(0001) /*---------------------------------------延时函数-------------------------------------*/
(0002)
(0003) /*-----------------------------------------------------------------------
(0004) 延时函数
(0005) 系统时钟:8M
(0006) -----------------------------------------------------------------------*/
(0007) void delay_1us(void) //1us延时函数
(0008) {
(0009) asm("nop");
_delay_1us:
004A 0000 NOP
004B 9508 RET
_delay_nus:
i --> R20
n --> R22
004C D0CA RCALL push_gset2
004D 01B8 MOVW R22,R16
(0010) }
(0011)
(0012) void delay_nus(unsigned int n) //N us延时函数
(0013) {
(0014) unsigned int i=0;
004E 2744 CLR R20
004F 2755 CLR R21
(0015) for (i=0;i<n;i++)
0050 C003 RJMP 0x0054
(0016) delay_1us();
0051 DFF8 RCALL _delay_1us
0052 5F4F SUBI R20,0xFF
0053 4F5F SBCI R21,0xFF
0054 1746 CP R20,R22
0055 0757 CPC R21,R23
0056 F3D0 BCS 0x0051
0057 D0B5 RCALL pop_gset2
0058 9508 RET
(0017) }
(0018)
(0019) void delay_1ms(void ) //延时1ms
(0020) {
(0021) unsigned int i ;
(0022) unsigned char xtal;
(0023) xtal=4;
_delay_1ms:
xtal --> R16
i --> R18
0059 E004 LDI R16,4
(0024) for (i=1;i<(xtal*143-2);i++)
005A E021 LDI R18,1
005B E030 LDI R19,0
005C C002 RJMP 0x005F
005D 5F2F SUBI R18,0xFF
005E 4F3F SBCI R19,0xFF
005F E88F LDI R24,0x8F
0060 9F80 MUL R24,R16
0061 01C0 MOVW R24,R0
0062 9702 SBIW R24,2
0063 1728 CP R18,R24
0064 0739 CPC R19,R25
0065 F3B8 BCS 0x005D
0066 9508 RET
_delay_nms:
i --> R20
n --> R22
0067 D0AF RCALL push_gset2
0068 01B8 MOVW R22,R16
(0025) {
(0026) ;
(0027) }
(0028) }
(0029)
(0030) void delay_nms(unsigned int n) //延时nms
(0031) {
(0032) unsigned int i=0 ;
0069 2744 CLR R20
006A 2755 CLR R21
(0033) for(i=0;i<n;i++)
006B C003 RJMP 0x006F
(0034) {
(0035) delay_1ms();
006C DFEC RCALL _delay_1ms
006D 5F4F SUBI R20,0xFF
006E 4F5F SBCI R21,0xFF
006F 1746 CP R20,R22
0070 0757 CPC R21,R23
0071 F3D0 BCS 0x006C
0072 D09A RCALL pop_gset2
0073 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\1602\LCD1602.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "LCD1602.h"
(0004) /**********************************************************
(0005) 光标命令
(0006) lcd_write_command(0x0e,0);//光标开
(0007) lcd_write_command(0x0d,0);//光标所在字符闪烁
(0008) lcd_write_command(0x0c,0); //光标关
(0009) lcd_write_command(0x07,0); //屏幕左移
(0010)
(0011) **********************************************************/
(0012)
(0013) /*------------------------------------液晶驱动函数-------------------------------------*/
(0014) void lcd_init_portDB(void)
(0015) {
(0016) lcd_data_port=0xff;
_lcd_init_portDB:
0074 EF8F LDI R24,0xFF
0075 BB88 OUT 0x18,R24
(0017) lcd_data_ddr=0xff;
0076 BB87 OUT 0x17,R24
(0018) lcd_control_port=0x07;
0077 E087 LDI R24,7
0078 BB85 OUT 0x15,R24
(0019) lcd_control_ddr=0x07;
0079 BB84 OUT 0x14,R24
007A 9508 RET
(0020) }
(0021)
(0022) //液晶初始化
(0023) void lcd_init(void)
(0024) {
(0025) delay_nms(15);
_lcd_init:
007B E00F LDI R16,0xF
007C E010 LDI R17,0
007D DFE9 RCALL _delay_nms
(0026) lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
007E 2722 CLR R18
007F E308 LDI R16,0x38
0080 D01F RCALL _lcd_write_command
(0027) delay_nms(5);
0081 E005 LDI R16,5
0082 E010 LDI R17,0
0083 DFE3 RCALL _delay_nms
(0028) lcd_write_command(0x38,0);
0084 2722 CLR R18
0085 E308 LDI R16,0x38
0086 D019 RCALL _lcd_write_command
(0029) delay_nms(5);
0087 E005 LDI R16,5
0088 E010 LDI R17,0
0089 DFDD RCALL _delay_nms
(0030) lcd_write_command(0x38,0);
008A 2722 CLR R18
008B E308 LDI R16,0x38
008C D013 RCALL _lcd_write_command
(0031) delay_nms(5);
008D E005 LDI R16,5
008E E010 LDI R17,0
008F DFD7 RCALL _delay_nms
(0032)
(0033) lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
0090 E021 LDI R18,1
0091 E308 LDI R16,0x38
0092 D00D RCALL _lcd_write_command
(0034) lcd_write_command(0x08,1);//显示关闭
0093 E021 LDI R18,1
0094 E008 LDI R16,0x8
0095 D00A RCALL _lcd_write_command
(0035) lcd_write_command(0x01,1);//显示清屏
0096 E021 LDI R18,1
0097 E001 LDI R16,1
0098 D007 RCALL _lcd_write_command
(0036) lcd_write_command(0x06,1);//显示光标移动设置
0099 E021 LDI R18,1
009A E006 LDI R16,6
009B D004 RCALL _lcd_write_command
(0037) lcd_write_command(0x0c,1);//显示开及光标设置
009C E021 LDI R18,1
009D E00C LDI R16,0xC
009E D001 RCALL _lcd_write_command
009F 9508 RET
_lcd_write_command:
wait_en --> R22
command --> R20
00A0 D076 RCALL push_gset2
00A1 2F62 MOV R22,R18
00A2 2F40 MOV R20,R16
(0038) }
(0039)
(0040) //写指令函数: E=高脉冲 RS=0 RW=0
(0041) void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
(0042) {
(0043) if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
00A3 2366 TST R22
00A4 F009 BEQ 0x00A6
00A5 D015 RCALL _wait_enable
(0044) lcd_control_port&=~lcd_RS;//RS=0
00A6 98A8 CBI 0x15,0
(0045) lcd_control_port&=~lcd_RW;//RW=0
00A7 98A9 CBI 0x15,1
(0046) lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
00A8 98AA CBI 0x15,2
(0047) NOP();
00A9 0000 NOP
(0048) lcd_control_port|=lcd_EN;//E=1
00AA 9AAA SBI 0x15,2
(0049) lcd_data_port=command;
00AB BB48 OUT 0x18,R20
(0050) lcd_control_port&=~lcd_EN;//重设E=0
00AC 98AA CBI 0x15,2
00AD D05F RCALL pop_gset2
00AE 9508 RET
_lcd_write_data:
char_data --> R20
00AF D069 RCALL push_gset1
00B0 2F40 MOV R20,R16
(0051) }
(0052)
(0053) //写数据函数: E =高脉冲 RS=1 RW=0
(0054) void lcd_write_data(unsigned char char_data)
(0055) {
(0056) wait_enable();//等待LCD空闲
00B1 D009 RCALL _wait_enable
(0057) lcd_control_port|=lcd_RS;//RS=1
00B2 9AA8 SBI 0x15,0
(0058) lcd_control_port&=~lcd_RW;//RW=0
00B3 98A9 CBI 0x15,1
(0059) lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
00B4 98AA CBI 0x15,2
(0060) NOP();
00B5 0000 NOP
(0061) lcd_control_port|=lcd_EN;//E=1
00B6 9AAA SBI 0x15,2
(0062) lcd_data_port=char_data;
00B7 BB48 OUT 0x18,R20
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -