标题: 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

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