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

2020-02-02 09:27发布

网上的程序ourdev_603541AYHA3M.rar(文件大小:47K) (原文件名:water.rar)
我从上网找的这个程序,他说可以使用,但是为什么到我硬件上就不能用啦!大家帮忙看看!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
shanjianfei
2020-02-02 10:05
#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 ;
                            else  KeyState = 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[byte];
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++);
}
}}

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

一周热门 更多>