[讨论]
矩阵键盘,数码管显示程序,求帮忙精简代码
如题:下面是一段矩阵按键,数码管依次显示的代码.我是新手,自己撸的,撸的很繁琐,请师傅们精简下代码,供新手学习....
程序目的:
例如:依次按矩阵键盘的1,2,3,4,5键,
数码管则从第五位显示12345.
例如:依次按矩阵键盘的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--;
}
}
}
小弟祝愿各位,生活顺心,工作如意