这个程序有很多缺欠,如:数码管不能显示+、-、*、/等等。我修改了半天也只能显示键值,无法显示四位数。发给你参考一下。
主函数部分:
#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;
} |