74LS164 键盘 C程序

2020-01-27 11:22发布

请个位高手帮帮忙,我74LS164 控制八个按键时是可以完成的程序如下。
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>                //绝对地址访问
#include <string.h>                //字符串处理
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;



sbit p10=P1^0;//控制LED
sbit p11=P1^1;//控制LED
sbit p12=P1^2;//控制LED
sbit p13=P1^3;//控制LED
#define uchar unsigned char
#define uint unsigned int

sbit K_SCAN=P2^7; //键扫描数据输入
sbit simuseri_CLK=P2^1;           //用P1^6模拟串口时钟
sbit simuseri_DATA=P2^0;          //用P1^5模拟串口数据
uint key_value;
void delayms(unsigned int count)
{
   unsigned int i,j;
   for(i=0;i<count;i++)
   for(j=0;j<100;j++);//90
  
}  

void HC164_Send(uchar buf)
{
uchar tmp;
simuseri_CLK=1;
for(tmp=0;tmp<8;tmp++)
{
  if(buf&0x80)
  simuseri_DATA=1;
  else simuseri_DATA=0;
  simuseri_CLK=0,_nop_(),simuseri_CLK=1;//产生上升沿
  buf<<=1;
}
}
void KEY_SCAN(void)
        {       
          
          HC164_Send(0xfe);
                if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=1;
                                        //return 1;
                                }
               
                }
                HC164_Send(0xfd);
        if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=2;
                                        //return 1;
                                }
               
                }
    HC164_Send(0xfb);
        if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=3;
                                        //return 1;
                                }
               
                }
HC164_Send(0xf7);
        if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=4;
                                        //return 1;
                                }
               
                }
HC164_Send(0xef);
                if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=5;
                                        //return 6;
                                }
               
                }
HC164_Send(0xdf);
        if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=6;
                               
                                }
               
                }
HC164_Send(0xbf);
        if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=7;
                                       
                                }
               
                }
HC164_Send(0x7f);
                if(K_SCAN==0)
                {
                        delayms(10);
                        if(K_SCAN==0)
                                {
                             key_value=8;
                                        //return 1;
                                }
               
                }
}
void xianshi(void)
{
   
   if(key_value==4)
    { p10=0;p11=1;p12=1;p13=1; }
          if(key_value==5)
      {p10=1;p11=0;p12=1;p13=1;}
          if(key_value==6)
      {p10=1;p11=1;p12=0;p13=1;}
    if(key_value==7)
         {p10=1;p11=1;p12=1;p13=0;}
          
}
main()
{   
         
  while(1)
  {
    KEY_SCAN();
    xianshi();
  }         
}          

但是控制16个键盘时为什么只有八个有效,其它八个没有用,程序上出问题了求高手帮忙。程序如下
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>                //绝对地址访问
#include <string.h>                //字符串处理
typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;



sbit p10=P1^0;//控制LED
sbit p11=P1^1;//控制LED
sbit p12=P1^2;//控制LED
sbit p13=P1^3;//控制LED
#define uchar unsigned char
#define uint unsigned int

sbit K_SCAN1=P2^6; //键扫描数据输入
sbit K_SCAN2=P2^7; //键扫描数据输入
sbit simuseri_CLK=P2^1;           //用P1^6模拟串口时钟
sbit simuseri_DATA=P2^0;          //用P1^5模拟串口数据
uint key_value;
void delayms(unsigned int count)
{
   unsigned int i,j;
   for(i=0;i<count;i++)
   for(j=0;j<100;j++);//90
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
}  

void HC164_Send(uchar buf)
{
uchar tmp;
simuseri_CLK=1;
for(tmp=0;tmp<8;tmp++)
{
  if(buf&0x80)
  simuseri_DATA=1;
  else simuseri_DATA=0;
  simuseri_CLK=0,_nop_(),simuseri_CLK=1;//产生上升沿
  buf<<=1;
}
}
void KEY_SCAN(void)
        {       
          
          HC164_Send(0xfe);
                if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=1;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=9;}
                               
                                }
               
                }
                HC164_Send(0xfd);
                        if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=2;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=10;}
                       
                                }
               
                }
    HC164_Send(0xfb);
                                if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=3;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=11;}
                       
                                }
               
                }
HC164_Send(0xf7);
                        if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=4;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=12;}
                               
                                }
               
                }
   HC164_Send(0xef);
                        if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=5;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=13;}
                       
                                }
               
                }
   HC164_Send(0xdf);
                        if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=6;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=14;}
                       
                                }
               
                }
   HC164_Send(0xbf);
                                if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=7;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=15;}
               
                                }
               
                }
   HC164_Send(0x7f);
                if(K_SCAN1&&K_SCAN2==0)
                {
                        delayms(10);
                        if(K_SCAN1&&K_SCAN2==0)
                                {
                             if(K_SCAN1==0,K_SCAN2==1)
                    { key_value=8;}
                 if(K_SCAN1==1,K_SCAN2==0)
                    { key_value=16;}
                       
                                }
               
                }
                }
void xianshi(void)
{
   
   if(key_value==4)
    { p10=0;p11=1;p12=1;p13=1; }
          if(key_value==13)
      {p10=1;p11=0;p12=1;p13=1;}
          if(key_value==5)
      {p10=1;p11=1;p12=0;p13=1;}
    if(key_value==14)
         {p10=1;p11=1;p12=1;p13=0;}
          
}
main()
{   
         
  while(1)
  {
    KEY_SCAN();
    xianshi();
  }         
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。