📄 lcd.lis
字号:
.module lcd.c
.area text(rom, con, rel)
0000 .dbfile E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\lcd.c
0000 .dbfunc e delay _delay fV
0000 ; i -> R20,R21
0000 ; n -> R16,R17
.even
0000 _delay::
0000 0E940000 xcall push_gset1
0004 .dbline -1
0004 .dbline 27
0004 ; #include <iom16v.h>
0004 ; #include <macros.h>
0004 ;
0004 ; #define uchar unsigned char
0004 ; #define uint unsigned int
0004 ;
0004 ; #define LCD_EN_PORT PORTA //数据寄存器,以下2个要设为同一个口
0004 ; #define LCD_EN_DDR DDRA //数据方向寄存器
0004 ; #define LCD_RS_PORT PORTA //以下2个要设为同一个口
0004 ; #define LCD_RS_DDR DDRA
0004 ; #define LCD_DATA_PORT PORTA //以下3个要设为同一个口
0004 ; #define LCD_DATA_DDR DDRA //一定要用高4位
0004 ; #define LCD_DATA_PIN PINA //端口输入引脚
0004 ; #define LCD_RS (1<<PA3) //0x04 portA3 out
0004 ; #define LCD_EN (1<<PA2) //0x08 portA2 out
0004 ; #define LCD_DATA ((1<<PA4)|(1<<PA5)|(1<<PA6)|(1<<PA7)) //0xf0 portA4/5/6/7 out
0004 ;
0004 ;
0004 ;
0004 ; void LCD_init(void);
0004 ; void LCD_en_write(void);
0004 ; void LCD_write_command(uchar command);
0004 ; void LCD_write_data(uchar data);
0004 ; void LCD_set_xy (uchar x, uchar y);
0004 ;
0004 ; void delay(uint n) //N ms延时函数
0004 ; {
0004 09C0 xjmp L3
0006 L2:
0006 .dbline 30
0006 4427 clr R20
0008 5527 clr R21
000A 02C0 xjmp L8
000C L5:
000C .dbline 30
000C L6:
000C .dbline 30
000C 4F5F subi R20,255 ; offset = 1
000E 5F4F sbci R21,255
0010 L8:
0010 .dbline 30
0010 4D37 cpi R20,125
0012 E0E0 ldi R30,0
0014 5E07 cpc R21,R30
0016 D0F3 brlo L5
0018 L3:
0018 .dbline 29
0018 ; uint i;
0018 ; while(n--)
0018 1801 movw R2,R16
001A 0150 subi R16,1
001C 1040 sbci R17,0
001E 2220 tst R2
0020 91F7 brne L2
0022 3320 tst R3
0024 81F7 brne L2
0026 X0:
0026 .dbline -2
0026 L1:
0026 0E940000 xcall pop_gset1
002A .dbline 0 ; func end
002A 0895 ret
002C .dbsym r i 20 i
002C .dbsym r n 16 i
002C .dbend
002C .dbfunc e LCD_init _LCD_init fV
.even
002C _LCD_init::
002C .dbline -1
002C .dbline 34
002C ; for (i=0;i<125;i++);
002C ; }
002C ;
002C ; void LCD_init(void) //液晶初始化
002C ; {
002C .dbline 35
002C ; LCD_DATA_DDR|=LCD_DATA; //数据口方向为输出
002C 8AB3 in R24,0x1a
002E 806F ori R24,240
0030 8ABB out 0x1a,R24
0032 .dbline 36
0032 ; LCD_EN_DDR|=LCD_EN; //设置EN方向为输出
0032 D29A sbi 0x1a,2
0034 .dbline 37
0034 ; LCD_RS_DDR|=LCD_RS; //设置RS方向为输出
0034 D39A sbi 0x1a,3
0036 .dbline 38
0036 ; LCD_write_command(0x28);
0036 08E2 ldi R16,40
0038 14D0 xcall _LCD_write_command
003A .dbline 39
003A ; LCD_en_write();
003A 0DD0 xcall _LCD_en_write
003C .dbline 40
003C ; delay(40);
003C 08E2 ldi R16,40
003E 10E0 ldi R17,0
0040 DFDF xcall _delay
0042 .dbline 41
0042 ; LCD_write_command(0x28); //4位显示
0042 08E2 ldi R16,40
0044 0ED0 xcall _LCD_write_command
0046 .dbline 42
0046 ; LCD_write_command(0x0c); //显示开
0046 0CE0 ldi R16,12
0048 0CD0 xcall _LCD_write_command
004A .dbline 43
004A ; LCD_write_command(0x01); //清屏
004A 01E0 ldi R16,1
004C 0AD0 xcall _LCD_write_command
004E .dbline 44
004E ; delay(2);
004E 02E0 ldi R16,2
0050 10E0 ldi R17,0
0052 D6DF xcall _delay
0054 .dbline -2
0054 L9:
0054 .dbline 0 ; func end
0054 0895 ret
0056 .dbend
0056 .dbfunc e LCD_en_write _LCD_en_write fV
.even
0056 _LCD_en_write::
0056 .dbline -1
0056 .dbline 48
0056 ; }
0056 ;
0056 ; void LCD_en_write(void) //液晶使能
0056 ; {
0056 .dbline 49
0056 ; LCD_EN_PORT|=LCD_EN;
0056 DA9A sbi 0x1b,2
0058 .dbline 50
0058 ; delay(1);
0058 01E0 ldi R16,1
005A 10E0 ldi R17,0
005C D1DF xcall _delay
005E .dbline 51
005E ; LCD_EN_PORT&=~LCD_EN;
005E DA98 cbi 0x1b,2
0060 .dbline -2
0060 L10:
0060 .dbline 0 ; func end
0060 0895 ret
0062 .dbend
0062 .dbfunc e LCD_write_command _LCD_write_command fV
0062 ; command -> R20
.even
0062 _LCD_write_command::
0062 0E940000 xcall push_gset1
0066 402F mov R20,R16
0068 .dbline -1
0068 .dbline 55
0068 ; }
0068 ;
0068 ; void LCD_write_command(uchar command) //写指令
0068 ; {
0068 .dbline 56
0068 ; delay(16);
0068 00E1 ldi R16,16
006A 10E0 ldi R17,0
006C C9DF xcall _delay
006E .dbline 57
006E ; LCD_RS_PORT&=~LCD_RS; //RS=0
006E DB98 cbi 0x1b,3
0070 .dbline 58
0070 ; LCD_DATA_PORT&=0X0f; //清高四位
0070 8BB3 in R24,0x1b
0072 8F70 andi R24,15
0074 8BBB out 0x1b,R24
0076 .dbline 59
0076 ; LCD_DATA_PORT|=command&0xf0; //写高四位
0076 842F mov R24,R20
0078 807F andi R24,240
007A 2BB2 in R2,0x1b
007C 282A or R2,R24
007E 2BBA out 0x1b,R2
0080 .dbline 60
0080 ; LCD_en_write();
0080 EADF xcall _LCD_en_write
0082 .dbline 61
0082 ; command=command<<4; //低四位移到高四位
0082 842F mov R24,R20
0084 8F70 andi R24,#0x0F
0086 8295 swap R24
0088 482F mov R20,R24
008A .dbline 62
008A ; LCD_DATA_PORT&=0x0f; //清高四位
008A 8BB3 in R24,0x1b
008C 8F70 andi R24,15
008E 8BBB out 0x1b,R24
0090 .dbline 63
0090 ; LCD_DATA_PORT|=command&0xf0; //写低四位
0090 842F mov R24,R20
0092 807F andi R24,240
0094 2BB2 in R2,0x1b
0096 282A or R2,R24
0098 2BBA out 0x1b,R2
009A .dbline 64
009A ; LCD_en_write();
009A DDDF xcall _LCD_en_write
009C .dbline -2
009C L11:
009C 0E940000 xcall pop_gset1
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r command 20 c
00A2 .dbend
00A2 .dbfunc e LCD_write_data _LCD_write_data fV
00A2 ; data -> R20
.even
00A2 _LCD_write_data::
00A2 0E940000 xcall push_gset1
00A6 402F mov R20,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -