标题: 新手想用矩阵键盘 实现一个显示4位数 以后好做计算器 但是有些问题 希望有大神来帮忙 [打印本页]

作者: ssss4416    时间: 2017-2-2 20:36
标题: 新手想用矩阵键盘 实现一个显示4位数 以后好做计算器 但是有些问题 希望有大神来帮忙
一下载完程序就直接显示了 键盘根本没用
#include<reg52.h>
unsigned char code smgduan[16] =  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴
sbit LSA=P2^2;           //138译码器
sbit LSB=P2^3;
sbit LSC=P2^4;
  unsigned int temp,qian,bai,shi,ge;
void delay( int  i)         //延时程序
{
while (i--);
}

int keydown()                  //扫描
{
unsigned char h,l,keyvalue;  
static int a;
a=1;
P1=0xf0;
h=P1&0xf0;
P1=0x0f;
l=P1&0x0f;
        switch(h+l)
        {
                case 0x77:keyvalue=7;break;
                case 0x7b:keyvalue=8;break;
                case 0x7d:keyvalue=9;break;
                case 0x7e:keyvalue='+';break;
                case 0xb7:keyvalue=4;break;
                case 0xbb:keyvalue=5;break;
                case 0xbd:keyvalue=6;break;
                case 0xbe:keyvalue='-';break;
                case 0xd7:keyvalue=1;break;
                case 0xdb:keyvalue=2;break;
                case 0xdd:keyvalue=3;break;
                case 0xde:keyvalue='*';break;
                case 0xe7:keyvalue=0;break;
                case 0xeb:keyvalue='=';break;
                case 0xed:keyvalue='c';break;
                case 0xee:keyvalue='/';break;
        }
a=a*10+keyvalue;
return a;
delay(1000);
}

        int display()                 //扫描次数
        {       
        int i,b;
         for(i=0;i<4;i++)
         {
         b= keydown();
         }
          return b;
        }
void DigDisplay()//显示
{
LSA=0;LSB=0;LSC=0;        //显示千位
P0=smgduan[qian];
delay(100);             //必须有延时
LSA=1;LSB=0;LSC=0;        //显示百位
P0=smgduan[bai];
delay(100);            
LSA=0;LSB=1;LSC=0;        //显示十位
P0=smgduan[shi];
delay(100);                                  
LSA=1;LSB=1;LSC=0;                          //显示个位
P0=smgduan[ge];
delay(100);                           
}
           
        void main()
        {
               temp=display();
                   qian=temp/1000;
           bai=temp/100%10;
           shi=temp/10%10;
           ge=temp%10;
                    while(1)
         {   
                 DigDisplay();
         }
        }



作者: sang    时间: 2017-2-3 11:58
看一下硬件接口正不正确?再检查软件,软件烧录的同时看一下硬件反应
作者: juese    时间: 2017-2-3 17:30
138译码器译过去是8
作者: juese    时间: 2017-2-3 17:32
不要置1
作者: 不倒翁.WZT    时间: 2017-2-4 12:41
这个程序有很多缺欠,如:数码管不能显示+、-、*、/等等。我修改了半天也只能显示键值,无法显示四位数。发给你参考一下。
主函数部分:
#include <reg51.h>   //包含特殊功能寄存器头文件
#include <key_down.C>
#define uint unsigned int     //定义uint=unsigned int
#define uchar unsigned char   //定义uchar=unsigned char
#define dula P0                      //段选
uchar qian,bai,shi,ge;
int temp;
sbit LSA=P2^2;                //138译码器
sbit LSB=P2^3;
sbit LSC=P2^4;
uint code du_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};    //段码表
void Delay_pro(uint xms)
  {
        uint i,j;
        for(i=xms;i>0;i--)    //i=xms即延时约xms毫秒
          for(j=110;j>0;j--);
        }
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
  temp=(KeyPro());
  
  qian=temp/1000;       //分离千位
  bai=temp%1000/100;    //分离百位
        shi=temp%100/10;      //分离十位
        ge=temp%10;           //分离个位

  LSA=0;LSB=0;LSC=1;    //显示千位位码
  dula=du_code[qian];   //显示千位段码
  Delay_pro(5);       

  LSA=1;LSB=0;LSC=1;    //显示百位位码
  dula=du_code[bai];    //显示百位段码
  Delay_pro(5);

  LSA=0;LSB=1;LSC=1;    //显示十位位码   
  dula=du_code[shi];    //显示百位段码
  Delay_pro(5);

  LSA=1;LSB=1;LSC=1;    //显示个位位码   
  dula=du_code[ge];     //显示百位段码
  Delay_pro(5);
}
void main()
{       
        while(1)
        {  
         display(qian,bai,shi,ge);
        }
}
矩阵扫描部分:
/*矩阵键盘*/
#include <reg51.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#define KeyPort P1
int k=0;
unsigned char Value,n=0;
void Delay_key(unsigned int i)
{
  unsigned int a,b;
  for(a=0;a<i;a++)
    for(b=0;b<110;b++);
}
unsigned char KeyScan(void)    //键盘扫描函数,使用行列反转扫描法
{
  unsigned char cord_h,cord_l; //行列值中间变量
  KeyPort=0x0f;                //行线输出全为0
  cord_h=KeyPort&0x0f;         //读入列线值
  if(cord_h!=0x0f)             //先检测有无按键按下
  {
    Delay_key(10);             //去抖
    if((KeyPort&0x0f)!=0x0f)
    {
      cord_h=KeyPort&0x0f;     //读入列线值
      KeyPort=cord_h|0xf0;     //输出当前列线值
      cord_l=KeyPort&0xf0;     //读入行线值
      while((KeyPort&0xf0)!=0xf0); //等待松开并输出
      return(cord_h+cord_l);       //键盘最后组合码值
    }
  }return(0xff);  //返回该值
}
unsigned char KeyPro(void)
{
  switch(KeyScan())
  {
    case 0xee:Value=1;break;   //0 按下相应的键显示相对应的码值
    case 0xde:Value=2;break;   //1
    case 0xbe:Value=3;break;   //2
    case 0x7e:Value=10;break;   
    case 0xed:Value=4;break;   //4
    case 0xdd:Value=5;break;   //5
    case 0xbd:Value=6;break;   //6
    case 0x7d:Value=11;break;  //7      
    case 0xeb:Value=7;break;   //8
    case 0xdb:Value=8;break;   //9
    case 0xbb:Value=9;break;   //a
    case 0x7b:Value=12;break;  //b   
    case 0xe7:Value=13;break;  //c
    case 0xd7:Value=0;break;   //d
    case 0xb7:Value=14;break;  //e
    case 0x77:Value=15;break;  //f
    break;
  }
  k=Value;
//  k=(k*10)+Value;
  return k;
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1