搜索
bottom↓
回复: 17

74LS164 键盘 C程序

[复制链接]

出0入0汤圆

发表于 2008-3-15 17:11:04 | 显示全部楼层 |阅读模式
请个位高手帮帮忙,我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();
  }         
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-3-15 18:10:51 | 显示全部楼层
没有明白LZ的意思

出0入10汤圆

发表于 2008-3-15 23:07:47 | 显示全部楼层
是啊,164不是输出的么

出0入0汤圆

发表于 2008-3-21 19:19:31 | 显示全部楼层
165

出0入0汤圆

发表于 2008-3-22 08:52:03 | 显示全部楼层
164输出,165输入,不知你的原理图如何?

出0入0汤圆

发表于 2008-3-22 12:13:19 | 显示全部楼层
有点乱

出0入0汤圆

发表于 2008-3-24 09:26:18 | 显示全部楼层
请把你的原理图也发上来,给你看看那里的问题.

出0入0汤圆

发表于 2011-4-28 03:04:24 | 显示全部楼层
回复【6楼】lizq
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-4-28 03:05:17 | 显示全部楼层
回复【4楼】dangzuo
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-5-2 12:35:12 | 显示全部楼层
不明白用途,请把你的原理图也发上来

出0入0汤圆

发表于 2011-5-5 15:05:22 | 显示全部楼层
你是不是在164输出特定的数,同时按键被按下来确定是哪个按键按下。

出0入0汤圆

发表于 2012-9-21 13:49:29 | 显示全部楼层
多谢楼主的74LS165程序,我学校的板子也是六个按键连接74LS165的一直找不到程序。
您的程序很OK,不过我没有矩阵键盘

出0入0汤圆

发表于 2012-9-27 16:28:00 | 显示全部楼层
这程序是亮LED的,我把它结合到数码管动态扫描(定时器扫描)就挂了,键盘完全失效了

出0入0汤圆

发表于 2013-4-30 20:18:45 | 显示全部楼层
很不错!!!

出0入0汤圆

发表于 2013-8-28 14:26:06 | 显示全部楼层
纠结了我的按键也出问题了 我草

出0入0汤圆

发表于 2013-8-28 14:39:35 | 显示全部楼层
用164来做矩阵键盘的行或列所扫描?那LZ的矩阵键盘阵势估计不小啊

出0入0汤圆

发表于 2013-8-28 15:18:33 | 显示全部楼层
楼主你弄出来了没 ,好纠结啊,我的按键出问题了

出0入0汤圆

发表于 2013-9-1 10:30:38 | 显示全部楼层
真希望看到你的原理图
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表