📄 lcd20x4.lis
字号:
.module LCD20x4.c
.area text(rom, con, rel)
0000 .dbfile F:\ouravr\M16LCD~1\LCD20x4.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; time -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 47
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 ; #include <ioM8515V.h>
0000 ; #define RS_H asm("sbi 0x15,5")
0000 ; //RS设为高电平0xDF 0X12,5
0000 ; #define RS_L asm("cbi 0x15,5")
0000 ; //RS设为低电平0x20
0000 ; #define RW_H asm("sbi 0x15,6")
0000 ; //RW设为高电平0xBF
0000 ; #define RW_L asm("cbi 0x15,6")
0000 ; //RW设为低电平0x40
0000 ; #define E_H asm("sbi 0x15,7")
0000 ; //E设为高电平0x7F
0000 ; #define E_L asm("cbi 0x15,7")
0000 ; //E设为低电平0x80
0000 ;
0000 ; //=======================================================
0000 ; //微秒级延时程序
0000 ; void delay_us(int time)
0000 ; {
0000 L2:
0000 .dbline 49
0000 ; do
0000 ; {
0000 .dbline 50
0000 ; time--;
0000 0150 subi R16,1
0002 1040 sbci R17,0
0004 .dbline 51
0004 ; }
0004 L3:
0004 .dbline 52
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 X0:
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 4A93 st -y,R20
0012 5A93 st -y,R21
0014 A801 movw R20,R16
0016 .dbline -1
0016 .dbline 57
0016 ; }
0016 ; //=======================================================
0016 ; //毫秒级延时程序
0016 ; void delay_ms(unsigned int time)
0016 ; {
0016 05C0 rjmp L7
0018 L6:
0018 .dbline 59
0018 ; while(time != 0)
0018 ; {
0018 .dbline 60
0018 ; delay_us(1000);
0018 08EE ldi R16,1000
001A 13E0 ldi R17,3
001C F1DF rcall _delay_us
001E .dbline 61
001E ; time--;
001E 4150 subi R20,1
0020 5040 sbci R21,0
0022 .dbline 62
0022 ; }
0022 L7:
0022 .dbline 58
0022 4030 cpi R20,0
0024 4507 cpc R20,R21
0026 C1F7 brne L6
0028 X1:
0028 .dbline -2
0028 L5:
0028 .dbline 0 ; func end
0028 5991 ld R21,y+
002A 4991 ld R20,y+
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 4A93 st -y,R20
0030 .dbline -1
0030 .dbline 68
0030 ; }
0030 ;
0030 ; //=======================================================
0030 ; //读取lcd是否内部操作(忙碌)状态
0030 ; char Lcd_Busy()
0030 ; {
0030 .dbline 70
0030 ; char r;
0030 ; DDRB = 0x00; //端口B设为输入方式
0030 2224 clr R2
0032 27BA out 0x17,R2
0034 .dbline 71
0034 ; E_L;RS_L;RW_H; //E=0(致能),RS=0(命令),RW=1(读)
0034 AF98 cbi 0x15,7
0036 .dbline 71
0036 AD98 cbi 0x15,5
0038 .dbline 71
0038 AE9A sbi 0x15,6
003A .dbline 72
003A ; delay_us(2); //液晶延时子程序
003A 02E0 ldi R16,2
003C 10E0 ldi R17,0
003E E0DF rcall _delay_us
0040 .dbline 73
0040 ; E_H;
0040 AF9A sbi 0x15,7
0042 .dbline 74
0042 ; delay_us(2); //液晶延时子程序
0042 02E0 ldi R16,2
0044 10E0 ldi R17,0
0046 DCDF rcall _delay_us
0048 .dbline 75
0048 ; r = PINB & 0x80; //读取lcd_data第八位
0048 46B3 in R20,0x16
004A 4078 andi R20,128
004C .dbline 76
004C ; E_L;
004C AF98 cbi 0x15,7
004E .dbline 77
004E ; DDRB=0xff; //端口B设为输出方式
004E 8FEF ldi R24,255
0050 87BB out 0x17,R24
0052 .dbline 78
0052 ; return r; //读取结果返回
0052 042F mov R16,R20
0054 .dbline -2
0054 L9:
0054 .dbline 0 ; func end
0054 4991 ld R20,y+
0056 0895 ret
0058 .dbsym r r 20 c
0058 .dbend
0058 .dbfunc e Lcd_Command _Lcd_Command fV
0058 ; Command -> R10
.even
0058 _Lcd_Command::
0058 AA92 st -y,R10
005A A02E mov R10,R16
005C .dbline -1
005C .dbline 84
005C ; }
005C ;
005C ; //=======================================================
005C ; //向Lcd发送命令程序
005C ; void Lcd_Command(unsigned char Command)
005C ; {
005C L11:
005C .dbline 85
005C ; while(Lcd_Busy()); //判断lcd是否内部操作状态
005C L12:
005C .dbline 85
005C E8DF rcall _Lcd_Busy
005E 0023 tst R16
0060 E9F7 brne L11
0062 X2:
0062 .dbline 86
0062 ; E_L;RS_L;RW_L; //E=0(致能),RS=0(命令),RW=0(写)
0062 AF98 cbi 0x15,7
0064 .dbline 86
0064 AD98 cbi 0x15,5
0066 .dbline 86
0066 AE98 cbi 0x15,6
0068 .dbline 87
0068 ; delay_us(2); //液晶延时子程序
0068 02E0 ldi R16,2
006A 10E0 ldi R17,0
006C C9DF rcall _delay_us
006E .dbline 88
006E ; E_H;
006E AF9A sbi 0x15,7
0070 .dbline 89
0070 ; PORTB = Command; //向Lcd发送命令
0070 A8BA out 0x18,R10
0072 .dbline 90
0072 ; delay_us(2); //液晶延时子程序
0072 02E0 ldi R16,2
0074 10E0 ldi R17,0
0076 C4DF rcall _delay_us
0078 .dbline 91
0078 ; E_L;
0078 AF98 cbi 0x15,7
007A .dbline -2
007A L10:
007A .dbline 0 ; func end
007A A990 ld R10,y+
007C 0895 ret
007E .dbsym r Command 10 c
007E .dbend
007E .dbfunc e Lcd_Write _Lcd_Write fV
007E ; Data -> R10
.even
007E _Lcd_Write::
007E AA92 st -y,R10
0080 A02E mov R10,R16
0082 .dbline -1
0082 .dbline 97
0082 ; }
0082 ;
0082 ; //=======================================================
0082 ; //向lcd写入一个字符程序
0082 ; void Lcd_Write(unsigned char Data)
0082 ; {
0082 L15:
0082 .dbline 98
0082 ; while(Lcd_Busy()); //判断lcd是否内部操作状态
0082 L16:
0082 .dbline 98
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -