📄 015.lst
字号:
__text_start:
__start:
0036 E5CF LDI R28,0x5F
0037 E0D4 LDI R29,4
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F E7E7 LDI R30,0x77
0040 E0F0 LDI R31,0
0041 E010 LDI R17,0
0042 37E7 CPI R30,0x77
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E5E4 LDI R30,0x54
0049 E0F0 LDI R31,0
004A E6A0 LDI R26,0x60
004B E0B0 LDI R27,0
004C E010 LDI R17,0
004D 36EB CPI R30,0x6B
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 940E00DE CALL _main
_exit:
0056 CFFF RJMP _exit
FILE: E:\ICCAVR\project\AVRMEG~2\icc\015-LCD1602\lcd1602.c
(0001) /*
(0002) LCD1602液晶屏驱动模块
(0003) 1、可直接嵌入到项目中使用
(0004) 2、晶振频率:1M
(0005) 3、如晶振提高低层驱动延时要作相应修改
(0006)
(0007) AVR_AFA
(0008) www.iccavr.com
(0009) 程序编写过程中参照了peak的4线显示程序
(0010) peak:AVR论坛技术版版主
(0011) */
(0012)
(0013) #include <iom16v.h>
(0014)
(0015) #define RS_CLR PORTD &= ~(1 << PD3)
(0016) #define RS_SET PORTD |= (1 << PD3)
(0017)
(0018) #define RW_CLR PORTD &= ~(1 << PD4)
(0019) #define RW_SET PORTD |= (1 << PD4)
(0020)
(0021) #define EN_CLR PORTD &= ~(1 << PD6)
(0022) #define EN_SET PORTD |= (1 << PD6)
(0023)
(0024) /*延时函数*/
(0025) void delay_us(unsigned int n) {
(0026)
(0027) if (n == 0) {
_delay_us:
n --> R16
0057 3000 CPI R16,0
0058 0701 CPC R16,R17
0059 F409 BNE 0x005B
(0028) return ;
005A C006 RJMP 0x0061
(0029) }
(0030) while (--n);
005B 01C8 MOVW R24,R16
005C 9701 SBIW R24,1
005D 018C MOVW R16,R24
005E 3000 CPI R16,0
005F 0701 CPC R16,R17
0060 F7D1 BNE 0x005B
0061 9508 RET
_delay_ms:
a --> R20
b --> R22
i --> R16
0062 940E0126 CALL push_gset2
(0031) }
(0032)
(0033) /*延时函数*/
(0034) void delay_ms(unsigned char i) {
(0035)
(0036) unsigned char a, b;
(0037) for (a = 1; a < i; a++) {
0064 E041 LDI R20,1
0065 C006 RJMP 0x006C
(0038) for (b = 1; b; b++) {
0066 E061 LDI R22,1
0067 C001 RJMP 0x0069
0068 9563 INC R22
0069 2366 TST R22
006A F7E9 BNE 0x0068
006B 9543 INC R20
006C 1740 CP R20,R16
006D F3C0 BCS 0x0066
006E 940E011A CALL pop_gset2
0070 9508 RET
_LCD_write_com:
com --> R20
0071 940E0128 CALL push_gset1
0073 2F40 MOV R20,R16
(0039) ;
(0040) }
(0041) }
(0042) }
(0043)
(0044) /*显示屏命令写入函数*/
(0045) void LCD_write_com(unsigned char com) {
(0046)
(0047) RS_CLR;
0074 9893 CBI 0x12,3
(0048) RW_CLR;
0075 9894 CBI 0x12,4
(0049) EN_SET;
0076 9A96 SBI 0x12,6
(0050) PORTB = com;
0077 BB48 OUT 0x18,R20
(0051) delay_us(5);
0078 E005 LDI R16,5
0079 E010 LDI R17,0
007A DFDC RCALL _delay_us
(0052) EN_CLR;
007B 9896 CBI 0x12,6
007C 940E012B CALL pop_gset1
007E 9508 RET
_LCD_write_data:
data --> R20
007F 940E0128 CALL push_gset1
0081 2F40 MOV R20,R16
(0053) }
(0054)
(0055) /*显示屏命令写入函数*/
(0056) void LCD_write_data(unsigned char data) {
(0057)
(0058) RS_SET;
0082 9A93 SBI 0x12,3
(0059) RW_CLR;
0083 9894 CBI 0x12,4
(0060) EN_SET;
0084 9A96 SBI 0x12,6
(0061) PORTB = data;
0085 BB48 OUT 0x18,R20
(0062) delay_us(5);
0086 E005 LDI R16,5
0087 E010 LDI R17,0
0088 DFCE RCALL _delay_us
(0063) EN_CLR;
0089 9896 CBI 0x12,6
008A 940E012B CALL pop_gset1
008C 9508 RET
(0064) }
(0065)
(0066) /*显示屏清空显示*/
(0067) void LCD_clear(void) {
(0068)
(0069) LCD_write_com(0x01);
_LCD_clear:
008D E001 LDI R16,1
008E DFE2 RCALL _LCD_write_com
(0070) delay_ms(5);
008F E005 LDI R16,5
0090 DFD1 RCALL _delay_ms
0091 9508 RET
_LCD_write_str:
s --> R20
y --> R10
x --> R22
0092 940E0124 CALL push_gset3
0094 2EA2 MOV R10,R18
0095 2F60 MOV R22,R16
0096 814E LDD R20,Y+6
0097 815F LDD R21,Y+7
(0071) }
(0072)
(0073) /*显示屏字符串写入函数*/
(0074) void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) {
(0075)
(0076) if (y == 0) {
0098 20AA TST R10
0099 F421 BNE 0x009E
(0077) LCD_write_com(0x80 + x);
009A 2F06 MOV R16,R22
009B 5800 SUBI R16,0x80
009C DFD4 RCALL _LCD_write_com
(0078) }
009D C009 RJMP 0x00A7
(0079) else {
(0080) LCD_write_com(0xC0 + x);
009E 2F06 MOV R16,R22
009F 5400 SUBI R16,0x40
00A0 DFD0 RCALL _LCD_write_com
(0081) }
00A1 C005 RJMP 0x00A7
(0082)
(0083) while (*s) {
(0084) LCD_write_data( *s);
00A2 01FA MOVW R30,R20
00A3 8100 LDD R16,Z+0
00A4 DFDA RCALL _LCD_write_data
(0085) s ++;
00A5 5F4F SUBI R20,0xFF
00A6 4F5F SBCI R21,0xFF
00A7 01FA MOVW R30,R20
00A8 8020 LDD R2,Z+0
00A9 2022 TST R2
00AA F7B9 BNE 0x00A2
00AB 940E011D CALL pop_gset3
00AD 9508 RET
_LCD_write_char:
data --> Y+4
y --> R22
x --> R20
00AE 940E0126 CALL push_gset2
00B0 2F62 MOV R22,R18
00B1 2F40 MOV R20,R16
(0086) }
(0087) }
(0088)
(0089) /*显示屏单字符写入函数*/
(0090) void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) {
(0091)
(0092) if (y == 0) {
00B2 2366 TST R22
00B3 F421 BNE 0x00B8
(0093) LCD_write_com(0x80 + x);
00B4 2F04 MOV R16,R20
00B5 5800 SUBI R16,0x80
00B6 DFBA RCALL _LCD_write_com
(0094) }
00B7 C003 RJMP 0x00BB
(0095) else {
(0096) LCD_write_com(0xC0 + x);
00B8 2F04 MOV R16,R20
00B9 5400 SUBI R16,0x40
00BA DFB6 RCALL _LCD_write_com
(0097) }
(0098)
(0099) LCD_write_data( data);
00BB 810C LDD R16,Y+4
00BC DFC2 RCALL _LCD_write_data
00BD 940E011A CALL pop_gset2
00BF 9508 RET
(0100) }
(0101)
(0102) /*显示屏初始化函数*/
(0103) void LCD_init(void) {
(0104)
(0105) DDRB = 0xFF; /*I/O口方向设置*/
_LCD_init:
00C0 EF8F LDI R24,0xFF
00C1 BB87 OUT 0x17,R24
(0106) DDRD |= (1 << PD3) | (1 << PD4) | (1 << PD6);
00C2 B381 IN R24,0x11
00C3 6588 ORI R24,0x58
00C4 BB81 OUT 0x11,R24
(0107) LCD_write_com(0x38); /*显示模式设置*/
00C5 E308 LDI R16,0x38
00C6 DFAA RCALL _LCD_write_com
(0108) delay_ms(5);
00C7 E005 LDI R16,5
00C8 DF99 RCALL _delay_ms
(0109) LCD_write_com(0x38);
00C9 E308 LDI R16,0x38
00CA DFA6 RCALL _LCD_write_com
(0110) delay_ms(5);
00CB E005 LDI R16,5
00CC DF95 RCALL _delay_ms
(0111) LCD_write_com(0x38);
00CD E308 LDI R16,0x38
00CE DFA2 RCALL _LCD_write_com
(0112) delay_ms(5);
00CF E005 LDI R16,5
00D0 DF91 RCALL _delay_ms
(0113) LCD_write_com(0x38);
00D1 E308 LDI R16,0x38
00D2 DF9E RCALL _LCD_write_com
(0114)
(0115) LCD_write_com(0x08); /*显示关闭*/
00D3 E008 LDI R16,0x8
00D4 DF9C RCALL _LCD_write_com
(0116) LCD_write_com(0x01); /*显示清屏*/
00D5 E001 LDI R16,1
00D6 DF9A RCALL _LCD_write_com
(0117) LCD_write_com(0x06); /*显示光标移动设置*/
00D7 E006 LDI R16,6
00D8 DF98 RCALL _LCD_write_com
(0118) delay_ms(5);
00D9 E005 LDI R16,5
00DA DF87 RCALL _delay_ms
(0119) LCD_write_com(0x0C); /*显示开及光标设置*/
00DB E00C LDI R16,0xC
00DC DF94 RCALL _LCD_write_com
00DD 9508 RET
_main:
i --> R20
p --> R22
00DE 9722 SBIW R28,2
FILE: E:\ICCAVR\project\AVRMEG~2\icc\015-LCD1602\main.c
(0001) /*
(0002) 实验十五:
(0003) LCD1602显示实验。
(0004) 1、LCD1602显示实验。显示欢及网址信息。
(0005) 2、内部1 M晶振,程序采用单任务方式,软件延时。
(0006) 3、进行此实验请插上JP1、JP2的所有8个短路块,PC7短路块。
(0007)
(0008) AVR mega16学习板
(0009) www.iccavr.com
(0010) 2007-04-13
(0011) */
(0012)
(0013) #include <iom16v.h>
(0014) #include "lcd1602.h"
(0015)
(0016) void main(void) {
(0017)
(0018) unsigned char i;
(0019) unsigned char *p;
(0020)
(0021) PORTA = 0xFF; /*打开上拉*/
00DF EF8F LDI R24,0xFF
00E0 BB8B OUT 0x1B,R24
(0022) DDRA = 0x00; /*方向输入*/
00E1 2422 CLR R2
00E2 BA2A OUT 0x1A,R2
(0023) PORTB = 0xFF; /*电平设置*/
00E3 BB88 OUT 0x18,R24
(0024) DDRB = 0xFF; /*方向输出*/
00E4 BB87 OUT 0x17,R24
(0025) PORTC = 0x7F;
00E5 E78F LDI R24,0x7F
00E6 BB85 OUT 0x15,R24
(0026) DDRC = 0x80;
00E7 E880 LDI R24,0x80
00E8 BB84 OUT 0x14,R24
(0027) PORTD = 0xFF;
00E9 EF8F LDI R24,0xFF
00EA BB82 OUT 0x12,R24
(0028) DDRD = 0x00;
00EB BA21 OUT 0x11,R2
(0029)
(0030) delay_ms(100);
00EC E604 LDI R16,0x64
00ED 940E0062 CALL _delay_ms
(0031) LCD_init();
00EF 940E00C0 CALL _LCD_init
00F1 C025 RJMP 0x0117
(0032)
(0033) while (1) {
(0034) i = 1;
00F2 E041 LDI R20,1
(0035) p = "www.iccavr.com";
00F3 E668 LDI R22,0x68
00F4 E070 LDI R23,0
(0036) LCD_clear();
00F5 940E008D CALL _LCD_clear
(0037) LCD_write_str(5,0,"Welcome");
00F7 E680 LDI R24,0x60
00F8 E090 LDI R25,0
00F9 8399 STD Y+1,R25
00FA 8388 STD Y+0,R24
00FB 2722 CLR R18
00FC E005 LDI R16,5
00FD 940E0092 CALL _LCD_write_str
(0038) delay_ms(250);
00FF EF0A LDI R16,0xFA
0100 940E0062 CALL _delay_ms
0102 C00D RJMP 0x0110
(0039)
(0040) while (*p) {
(0041) LCD_write_char(i,1,*p);
0103 01FB MOVW R30,R22
0104 8020 LDD R2,Z+0
0105 8228 STD Y+0,R2
0106 E021 LDI R18,1
0107 2F04 MOV R16,R20
0108 940E00AE CALL _LCD_write_char
(0042) i ++;
010A 9543 INC R20
(0043) p ++;
010B 5F6F SUBI R22,0xFF
010C 4F7F SBCI R23,0xFF
(0044) delay_ms(250);
010D EF0A LDI R16,0xFA
010E 940E0062 CALL _delay_ms
0110 01FB MOVW R30,R22
0111 8020 LDD R2,Z+0
0112 2022 TST R2
0113 F779 BNE 0x0103
(0045) }
(0046) delay_ms(250);
FILE: <library>
0114 EF0A LDI R16,0xFA
0115 940E0062 CALL _delay_ms
0117 CFDA RJMP 0x00F2
0118 9622 ADIW R28,2
0119 9508 RET
pop_gset2:
011A E0E2 LDI R30,2
011B 940C012C JMP pop
pop_gset3:
011D E0E4 LDI R30,4
011E 940C012C JMP pop
push_gset5:
0120 92FA ST R15,-Y
0121 92EA ST R14,-Y
push_gset4:
0122 92DA ST R13,-Y
0123 92CA ST R12,-Y
push_gset3:
0124 92BA ST R11,-Y
0125 92AA ST R10,-Y
push_gset2:
0126 937A ST R23,-Y
0127 936A ST R22,-Y
push_gset1:
0128 935A ST R21,-Y
0129 934A ST R20,-Y
012A 9508 RET
pop_gset1:
012B E0E1 LDI R30,1
pop:
012C 9149 LD R20,Y+
012D 9159 LD R21,Y+
012E FDE0 SBRC R30,0
012F 9508 RET
0130 9169 LD R22,Y+
0131 9179 LD R23,Y+
0132 FDE1 SBRC R30,1
0133 9508 RET
0134 90A9 LD R10,Y+
0135 90B9 LD R11,Y+
0136 FDE2 SBRC R30,2
0137 9508 RET
0138 90C9 LD R12,Y+
0139 90D9 LD R13,Y+
013A FDE3 SBRC R30,3
013B 9508 RET
013C 90E9 LD R14,Y+
013D 90F9 LD R15,Y+
013E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -