请个位高手帮帮忙,我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();
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
-----------------------------------------------------------------------
大侠,请问164和165应该怎样可以实现标准键盘呢。。 好急啊,求指点
一周热门 更多>