久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

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


回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:149988 發(fā)表于 2017-2-4 12:41 | 顯示全部樓層
這個程序有很多缺欠,如:數(shù)碼管不能顯示+、-、*、/等等。我修改了半天也只能顯示鍵值,無法顯示四位數(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即延時約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)    //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
{
  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;     //輸出當(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)的鍵顯示相對應(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ù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 黄页网址在线观看 | 欧美精品福利视频 | 欧美精品一区二区免费 | 91在线视频网址 | 国产女人与拘做受免费视频 | 日韩视频一区二区 | 久久久久久久一区 | 国产91丝袜在线播放 | 亚洲综合中文字幕在线观看 | 超碰97人人人人人蜜桃 | 99在线视频观看 | 亚洲国产成人精品女人久久久 | 欧美一区成人 | 欧美日韩专区 | 亚洲精品国产成人 | 中文字幕专区 | 亚洲风情在线观看 | 亚洲三区视频 | 精品一区二区三区在线观看 | 久久精品成人 | 日韩欧美在线视频观看 | 9999精品视频 | 最新日韩在线视频 | 亚洲国产成人av好男人在线观看 | 成人三级影院 | 日本欧美国产 | 天堂一区二区三区 | 国产精品入口麻豆www | 99精品视频在线观看 | 成人福利网站 | 狠狠操网站 | 精品伦精品一区二区三区视频 | 成人免费高清 | 精品国产91亚洲一区二区三区www | 成人免费视频 | 久久国产精品免费视频 | 国产精品国产a级 | 成人av在线大片 | 久久精品| 亚洲欧洲成人av每日更新 | 久久国产精品久久久久 |