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

📄 12.lst

📁 08浙江省大学生电子设计竞赛 C题,智能公交系统 获二等奖
💻 LST
📖 第 1 页 / 共 5 页
字号:
C51 COMPILER V8.02   12                                                                    10/10/2008 16:05:55 PAGE 1   


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

line level    source

   1          /**********************************************
   2            显示和键盘都已经正常,键盘采用的是中断方式
   3            
   4            2008.7.2
   5            
   6          **************************************/
   7          #include <P89V51.h>
   8          #include <absacc.h>
   9          #include <intrins.h>
  10          #include <stdlib.h>
  11          #include <stdio.h> 
  12          #define   uchar unsigned char 
  13          //SYSTEM ADDRESS ALLOCATION     ******************
  14          #define KEYCOLUM XBYTE[0xEFFF]
  15          #define KEYROW XBYTE[0xDFFF]
  16          #define ALARM XBYTE[0xCFFF]
  17          #define HC245C1 XBYTE[0xBFFF]
  18          #define HC245C2 XBYTE[0xAFFF]
  19          #define HC573C1 XBYTE[0x9FFF]
  20          #define HC573C2 XBYTE[0x8FFF]
  21          #define HC573C3 XBYTE[0x7FFF]
  22          #define ADCS XBYTE[0x6FFF]
  23          #define DACS XBYTE[0x5FFF]
  24          #define DACLOAD XBYTE[0x4FFF]
  25          //***************************************       
  26          
  27          //static unsigned char keyin=0;
  28          
  29          
  30          /*-------------LCD1602 definitions and functions--------------*/
  31          #define nops() {_nop_();_nop_();_nop_();}
  32          typedef bit BOOL;
  33          
  34          #define FALSE (bit)0
  35          #define TRUE  (bit)1
  36           
  37          sbit lcd_cs = P2^0;            //控制位
  38          sbit lcd_rw = P2^1; 
  39          sbit lcd_rs = P2^2;
  40          #define DataPort      P0 
  41          #define DataDirPort   P0  
  42          #define StatePort     P0   
  43                
  44          #define Busy 0x80 // 忙判别位  
  45          uchar keystate,keyin=0;
  46          char n=0,i,flag=0,c_2;
  47          unsigned int a, ADs,ch;
  48          char ADval[10];
  49          //**************时间变量**********************
  50          unsigned int tick=0,second=0,second_1=0,minute=0,b_out,c_0,c_1,mid,mid2,ch,ch_0=0,ch_no=0;
  51          
  52          //*****************控制变量*********************
  53          unsigned int step=0,t_1=0,t_2,t_3,t_no=0,co_2;
  54          
  55          float co_1;
