找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4483|回复: 4
打印 上一主题 下一主题
收起左侧

at89c51 3x3矩阵键盘实现led显示按键1-9 哪里错了

[复制链接]
跳转到指定楼层
楼主
ID:189690 发表于 2017-4-17 12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 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);//显示
                        }
                }
        }

调用显示函数的语句放在这儿不对。如果没有键按下就不会显示。
回复

使用道具 举报

板凳
ID:149451 发表于 2017-4-17 19:47 | 只看该作者
单片机的应用记住:P0口需加上拉电阻。你把它加上试试,有惊喜哟!!!!你的程序仿真了,没错的,可以正常显示。
回复

使用道具 举报

地板
ID:190593 发表于 2017-4-17 20:25 | 只看该作者
51单片机P0口要接1k或者10k的上拉
回复

使用道具 举报

5#
ID:189690 发表于 2017-4-18 18:47 | 只看该作者
确实是没加电阻的问题 10k电阻还是显示不了 470Ω就可以了  此贴完结 谢谢大家
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表