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

📄 8574keyboard.lst

📁 aduc834单片机PCF8574 4*5键盘驱动程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.08   8574KEYBOARD                                                          03/31/2009 16:43:21 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE 8574KEYBOARD
OBJECT MODULE PLACED IN 8574KEYBOARD.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 8574KEYBOARD.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //#include <reg52.h>
   2          #include <ADI/ADuC834.h>
   3          #include <intrins.h>
   4          
   5          #define uchar unsigned char
   6          #define uint unsigned int
   7          
   8          //1602移植过来的
   9          sbit rs=P2^3;    //1602的数据/指令选择控制线 
  10          sbit rw=P2^4;        //1602的读写控制线 
  11          sbit en=P2^5;        //1602的使能控制线 
  12          /*P2口接1602的D0~D7,注意不要接错了顺序,我以前可在这上面吃过亏~*/ 
  13          uchar code table[]="LCD1602 check ok"; //要显示的内容1放入数组tablel 
  14          uchar code table1[]="study up";             //要显示的内容2放入数组table1 
  15          uchar code esc[]="ESC";
  16          uchar code light[]="LIGHT";
  17          uchar code avc[]="AVC";
  18          uchar code memo[]="MEMO";
  19          uchar code hold[]="HOLD";
  20          uchar code setup[]="SETUP";
  21          uchar code pgdn[]="PgDn";
  22          
  23          uchar n,m=0;
  24          
  25          uchar slvadr=0x40 ;      //被控器地址
  26          uchar ack;
  27          uchar key;
  28          uchar curkey;
  29          uchar key_right_flag=1;
  30          uchar KeyPort;
  31          uchar RBT[8];
  32          
  33          //1602移植过来的
  34          void delay(uint n)       //延时函数                       
  35          { 
  36   1          uint x,y; 
  37   1          for(x=n;x>0;x--) 
  38   1              for(y=110;y>0;y--); 
  39   1      } 
  40          void lcd_wcom(uchar com)  //1602写命令函数                 
  41          { 
  42   1          rs=0;            //选择指令寄存器 
  43   1          rw=0;            //选择写 
  44   1          P0=com;            //把命令字送入P2 
  45   1          delay(5);            //延时一小会儿,让1602准备接收数据 
  46   1          en=1;           //使能线电平变化,命令送入1602的8位数据口 
  47   1          en=0; 
  48   1      } 
  49          void lcd_wdat(uchar dat)        //1602写数据函数       
  50          { 
  51   1          rs=1;        //选择数据寄存器 
  52   1          rw=0;        //选择写 
  53   1          P0=dat;        //把要显示的数据送入P2 
  54   1          delay(5);        //延时一小会儿,让1602准备接收数据 
  55   1          en=1;        //使能线电平变化,数据送入1602的8位数据口 
C51 COMPILER V8.08   8574KEYBOARD                                                          03/31/2009 16:43:21 PAGE 2   

  56   1          en=0; 
  57   1      } 
  58          void lcd_init()              //1602初始化函数       
  59          { 
  60   1          lcd_wcom(0x38);       //8位数据,双列,5*7字形       
  61   1          lcd_wcom(0x0F);      //开启显示屏,关光标,光标不闪烁 
  62   1          lcd_wcom(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位 
  63   1          lcd_wcom(0x01);    //清屏 
  64   1      } 
  65          
  66          void PCF8574init(void)
  67          {
  68   1              I2CM=1;
  69   1      }
  70          
  71          void delay1ms(uchar x)
  72          {  
  73   1      unsigned char i,j;
  74   1              while(x--)
  75   1                 {
  76   2                   for(i=5;i>0;i--)
  77   2                for(j=132;j>0;j--);
  78   2              }
  79   1      }
  80          
  81          void Delay_Cycles(char delay)
  82          {
  83   1        while(delay--);
  84   1      }
  85          
  86          /*---------------------------------------------------------------------------------------------------
  87          开始:START
  88          描述:启动I2C 总线子程序--发送I2C 起始条件
  89          ---------------------------------------------------------------------------------------------------*/
  90          void start(void)
  91          {
  92   1        MDE=1;
  93   1        MCO=1;
  94   1        MDO=1;
  95   1        _nop_();
  96   1        _nop_();
  97   1        _nop_();
  98   1        _nop_();
  99   1        _nop_();
 100   1        MDO=0;
 101   1        _nop_();
 102   1        _nop_();
 103   1        _nop_();
 104   1        _nop_();
 105   1        _nop_();
 106   1        MCO=0;
 107   1      }
 108          
 109          void Ack_I2c(uchar a) //a=0发送应答信号,=1发送非应答信号
 110          { 
 111   1              MDE=1;
 112   1        if(a==0)MDO=0; /*在此发出应答或非应答信号 */ 
 113   1        else MDO=1; 
 114   1        _nop_(); 
 115   1        _nop_(); 
 116   1        _nop_(); 
 117   1        MCO=1; 
C51 COMPILER V8.08   8574KEYBOARD                                                          03/31/2009 16:43:21 PAGE 3   

 118   1        _nop_();
 119   1        _nop_(); /*时钟低电平周期大于4μs*/ 
 120   1        _nop_(); 
 121   1        _nop_(); 
 122   1        _nop_(); 
 123   1        MCO=0; /*清时钟线,钳住I2C总线以便继续接收*/ 
 124   1        _nop_(); 
 125   1        _nop_(); 
 126   1      }
 127          
 128          void wrbyt(uchar shu)
 129          {
 130   1        uchar i;
 131   1        ack=0;
 132   1        MDE=1;                        //        SETB    MDE           ; to enable SDATA pin as an output      
 133   1        MCO=0;
 134   1        for(i=0;i<8;i++)
 135   1        {
 136   2          if(shu&0x80)
 137   2          {
 138   3            MDO=1;
 139   3            _nop_();
 140   3            MCO=1;
 141   3            _nop_();    
 142   3            _nop_();
 143   3            _nop_();
 144   3            MCO=0;
 145   3            //MDO=0;
 146   3          }
 147   2          else
 148   2          {
 149   3            MDO=0;
 150   3            _nop_();
 151   3            MCO=1;
 152   3            _nop_();
 153   3            _nop_();
 154   3            _nop_();
 155   3            MCO=0;
 156   3          }
 157   2        shu=shu<<1;
 158   2        }
 159   1        MDO=1;
 160   1        MDE=0;                        //      CLR     MDE             ; release data line for acknowledge
 161   1        MCO=1;                        //      SETB    MCO             ; send clock for acknowledge
 162   1        Delay_Cycles(3);
 163   1        MCO=0;
 164   1      }
 165          
 166          //void SendByte_Upon_I2C(unsigned char byte)
 167          //{
 168          //      unsigned char send_bitdata;
 169          //  unsigned char send_bytedata=byte;
 170          //  uchar BITCNT=8;             //        MOV     BITCNT,#8     ; 8 bits in a byte
 171          //  MDE=1;                      //        SETB    MDE           ; to enable SDATA pin as an output      
 172          //  MCO=0;                      //        CLR     MCO           ; make sure that the clock line is low
 173          //  Delay_Cycles(5);
 174          //  while(BITCNT--)
 175          //      {
 176          //        if(send_bytedata&0x80)send_bitdata=1;
 177          //              else send_bitdata=0;
 178          //        MDO=send_bitdata;             //      MOV     MDO,C           ; put data bit on SDATA line
 179          //        MCO=1;                //      SETB    MCO             ; clock to send bit
C51 COMPILER V8.08   8574KEYBOARD                                                          03/31/2009 16:43:21 PAGE 4   

 180          //        Delay_Cycles(1);
 181          //        Delay_Cycles(5);
 182          //        MCO=0;                //      CLR     MCO             ; clear clock 
 183          //        send_bytedata<<=1;
 184          //      }               //              DJNZ    BITCNT,SENDBIT  ; jump back and send all eight bits
 185          //  MDE=0;                      //      CLR     MDE             ; release data line for acknowledge
 186          //  MCO=1;                      //      SETB    MCO             ; send clock for acknowledge
 187          //  Delay_Cycles(3);
 188          //  MCO=0;                      //NEXT: CLR     MCO             ; clear clock 
 189          //  return;                     //      RET
 190          //}
 191          
 192          uchar RcvByte() 
 193          { 
 194   1      uchar retc; 
 195   1      uchar BitCnt; 
 196   1      
 197   1      retc=0; 
 198   1      MDE=0; /*置数据线为输入方式*/ 
 199   1      for(BitCnt=0;BitCnt<8;BitCnt++) 
 200   1      { 
 201   2      _nop_(); 
 202   2      MCO=0; /*置时钟线为低,准备接收数据位*/ 
 203   2      _nop_(); 
 204   2      _nop_(); /*时钟低电平周期大于4.7μs*/ 
 205   2      _nop_(); 
 206   2      _nop_(); 
 207   2      _nop_(); 
 208   2      MCO=1; /*置时钟线为高使数据线上数据有效*/ 
 209   2      _nop_(); 
 210   2      _nop_(); 
 211   2      retc=retc<<1; 
 212   2      if(MDI==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */ 
 213   2      _nop_(); 
 214   2      _nop_(); 
 215   2      } 
 216   1      MCO=0; 
 217   1      _nop_(); 
 218   1      _nop_(); 
 219   1      return(retc); 
 220   1      } 
 221          
 222          /*---------------------------------------------------------------------------------------------------
 223          名称:STOP
 224          描述:停止I2C 总线子程序--发送I2C 总线停止条件
 225          ---------------------------------------------------------------------------------------------------*/
 226          void stop(void)
 227          {
 228   1                   MDE=1;
 229   1             MDO=0;
 230   1             _nop_();
 231   1             MCO=1;
 232   1             _nop_();
 233   1             _nop_();
 234   1             _nop_();
 235   1             _nop_();
 236   1             _nop_();
 237   1             MDO=1;
 238   1             _nop_();
 239   1             _nop_();
 240   1             _nop_();
 241   1      }
C51 COMPILER V8.08   8574KEYBOARD                                                          03/31/2009 16:43:21 PAGE 5   

 242          void checkack(void)
 243          {
 244   1      //  MDO=1; /*8位发送完后释放数据线,准备接收应答位*/ 
 245   1      //  MDE=0;
 246   1      //  _nop_(); 
 247   1      //  _nop_(); 
 248   1      //  MCO=1; 

⌨️ 快捷键说明

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