shuilideniao 发表于 2008-3-15 17:11:04

74LS164 键盘 C程序

请个位高手帮帮忙,我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();
}       
}

hhrfjz 发表于 2008-3-15 18:10:51

没有明白LZ的意思

ylei12 发表于 2008-3-15 23:07:47

是啊,164不是输出的么

chen_05 发表于 2008-3-21 19:19:31

165

dangzuo 发表于 2008-3-22 08:52:03

164输出,165输入,不知你的原理图如何?

weiwgml 发表于 2008-3-22 12:13:19

有点乱

lizq 发表于 2008-3-24 09:26:18

请把你的原理图也发上来,给你看看那里的问题.

nuga 发表于 2011-4-28 03:04:24

回复【6楼】lizq
-----------------------------------------------------------------------

大侠,请问164和165应该怎样可以实现标准键盘呢。。

nuga 发表于 2011-4-28 03:05:17

回复【4楼】dangzuo
-----------------------------------------------------------------------

大侠,请问164和165应该怎样可以实现标准键盘呢。。 好急啊,求指点

hu7215 发表于 2011-5-2 12:35:12

不明白用途,请把你的原理图也发上来

wangjian6655 发表于 2011-5-5 15:05:22

你是不是在164输出特定的数,同时按键被按下来确定是哪个按键按下。

xts 发表于 2012-9-21 13:49:29

多谢楼主的74LS165程序,我学校的板子也是六个按键连接74LS165的一直找不到程序。
您的程序很OK,不过我没有矩阵键盘

xts 发表于 2012-9-27 16:28:00

这程序是亮LED的,我把它结合到数码管动态扫描(定时器扫描)就挂了,键盘完全失效了

HBBMAKEIT 发表于 2013-4-30 20:18:45

很不错!!!

a20084666 发表于 2013-8-28 14:26:06

纠结了我的按键也出问题了 我草

大米饭 发表于 2013-8-28 14:39:35

用164来做矩阵键盘的行或列所扫描?那LZ的矩阵键盘阵势估计不小啊

a20084666 发表于 2013-8-28 15:18:33

楼主你弄出来了没 ,好纠结啊,我的按键出问题了

LML0406 发表于 2013-9-1 10:30:38

真希望看到你的原理图
页: [1]
查看完整版本: 74LS164 键盘 C程序