4258|9

473

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

51键盘扫描问题 [复制链接]

我的学习板上是3*3的键盘,数码管位选是直接接P2口的,我的目的是按几数码管就显几,不按的时候就不显,但现在发现我按几是显示了几,但不按的时候数码管还是有显示
程序如下,看看问题出在哪,有位高手说要用定时动态扫描,能不能具体说下
#include
#define uint unsigned int
#define uchar unsigned char
sbit dig1=P2^0 ;
sbit dig2=P2^1 ;
sbit dig3=P2^2 ;
sbit dig4=P2^3        ;
uchar temp,num,a;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
void display(uchar );
void delay(uint z);
void main()
{               
        while(1)
        {       
                display( num);
                P3=0xfb;
            temp=P3;
                temp=temp&0xe3;
                if(temp!=0xe3)
                        {
                                delay(5);
                                P3=0xfb;
                        temp=P3;
                        temp=temp&0xe3;
                            if(temp!=0xe3)
                                        {
                                                switch(temp)
                                                {
                                                        case 0xc3:num=1;break;;
                                                        case 0xa3:num=2;break;         
                                                        case 0x63:num=3;break;
                                                }                                  
                                        }
       
                                }
                P3=0xf7;
                temp=P3;
                temp=temp&0xe3;
                if(temp!=0xe3)
                        {
                                delay(5);
                                P3=0xf7;
                            temp=P3;
                            temp=temp&0xe3;
                                    if(temp!=0xe3)
                                                {
                                                        switch(temp)
                                                        {
                                                                case 0xc3:num=4;break;;
                                                                case 0xa3:num=5;break;         
                                                                case 0x63:num=6;break;
                                                        }
                                                }
                                }
                P3=0xef;
                temp=P3;
                temp=temp&0xe3;
                if(temp!=0xe3)
                        {
                                delay(5);
                                P3=0xef;
                            temp=P3;
                            temp=temp&0xe3;
                                    if(temp!=0xe3)
                                                {
                                                        switch(temp)
                                                        {
                                                                case 0xc3:num=7;break;
                                                                case 0xa3:num=8;break;         
                                                                case 0x63:num=9;break;
                                                        }
                                                }
       
                        }               
        }
}
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
此帖出自51单片机论坛

最新回复

不懂,顶一下  详情 回复 发表于 2011-1-5 22:15
点赞 关注
 

回复
举报

473

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
我知道问题在就于怎么检测松手是数码管不显,具体程序怎么改呢
此帖出自51单片机论坛
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
按住键的时候要让数码管有显示,而不按键则不显示。
如果加一个while(temp!=)语句等待松键来判别松开时,就让数码管不显示的话,那么按住键的时候程序会一直执行while语句,而不会执行显示程序,因此那位高手会说要用定时中断进行扫描,这样两者可以兼具了。
解决的办法有两个:
1:利用定时中断判断是否松键,然后主程序还是一直执行动态显示
2:与1相反,用定时器来动态显示,主程序来判别是否松键

最后需要解决的就是时间搭配问题,怎样选一个合适的定时中断时间
此帖出自51单片机论坛
 
个人签名小草眼中的世界!
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

4
 

能不能在我的程序上写下,我自己分析下,我实现不知道您说的加定时怎么加,谢谢了,拜托了

此帖出自51单片机论坛
 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

5
 
再次拜托下,我试了几个晚上了都不行
此帖出自51单片机论坛
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(初级)

6
 
//定时器中断函数初始化
void timer_init()
{
        nn=0;
        TMOD=0x11;
        TH0=(65535-100)/256;
        TL0=(65535-100)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
在你的主函数中修改如下,每个都加
if(temp!=0xe3)
{
switch(temp)
{
case 0xc3:num=1;break;
case 0xa3:num=2;break;
case 0x63:num=3;break;
}
  songflag=1;
}

if(songflag==2)
{
        num=x(此值自己设定,并让其对应的数码管段值为0xff,就是让其不显示)
}

//中断服务程序
void time0() interrupt 1
{
        TH0=(65535-100)/256;
        TL0=(65535-100)%256;
        nn++;
   if(nn==20)
{
nn=0;
if(songflag==1)
{
   if(temp==0xe3)//判断是否松键
    songflag=2; //松键则不显示
           
}
}
}

你如果知道定时器中断的话,上面的程序你应该知道怎么放。
我没有试验我写的程序,好久了,忘了些。
此帖出自51单片机论坛
 
个人签名小草眼中的世界!
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

7
 
TH0和TL0的初值设置,只要时间超个整个程序执行的时间就行了吧
此帖出自51单片机论坛
 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

8
 
非常感谢inintrovert
您提醒了我一点,其它不用中断定时,只要在程序的开头写入NUM值等于数码管不亮也就是0XFF就可以了,不过您让我好好的学习了定时器,谢谢了
此帖出自51单片机论坛
 
 
 

回复

126

帖子

0

TA的资源

一粒金砂(中级)

9
 
不懂,顶一下
此帖出自51单片机论坛
 
 
 

回复

473

帖子

0

TA的资源

纯净的硅(高级)

10
 
问题又有新的出现,我按inintrovert的方法好像不太行,按键还是有显示,另外如果我按快一点有时候会出现显示乱的东西
求帮助
另外感谢论坛里的朋友,让我学起来更快
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表