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

📄 test.lst

📁 基于C8051F040的液晶
💻 LST
字号:
C51 COMPILER V7.50   TEST                                                                  08/29/2007 18:00:13 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\c51.exe test.c DB OE

line level    source

   1          //#include "c8051f040.h"
   2          //#include "lcd.h"
   3          #include "c8051f040.h"
   4          typedef unsigned char uchar;
   5          typedef unsigned int uint;
   6          typedef unsigned long ulong;
   7          sbit lcdrs=P5^2;//硬件控制接口
   8          sbit lcdrw=P5^1;
   9          sbit lcdcs=P5^0;
  10          xdata uchar keybuf[16];//输入缓冲区
  11          code uchar disdata[3][16]={"0123456789.+-012","ABCDEFGHIJKLMNOP","QRSTUVWXYZ@#$%&*"};
  12          xdata uchar intbuf[16];//显示int型数据缓冲区
  13          void config(void){
  14   1      //看门狗禁止
  15   1          WDTCN = 0x07;       
  16   1          WDTCN = 0xDE;   
  17   1          WDTCN = 0xAD;
  18   1          SFRPAGE = 0x0F;
  19   1          XBR0 = 0x00;        
  20   1          XBR1 = 0x00;        
  21   1          XBR2 = 0x40;        //交叉开关使能,使得P0-P3口能输出
  22   1          XBR3 = 0x00;    
  23   1          SFRPAGE = 0x0F;
  24   1          P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
  25   1          P1MDOUT = 0x00; 
  26   1          P2MDOUT = 0x00; 
  27   1          P3MDOUT = 0x00; 
  28   1          P4MDOUT = 0x00; //P4口为开漏
  29   1          P5MDOUT = 0x07; 
  30   1          P6MDOUT = 0x00; 
  31   1          P7MDOUT = 0x00;
  32   1                                              \
  33   1          P1MDIN = 0xFF;  //所有端口为数字输入,没有模拟输入端口
  34   1          P2MDIN = 0xFF;  
  35   1          P3MDIN = 0xFF; 
  36   1          SFRPAGE = 0x0F;
  37   1          CLKSEL = 0x00;  
  38   1          OSCXCN = 0x00;      
  39   1          OSCICN = 0x84;      
  40   1          //采用内部晶振,为24.5MHZ8分频
  41   1      }
  42          void delay1ms(uint time){//延迟1ms*time,这不是一个精确值
  43   1              uint i;
  44   1              uint j;
  45   1              for (i=0;i<time;i++){
  46   2                      for(j=0;j<255;j++);
  47   2              }
  48   1      }       
  49          void delay50us(uchar time){//延时50us*time,不是精确值
  50   1              uchar i,j;
  51   1              for (i=0;i<time;i++){
  52   2                      for(j=0;j<12;j++);
  53   2              }
  54   1      }       
  55          void sendc(uchar c){//给lcd送命令
C51 COMPILER V7.50   TEST                                                                  08/29/2007 18:00:13 PAGE 2   

  56   1              SFRPAGE = 0x0f;//以下为lcd发送命令虚拟时序
  57   1              P4=c;
  58   1              lcdrs=0;
  59   1              lcdrw=0;
  60   1              EA=0;
  61   1              lcdcs=1;
  62   1              lcdcs=0;
  63   1              lcdcs=1;
  64   1              lcdrw=1;
  65   1              P4=0xff;//先置1,后读取
  66   1              lcdrs=0;
  67   1              while(P4>=0x80);
  68   1              lcdcs=0;
  69   1              lcdcs=1;
  70   1              EA=1;
  71   1              if(c==1)
  72   1                      delay1ms(2);
  73   1                      
  74   1      }
  75          void sendd(uchar c){//给lcd送数据
  76   1              SFRPAGE = 0x0f;
  77   1              EA=0;
  78   1              P4=c;
  79   1              lcdrs=1;
  80   1              lcdrw=0;
  81   1              lcdcs=1;
  82   1              lcdcs=0;
  83   1              lcdcs=1;
  84   1              lcdrw=1;
  85   1              P4=0xff;//先置1,后读取
  86   1              lcdrs=0;
  87   1              while(P4>=0x80);
  88   1              lcdcs=0;
  89   1              lcdcs=1;
  90   1              EA=1;
  91   1      }       
  92          uchar readd(){//读LCD数据
  93   1              uchar k;
  94   1              SFRPAGE = 0x0f;
  95   1              EA=0;
  96   1              lcdrw=1;
  97   1              P4=0xff;
  98   1              lcdrs=1;
  99   1              k=P4;
 100   1              lcdcs=0;
 101   1              lcdcs=1;
 102   1              P4=0xff;//先置1,后读取,否则所读数据可能有误
 103   1              lcdrs=0;
 104   1              while(P4>=0x80);
 105   1              /*读LCD是否为忙,此代码不可省略,否则连续读时若LCD为忙,所读数据是上一周期的数据*/
 106   1              lcdcs=0;
 107   1              lcdcs=1;
 108   1              EA=1;
 109   1              return k;
 110   1      }       
 111          void dispini(){ //lcd显示初始化
 112   1              delay1ms(100);
 113   1              SFRPAGE=0xf;
 114   1              lcdcs=0;         
 115   1              lcdrs=1;
 116   1              lcdrw=1;
 117   1              delay1ms(30);
C51 COMPILER V7.50   TEST                                                                  08/29/2007 18:00:13 PAGE 3   

 118   1              sendc(0x38);//8位,2行,5*7字体
 119   1              delay1ms(100);
 120   1              sendc(0x0c);//显示开,光标关;不闪烁字符
 121   1              delay1ms(100);
 122   1              sendc(0x06);//增量方式,现不移动
 123   1              delay1ms(100);
 124   1              sendc(0x01);//清屏
 125   1              delay1ms(100);
 126   1      }
 127          void puti(long  data inum){    
 128   1      /*将一个int型数据转化成ascii码字符串,结尾以'\0'结束,并将结果存于intbuf(全局变量数组,可在任何地方被调用)*/
 129   1              long data t;
 130   1              uchar data c=0;
 131   1              bit flag=1;
 132   1              t=100000000L;
 133   1              for(;c<16;c++)
 134   1                      intbuf[c]='\0';
 135   1              c=0;
 136   1              if(inum<0){
 137   2                      intbuf[0]='-';
 138   2                      c++;
 139   2                      inum=-inum;
 140   2              }
 141   1              for(;t>=10;t/=10){//此为将int型转化成字符串算法
 142   2                      if(t==10){
 143   3                              intbuf[c]=inum/t+'0';
 144   3                              intbuf[++c]=inum%t+'0';
 145   3                              intbuf[++c]='\0';
 146   3                              break;
 147   3                      }
 148   2                      if(inum<t&flag)
 149   2                              continue;
 150   2                      else    {
 151   3                              flag=0;
 152   3                              intbuf[c]=inum/t;
 153   3                              inum-=(long)(intbuf[c]) * t;
 154   3                              intbuf[c]+='0';
 155   3                              c++;
 156   3                      }
 157   2              }
 158   1      }
 159          void showline(uchar  *str,bit page){//page值为0,显示第一行,page为1,显示第二行
 160   1              uchar idata  k;
 161   1              if(page==0){//控制显示在第几行是通过k的地址不同来实现的
 162   2                      for(k=0x80;k<0x90;k++){
 163   3                      if(*str=='\0'){//*str的指针不下移,会执行到k=0x8f为止
 164   4                                      sendc(k);
 165   4                                      sendd(' ');//显示空格清掉上次显示部分
 166   4                              }
 167   3                              else{
 168   4                                      sendc(k); 
 169   4                                      sendd(*str);
 170   4                                      str++;
 171   4                              }
 172   3                      }
 173   2              }
 174   1              if(page==1){
 175   2                      for(k=0xc0;k<0xd0;k++){
 176   3                              if(*str=='\0'){
 177   4                                      sendc(k);
 178   4                                      sendd(' ');
 179   4                              }
C51 COMPILER V7.50   TEST                                                                  08/29/2007 18:00:13 PAGE 4   

 180   3                              else    {
 181   4                                      sendc(k); 
 182   4                                      sendd(*str);
 183   4                                      str++;
 184   4                              }
 185   3                      }
 186   2              }
 187   1      }
 188          void showint(long idata num,bit line){
 189   1              puti(num);
 190   1              showline(intbuf,line);
 191   1      }
 192          
 193          
 194          
 195          
 196          
 197          
 198          
 199          
 200          uchar idata fifo[60];  //用数组构建产度为60的队列
 201          uchar fifoAdd(uchar a){//队列元素增加
 202   1              uchar i;
 203   1              for(i= 0;i<59;i++){
 204   2                      fifo[59-i]=fifo[58-i];
 205   2              }
 206   1              fifo[0] = a;
 207   1              return fifo[0];
 208   1      }
 209          /*--------------------------------------------
 210          键盘扫描函数,返回键值:DYT。2008-08-19
 211          --------------------------------------------*/
 212          /*uchar scankey(void){
 213                  uchar c;
 214                  for(;;){
 215                          P2 = 0xff;
 216                          c = P2&0x0f;
 217                          
 218                          switch(c){
 219                                  case 0x0e:c=0;return c;
 220                                  case 0x0d:c=1;return c;
 221                                  case 0x0b:c=2;return c;
 222                                  case 0x07:c=3;return c;
 223                          }
 224                  }
 225          }*/
 226          /*--------------------------------------------
 227          矩阵式键盘扫描函数,返回键值:DYT。2008-08-27
 228          --------------------------------------------*/
 229          Scankey(void){
 230   1              xdata uchar col[4]={0x0e,0x0d,0x0b,0x07};
 231   1              xdata uchar table[4][4] ={{0,1,2,3,},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
 232   1          uchar c,r,p,i;//c:列 r:行  p:端口输入 
 233   1          for(;;){
 234   2              P7 = 0x0f;
 235   2              p = P7;
 236   2              if(p != 0x0f){break;}
 237   2          }
 238   1          switch(p){
 239   2              case 0x0e:c=0;break;
 240   2              case 0x0d:c=1;break;
 241   2              case 0x0b:c=2;break;
C51 COMPILER V7.50   TEST                                                                  08/29/2007 18:00:13 PAGE 5   

 242   2              case 0x07:c=3;break;
 243   2          }
 244   1          //用于IO口高四位依次置1,用移位运算“>>”实现 
 245   1          for(i=0;i<4;i++){
 246   2              p=0x80>>i;
 247   2                      P7=0x0f;
 248   2              P7|=p;
 249   2                      r=P7;
 250   2              r&=0x0f;
 251   2              if(r==0x0f ){r=i;break;}
 252   2          
 253   2          }
 254   1          return table[r][c];
 255   1      }
 256          
 257          /*---------------------------------------------
 258          逐位显示函数:DYT.2008-08-19
 259          ---------------------------------------------*/
 260          void showbit(uchar c,bit line,uchar adr){
 261   1              uchar idata k;
 262   1              c ='0'+c;
 263   1              if(~line){ k = 0x80+adr;}
 264   1              else {k = 0xc0+adr;}
 265   1              sendc(k);
 266   1              delay1ms(255);
 267   1              sendd(c);
 268   1      }
 269          /*---------------------------------------------
 270          确定处理函数:DYT.2008-08-29
 271          ---------------------------------------------*/
 272          bit Confirm(uchar *quest){
 273   1              bit flag=1;
 274   1              showline(quest,0);
 275   1              showline("  *YES*    no",1);
 276   1              for(;;){
 277   2                      if(Scankey()==8){
 278   3                              showline("   yes    *NO*",1); 
 279   3                              delay1ms(100);
 280   3                              flag=0;
 281   3                      }
 282   2                      else if(Scankey()==9){
 283   3                              showline("  *YES*    no",1);
 284   3                              delay1ms(100);
 285   3                              flag=1;
 286   3                      }
 287   2                      else if(Scankey()==13){return flag;}
 288   2              }
 289   1      }
 290          
 291          main(void){
 292   1              ulong idata x = 100;
 293   1              uchar idata add = 0;
 294   1              config();
 295   1              dispini();
 296   1              x=Confirm("Return?");
 297   1              /*showline("Scankey test",0);
 298   1              while(1){
 299   1                      x = Scankey();
 300   1                      showint(x,1);
 301   1                      delay1ms(200);
 302   1              }//矩阵键盘扫描测试程序*/
 303   1              //showline("Scankey test:",0);
C51 COMPILER V7.50   TEST                                                                  08/29/2007 18:00:13 PAGE 6   

 304   1              /*while(1){
 305   1                      x = scankey();
 306   1                  showbit(x,1,add);
 307   1                      add++;
 308   1              }
 309   1              while(1){
 310   1                      if(x<255){
 311   1                              fifoAdd(x);
 312   1                              showint(fifo[10],0);
 313   1                              showint(fifo[20],1);
 314   1                              x++;
 315   1                              delay1ms(200);
 316   1                      }
 317   1      
 318   1                      else x = 0;
 319   1              }*/
 320   1              while(1){
 321   2                      showint(x,0);
 322   2                      delay1ms(300);
 323   2                      x++;
 324   2                      if(x == 99999) x = 0;
 325   2              }
 326   1      }
 327          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1207    ----
   CONSTANT SIZE    =    105    ----
   XDATA SIZE       =     32      20
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      16
   IDATA SIZE       =     60       7
   BIT SIZE         =   ----       5
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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