打印

120急救,有新问题!!这个矩阵按键和显示一直困扰着我,

[复制链接]
1499|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tyb520|  楼主 | 2010-10-10 20:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********各位大虾为什么显示出了毛病,首先P1口接数码管的数据口,P0接矩阵键盘
   以下程序显示可以,但是大家看看没有松手检测,所以就容易误判,但是加了
   松手检测部分也有问题了,按下去时候未松开此时显示就出故障了,请各位分析下*/
#include<reg52.h>
//#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uchar);/****延时声明******/
void display(uchar dat);/***显示声明*****/
void keyscan(); /******键盘扫描声明****/
sbit LS138A=P2^2; /*****led的位选******/
sbit LS138B=P2^3; /*****led的位选******/
sbit LS138C=P2^4;  /*****led的位选******/
void keydown(void);
uchar code dis[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,   
                     0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x86,0xc7,0xff};
         
uchar temp,num,wel[2],key,disbuf;
void main()
{
  
  while(1)
  {
    P0=0xFF;
    keydown();
    display(disbuf);
  }
}
void delayms(uchar ms)
{
  uchar i;
  while(ms--)
   for(i=0;i<125;i++);
}
void keydown(void) //*****判断是否有键按下*****
{
P0=0xF0;
if(P0!=0xF0)
  {
    keyscan();
  //while(P0=0xf0);  //松手检测部分,要了这个就显示出问题了
  }
}
void keyscan()     //****键盘扫描***
{
temp = 0;
    P0=0xF0;                 //高四位输入   行为高电平  列为低电平
    delayms(1);
temp=P0;                 //读P1口
    temp=temp&0xF0;    //屏蔽低四位
    temp=~((temp>>4)|0xF0);   
    if(temp==1)   // p1.4 被拉低
        key=0;
    else if(temp==2)   // p1.5 被拉低
        key=1;
    else if(temp==4)   // p1.6 被拉低
        key=2;
    else if(temp==8)   // p1.7 被拉低
         key=3;
    else
        key=16;
        
    P0=0x0F;                //低四位输入  列为高电平 行为低电平
    delayms(1);
temp=P0;                //读P1口      
    temp=temp&0x0F;
    temp=~(temp|0xF0);
    if(temp==2)     // p1.1  被拉低
        key=key+0;
    else if(temp==4)   // p1.2  被拉低
        key=key+4;
    else if(temp==8) // p1.3  被拉低
        key=key+8;
    else
        key=16;  
disbuf=key;
}
void display(uchar dat)
{
    uchar j;
    wel[0]=dis[dat/10];
wel[1]=dis[dat%10];
for(j=0;j<2;j++)
{
  P1=wel[j];//****数据口****
  switch(j)
  {
         case 0:LS138A=0; LS138B=0; LS138C=0; break;         
         case 1:LS138A=1; LS138B=0; LS138C=0; break;              
  }
delayms(1);
}
}

相关帖子

沙发
tyb520|  楼主 | 2010-10-10 20:53 | 只看该作者
case 0: LS138A=0; LS138B=0; LS138C=0; break;         
        case 1: LS138A=1; LS138B=0; LS138C=0; break;

使用特权

评论回复
板凳
免证入网| | 2010-10-10 21:27 | 只看该作者
有什么好分析的,脑子好好跟踪程序怎么运行的吧。显示完了不关位选信号。自然出现两管同内容情况。如果没猜错,就是显示88。对不?

使用特权

评论回复
地板
免证入网| | 2010-10-10 21:30 | 只看该作者
好好看看动态扫描。

使用特权

评论回复
5
tyb520|  楼主 | 2010-10-11 11:44 | 只看该作者
不是,直接动不了了,前面不显示,后面显示0

使用特权

评论回复
6
免证入网| | 2010-10-11 15:47 | 只看该作者
好好看看动态扫描原理。前面那句低位数码管没开,第二句开了高位。自然只有高位数码管显示。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:脚踏实地的做人,脚踏实地的做事……

7

主题

276

帖子

1

粉丝