找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4310|回復(fù): 4
收起左側(cè)

新手想用矩陣鍵盤 實(shí)現(xiàn)一個(gè)顯示4位數(shù) 以后好做計(jì)算器 但是有些問(wèn)題 希望有大神來(lái)幫忙

[復(fù)制鏈接]
ID:161990 發(fā)表于 2017-2-2 20:36 | 顯示全部樓層 |閱讀模式
一下載完程序就直接顯示了 鍵盤根本沒(méi)用
#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)         //延時(shí)程序
{
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()                 //掃描次數(shù)
        {       
        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);             //必須有延時(shí)
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;                          //顯示個(gè)位
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();
         }
        }


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:163329 發(fā)表于 2017-2-3 11:58 | 顯示全部樓層
看一下硬件接口正不正確?再檢查軟件,軟件燒錄的同時(shí)看一下硬件反應(yīng)
回復(fù)

使用道具 舉報(bào)

ID:161488 發(fā)表于 2017-2-3 17:30 | 顯示全部樓層
138譯碼器譯過(guò)去是8
回復(fù)

使用道具 舉報(bào)

ID:161488 發(fā)表于 2017-2-3 17:32 | 顯示全部樓層
不要置1
回復(fù)

使用道具 舉報(bào)

ID:149988 發(fā)表于 2017-2-4 12:41 | 顯示全部樓層
這個(gè)程序有很多缺欠,如:數(shù)碼管不能顯示+、-、*、/等等。我修改了半天也只能顯示鍵值,無(wú)法顯示四位數(shù)。發(fā)給你參考一下。
主函數(shù)部分:
#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即延時(shí)約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;           //分離個(gè)位

  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;    //顯示個(gè)位位碼   
  dula=du_code[ge];     //顯示百位段碼
  Delay_pro(5);
}
void main()
{       
        while(1)
        {  
         display(qian,bai,shi,ge);
        }
}
矩陣掃描部分:
/*矩陣鍵盤*/
#include <reg51.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
#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)    //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
{
  unsigned char cord_h,cord_l; //行列值中間變量
  KeyPort=0x0f;                //行線輸出全為0
  cord_h=KeyPort&0x0f;         //讀入列線值
  if(cord_h!=0x0f)             //先檢測(cè)有無(wú)按鍵按下
  {
    Delay_key(10);             //去抖
    if((KeyPort&0x0f)!=0x0f)
    {
      cord_h=KeyPort&0x0f;     //讀入列線值
      KeyPort=cord_h|0xf0;     //輸出當(dāng)前列線值
      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 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值
    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;
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表