⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd20x4.lis

📁 用ATmega16驱动的LCD2004的源程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -