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

📄 1602.lst

📁 LCD1602的C语言显示编程
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.01   1602                                                                  03/30/2008 11:45:28 PAGE 1   


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

line level    source

   1          //单行或双行显示
   2          //显示的起始位置设定
   3          //屏幕左右移动,动画效果
   4          //给定一个字符数组,如何通过strlen()来判断字符串的长度?这样在for初始化时,也许可以简化程序
   5          //最后的一行,会再次显一遍,又返回到了第一行
   6          //遇到\n 自动换行
   7          
   8          //两个外部中断调节,自动翻页的速度。
   9          //暂停键,再次按,开始
  10          
  11          //设置一个手动翻页,上下键
  12          
  13          //如果全用中断那么中断太多,如何扩展中断?
  14          #include <at89x51.h>
  15          #include <intrins.h>
  16          #define uchar unsigned char
  17          #define uint  unsigned int
  18          sbit lcd_RS=P2^5;                                //定义寄存器
  19          sbit lcd_RW=P2^6;                                //定义是否读写
  20          sbit lcd_E=P2^7;                                //定义使能端
  21          sbit lcd_flag=P0^7;                             //定义是否Busy标志
  22          sbit pd=P1^0;
  23          sbit pu=P1^1;
  24          sbit spdd=P1^2;
  25          sbit spdu=P1^3;
  26          uint spd=600;
  27          uchar *app;
  28          //uchar dis1[]="0123456789012345";
  29          //uchar dis2[]="abcdefghijklmnop";
  30           uchar code dis[]="you bought all the books you need thiss emester yet?";
  31          //uchar dis1[]="012345";
  32          bit lcd_busy()                                //判断是否忙碌 RS=Low,RW=High,E=High:读状态
  33          { 
  34   1              bit flag;                
  35   1              lcd_RS=0;                             //寄存器为Low
  36   1              lcd_RW=1;                             //是否读写为High
  37   1              lcd_E=1;                              //使能端为High
  38   1              if (lcd_flag==1) flag=1;
  39   1              else flag=0;
  40   1              lcd_E=0;
  41   1              return flag;                         //返回标志,判断是否LCD忙碌
  42   1      }
  43          void lcd_putcommand(uchar command)     //写指令 RS=Low,RW=Low,E=High:写指令
  44          { 
  45   1              while (lcd_busy());            //判断是否忙碌
  46   1              lcd_RS=0;                                                                          
  47   1              lcd_RW=0;
  48   1              lcd_E=0;                       
  49   1              P0=command;                   
  50   1              lcd_E=1;                      
  51   1              lcd_E=0;
  52   1      }
  53          void lcd_putchar(uchar putchar)      //写数据 RS=High,RW=Low,E=High:写数据
  54          { 
  55   1              while(lcd_busy());           //判断是否忙碌
C51 COMPILER V8.01   1602                                                                  03/30/2008 11:45:28 PAGE 2   

  56   1              lcd_RS=1;
  57   1              lcd_RW=0;
  58   1              lcd_E=0;                     
  59   1              P0=putchar;                  
  60   1              lcd_E=1;                   
  61   1              lcd_E=0;
  62   1      }
  63          void lcd_moveto(uchar x,uchar y)                    //显示字符的位置:第x行y列(X=1或2,Y=1~16)
  64          { 
  65   1              if (x==0) lcd_putcommand(0x80|y-1);     //第一行,并初始化从第y-1个字符开始显示
  66   1              if (x==1) lcd_putcommand(0xc0|y-1);     //第二行,并............
  67   1      }
  68          void lcd_delay(uint ms) //延时函数
  69          { 
  70   1              uchar i;
  71   1              while(ms--)
  72   1              {
  73   2                      for(i=0;i<250;i++)
  74   2                      {
  75   3                      _nop_();_nop_();_nop_();_nop_();
  76   3                      }
  77   2              }
  78   1      }
  79          void lcd_init(void)
  80          {
  81   1              lcd_putcommand(0x38);  lcd_delay(1); //LCD为2行,5×7字
  82   1              lcd_putcommand(0x0e);  //打开显示,显示光标,光标不闪
  83   1      //              lcd_putcommand(0x0f);  //....................光标闪烁  
  84   1              lcd_delay(1);
  85   1              lcd_putcommand(0x06); lcd_delay(1);//每次右移一字符
  86   1              
  87   1      }
  88          void main(void)
  89          {
  90   1      //              IT0=1;  //设置中断触发方式,下降沿
  91   1      //          IE=0X81;
  92   1      
  93   1              //uchar flag,m,i;
  94   1                      uchar *p;
  95   1                      app=dis;
  96   1              //m=strlen(dis);
  97   1              lcd_init();                                                                          //初始化
  98   1      //        lcd_delay(10);                
  99   1              IT0=1;    //设置中断触发方式,下降沿
 100   1                      IE=0X81;  //中断放在前面,会引起指针变量声明错误
 101   1      while(1)
 102   1      {app=dis;
 103   2       while(*app!='\0')
 104   2         { 
 105   3               /************第一行***************/
 106   3               lcd_moveto(0,1);
 107   3               lcd_putcommand(0x08);     //在显示数据时关闭显示,否则如果cpu慢的话,会感觉闪烁
 108   3               for(p=app;(p<app+16)&&(*p!='\0');p++)   //逻辑判断的顺序是从右到左,所以把     *p~='\0'写右边
 109   3                        {
 110   4                          
 111   4                          lcd_putchar(*p);
 112   4                      //      lcd_delay(100);
 113   4                        }
 114   3           app+=16;
 115   3              //  lcd_putcommand(0x0e);
 116   3              // lcd_delay(200);
 117   3               /***********第二行****************/
C51 COMPILER V8.01   1602                                                                  03/30/2008 11:45:28 PAGE 3   

 118   3              //   lcd_putcommand(0x08);
 119   3           lcd_moveto(1,1);
 120   3               for(p=app;(p<app+16)&&(*p!='\0');p++)
 121   3                        {
 122   4                          lcd_putchar(*p);
 123   4              //              lcd_delay(100);
 124   4                        }
 125   3                 //   dis=dis+16;
 126   3              lcd_putcommand(0x0e);
 127   3      
 128   3               lcd_delay(spd);
 129   3               lcd_putcommand(0x01);
 130   3      
 131   3               if(*p=='\0') break;  //阻止最后一行再次显示
 132   3           
 133   3                        
 134   3        }
 135   2        }
 136   1      
 137   1       // while(1);
 138   1      }
 139          
 140          
 141          void lcd_key() interrupt 0 using 2 //外部中断0 ,第一组寄存器,r0
 142          {
 143   1        /* switch (P1) 
 144   1         {
 145   1               case 0xfe:  //第一个键按下
 146   1        }*/
 147   1        if (pu==0)
 148   1           {app-=16;}
 149   1        else if (pd==0)
 150   1           {app+=16;}
 151   1        else if (spdd==0)
 152   1           { if(spd<2000)
 153   2                 spd+=500;
 154   2               
 155   2               }
 156   1        else if (spdu==0)
 157   1           { if(spd>200)
 158   2                  spd-=500;
 159   2                               
 160   2                }
 161   1        else ;//异常原因引起的中断,不处理,但此处有个问题,如果同时按下两个键呢,呵呵,总有个先后,你说呢
 162   1      
 163   1      }
