📄 second.lst
字号:
__text_start:
__start:
0045 E5CF LDI R28,0x5F
0046 E0D4 LDI R29,4
0047 BFCD OUT 0x3D,R28
0048 BFDE OUT 0x3E,R29
0049 51C0 SUBI R28,0x10
004A 40D0 SBCI R29,0
004B EA0A LDI R16,0xAA
004C 8308 STD Y+0,R16
004D 2400 CLR R0
004E E8EC LDI R30,0x8C
004F E0F0 LDI R31,0
0050 E010 LDI R17,0
0051 38EC CPI R30,0x8C
0052 07F1 CPC R31,R17
0053 F011 BEQ 0x0056
0054 9201 ST R0,Z+
0055 CFFB RJMP 0x0051
0056 8300 STD Z+0,R16
0057 E5EE LDI R30,0x5E
0058 E0F0 LDI R31,0
0059 E6A0 LDI R26,0x60
005A E0B0 LDI R27,0
005B E010 LDI R17,0
005C 38EA CPI R30,0x8A
005D 07F1 CPC R31,R17
005E F021 BEQ 0x0063
005F 95C8 LPM
0060 9631 ADIW R30,1
0061 920D ST R0,X+
0062 CFF9 RJMP 0x005C
0063 940E012C CALL _main
_exit:
0065 CFFF RJMP _exit
FILE: D:\mega16学习板资料\例程\m16\1602\1602.h
(0001) //ICC-AVR application builder : 2006-5-30 8:29:21
(0002) // Target : M8
(0003) // Crystal: 4.0000Mhz
(0004)
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007)
(0008) #define lcd_data_port PORTB //定义数据口为PB口
(0009) #define lcd_data_ddr DDRB
(0010) #define lcd_busy_pin PINB
(0011) #define lcd_busy_ddr DDRB
(0012) #define lcd_control_port PORTA //定义控制口为PA口
(0013) #define lcd_control_ddr DDRA
(0014)
(0015) #define lcd_RS (1<<6) //PORTA^6
(0016) #define lcd_RW (1<<5) //PORTA^5
(0017) #define lcd_EN (1<<4) //PORTA^4
(0018) #define busy 0x80 //LCD_DB7
(0019)
(0020)
(0021) /*----------------------------------函数声明------------------------------------------*/
(0022) void lcd_init(void);
(0023) void lcd_write_command(unsigned char command,unsigned char wait_en);
(0024) void lcd_write_data(unsigned char char_data);
(0025) void wait_enable(void);
(0026) void display_a_char(unsigned char position,unsigned char char_data);
(0027) void display_a_string(unsigned char col,unsigned char *ptr);
(0028) void delay_1ms(void);
(0029) void delay_nms(unsigned int n);
(0030) const unsigned char seg_table[]={0x30,0x31,0x32,0x33,0x34,0x35,
(0031) 0x36,0x37,0x38,0x39};
(0032)
(0033)
(0034)
(0035) //液晶初始化
(0036) void lcd_init(void)
(0037) {
(0038) delay_nms(100);
_lcd_init:
0066 E604 LDI R16,0x64
0067 E010 LDI R17,0
0068 D02B RCALL _delay_nms
(0039) lcd_write_command(0x38,0);//显示模式设置三次(此时不管lcd空闲与否)
0069 2722 CLR R18
006A E308 LDI R16,0x38
006B D037 RCALL _lcd_write_command
(0040) delay_nms(20);
006C E104 LDI R16,0x14
006D E010 LDI R17,0
006E D025 RCALL _delay_nms
(0041) lcd_write_command(0x38,0);
006F 2722 CLR R18
0070 E308 LDI R16,0x38
0071 D031 RCALL _lcd_write_command
(0042) delay_nms(20);
0072 E104 LDI R16,0x14
0073 E010 LDI R17,0
0074 D01F RCALL _delay_nms
(0043) lcd_write_command(0x38,0);
0075 2722 CLR R18
0076 E308 LDI R16,0x38
0077 D02B RCALL _lcd_write_command
(0044) delay_nms(20);
0078 E104 LDI R16,0x14
0079 E010 LDI R17,0
007A D019 RCALL _delay_nms
(0045)
(0046) lcd_write_command(0x38,1);//显示模式设置(从此之后均需lcd空闲)
007B E021 LDI R18,1
007C E308 LDI R16,0x38
007D D025 RCALL _lcd_write_command
(0047) lcd_write_command(0x08,1);//显示关闭
007E E021 LDI R18,1
007F E008 LDI R16,0x8
0080 D022 RCALL _lcd_write_command
(0048) lcd_write_command(0x01,1);//显示清屏
0081 E021 LDI R18,1
0082 E001 LDI R16,1
0083 D01F RCALL _lcd_write_command
(0049) lcd_write_command(0x06,1);//显示光标移动设置
0084 E021 LDI R18,1
0085 E006 LDI R16,6
0086 D01C RCALL _lcd_write_command
(0050) lcd_write_command(0x0c,1);//显示开及光标设置
0087 E021 LDI R18,1
0088 E00C LDI R16,0xC
(0051) }
0089 C019 RJMP _lcd_write_command
(0052)
(0053) /*---------------------------------------延时函数-------------------------------------*/
(0054) //1ms延时函数
(0055) void delay_1ms(void)
(0056) {
(0057) unsigned int i;
(0058) for(i=0;i<1600;i++);
_delay_1ms:
i --> R16
008A 2700 CLR R16
008B 2711 CLR R17
008C C002 RJMP 0x008F
008D 5F0F SUBI R16,0xFF
008E 4F1F SBCI R17,0xFF
008F 3400 CPI R16,0x40
0090 E0E6 LDI R30,6
0091 071E CPC R17,R30
0092 F3D0 BCS 0x008D
(0059) }
0093 9508 RET
_delay_nms:
i --> R20
n --> R22
0094 940E0169 CALL push_gset2
0096 01B8 MOVW R22,R16
(0060)
(0061) //n ms延时函数
(0062) void delay_nms(unsigned int n)
(0063) {
(0064) unsigned int i;
(0065) for(i=0;i<n;i++)delay_1ms();
0097 2744 CLR R20
0098 2755 CLR R21
0099 C003 RJMP 0x009D
009A DFEF RCALL _delay_1ms
009B 5F4F SUBI R20,0xFF
009C 4F5F SBCI R21,0xFF
009D 1746 CP R20,R22
009E 0757 CPC R21,R23
009F F3D0 BCS 0x009A
(0066) }
00A0 940E014C CALL pop_gset2
00A2 9508 RET
_lcd_write_command:
wait_en --> R22
command --> R20
00A3 940E0169 CALL push_gset2
00A5 2F62 MOV R22,R18
00A6 2F40 MOV R20,R16
(0067)
(0068) //写指令函数: E=高脉冲 RS=0 RW=0
(0069) void lcd_write_command(unsigned char command,unsigned char wait_en)//command为指令,wait_en指定是否要检测LCD忙信号
(0070) {
(0071) if(wait_en)wait_enable();//若wait_en为1,则要检测LCD忙信号,等待其空闲
00A7 2366 TST R22
00A8 F009 BEQ 0x00AA
00A9 D045 RCALL _wait_enable
(0072) lcd_control_port&=~lcd_RS;//RS=0
00AA 98DE CBI 0x1B,6
(0073) lcd_control_port&=~lcd_RW;//RW=0
00AB 98DD CBI 0x1B,5
(0074) lcd_control_port&=~lcd_EN;//E=0,下面给LCD一个高脉冲
00AC 98DC CBI 0x1B,4
(0075) NOP();
00AD 0000 NOP
(0076) lcd_control_port|=lcd_EN;//E=1
00AE 9ADC SBI 0x1B,4
(0077) lcd_data_port=command;
00AF BB48 OUT 0x18,R20
(0078) lcd_control_port&=~lcd_EN;//重设E=0
00B0 98DC CBI 0x1B,4
(0079) }
00B1 940E014C CALL pop_gset2
00B3 9508 RET
_display_a_char:
position_tem --> R22
char_data --> R20
position --> R10
00B4 940E016D CALL push_gset3
00B6 2F42 MOV R20,R18
00B7 2EA0 MOV R10,R16
(0080)
(0081) //指定位置显示一个字符:第一行位置0~15,第二行16~31
(0082) //显示一个字符函数
(0083) void display_a_char(unsigned char position,unsigned char char_data)//参数position指定位置0~31,char_data为要显示的字符
(0084) {
(0085) unsigned char position_tem;
(0086) if(position>=0x10)
00B8 2D8A MOV R24,R10
00B9 3180 CPI R24,0x10
00BA F018 BCS 0x00BE
(0087) position_tem=position+0xb0;
00BB 2F68 MOV R22,R24
00BC 5560 SUBI R22,0x50
00BD C002 RJMP 0x00C0
(0088) else
(0089) position_tem=position+0x80;
00BE 2D6A MOV R22,R10
00BF 5860 SUBI R22,0x80
(0090) lcd_write_command(position_tem,1);
00C0 E021 LDI R18,1
00C1 2F06 MOV R16,R22
00C2 DFE0 RCALL _lcd_write_command
(0091) lcd_write_data(char_data);
00C3 2F04 MOV R16,R20
00C4 D01C RCALL _lcd_write_data
(0092) }
00C5 940E014F CALL pop_gset3
00C7 9508 RET
_display_a_string:
col_tem --> R20
i --> R22
ptr --> R10
col --> R20
00C8 940E016D CALL push_gset3
00CA 0159 MOVW R10,R18
00CB 2F40 MOV R20,R16
(0093)
(0094) //指定一行显示连续字符串:0显示在第一行,1显示在第二行,注字符串不能长于16个字符
(0095) //显示一行连续字符串函数
(0096) void display_a_string(unsigned char col,unsigned char *ptr)//参数col指定行,*ptr指字符串数组的首指针
(0097) {
(0098) unsigned char col_tem,i;
(0099) col_tem=col<<4;//若col为1(即在LCD第二行显示字符串),先把col左移4位,使显示字符的首位置改到第二行首位,即位置16
00CC 2F84 MOV R24,R20
00CD 708F ANDI R24,0xF
00CE 9582 SWAP R24
00CF 2F48 MOV R20,R24
(0100) for(i=0;i<16;i++)
00D0 2766 CLR R22
00D1 C00A RJMP 0x00DC
(0101) display_a_char(col_tem++,*(ptr+i));
00D2 2FE6 MOV R30,R22
00D3 27FF CLR R31
00D4 0DEA ADD R30,R10
00D5 1DFB ADC R31,R11
00D6 8120 LDD R18,Z+0
00D7 2E24 MOV R2,R20
00D8 5F4F SUBI R20,0xFF
00D9 2D02 MOV R16,R2
00DA DFD9 RCALL _display_a_char
00DB 9563 INC R22
00DC 3160 CPI R22,0x10
00DD F3A0 BCS 0x00D2
(0102) }
00DE 940E014F CALL pop_gset3
00E0 9508 RET
_lcd_write_data:
char_data --> R20
00E1 940E0152 CALL push_gset1
00E3 2F40 MOV R20,R16
(0103)
(0104) //写数据函数: E =高脉冲 RS=1 RW=0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -