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();
}
} 没有明白LZ的意思 是啊,164不是输出的么 165 164输出,165输入,不知你的原理图如何? 有点乱 请把你的原理图也发上来,给你看看那里的问题. 回复【6楼】lizq
-----------------------------------------------------------------------
大侠,请问164和165应该怎样可以实现标准键盘呢。。 回复【4楼】dangzuo
-----------------------------------------------------------------------
大侠,请问164和165应该怎样可以实现标准键盘呢。。 好急啊,求指点 不明白用途,请把你的原理图也发上来 你是不是在164输出特定的数,同时按键被按下来确定是哪个按键按下。 多谢楼主的74LS165程序,我学校的板子也是六个按键连接74LS165的一直找不到程序。
您的程序很OK,不过我没有矩阵键盘
这程序是亮LED的,我把它结合到数码管动态扫描(定时器扫描)就挂了,键盘完全失效了 很不错!!! 纠结了我的按键也出问题了 我草 用164来做矩阵键盘的行或列所扫描?那LZ的矩阵键盘阵势估计不小啊 楼主你弄出来了没 ,好纠结啊,我的按键出问题了 真希望看到你的原理图
页:
[1]