C51 COMPILER V8.01   1602                                                                  03/30/2008 11:45:28 PAGE 4   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION lcd_busy (BEGIN)
                                           ; SOURCE LINE # 32
                                           ; SOURCE LINE # 33
                                           ; SOURCE LINE # 35
0000 C2A5              CLR     lcd_RS
                                           ; SOURCE LINE # 36
0002 D2A6              SETB    lcd_RW
                                           ; SOURCE LINE # 37
0004 D2A7              SETB    lcd_E
                                           ; SOURCE LINE # 38
0006 308704            JNB     lcd_flag,?C0001
0009 D200        R     SETB    flag
000B 8002              SJMP    ?C0002
000D         ?C0001:
                                           ; SOURCE LINE # 39
000D C200        R     CLR     flag
000F         ?C0002:
                                           ; SOURCE LINE # 40
000F C2A7              CLR     lcd_E
                                           ; SOURCE LINE # 41
0011 A200        R     MOV     C,flag
                                           ; SOURCE LINE # 42
0013         ?C0003:
0013 22                RET     
             ; FUNCTION lcd_busy (END)

             ; FUNCTION _lcd_putcommand (BEGIN)
                                           ; SOURCE LINE # 43
;---- Variable 'command' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 44
0000         ?C0004:
                                           ; SOURCE LINE # 45
0000 120000      R     LCALL   lcd_busy
0003 40FB              JC      ?C0004
0005         ?C0005:
                                           ; SOURCE LINE # 46
0005 C2A5              CLR     lcd_RS
                                           ; SOURCE LINE # 47
0007 C2A6              CLR     lcd_RW
                                           ; SOURCE LINE # 48
0009 C2A7              CLR     lcd_E
                                           ; SOURCE LINE # 49
000B 8F80              MOV     P0,R7
                                           ; SOURCE LINE # 50
000D D2A7              SETB    lcd_E
                                           ; SOURCE LINE # 51
000F C2A7              CLR     lcd_E
                                           ; SOURCE LINE # 52
0011 22                RET     
             ; FUNCTION _lcd_putcommand (END)

             ; FUNCTION _lcd_putchar (BEGIN)
                                           ; SOURCE LINE # 53
;---- Variable 'putchar' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 54
0000         ?C0007:
                                           ; SOURCE LINE # 55
0000 120000      R     LCALL   lcd_busy
0003 40FB              JC      ?C0007
C51 COMPILER V8.01   1602                                                                  03/30/2008 11:45:28 PAGE 5   

0005         ?C0008:
                                           ; SOURCE LINE # 56
0005 D2A5              SETB    lcd_RS
                                           ; SOURCE LINE # 57
0007 C2A6              CLR     lcd_RW
                                           ; SOURCE LINE # 58
0009 C2A7              CLR     lcd_E
                                           ; SOURCE LINE # 59
000B 8F80              MOV     P0,R7
                                           ; SOURCE LINE # 60
000D D2A7              SETB    lcd_E
                                           ; SOURCE LINE # 61
000F C2A7              CLR     lcd_E
                                           ; SOURCE LINE # 62
0011 22                RET     
             ; FUNCTION _lcd_putchar (END)

             ; FUNCTION _lcd_moveto (BEGIN)
                                           ; SOURCE LINE # 63
;---- Variable 'y' assigned to Register 'R5' ----
;---- Variable 'x' assigned to Register 'R6' ----
0000 AE07              MOV     R6,AR7
                                           ; SOURCE LINE # 64
                                           ; SOURCE LINE # 65
0002 EE                MOV     A,R6
0003 7008              JNZ     ?C0010
0005 ED                MOV     A,R5
0006 14                DEC     A
0007 4480              ORL     A,#080H
0009 FF                MOV     R7,A
000A 120000      R     LCALL   _lcd_putcommand
000D         ?C0010:
                                           ; SOURCE LINE # 66
000D BE0108            CJNE    R6,#01H,?C0012
0010 ED                MOV     A,R5
0011 14                DEC     A
0012 44C0              ORL     A,#0C0H
0014 FF                MOV     R7,A
0015 120000      R     LCALL   _lcd_putcommand
                                           ; SOURCE LINE # 67
0018         ?C0012:
0018 22                RET     
             ; FUNCTION _lcd_moveto (END)

             ; FUNCTION _lcd_delay (BEGIN)
                                           ; SOURCE LINE # 68
;---- Variable 'i' assigned to Register 'R5' ----
;---- Variable 'ms' assigned to Register 'R6/R7' ----
                                           ; SOURCE LINE # 69
0000         ?C0013:
                                           ; SOURCE LINE # 71

⌨️ 快捷键说明

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