C51 COMPILER V8.02   12                                                                    10/10/2008 16:05:55 PAGE 2   

  56          
  57          void delay(long t)
  58          {
  59   1          while(t)
  60   1           t--;
  61   1      } 
  62          
  63          code unsigned char* WrtieLcdErr =  "Display char outof range."; 
  64          
  65          // ------ Private function prototypes --------------------------
  66          static BOOL WaitTillNotBusy();
  67          static BOOL LocateXY(unsigned char posx, unsigned char posy); 
  68          static BOOL LcdWData(unsigned char dataW);
  69          static BOOL LcdWCMD(unsigned char CMD);
  70          BOOL LCDInit() ;
  71          BOOL DisplayOneChar(unsigned char x ,unsigned char y ,unsigned char Wdata) ;
  72          BOOL DisplayString(unsigned char posx, unsigned char posy,  unsigned char*  str);
  73          unsigned char keyscan(void);
  74          unsigned char Gatkey(char keystate);
  75          
  76          BOOL WaitTillNotBusy()
  77          { 
  78   1          unsigned int delay = 0xffff;  
  79   1       
  80   1              DataDirPort = 0xff; 
  81   1                                  
  82   1              lcd_cs = 1;
  83   1              lcd_rs = 0;
  84   1              lcd_rw = 1;
  85   1              while( (StatePort & Busy) && delay)
  86   1                  delay--;
  87   1              lcd_cs = 0;  
  88   1              if (!delay)  
  89   1                  return FALSE ; 
  90   1          
  91   1          return TRUE; 
  92   1      }      
  93          
  94          BOOL LocateXY( unsigned char posx,unsigned char posy)
  95          {
  96   1          posy &= 0x01;
  97   1          if (posy == 1)
  98   1              posx |= 0x40;
  99   1          posx |= 0x80;
 100   1         
 101   1          return LcdWCMD(posx);   
 102   1      }
 103          
 104          
 105          BOOL LcdWCMD(unsigned char CMD) 
 106          {        
 107   1              unsigned char i=1;
 108   1                                  
 109   1              if (!WaitTillNotBusy()) // 检测忙信号? 
 110   1              return FALSE;    
 111   1                                      
 112   1              DataPort = CMD;
 113   1              lcd_rs = 0;
 114   1              lcd_rw = 0;
 115   1              lcd_cs = 1;
 116   1              while(i++);
 117   1              lcd_cs = 0;  
C51 COMPILER V8.02   12                                                                    10/10/2008 16:05:55 PAGE 3   

 118   1          
 119   1             return TRUE;
 120   1      }
 121          
 122          
 123          BOOL LcdWData( unsigned char dataW )
 124          {    
 125   1           
 126   1              unsigned char i = 1;
 127   1               
 128   1              if (!WaitTillNotBusy()) // 检测忙信号? 
 129   1                  return FALSE; 
 130   1            
 131   1              
 132   1              DataPort = dataW;
 133   1              lcd_rs = 1;
 134   1              lcd_rw = 0;
 135   1              lcd_cs = 1;
 136   1              while(i++);
 137   1              lcd_cs = 0;   
 138   1      
 139   1             return TRUE;
 140   1      } 
 141          
 142          // LCD输出用函数
 143          //LCDInit--LCD初始化
 144          //DisplayOneChar(x,y,char) --在指定x,y显示一个字符
 145          //DisplayString(x,y,str)--在指定位置x,y开始显示一个字符串
 146          
 147          BOOL LCDInit() 
 148          {
 149   1        
 150   1          // 显示模式设置,光标移动设置,显示开及光标设置,显示清屏 
 151   1          return (LcdWCMD( 0x38) && LcdWCMD( 0x06) && LcdWCMD( 0x0c) && LcdWCMD( 0x01));       
 152   1      
 153   1      }
 154          
 155          BOOL DisplayOneChar(unsigned char x ,unsigned char y ,unsigned char Wdata) 
 156          {
 157   1         
 158   1          if( (x >= 0 && x < 16) && (y >= 0 && y < 2) )
 159   1              return (LocateXY( x, y ) && LcdWData( Wdata )) ;// 定位显示地址,写字符 
 160   1          else
 161   1              return ( LCDInit() && DisplayString(0, 0, WrtieLcdErr));    //显示越界消息    
 162   1      }
 163          
 164          BOOL DisplayString(unsigned char posx, unsigned char posy,  unsigned char*  str)
 165          {    
 166   1          while ( (*str) != '\0' )
 167   1          {
 168   2              if (!DisplayOneChar(posx, posy, (*str)))
 169   2                  return FALSE;
 170   2              str++;
 171   2              posx++;
 172   2              if( posx == 16 )
 173   2              {
 174   3                  posx = 0;
 175   3                  posy++;
 176   3      
 177   3              }
 178   2          }
 179   1          
C51 COMPILER V8.02   12                                                                    10/10/2008 16:05:55 PAGE 4   

 180   1          return TRUE;              
 181   1      }
 182          /*--------------End of LCD1602 macros and functions------------------*/
 183          
 184          /*-------------- ----SPI protocols-----------------------------------   */
 185          
 186          void SpiInit(void)
 187          {
 188   1         SPCR = 0x51;
 189   1         SPSR = 0x00;
 190   1      }
 191          
 192          void SpiClose(void)  {SPCR = 0x00;}
 193          
 194          /*----------------End of SPI protocols---------------------------*/
 195          
 196          //-----------ADC MCP3208 functions--------------------
 197          // ReadAD(chx)读AD,chx为通道号
 198          //chx=0x00----0x07对应AD0---AD7通道
 199          unsigned int ReadAD(unsigned char chx)
 200          {
 201   1      
 202   1          unsigned int lsb,msb;
 203   1              char sbuf;
 204   1          lsb=0;msb=0;
 205   1              
 206   1              ADCS = 0x00;    
 207   1              sbuf = 0x06 | (chx>>2);
 208   1              SPDAT = sbuf;
 209   1          while(!(SPSR&0x80) );
 210   1              SPSR = 0x00;
 211   1          sbuf = SPDAT;
 212   1              
 213   1              sbuf = (chx&0x03)<<6;
 214   1              SPDAT = sbuf;
 215   1          while(!(SPSR&0x80) );
 216   1              SPSR = 0x00;
 217   1          sbuf = SPDAT;
 218   1              msb = sbuf&0x0F;
 219   1              
 220   1              sbuf = 0x00;
 221   1              SPDAT = sbuf;
 222   1          while(!(SPSR&0x80) );
 223   1              SPSR = 0x00;
 224   1          lsb = SPDAT;
 225   1              
 226   1              XBYTE[0xFFFF] = 0x00;
 227   1              
 228   1          return msb*256+lsb;
 229   1      
 230   1      }  
 231          //------------End ADC MCP3208 functions-----------------        
 232          
 233          //-----------------DAC MCP4922 functions----------------------
 234          void DACout( unsigned char DACH, unsigned int DAValue)
 235          {
 236   1          unsigned char msb,lsb,temp;  
 237   1      
 238   1         XBYTE[0xFFFF] = 0;
 239   1      
 240   1         DAValue&=0x0FFF;
 241   1       
C51 COMPILER V8.02   12                                                                    10/10/2008 16:05:55 PAGE 5   

 242   1         temp = (DAValue/256)&0x0F;
 243   1      
 244   1        DACS = 0x00; 
 245   1         
 246   1        if(DACH==1)
 247   1          {
 248   2          msb =0x70|temp;
 249   2          lsb = (unsigned char)(DAValue & 0xFF) ; 
 250   2          }
 251   1        else if(DACH==2)
 252   1         {
 253   2          msb =0xF0|temp;                       
 254   2          lsb = (unsigned char)(DAValue & 0xFF) ; 
 255   2          }
 256   1        else
 257   1          { }
 258   1         
 259   1       
 260   1         SPDAT = msb;
 261   1         while(!(SPSR&0x80) );
 262   1         SPSR = 0x00;
 263   1      
 264   1         SPDAT = lsb;
 265   1         while(!(SPSR&0x80) );
 266   1         SPSR = 0x00;
 267   1        
 268   1         XBYTE[0xFFFF] = 0;
 269   1         DACLOAD = 0x00;
 270   1         nops();
 271   1         XBYTE[0xFFFF] = 0;
 272   1       
 273   1      }
 274          
 275          
 276          
 277          //**********************按键中断响应**********************
 278          
 279          void Int1_keyscan(  )  interrupt 0       
 280          {   
 281   1          unsigned char ucSKey;
 282   1          unsigned int  uiI;
 283   1              EA=0;
 284   1          for (uiI=0;uiI<100;uiI++);                //延时,去掉抖动 
 285   1          if(INT1==1) 
 286   1              goto end01;                     
 287   1          for (uiI=0;uiI<100;uiI++);                //延时,去掉抖动 
 288   1          if(INT1==1) 
 289   1              goto end01;                                     //关闭外部中断
 290   1          //LcdWCMD( 0x01) ;  //显示清屏
 291   1          keyscan();   //获取按键状态
 292   1          Gatkey(keystate);                        
 293   1          DisplayOneChar(0,1,keyin);   //显示按键对应的字符
 294   1      
 295   1      
 296   1              //delay(500);   
 297   1              while(P3_2==0){;}
 298   1              delay(100);
 299   1              while(P3_2==0){;}
 300   1              end01:;
 301   1              EA=1;  // 开启中断
 302   1              KEYROW=0x00;
 303   1      }
C51 COMPILER V8.02   12                                                                    10/10/2008 16:05:55 PAGE 6   

⌨️ 快捷键说明

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