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

📄 lcd1602.lst

📁 这是一个经过调试成功的可以实用的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   LCD1602                                                               07/13/2006 21:12:22 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE LCD1602
OBJECT MODULE PLACED IN LCD1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE LCD1602.c DEBUG OBJECTEXTEND CODE

line level    source

   1          //这是一个DEMO程序,可以很方便地嵌入到其它程序中,只需要进行相关的函数调用。
   2          //晶振为11.0592MHz
   3          
   4          #include <at89s52.h>
   5          #include<intrins.h>
   6          
   7          //变量类型定义,
   8          #define uchar unsigned char
   9          #define uint unsigned int
  10          
  11          // 控制引脚定义
  12          sbit LCD_RS=P3^3;
  13          sbit LCD_RW=P3^4;
  14          sbit LCD_E=P3^5;
  15          sbit BUZ=P1^3;
  16          
  17          #define DataPort P0                             // 数据端口
  18          
  19          #define Busy    0x80            // 总线定义
  20          
  21          //EXAMPLE
  22          
  23          code char exampl[]="Hello RFID World";
  24          code char sn[]="www.ehuoyan.com";
  25          
  26          void Delay400Ms(void);
  27          void Delay5Ms(void);
  28          void WaitForEnable( void );
  29          void LocateXY( char posx,char posy);
  30          void LcdWriteData( char dataW );
  31          void LcdWriteCommand( uchar CMD,uchar AttribC );
  32          void LcdReset( void );
  33          void Display( uchar dd );
  34          void DispOneChar(uchar x,uchar y,uchar Wdata);
  35          void ePutstr(uchar x,uchar y, uchar code *ptr);
  36          
  37          //测试主程序
  38          void main(void)
  39          {
  40   1              uchar temp;
  41   1      
  42   1              Delay400Ms();
  43   1          BUZ=0;
  44   1              LcdReset();
  45   1              temp = 32;
  46   1              ePutstr(0,0,exampl);            // 上面一行显示一个预定字符串    
  47   1              Delay400Ms();
  48   1      
  49   1              while(1)
  50   1              {               
  51   2              //      DispOneChar(0,1,'s');
  52   2              //      DispOneChar(1,1,'n');
  53   2              //      DispOneChar(2,1,':');
  54   2                      ePutstr(0,1,sn);
  55   2              }
C51 COMPILER V8.02   LCD1602                                                               07/13/2006 21:12:22 PAGE 2   

  56   1      }
  57          
  58          /*=======================================================
  59           显示字符串
  60          =======================================================*/
  61          void ePutstr(uchar x,uchar y, uchar code *ptr) {
  62   1      uchar i,l=0;
  63   1              while (ptr[l] >31){l++;};
  64   1              for (i=0;i<l;i++) {
  65   2                      DispOneChar(x++,y,ptr[i]);
  66   2                      if ( x == 16 ){
  67   3                              x = 0; y ^= 1;
  68   3                      }
  69   2              }
  70   1      }
  71          
  72          /*=======================================================
  73           演示一行连续字符串,配合上位程序演示移动字串
  74          =======================================================*/
  75          void Display( uchar dd ) {
  76   1      
  77   1      uchar i;
  78   1              
  79   1              for (i=0;i<16;i++) { 
  80   2                      DispOneChar(i,1,dd++);   //第二行移动显示
  81   2                      dd &= 0x7f;
  82   2                      if (dd<32) dd=32;
  83   2           }
  84   1      }
  85          
  86          /*=======================================================
  87           显示光标定位
  88          =======================================================*/
  89          void LocateXY( char posx,char posy) {
  90   1      
  91   1      uchar temp;
  92   1      
  93   1              temp = posx & 0xf;
  94   1              posy &= 0x1;
  95   1              if ( posy )temp |= 0x40;
  96   1              temp |= 0x80;
  97   1              LcdWriteCommand(temp,0);
  98   1      }
  99          
 100          /*=======================================================
 101           按指定位置显示数出一个字符
 102          =======================================================*/
 103          void DispOneChar(uchar x,uchar y,uchar Wdata) {
 104   1      
 105   1              LocateXY( x, y );                               // 定位显示地址
 106   1              LcdWriteData( Wdata );                  // 写字符
 107   1      }
 108          
 109          /*=======================================================
 110           初始化程序, 必须按照产品资料介绍的初始化过程进行
 111          =======================================================*/
 112          void LcdReset( void ) {
 113   1      
 114   1              LcdWriteCommand( 0x38, 0);                      // 显示模式设置(不检测忙信号)
 115   1                      Delay5Ms();
 116   1              LcdWriteCommand( 0x38, 0);                      // 共三次
 117   1                      Delay5Ms();
C51 COMPILER V8.02   LCD1602                                                               07/13/2006 21:12:22 PAGE 3   

 118   1              LcdWriteCommand( 0x38, 0);
 119   1                      Delay5Ms();
 120   1      
 121   1              LcdWriteCommand( 0x38, 1);                      // 显示模式设置(以后均检测忙信号)
 122   1          LcdWriteCommand( 0x08, 1);                  // 显示关闭
 123   1              LcdWriteCommand( 0x01, 1);                      // 显示清屏
 124   1              LcdWriteCommand( 0x06, 1);                      // 显示光标移动设置
 125   1              LcdWriteCommand( 0x0c, 1);                      // 显示开及光标设置
 126   1      }
 127          
 128          /*=======================================================
 129           写控制字符子程序: E=1 LCD_RS=0 LCD_RW=0
 130          =======================================================*/
 131          void LcdWriteCommand( uchar CMD,uchar AttribC ) {
 132   1      
 133   1              if (AttribC) WaitForEnable();                           // 检测忙信号?
 134   1              
 135   1              LCD_RS = 0;     LCD_RW = 0; _nop_();
 136   1      
 137   1              DataPort = CMD; _nop_();                                        // 送控制字子程序
 138   1              
 139   1              LCD_E = 1;_nop_();_nop_();LCD_E = 0;                    // 操作允许脉冲信号     
 140   1      }
 141                  
 142          /*=======================================================
 143           当前位置写字符子程序: E =1 LCD_RS=1 LCD_RW=0
 144          =======================================================*/
 145          void LcdWriteData( char dataW ) {
 146   1      
 147   1              WaitForEnable();                                                        // 检测忙信号
 148   1      
 149   1              LCD_RS = 1; LCD_RW = 0; _nop_();
 150   1      
 151   1          DataPort = dataW; _nop_();
 152   1      
 153   1              LCD_E = 1; _nop_(); _nop_(); LCD_E = 0;         // 操作允许脉冲信号             
 154   1      
 155   1      }
 156          
 157          /*=======================================================
 158          正常读写操作之前必须检测LCD控制器状态:  CS=1 LCD_RS=0 LCD_RW=1
 159          DB7:    0  LCD控制器空闲; 1  LCD控制器忙
 160          ========================================================*/
 161          void WaitForEnable( void ) {
 162   1      
 163   1              DataPort = 0xff;
 164   1      
 165   1              LCD_RS =0; LCD_RW = 1; _nop_(); LCD_E = 1; _nop_(); _nop_();
 166   1              
 167   1              while( DataPort & Busy );
 168   1      
 169   1              LCD_E = 0;
 170   1      }       
 171                                 
 172          
 173          // 短延时
 174          void Delay5Ms(void)
 175          {
 176   1              uint i = 5552;
 177   1              while(i--);
 178   1      }
 179          
C51 COMPILER V8.02   LCD1602                                                               07/13/2006 21:12:22 PAGE 4   

 180          //长延时
 181          void Delay400Ms(void)
 182          {
 183   1              uchar i = 5;
 184   1              uint j;
 185   1              while(i--)
 186   1              {
 187   2                      j=7269;
 188   2                      while(j--);
 189   2              };
 190   1      }
 191          
C51 COMPILER V8.02   LCD1602                                                               07/13/2006 21:12:22 PAGE 5   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION main (BEGIN)
                                           ; SOURCE LINE # 38
                                           ; SOURCE LINE # 39
                                           ; SOURCE LINE # 42
0000 120000      R     LCALL   Delay400Ms
                                           ; SOURCE LINE # 43
0003 C293              CLR     BUZ
                                           ; SOURCE LINE # 44
0005 120000      R     LCALL   LcdReset
                                           ; SOURCE LINE # 45
0008 750020      R     MOV     temp,#020H
                                           ; SOURCE LINE # 46
000B 7A00        R     MOV     R2,#HIGH exampl
000D 7B00        R     MOV     R3,#LOW exampl
000F E4                CLR     A
0010 FD                MOV     R5,A
0011 FF                MOV     R7,A
0012 120000      R     LCALL   _ePutstr
                                           ; SOURCE LINE # 47
0015 120000      R     LCALL   Delay400Ms
0018         ?C0001:
                                           ; SOURCE LINE # 49
                                           ; SOURCE LINE # 50
                                           ; SOURCE LINE # 54
0018 7A00        R     MOV     R2,#HIGH sn
001A 7B00        R     MOV     R3,#LOW sn
001C 7D01              MOV     R5,#01H
001E E4                CLR     A
001F FF                MOV     R7,A
0020 120000      R     LCALL   _ePutstr
                                           ; SOURCE LINE # 55
0023 80F3              SJMP    ?C0001
             ; FUNCTION main (END)

             ; FUNCTION _ePutstr (BEGIN)
                                           ; SOURCE LINE # 61
0000 8F00        R     MOV     x,R7
0002 8D00        R     MOV     y,R5
0004 8A00        R     MOV     ptr,R2
0006 8B00        R     MOV     ptr+01H,R3
                                           ; SOURCE LINE # 62
0008 E4                CLR     A
0009 F500        R     MOV     l,A
000B         ?C0004:
                                           ; SOURCE LINE # 63
000B E500        R     MOV     A,ptr+01H
000D 2500        R     ADD     A,l
000F F582              MOV     DPL,A
0011 E4                CLR     A
0012 3500        R     ADDC    A,ptr
0014 F583              MOV     DPH,A
0016 E4                CLR     A
0017 93                MOVC    A,@A+DPTR
0018 D3                SETB    C
0019 941F              SUBB    A,#01FH
001B 4004              JC      ?C0005
001D 0500        R     INC     l
001F 80EA              SJMP    ?C0004
0021         ?C0005:
C51 COMPILER V8.02   LCD1602                                                               07/13/2006 21:12:22 PAGE 6   

                                           ; SOURCE LINE # 64
0021 E4                CLR     A
0022 F500        R     MOV     i,A
0024         ?C0006:
0024 E500        R     MOV     A,i
0026 C3                CLR     C
0027 9500        R     SUBB    A,l
0029 5026              JNC     ?C0010
                                           ; SOURCE LINE # 65
002B AF00        R     MOV     R7,x
002D 0500        R     INC     x
002F E500        R     MOV     A,ptr+01H

⌨️ 快捷键说明

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