大家帮我看一下这个程序,哪里有问题,怎么才能实现,和麻烦帮我修改一下。
大家帮我看一下这个程序,哪里有问题,怎么才能实现,和麻烦帮我修改一下。#include<msp430f5529.h>#defineucharunsignedchar#de...
大家帮我看一下这个程序,哪里有问题,怎么才能实现,和麻烦帮我修改一下。
#include<msp430f5529.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void key_scan()
{
uchar temp=0xfe;
P4DIR |=0xfe;
P4OUT =0xfe;
if((P4IN & 0xf0)!=0xf0)
{
delay(10);
if((P4IN & 0xf0)!=0xf0)
{
temp=temp & P4IN;
switch(temp)
{
case 0xee:P1OUT=0x01;break;
case 0xde:P1OUT=0x00;break;
case 0xbe:P1OUT=0x01;break;
case 0x7e:P1OUT=0x00;break;
}
}
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |=0x01;
P1OUT =0;
while(1)
{
key_scan();
}
} 展开
#include<msp430f5529.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
void key_scan()
{
uchar temp=0xfe;
P4DIR |=0xfe;
P4OUT =0xfe;
if((P4IN & 0xf0)!=0xf0)
{
delay(10);
if((P4IN & 0xf0)!=0xf0)
{
temp=temp & P4IN;
switch(temp)
{
case 0xee:P1OUT=0x01;break;
case 0xde:P1OUT=0x00;break;
case 0xbe:P1OUT=0x01;break;
case 0x7e:P1OUT=0x00;break;
}
}
}
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |=0x01;
P1OUT =0;
while(1)
{
key_scan();
}
} 展开
2个回答
展开全部
你的程序是循环运行
key_scan();此程序中:
P1.0输出状态显示时间在delay(10);句。而此句前P4OUT =0xfe;将P1.0变成了0.即使按键按下(P4IN & 0xf0)!=0xf0)时仍能再运行key_scan()-P4OUT =0xfe;,这样P1.0始终为0.应将
if ((P4IN & 0xf0)!=0xf0)改为while ((P4IN & 0xf0)!=0xf0),另外P4IN低四位始终被读取,总是e不变吗?好象与程序运行无关
temp=temp & P4IN; temp后四位 总是e吗?
按下面改改看:
void key_scan()
{
uchar temp=0xfe;
P4DIR |=0xfe;
P4OUT =0xfe;
if((P4IN & 0xf0)!=0xf0)
{
delay(10);
while ((P4IN & 0xf0)!=0xf0) //这句
{
temp=P4IN&0xf0 //这句
switch(temp)
{
case 0xe0P1OUT=0x01;break;
case 0xd0P1OUT=0x00;break;
case 0xb0P1OUT=0x01;break;
case 0x70P1OUT=0x00;break;
default:break;
}
}
}
}
key_scan();此程序中:
P1.0输出状态显示时间在delay(10);句。而此句前P4OUT =0xfe;将P1.0变成了0.即使按键按下(P4IN & 0xf0)!=0xf0)时仍能再运行key_scan()-P4OUT =0xfe;,这样P1.0始终为0.应将
if ((P4IN & 0xf0)!=0xf0)改为while ((P4IN & 0xf0)!=0xf0),另外P4IN低四位始终被读取,总是e不变吗?好象与程序运行无关
temp=temp & P4IN; temp后四位 总是e吗?
按下面改改看:
void key_scan()
{
uchar temp=0xfe;
P4DIR |=0xfe;
P4OUT =0xfe;
if((P4IN & 0xf0)!=0xf0)
{
delay(10);
while ((P4IN & 0xf0)!=0xf0) //这句
{
temp=P4IN&0xf0 //这句
switch(temp)
{
case 0xe0P1OUT=0x01;break;
case 0xd0P1OUT=0x00;break;
case 0xb0P1OUT=0x01;break;
case 0x70P1OUT=0x00;break;
default:break;
}
}
}
}
追答
R1~R4,C1~C4是接P4口吗?那R1~R4平时是悬空什么也不接,定成输入时电平不稳定,肯定不行。R1~R4都是设成输出,读输入时要把它屏蔽掉。
将R1-R4改接至S4\S8\S12\S16对应脚,S1~S16读取键码可对应1~16.程序如下:
void key_scan()
{
uchar key_code=0;//定义键码没键按下为0.
uchar temp,temp1;
uchar i,j;
P4DIR =0xf;
P4OUT=0x0f;
if((P4IN & 0xf0)!=0xf0)
{
delay(10);
if ((P4IN & 0xf0)!=0xf0)
{
temp=P4IN&0xf0 ;
temp1=0x01;
for(i=0;i>1;
}
temp1=temp1>>1;
}
}
}
没有验证,就是这个路子。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询