shanjianfei 发表于 2010-12-9 14:58:19

51单片机通过74hc165扩展IO口

网上的程序ourdev_603541AYHA3M.rar(文件大小:47K) (原文件名:water.rar)
我从上网找的这个程序,他说可以使用,但是为什么到我硬件上就不能用啦!大家帮忙看看!!

shanjianfei 发表于 2010-12-9 14:59:07

#include <reg52.h>
#include <intrins.h>
//下面是引脚的连接以及相关必要的宏定义
sbit io_74hc165_SH_LD = P1^0 ;
sbit io_74hc165_CLK   = P1^1 ;
sbit io_74hc165_SDA   = P1^2 ;
sbit dat=P3^0;//显示
sbit clk=P3^1;//显示


#define MAX_NUM_74HC165   2
#define NOKEY            0x00
#define KEY_WAIT                  0   
#define KEY_PRESS               1
#define KEY_CONFIRM             2
#define KEY_WAIT_REALSE          3

#define uint8          unsigned int
#define uchar          unsigned char

uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x79,0x6d,0x7F,0x7c,0x71,0x39,0x77,0x1c,0x5e,0x73,0x76,0x40};
//                  0   1'   2'    3    E   5,   8,   b,   f,   c,   a,   u    d    p,   H,   -


//165部分
static u8_Read74hc165_f( void )
{
    uint8 i, j;
    uint8 KeyAddress[ MAX_NUM_74HC165 ] ;
    uint8 ReadReturn ;
   io_74hc165_SH_LD = 0 ;            //锁存并行数据开始
   io_74hc165_SDA = 1 ;          //准备读串行数据(也起到延时作用)
   io_74hc165_SH_LD = 1 ;          //锁存并行数据结束
   for( j = 0 ; j < MAX_NUM_74HC165 ; j++ )
   {   
         for( i = 8 ; i >= 1 ; i-- )
         {         
             io_74hc165_CLK = 0 ;                      //时钟拉低                        
            if( io_74hc165_SDA == 0 )break ;      //有键按下,数据为1
            io_74hc165_CLK = 1 ;                     //时钟拉高   
         }
         KeyAddress[ j ] = i ;      //有键压下,则i的取值在1~8之间,无键压下,i = 0
   }
   for( j = 0 ; j < MAX_NUM_74HC165 ; j++ )
   {
         if( KeyAddress[ j ] == 0 ) ReadReturn = 0x00 ;
      else
      {
            ReadReturn = KeyAddress[ j ] + j * 8 ;
            break ;
      }
   }
    return ReadReturn ;

}

//下面的这个函数就是读键盘的函数了。
uint8 u8_ReadKeyboard74hc165_f( void )
{
    static uint8 KeyState = KEY_WAIT ;
    uint8 KeyTemp = NOKEY, KeyValue = NOKEY ;
    KeyTemp = u8_Read74hc165_f() ;

    switch( KeyState )
    {
      case KEY_WAIT :   if( KeyTemp == NOKEY ) KeyState = KEY_WAIT ;
                            elseKeyState = KEY_PRESS ; break ;

      case KEY_PRESS :   if( KeyTemp == NOKEY ) KeyState = KEY_WAIT ;
                            else KeyState = KEY_CONFIRM ; break ;

      case KEY_CONFIRM :   if( KeyTemp == NOKEY ) KeyState = KEY_WAIT ;
                            else                  
                            {   
                                    KeyState = KEY_WAIT_REALSE ;
                                    KeyValue = KeyTemp ;         
                            } break ;
                                             case KEY_WAIT_REALSE :if( KeyTemp != NOKEY ) KeyState = KEY_WAIT_REALSE ;
                            else                  
                            {
                                    KeyState = KEY_WAIT ;   
                            }break ;   
      default : break ;
    }
    return KeyValue ;
}
//164部分
void sendbyte(uchar byte)
{uchar num,i;
num=tab;
for(i=0;i<8;i++)
{dat=num&0x80;
num=num<<1;
clk=0;
clk=1;
}
}
main()
{int i;
while(1)
{sendbyte(u8_ReadKeyboard74hc165_f());
sendbyte(u8_ReadKeyboard74hc165_f());
for(i=0;i<5000;i++)
{//for(j=0;j<50;j++);
}
}}

这个程序我也试过,也一样不行,大虾给我点意见啊!

cdust 发表于 2010-12-9 21:20:57

顶,看看程序还不错啊

cdust 发表于 2010-12-9 21:39:24

好像是仿真不出,查不到原因!

pangfen 发表于 2010-12-9 22:40:24

路过!

liujingbin 发表于 2012-11-9 08:54:22

{:2_26:}看看先
页: [1]
查看完整版本: 51单片机通过74hc165扩展IO口