📄 lcd.lst
字号:
__text_start:
__start:
0037 EFCF LDI R28,0xFF
0038 E0D2 LDI R29,2
0039 BFCD OUT 0x3D,R28
003A BFDE OUT 0x3E,R29
003B 51C0 SUBI R28,0x10
003C 40D0 SBCI R29,0
003D EA0A LDI R16,0xAA
003E 8308 STD Y+0,R16
003F 2400 CLR R0
0040 E3EA LDI R30,0x3A
0041 E0F1 LDI R31,1
0042 E011 LDI R17,1
0043 33EE CPI R30,0x3E
0044 07F1 CPC R31,R17
0045 F011 BEQ 0x0048
0046 9201 ST R0,Z+
0047 CFFB RJMP 0x0043
0048 8300 STD Z+0,R16
0049 E3E4 LDI R30,0x34
004A E0F0 LDI R31,0
004B E0A0 LDI R26,0
004C E0B1 LDI R27,1
004D E010 LDI R17,0
004E 36EE CPI R30,0x6E
004F 07F1 CPC R31,R17
0050 F021 BEQ 0x0055
0051 95C8 LPM
0052 9631 ADIW R30,1
0053 920D ST R0,X+
0054 CFF9 RJMP 0x004E
0055 D132 RCALL _main
_exit:
0056 CFFF RJMP _exit
FILE: F:\avrprojs\lcd_block\lcd.h
(0001) #include <iom48v.h>
(0002) #include <macros.h>
(0003)
(0004) #define LCD_DATA_PORT PORTB
(0005) #define LCD_DATA_DDR DDRB
(0006) #define LCD_EN_PORT PORTD
(0007) #define LCD_RS_PORT PORTD
(0008) #define LCD_EN 0x10
(0009) #define LCD_RS 0x08
(0010)
(0011) void LCD_init (void);
(0012) void LCD_en_write (void);
(0013) void LCD_write_char (unsigned command,unsigned data);
(0014) void LCD_set_xy (int x, int y);
(0015) void LCD_write_string (int X,int Y,unsigned char *s);
(0016) void LCD_display_char (int X,int Y,unsigned char data);
(0017) void delay_nus (unsigned int n);
(0018) void delay_nms (unsigned int n);
(0019)
(0020)
(0021) void LCD_init(void) //液晶初始化
(0022) {
(0023) delay_nms(2);
_LCD_init:
0057 E002 LDI R16,2
0058 E010 LDI R17,0
0059 D0D3 RCALL _delay_nms
(0024) LCD_write_char(0x38,0); //8位显示
005A 2722 CLR R18
005B 2733 CLR R19
005C E308 LDI R16,0x38
005D E010 LDI R17,0
005E D08B RCALL _LCD_write_char
(0025)
(0026) delay_nms(6);
005F E006 LDI R16,6
0060 E010 LDI R17,0
0061 D0CB RCALL _delay_nms
(0027) LCD_write_char(0x38,0); //8位显示
0062 2722 CLR R18
0063 2733 CLR R19
0064 E308 LDI R16,0x38
0065 E010 LDI R17,0
0066 D083 RCALL _LCD_write_char
(0028)
(0029) delay_nms(2);
0067 E002 LDI R16,2
0068 E010 LDI R17,0
0069 D0C3 RCALL _delay_nms
(0030) LCD_write_char(0x38,0); //8位显示
006A 2722 CLR R18
006B 2733 CLR R19
006C E308 LDI R16,0x38
006D E010 LDI R17,0
006E D07B RCALL _LCD_write_char
(0031)
(0032) LCD_write_char(0x38,0); //8位显示
006F 2722 CLR R18
0070 2733 CLR R19
0071 E308 LDI R16,0x38
0072 E010 LDI R17,0
0073 D076 RCALL _LCD_write_char
(0033) delay_nms(2);
0074 E002 LDI R16,2
0075 E010 LDI R17,0
0076 D0B6 RCALL _delay_nms
(0034) LCD_write_char(0x01,0); //8位显示
0077 2722 CLR R18
0078 2733 CLR R19
0079 E001 LDI R16,1
007A E010 LDI R17,0
007B D06E RCALL _LCD_write_char
(0035) delay_nms(2);
007C E002 LDI R16,2
007D E010 LDI R17,0
007E D0AE RCALL _delay_nms
(0036) LCD_write_char(0x08,0); //8位显示
007F 2722 CLR R18
0080 2733 CLR R19
0081 E008 LDI R16,0x8
0082 E010 LDI R17,0
0083 D066 RCALL _LCD_write_char
(0037) delay_nms(1);
0084 E001 LDI R16,1
0085 E010 LDI R17,0
0086 D0A6 RCALL _delay_nms
(0038)
(0039) LCD_write_char(0x06,0); //8位显示
0087 2722 CLR R18
0088 2733 CLR R19
0089 E006 LDI R16,6
008A E010 LDI R17,0
008B D05E RCALL _LCD_write_char
(0040) delay_nms(1);
008C E001 LDI R16,1
008D E010 LDI R17,0
008E D09E RCALL _delay_nms
(0041)
(0042)
(0043) LCD_write_char(0x0c,0); //显示开
008F 2722 CLR R18
0090 2733 CLR R19
0091 E00C LDI R16,0xC
0092 E010 LDI R17,0
0093 D056 RCALL _LCD_write_char
(0044) //delay_nms(100);
(0045) LCD_write_char(0x01,0); //清屏
0094 2722 CLR R18
0095 2733 CLR R19
0096 E001 LDI R16,1
0097 E010 LDI R17,0
0098 D051 RCALL _LCD_write_char
0099 9508 RET
_LCD_write_string:
s --> R20
Y --> R10
X --> R22
009A D182 RCALL push_gset3
009B 0159 MOVW R10,R18
009C 01B8 MOVW R22,R16
009D 814E LDD R20,Y+6
009E 815F LDD R21,Y+7
(0046) //delay_nms(3);
(0047) }
(0048)
(0049) void LCD_write_string(int X,int Y,unsigned char *s)
(0050) {
(0051) LCD_set_xy( X, Y ); //写地址
009F 0195 MOVW R18,R10
00A0 018B MOVW R16,R22
00A1 D00F RCALL _LCD_set_xy
00A2 C008 RJMP 0x00AB
(0052)
(0053) while (*s) // 写显示字符
(0054) {
(0055) LCD_write_char( 0, *s );
00A3 01FA MOVW R30,R20
00A4 8120 LDD R18,Z+0
00A5 2733 CLR R19
00A6 2700 CLR R16
00A7 2711 CLR R17
00A8 D041 RCALL _LCD_write_char
(0056) s ++;
00A9 5F4F SUBI R20,0xFF
00AA 4F5F SBCI R21,0xFF
00AB 01FA MOVW R30,R20
00AC 8020 LDD R2,Z+0
00AD 2022 TST R2
00AE F7A1 BNE 0x00A3
00AF D167 RCALL pop_gset3
00B0 9508 RET
_LCD_set_xy:
address --> R20
y --> R22
x --> R20
00B1 D16D RCALL push_gset2
00B2 01B9 MOVW R22,R18
00B3 01A8 MOVW R20,R16
(0057) }
(0058) }
(0059)
(0060)
(0061) void LCD_set_xy( int x, int y ) //写地址函数
(0062) {
(0063)
(0064) unsigned char address;
(0065) delay_nus(100);
00B4 E604 LDI R16,0x64
00B5 E010 LDI R17,0
00B6 D05F RCALL _delay_nus
(0066) address=x&0x0f;
00B7 704F ANDI R20,0xF
00B8 7050 ANDI R21,0
(0067) switch(y)
00B9 3060 CPI R22,0
00BA 0767 CPC R22,R23
00BB F069 BEQ 0x00C9
00BC 3061 CPI R22,1
00BD E0E0 LDI R30,0
00BE 077E CPC R23,R30
00BF F051 BEQ 0x00CA
00C0 3062 CPI R22,2
00C1 E0E0 LDI R30,0
00C2 077E CPC R23,R30
00C3 F041 BEQ 0x00CC
00C4 3063 CPI R22,3
00C5 E0E0 LDI R30,0
00C6 077E CPC R23,R30
00C7 F031 BEQ 0x00CE
00C8 C006 RJMP 0x00CF
(0068) {
(0069) case 0:
(0070) address+= 0x00; //0x00 - 0x0f
(0071) break;
00C9 C005 RJMP 0x00CF
(0072) case 1:
(0073) address+= 0x40; //0x40 - 0x4f
00CA 5C40 SUBI R20,0xC0
(0074) break;
00CB C003 RJMP 0x00CF
(0075) case 2:
(0076) address+= 0x10; //0x10 - 0x1f
00CC 5F40 SUBI R20,0xF0
(0077) break;
00CD C001 RJMP 0x00CF
(0078) case 3:
(0079) address+= 0x50; //0x50 - 0x5f
00CE 5B40 SUBI R20,0xB0
(0080) break;
(0081) default :
(0082) break;
(0083) }
(0084) address=address|0x80;
00CF 6840 ORI R20,0x80
(0085) LCD_write_char( address, 0 );
00D0 2722 CLR R18
00D1 2733 CLR R19
00D2 2F04 MOV R16,R20
00D3 2711 CLR R17
00D4 D015 RCALL _LCD_write_char
00D5 D13F RCALL pop_gset2
00D6 9508 RET
(0086) //delay_nms(2);
(0087) }
(0088)
(0089)
(0090) void LCD_en_write(void) //液晶使能
(0091) {
(0092) LCD_EN_PORT|=LCD_EN;
_LCD_en_write:
00D7 9A5C SBI 0x0B,4
(0093) delay_nus(1);
00D8 E001 LDI R16,1
00D9 E010 LDI R17,0
00DA D03B RCALL _delay_nus
(0094) LCD_EN_PORT&=~LCD_EN;
00DB 985C CBI 0x0B,4
00DC 9508 RET
_LCD_display_char:
data --> Y+4
y --> R22
x --> R20
00DD D141 RCALL push_gset2
00DE 01B9 MOVW R22,R18
00DF 01A8 MOVW R20,R16
(0095) }
(0096) void LCD_display_char(int x,int y,unsigned char data)
(0097) {
(0098) LCD_set_xy(x,y); //写地址函数
00E0 019B MOVW R18,R22
00E1 018A MOVW R16,R20
00E2 DFCE RCALL _LCD_set_xy
(0099) LCD_write_char(0,data);
00E3 812C LDD R18,Y+4
00E4 2733 CLR R19
00E5 2700 CLR R16
00E6 2711 CLR R17
00E7 D002 RCALL _LCD_write_char
00E8 D12C RCALL pop_gset2
00E9 9508 RET
_LCD_write_char:
data --> R22
command --> R20
00EA D134 RCALL push_gset2
00EB 01B9 MOVW R22,R18
00EC 01A8 MOVW R20,R16
(0100) }
(0101)
(0102) void LCD_write_char(unsigned command,unsigned data) // 写数据
(0103) {
(0104)
(0105) delay_nus(16);
00ED E100 LDI R16,0x10
00EE E010 LDI R17,0
00EF D026 RCALL _delay_nus
(0106) if(command==0)
00F0 3040 CPI R20,0
00F1 0745 CPC R20,R21
00F2 F449 BNE 0x00FC
(0107) {
(0108) LCD_RS_PORT|=LCD_RS; //RS=1
00F3 9A5B SBI 0x0B,3
(0109) LCD_EN_PORT&=~LCD_EN;
00F4 985C CBI 0x0B,4
(0110) LCD_DATA_PORT=data;
00F5 B965 OUT 0x05,R22
(0111) LCD_EN_PORT|=LCD_EN;
00F6 9A5C SBI 0x0B,4
(0112)
(0113) delay_nus(50);
00F7 E302 LDI R16,0x32
00F8 E010 LDI R17,0
00F9 D01C RCALL _delay_nus
(0114) LCD_EN_PORT&=~LCD_EN;
00FA 985C CBI 0x0B,4
(0115) }
00FB C008 RJMP 0x0104
(0116) else
(0117) {
(0118) LCD_RS_PORT&=~LCD_RS; //RS=0
00FC 985B CBI 0x0B,3
(0119) LCD_EN_PORT&=~LCD_EN;
00FD 985C CBI 0x0B,4
(0120) LCD_DATA_PORT=command;
00FE B945 OUT 0x05,R20
(0121) LCD_EN_PORT|=LCD_EN;
00FF 9A5C SBI 0x0B,4
(0122)
(0123) delay_nus(50);
0100 E302 LDI R16,0x32
0101 E010 LDI R17,0
0102 D013 RCALL _delay_nus
(0124) LCD_EN_PORT&=~LCD_EN;
0103 985C CBI 0x0B,4
(0125) }
0104 D110 RCALL pop_gset2
0105 9508 RET
(0126) }
(0127)
(0128) void port_init(void)
(0129) {
(0130) PORTB = 0x1B;
_port_init:
0106 E18B LDI R24,0x1B
0107 B985 OUT 0x05,R24
(0131) DDRB = 0xFF;
0108 EF8F LDI R24,0xFF
0109 B984 OUT 0x04,R24
(0132) PORTC = 0x03; //m103 output only
010A E083 LDI R24,3
010B B988 OUT 0x08,R24
(0133) DDRC = 0x03;
010C B987 OUT 0x07,R24
(0134) PORTD = 0x00;
010D 2422 CLR R2
010E B82B OUT 0x0B,R2
(0135) DDRD = 0x18;
010F E188 LDI R24,0x18
0110 B98A OUT 0x0A,R24
0111 9508 RET
(0136) }
(0137)
(0138) //call this routine to initialize all peripherals
(0139) void init_devices(void)
(0140) {
(0141) //stop errant interrupts until set up
(0142) port_init();
_init_devices:
0112 DFF3 RCALL _port_init
0113 9508 RET
(0143) //all peripherals are now initialized
(0144) }
(0145)
(0146) /*-----------------------------------------------------------------------
(0147) 延时函数
(0148) 系统时钟:8M
(0149) -----------------------------------------------------------------------*/
(0150) void delay_1us(void) //1us延时函数
(0151) {
(0152) asm("nop");
_delay_1us:
0114 0000 NOP
0115 9508 RET
_delay_nus:
i --> R20
n --> R22
0116 D108 RCALL push_gset2
0117 01B8 MOVW R22,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -