📄 lcd20x4.lis
字号:
.module LCD20x4.c
.area text(rom, con, rel)
0000 .dbfile E:\AVR应用实例\LCD20x4\LCD20x4.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; time -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 40
0000 ; /*=======================================================
0000 ; 20x4字符液晶主程序,编译软件(ICCAVR_6.31)
0000 ; CPU内部晶振8M
0000 ; 数据线B0~B7接PORTB, E=D7 RW=D6 RS=D5
0000 ; =========================================================
0000 ; 接线图如下:
0000 ; _______________ ______________
0000 ; | --1|GND |
0000 ; | --2|+5V |
0000 ; | --3|V0 |
0000 ; | | |
0000 ; PD5|--------4|RS |
0000 ; PD6|--------5|RW |
0000 ; PD7|--------6|E |
0000 ; CPU | | |
0000 ; ATmmega16L PB0|--------7|D0 LCD20x4 |
0000 ; PB1|--------8|D1 |
0000 ; PB2|--------9|D2 |
0000 ; PB3|-------10|D3 |
0000 ; PB4|-------11|D4 |
0000 ; PB5|-------12|D5 |
0000 ; PB6|-------13|D6 |
0000 ; PB7|-------14|D7 |
0000 ; | | |
0000 ; | --15|+LED |
0000 ; | --16|-LED |
0000 ; _______________| |______________|
0000 ; ========================================================*/
0000 ; #include<ioM16V.h> //CPU_ATmmega16L
0000 ; #define RS_H asm("sbi 0x12,5") //RS设为高电平
0000 ; #define RS_L asm("cbi 0x12,5") //RS设为低电平
0000 ; #define RW_H asm("sbi 0x12,6") //RW设为高电平
0000 ; #define RW_L asm("cbi 0x12,6") //RW设为低电平
0000 ; #define E_H asm("sbi 0x12,7") //E设为高电平
0000 ; #define E_L asm("cbi 0x12,7") //E设为低电平
0000 ;
0000 ; //=======================================================
0000 ; //微秒级延时程序
0000 ; void delay_us(int time)
0000 ; {
0000 L2:
0000 .dbline 42
0000 ; do
0000 ; {
0000 .dbline 43
0000 ; time--;
0000 0150 subi R16,1
0002 1040 sbci R17,0
0004 .dbline 44
0004 ; }
0004 L3:
0004 .dbline 45
0004 ; while (time > 1);
0004 81E0 ldi R24,1
0006 90E0 ldi R25,0
0008 8017 cp R24,R16
000A 9107 cpc R25,R17
000C CCF3 brlt L2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbsym r time 16 I
0010 .dbend
0010 .dbfunc e delay_ms _delay_ms fV
0010 ; time -> R20,R21
.even
0010 _delay_ms::
0010 0E940000 xcall push_gset1
0014 A801 movw R20,R16
0016 .dbline -1
0016 .dbline 50
0016 ; }
0016 ; //=======================================================
0016 ; //毫秒级延时程序
0016 ; void delay_ms(unsigned int time)
0016 ; {
0016 05C0 xjmp L7
0018 L6:
0018 .dbline 52
0018 .dbline 53
0018 08EE ldi R16,1000
001A 13E0 ldi R17,3
001C F1DF xcall _delay_us
001E .dbline 54
001E 4150 subi R20,1
0020 5040 sbci R21,0
0022 .dbline 55
0022 L7:
0022 .dbline 51
0022 ; while(time != 0)
0022 4030 cpi R20,0
0024 4507 cpc R20,R21
0026 C1F7 brne L6
0028 X0:
0028 .dbline -2
0028 L5:
0028 0E940000 xcall pop_gset1
002C .dbline 0 ; func end
002C 0895 ret
002E .dbsym r time 20 i
002E .dbend
002E .dbfunc e Lcd_Busy _Lcd_Busy fc
002E ; r -> R20
.even
002E _Lcd_Busy::
002E 0E940000 xcall push_gset1
0032 .dbline -1
0032 .dbline 61
0032 ; {
0032 ; delay_us(1000);
0032 ; time--;
0032 ; }
0032 ; }
0032 ;
0032 ; //=======================================================
0032 ; //读取lcd是否内部操作(忙碌)状态
0032 ; char Lcd_Busy()
0032 ; {
0032 .dbline 63
0032 ; char r;
0032 ; DDRB = 0x00; //端口B设为输入方式
0032 2224 clr R2
0034 27BA out 0x17,R2
0036 .dbline 64
0036 ; E_L;RS_L;RW_H; //E=0(致能),RS=0(命令),RW=1(读)
0036 9798 cbi 0x12,7
0038 .dbline 64
0038 9598 cbi 0x12,5
003A .dbline 64
003A 969A sbi 0x12,6
003C .dbline 65
003C ; delay_us(2); //液晶延时子程序
003C 02E0 ldi R16,2
003E 10E0 ldi R17,0
0040 DFDF xcall _delay_us
0042 .dbline 66
0042 ; E_H;
0042 979A sbi 0x12,7
0044 .dbline 67
0044 ; delay_us(2); //液晶延时子程序
0044 02E0 ldi R16,2
0046 10E0 ldi R17,0
0048 DBDF xcall _delay_us
004A .dbline 68
004A ; r = PINB & 0x80; //读取lcd_data第八位
004A 46B3 in R20,0x16
004C 4078 andi R20,128
004E .dbline 69
004E ; E_L;
004E 9798 cbi 0x12,7
0050 .dbline 70
0050 ; DDRB=0xff; //端口B设为输出方式
0050 8FEF ldi R24,255
0052 87BB out 0x17,R24
0054 .dbline 71
0054 ; return r; //读取结果返回
0054 042F mov R16,R20
0056 .dbline -2
0056 L9:
0056 0E940000 xcall pop_gset1
005A .dbline 0 ; func end
005A 0895 ret
005C .dbsym r r 20 c
005C .dbend
005C .dbfunc e Lcd_Command _Lcd_Command fV
005C ; Command -> R20
.even
005C _Lcd_Command::
005C 0E940000 xcall push_gset1
0060 402F mov R20,R16
0062 .dbline -1
0062 .dbline 77
0062 ; }
0062 ;
0062 ; //=======================================================
0062 ; //向Lcd发送命令程序
0062 ; void Lcd_Command(unsigned char Command)
0062 ; {
0062 L11:
0062 .dbline 78
0062 L12:
0062 .dbline 78
0062 ; while(Lcd_Busy()); //判断lcd是否内部操作状态
0062 E5DF xcall _Lcd_Busy
0064 0023 tst R16
0066 E9F7 brne L11
0068 .dbline 79
0068 ; E_L;RS_L;RW_L; //E=0(致能),RS=0(命令),RW=0(写)
0068 9798 cbi 0x12,7
006A .dbline 79
006A 9598 cbi 0x12,5
006C .dbline 79
006C 9698 cbi 0x12,6
006E .dbline 80
006E ; delay_us(2); //液晶延时子程序
006E 02E0 ldi R16,2
0070 10E0 ldi R17,0
0072 C6DF xcall _delay_us
0074 .dbline 81
0074 ; E_H;
0074 979A sbi 0x12,7
0076 .dbline 82
0076 ; PORTB = Command; //向Lcd发送命令
0076 48BB out 0x18,R20
0078 .dbline 83
0078 ; delay_us(2); //液晶延时子程序
0078 02E0 ldi R16,2
007A 10E0 ldi R17,0
007C C1DF xcall _delay_us
007E .dbline 84
007E ; E_L;
007E 9798 cbi 0x12,7
0080 .dbline -2
0080 L10:
0080 0E940000 xcall pop_gset1
0084 .dbline 0 ; func end
0084 0895 ret
0086 .dbsym r Command 20 c
0086 .dbend
0086 .dbfunc e Lcd_Write _Lcd_Write fV
0086 ; Data -> R20
.even
0086 _Lcd_Write::
0086 0E940000 xcall push_gset1
008A 402F mov R20,R16
008C .dbline -1
008C .dbline 90
008C ; }
008C ;
008C ; //=======================================================
008C ; //向lcd写入一个字符程序
008C ; void Lcd_Write(unsigned char Data)
008C ; {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -