标题:
at89c51 3x3矩阵键盘实现led显示按键1-9 哪里错了
[打印本页]
作者:
超级大乐透
时间:
2017-4-17 12:54
标题:
at89c51 3x3矩阵键盘实现led显示按键1-9 哪里错了
#include<reg51.h>
#define key P0//定义按键端口
#define uchar unsigned char
sbit line0=P0^0;//定义行线
sbit line1=P0^1;
sbit line2=P0^2;
char led[]={0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//定义led显示字行码
char scancode2[]={0xef,0xdf};
bit iskey()//判断是否有按键闭合
{
key=0x07;//低三位为1,高三位为0
if((key&0x07)==0x07)//屏蔽高三位(列线),只检测低三位(行线)
return 0;//没有按键闭合
else
return 1;//有按键闭合
}
uchar key_identify()//识别建号
{
uchar linecode=0,i,rowcode=0,scancode=0xf7;//初始化扫描码,第一列为0,其他为1
for(i=0;i<3;i++)//扫描三列
{
key=scancode;//输出扫描码,扫描各列
if((key&0x07)==0x07)//屏蔽高三位(列线),只检测低三位(行线)
{
rowcode++;//无按键闭合
scancode=scancode2[rowcode-1];//输出0的列线每次左移一位
}
else//已确定列号,再确定行号
{
if(line0==0)linecode=0;
if(line1==0)linecode=3;
if(line2==0)linecode=6;
break;
}
}
return (linecode+rowcode);//输出键号
}
void wait_key_release()//等按键松开
{
while(1)
{
key=0x07;//低三位为1,高三位为0
if((key&0x07)==0x07)break;//读行线状态,如果为高电平,则没有按键闭合,键盘松开
}
}
void display(uchar n)//led显示数字
{
P1=led[n];
P0=0xff;
}
int main(void)
{
uchar keycode;//保存键号
unsigned int i;
while(1)
{
while(!iskey());//如果没有按键按下,等待
for(i=0;i<500;i++);//消抖
if(iskey())//检测是否有按键
{
keycode=key_identify();//识别键号
wait_key_release();//等待按键松开
display(keycode);//显示
}
}
}
仿真时P0.0 P0.1 P0.2电平是灰的 按键没反应 详情见附件
矩阵键盘led显示.rar
2017-4-17 12:46 上传
点击文件名下载附件
19.08 KB, 下载次数: 53
作者:
ahshmj
时间:
2017-4-17 19:26
int main(void)
{
uchar keycode;//保存键号
unsigned int i;
while(1)
{
while(!iskey());//如果没有按键按下,等待
for(i=0;i<500;i++);//消抖
if(iskey())//检测是否有按键
{
keycode=key_identify();//识别键号
wait_key_release();//等待按键松开
display(keycode);//显示
}
}
}
调用显示函数的语句放在这儿不对。如果没有键按下就不会显示。
作者:
w1179benp
时间:
2017-4-17 19:47
单片机的应用记住:P0口需加上拉电阻。你把它加上试试,有惊喜哟!!!!你的程序仿真了,没错的,可以正常显示。
作者:
HxFor51
时间:
2017-4-17 20:25
51单片机P0口要接1k或者10k的上拉
作者:
超级大乐透
时间:
2017-4-18 18:47
确实是没加电阻的问题 10k电阻还是显示不了 470Ω就可以了 此贴完结 谢谢大家
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1