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

📄 lcd1602.lis

📁 数控电压源程序数控电压源程序数控电压源程序数控电压源程序
💻 LIS
字号:
                        .module LCD1602.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\张秋伟\我的实验\数控电压源\LCD1602.C
 0000                   .dbfunc e delay_ms _delay_ms fV
 0000           ;              i -> R20,R21
 0000           ;              n -> R22,R23
                        .even
 0000           _delay_ms::
 0000 0E940000          xcall push_gset2
 0004 B801              movw R22,R16
 0006                   .dbline -1
 0006                   .dbline 25
 0006           ; #include <iom16v.h>
 0006           ; #include <macros.h>
 0006           ; #include "delay.h"
 0006           ; /*
 0006           ;  数据口接PB口:PB0--DB0,PB1--DB1,.....PB7--DB7;
 0006           ;  控制总线RS--PD3 RW--PD5 EN--PD4
 0006           ; 
 0006           ; */
 0006           ; #define LCDPORT PORTC
 0006           ; #define LCDDDR DDRC
 0006           ; #define LCDPIN PINC
 0006           ; 
 0006           ; #define RS_CLR        PORTA&= ~(1 << PA0)
 0006           ; #define RS_SET        PORTA |= (1 << PA0)
 0006           ; 
 0006           ; #define RW_CLR        PORTA &= ~(1 << PA1)
 0006           ; #define RW_SET        PORTA |= (1 << PA1)
 0006           ; 
 0006           ; #define EN_CLR        PORTA &= ~(1 << PA2)
 0006           ; #define EN_SET        PORTA |= (1 << PA2)
 0006           ; #define Clear_Screen  Write_Command(0x01)
 0006           ; 
 0006           ; 
 0006           ; void delay_ms(unsigned int n)
 0006           ; {
 0006                   .dbline 27
 0006 4427              clr R20
 0008 5527              clr R21
 000A 04C0              xjmp L5
 000C           L2:
 000C                   .dbline 27
 000C 0E940000          xcall _delay_1ms
 0010           L3:
 0010                   .dbline 27
 0010 4F5F              subi R20,255  ; offset = 1
 0012 5F4F              sbci R21,255
 0014           L5:
 0014                   .dbline 27
 0014           ;  unsigned int i;
 0014           ;  for(i=0;i<n;i++)delay_1ms();
 0014 4617              cp R20,R22
 0016 5707              cpc R21,R23
 0018 C8F3              brlo L2
 001A                   .dbline -2
 001A           L1:
 001A 0E940000          xcall pop_gset2
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbsym r i 20 i
 0020                   .dbsym r n 22 i
 0020                   .dbend
 0020                   .dbfunc e En_Toggle _En_Toggle fV
                        .even
 0020           _En_Toggle::
 0020                   .dbline -1
 0020                   .dbline 31
 0020           ; }
 0020           ; 
 0020           ; void En_Toggle()//产生一个使能脉冲
 0020           ; {
 0020                   .dbline 32
 0020           ;  EN_CLR;        //拉低使能位,产生一个下降沿
 0020 DA98              cbi 0x1b,2
 0022                   .dbline 33
 0022           ;  delay_ms(5);//保持低电平一定时间
 0022 05E0              ldi R16,5
 0024 10E0              ldi R17,0
 0026 ECDF              xcall _delay_ms
 0028                   .dbline 34
 0028           ;  EN_SET;        //拉高使能位
 0028 DA9A              sbi 0x1b,2
 002A                   .dbline 35
 002A           ;  delay_ms(3);//保持高电平一定时间
 002A 03E0              ldi R16,3
 002C 10E0              ldi R17,0
 002E E8DF              xcall _delay_ms
 0030                   .dbline 36
 0030           ;  EN_CLR;        //拉低使能位,产生一个下降沿
 0030 DA98              cbi 0x1b,2
 0032                   .dbline -2
 0032           L6:
 0032                   .dbline 0 ; func end
 0032 0895              ret
 0034                   .dbend
 0034                   .dbfunc e Wait_Until_Ready _Wait_Until_Ready fV
                        .even
 0034           _Wait_Until_Ready::
 0034                   .dbline -1
 0034                   .dbline 41
 0034           ; }
 0034           ; 
 0034           ; /* 不断检测LCD的忙标志 (BF),直到其为0,表示可以执行下一条指令*/ 
 0034           ;  void Wait_Until_Ready(void)
 0034           ;  {
 0034                   .dbline 42
 0034           ;   RW_SET;     //设为读状态
 0034 D99A              sbi 0x1b,1
 0036                   .dbline 43
 0036           ;   RS_CLR;  //所读为状态位
 0036 D898              cbi 0x1b,0
 0038                   .dbline 44
 0038           ;   LCDDDR&=~(1<<DDD7);//单片机设为输入,用以读取LCD的忙标志
 0038 A798              cbi 0x14,7
 003A                   .dbline 45
 003A           ;   EN_SET;
 003A DA9A              sbi 0x1b,2
 003C                   .dbline 46
 003C           ;   delay_ms(5);
 003C 05E0              ldi R16,5
 003E 10E0              ldi R17,0
 0040 DFDF              xcall _delay_ms
 0042           L8:
 0042                   .dbline 47
 0042           L9:
 0042                   .dbline 47
 0042           ;   while((LCDPIN&0x80)==0x80) ;    //不断循环,直至BF=0
 0042 23B2              in R2,0x13
 0044 3324              clr R3
 0046 27FC              sbrc R2,7
 0048 FCCF              rjmp L8
 004A                   .dbline 48
 004A           ;   EN_CLR;
 004A DA98              cbi 0x1b,2
 004C                   .dbline 49
 004C           ;   LCDDDR|=(1<<DDD7);
 004C A79A              sbi 0x14,7
 004E                   .dbline -2
 004E           L7:
 004E                   .dbline 0 ; func end
 004E 0895              ret
 0050                   .dbend
 0050                   .dbfunc e Write_Command _Write_Command fV
 0050           ;        Command -> R20
                        .even
 0050           _Write_Command::
 0050 0E940000          xcall push_gset1
 0054 402F              mov R20,R16
 0056                   .dbline -1
 0056                   .dbline 53
 0056           ;  }
 0056           ; 
 0056           ;  void Write_Command(unsigned char Command)   //向LCD写入命令字
 0056           ;  {
 0056                   .dbline 54
 0056           ;   RS_CLR;        //写入的是命令 
 0056 D898              cbi 0x1b,0
 0058                   .dbline 55
 0058           ;   RW_CLR;        //置为写状态
 0058 D998              cbi 0x1b,1
 005A                   .dbline 56
 005A           ;   LCDDDR=0xFF;
 005A 8FEF              ldi R24,255
 005C 84BB              out 0x14,R24
 005E                   .dbline 57
 005E           ;   LCDPORT=Command;  //写命令字 
 005E 45BB              out 0x15,R20
 0060                   .dbline 58
 0060           ;   delay_ms(2);
 0060 02E0              ldi R16,2
 0062 10E0              ldi R17,0
 0064 CDDF              xcall _delay_ms
 0066                   .dbline 59
 0066           ;   En_Toggle();
 0066 DCDF              xcall _En_Toggle
 0068                   .dbline 60
 0068           ;   Wait_Until_Ready(); //等待指令执行完毕
 0068 E5DF              xcall _Wait_Until_Ready
 006A                   .dbline -2
 006A           L11:
 006A 0E940000          xcall pop_gset1
 006E                   .dbline 0 ; func end
 006E 0895              ret
 0070                   .dbsym r Command 20 c
 0070                   .dbend
 0070                   .dbfunc e Write_Data _Write_Data fV
 0070           ;           Data -> R20,R21
                        .even
 0070           _Write_Data::
 0070 0E940000          xcall push_gset1
 0074 A801              movw R20,R16
 0076                   .dbline -1
 0076                   .dbline 64
 0076           ;  } 
 0076           ; 
 0076           ; void Write_Data(unsigned int Data)
 0076           ; {
 0076                   .dbline 65
 0076           ;   RS_SET;
 0076 D89A              sbi 0x1b,0
 0078                   .dbline 66
 0078           ;   RW_CLR; //写入的是数据
 0078 D998              cbi 0x1b,1
 007A                   .dbline 67
 007A           ;   LCDDDR=0xFF;
 007A 8FEF              ldi R24,255
 007C 84BB              out 0x14,R24
 007E                   .dbline 68
 007E           ;   delay_ms(2);
 007E 02E0              ldi R16,2
 0080 10E0              ldi R17,0
 0082 BEDF              xcall _delay_ms
 0084                   .dbline 69
 0084           ;   LCDPORT=Data;
 0084 45BB              out 0x15,R20
 0086                   .dbline 70
 0086           ;   En_Toggle();
 0086 CCDF              xcall _En_Toggle
 0088                   .dbline 71
 0088           ;   Wait_Until_Ready();
 0088 D5DF              xcall _Wait_Until_Ready
 008A                   .dbline -2
 008A           L12:
 008A 0E940000          xcall pop_gset1
 008E                   .dbline 0 ; func end
 008E 0895              ret
 0090                   .dbsym r Data 20 i
 0090                   .dbend
 0090                   .dbfunc e Write_Position _Write_Position fV
 0090           ;              p -> R20
 0090           ;          colum -> R22,R23
 0090           ;            row -> R20,R21
                        .even
 0090           _Write_Position::
 0090 0E940000          xcall push_gset2
 0094 B901              movw R22,R18
 0096 A801              movw R20,R16
 0098                   .dbline -1
 0098                   .dbline 75
 0098           ; } 
 0098           ; 
 0098           ; void Write_Position(unsigned int row,unsigned int colum)//设字符位置
 0098           ; {
 0098                   .dbline 77
 0098           ;  unsigned char p;
 0098           ;   if(row==1)
 0098 4130              cpi R20,1
 009A E0E0              ldi R30,0
 009C 5E07              cpc R21,R30
 009E 41F4              brne L14
 00A0                   .dbline 78
 00A0           ;   {
 00A0                   .dbline 79
 00A0           ;    p=0x80+colum-1;
 00A0 462F              mov R20,R22
 00A2 4058              subi R20,128  ; offset = 128
 00A4 5F4F              sbci R21,255
 00A6 4150              subi R20,1
 00A8 5040              sbci R21,0
 00AA                   .dbline 80
 00AA           ;    Write_Command(p);
 00AA 042F              mov R16,R20
 00AC D1DF              xcall _Write_Command
 00AE                   .dbline 81
 00AE           ;    }  
 00AE 07C0              xjmp L15
 00B0           L14:
 00B0                   .dbline 83
 00B0                   .dbline 84
 00B0 462F              mov R20,R22
 00B2 4054              subi R20,64  ; offset = 192
 00B4 5F4F              sbci R21,255
 00B6 4150              subi R20,1
 00B8 5040              sbci R21,0
 00BA                   .dbline 85
 00BA 042F              mov R16,R20
 00BC C9DF              xcall _Write_Command
 00BE                   .dbline 86
 00BE           L15:
 00BE                   .dbline -2
 00BE           L13:
 00BE 0E940000          xcall pop_gset2
 00C2                   .dbline 0 ; func end
 00C2 0895              ret
 00C4                   .dbsym r p 20 c
 00C4                   .dbsym r colum 22 i
 00C4                   .dbsym r row 20 i
 00C4                   .dbend
 00C4                   .dbfunc e Write_String _Write_String fV
 00C4           ;              s -> R20,R21
                        .even
 00C4           _Write_String::
 00C4 0E940000          xcall push_gset1
 00C8 A801              movw R20,R16
 00CA                   .dbline -1
 00CA                   .dbline 90
 00CA           ;    else 
 00CA           ;      {
 00CA           ;       p=0xC0+colum-1;
 00CA           ;       Write_Command(p);
 00CA           ;      }
 00CA           ; }
 00CA           ;   
 00CA           ; void Write_String(char *s)//写入字符串
 00CA           ; {
 00CA                   .dbline 91
 00CA           ;  for(;*s!='\0';s++)
 00CA 06C0              xjmp L20
 00CC           L17:
 00CC                   .dbline 92
 00CC FA01              movw R30,R20
 00CE 0081              ldd R16,z+0
 00D0 1127              clr R17
 00D2 CEDF              xcall _Write_Data
 00D4           L18:
 00D4                   .dbline 91
 00D4 4F5F              subi R20,255  ; offset = 1
 00D6 5F4F              sbci R21,255
 00D8           L20:
 00D8                   .dbline 91
 00D8 FA01              movw R30,R20
 00DA 2080              ldd R2,z+0
 00DC 2220              tst R2
 00DE B1F7              brne L17
 00E0                   .dbline -2
 00E0           L16:
 00E0 0E940000          xcall pop_gset1
 00E4                   .dbline 0 ; func end
 00E4 0895              ret
 00E6                   .dbsym r s 20 pc
 00E6                   .dbend
 00E6                   .dbfunc e Initialize_LCD _Initialize_LCD fV
                        .even
 00E6           _Initialize_LCD::
 00E6                   .dbline -1
 00E6                   .dbline 95
 00E6           ;   Write_Data(*s);
 00E6           ; }
 00E6           ; void Initialize_LCD(void)
 00E6           ; { 
 00E6                   .dbline 96
 00E6           ;  CLI(); //禁止所有中断
 00E6 F894              cli
 00E8                   .dbline 97
 00E8           ;  PORTA=0x00;
 00E8 2224              clr R2
 00EA 2BBA              out 0x1b,R2
 00EC                   .dbline 98
 00EC           ;  DDRA=0X07;
 00EC 87E0              ldi R24,7
 00EE 8ABB              out 0x1a,R24
 00F0                   .dbline 99
 00F0           ;  LCDPORT=0x00;
 00F0 25BA              out 0x15,R2
 00F2                   .dbline 100
 00F2           ;  LCDDDR=0xFF;
 00F2 8FEF              ldi R24,255
 00F4 84BB              out 0x14,R24
 00F6                   .dbline 101
 00F6           ;  Write_Command(0X38);
 00F6 08E3              ldi R16,56
 00F8 ABDF              xcall _Write_Command
 00FA                   .dbline 102
 00FA           ;  Write_Command(0x06);
 00FA 06E0              ldi R16,6
 00FC A9DF              xcall _Write_Command
 00FE                   .dbline 103
 00FE           ;  Write_Command(0x0c);
 00FE 0CE0              ldi R16,12
 0100 A7DF              xcall _Write_Command
 0102                   .dbline 104
 0102           ;  Clear_Screen;
 0102 01E0              ldi R16,1
 0104 A5DF              xcall _Write_Command
 0106                   .dbline 105
 0106           ;  SEI();//开全局中断
 0106 7894              sei
 0108                   .dbline -2
 0108           L21:
 0108                   .dbline 0 ; func end
 0108 0895              ret
 010A                   .dbend

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -