[讨论] 矩阵键盘,数码管显示程序,求帮忙精简代码

v115488   2018-5-30 15:47 楼主
如题:下面是一段矩阵按键,数码管依次显示的代码.我是新手,自己撸的,撸的很繁琐,请师傅们精简下代码,供新手学习....
程序目的:
例如:依次按矩阵键盘的1,2,3,4,5键,
数码管则从第五位显示12345.
数码管.png
例如:依次按矩阵键盘的1,2,3键,
数码管则从第三位显示123.

程序如下:
#include
//数据及端口定义模块
typedef unsigned char u8;
typedef unsigned int  u16;
#define DATA  P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//全局变量
u8 wei,shu,shu1,shu2,shu3,shu4,shu5,shu6,shu7,shu8,temp2,num1;
//延时模块
void delay(u16 num)
{
  u16 x,y;
  for(x=num;x>0;x--)
  for(y=110;y>0;y--);
}
//共阴数码管_码表数组
u8 code seg_tab[]={
                   0x3f,0x06,0x5b,0x4f,
                   0x66,0x6d,0x7d,0x07,
                   0x7f,0x6f,0x77,0x7c,
                   0x39,0x5e,0x79,0x71
                   };
//74LS138译码
void bit_sel(u8 num)
{
    switch(num)
          {
      case(1):
                                LSA=0;LSB=0;LSC=0; break;
                        case(2):
                                LSA=1;LSB=0;LSC=0; break;
                        case(3):
                                LSA=0;LSB=1;LSC=0; break;
                        case(4):
                                LSA=1;LSB=1;LSC=0; break;
                        case(5):
                                LSA=0;LSB=0;LSC=1; break;
                        case(6):
                                LSA=1;LSB=0;LSC=1; break;
                        case(7):
                                LSA=0;LSB=1;LSC=1; break;
                        case(8):
                                LSA=1;LSB=1;LSC=1; break;
          }
}

//bit,DATA函数封装
void digdisplay(u8 bits,u8 datas)
{
  bit_sel(bits);
DATA=seg_tab[datas];
delay(1);
DATA=0x00;
}
//按键检测
u8 anjian(void)
{
u8 temp;
P1=0xf0;
delay(2);
if(P1!=0xf0)
   {
    delay(1);
    if(P1!=0xf0)
       {
        temp=P1;
        temp2=temp & 0xf0;
        P1=0x0f;
        temp=P1;
        temp2 |= temp;
      wei++;
      delay(500);
       return temp2,wei;
       }
   }
}
//按键码表
u8 anjian_biao(u8 shu)
{
u8 num;
switch(shu)
          {
         case 0x77:num=0; break;
         case 0x7b:num=1; break;
         case 0x7d:num=2; break;
         case 0x7e:num=3; break;
         case 0xb7:num=4; break;
         case 0xbb:num=5; break;
         case 0xbd:num=6; break;
         case 0xbe:num=7; break;
         case 0xd7:num=8; break;
         case 0xdb:num=9; break;
         case 0xdd:num=10; break;
         case 0xde:num=11; break;
         case 0xe7:num=12; break;
         case 0xeb:num=13; break;
         case 0xed:num=14; break;
         case 0xee:num=15; break;
           }   
          return num;//返回num的值
}
//入库
void ruku(u8 wei2)
{
wei2=wei;
switch(wei2)
          {
         case(1):shu1=temp2; break;
         case(2):shu2=temp2; break;
         case(3):shu3=temp2; break;
         case(4):shu4=temp2; break;
         case(5):shu5=temp2; break;
         case(6):shu6=temp2; break;
         case(7):shu7=temp2; break;
         case(8):shu8=temp2; break;
           }
}   
//显库
u8 xianku(u8 wei)
{
switch(wei)
          {
         case(1):shu=shu1; break;
         case(2):shu=shu2; break;
         case(3):shu=shu3; break;
         case(4):shu=shu4; break;
         case(5):shu=shu5; break;
         case(6):shu=shu6; break;
         case(7):shu=shu7; break;
         case(8):shu=shu8; break;
           }
        return shu;//返回shu的值  
}
//主程序
void main(void)
{
u8 cod,cod1,wei1,wei3;
LSA=0;
LSB=0;
LSC=0;
P0=0x3f;
wei=0;
while(1)
{
anjian();         //按键检测
ruku(wei);           //入库
wei1=wei;
wei3=1;
while(wei1>=1,wei1<9)
{     
cod=xianku(wei1);
num1=anjian_biao(cod);
digdisplay(wei3,num1);
if(wei1>1)
{
wei3++;
}
wei1--;
}
}
}
小弟祝愿各位,生活顺心,工作如意

回复评论 (2)

你想怎么精简了?
点赞  2018-6-5 13:06
引用: gxg1122 发表于 2018-6-5 13:06
你想怎么精简了?

功能不变,代码不越短越好吗?
点赞  2018-6-9 10:43
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复