跪求!7X7矩阵键盘这个C语言程序怎么改!?

P0是共阳极数码管的段选,P2.0和2.1是数码管的位选
P1.为矩阵按键的行,P3为矩阵按键的列
这个是原来4x4矩阵按键键值数码管显示的,怎么改成7X7数码管显示?
#include <reg51.h>
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
#define KEYP P1 // 扫瞄输出端口(高位元)及键盘输入端口(低位元)
#define SEG7P P0
sbit SEG_0=P2^1;
sbit SEG_1=P2^0;
sbit SEG_2=P2^2;
sbit SEG_3=P2^3;
uchar code TAB[18]= // 共阳7节显示器(g~a)编码
{ 0xc0, 0xf9, 0xa4, 0xb0, 0x99,
0x92, 0x82, 0xf8, 0x80, 0x98,
0xa0, 0x83, 0xa7, 0xa1, 0x84,
0x8e, 0xbf};
uchar scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7数码管和键盘扫描
uchar dig0,dig1;
void display(uchar dig0,uchar dig1);
void delay1ms(int); // 声明延迟函数
void scanner(void); // 声明扫瞄函数

//==主程序================================================
main() // 主程序开始
{ while(1)
{
scanner(); // 扫瞄键盘及显示7段显示器
}
} // 主程序结束

// === 延时函数约1ms ================================
void delay1ms(int x)
{
int i,j; // 声明整数变数i
for(i=0;i<x;i++) // 计数x次,延时约*1ms
for(j=0;j<120;j++); // 计数120次,延时约1ms
}

// ======= 扫描4*4键盘显示函数 ================
void scanner(void) // 扫瞄函数开始
{
uchar hang,lie1; // 声明变数(hang:行lie1:列,dig:颢示位)
uchar lie,num; // 声明变数(lie:列键值,num:按键码)
for(hang=0;hang<4;hang++) // for回圈,扫瞄第hang行
{
KEYP = scan[hang]; // 高4位输出扫瞄信号,低4位元输入列值
display(dig0,dig1);
lie= ~KEYP & 0x0f;
// 读入KEYP低4位,清除高4位求出列键值
if(lie != 0) // 若有按键按下
{ if(lie == 0x01) lie1=0; // 第0列被按下
else if(lie == 0x02) lie1=1; // 第1列被按下
else if(lie == 0x04) lie1=2; // 第2列被按下
else if(lie == 0x08) lie1=3; // 第3列被按下
num = 4 * hang + lie1; // 计算出按键数值,然后赋值给num
dig1=num/10;
dig0=num%10;
while(lie!= 0) // 当按钮未放开
lie=~KEYP & 0x0f; // 再读入列键值
}
}
}

void display(uchar x,uchar y) //数码管显示子函数
{
SEG_0=1;
SEG7P=TAB[x];
delay1ms(1);
SEG_0=0;

SEG_1=1;
SEG7P=TAB[y];
delay1ms(1);
SEG_1=0;
}

#include <reg51.h>

#define uint unsigned int //宏定义

#define uchar unsigned char   //宏定义

#define KEYP P1 // 扫瞄输出端口(高位元)及键盘输入端口(低位元)

#define SEG7P P0  

sbit  SEG_0=P2^1;

sbit  SEG_1=P2^0;

sbit  SEG_2=P2^2;

sbit  SEG_3=P2^3;

uchar code TAB[18]= // 共阳7节显示器(g~a)编码 

{ 0xc0, 0xf9, 0xa4, 0xb0, 0x99,

  0x92, 0x82, 0xf8, 0x80, 0x98,

  0xa0, 0x83, 0xa7, 0xa1, 0x84, 

  0x8e, 0xbf};  

uchar scan[7]={ 0xFE, 0xFD ,0xFB ,0xF7,0xEF,0xDF,0xBF }; // 7数码管和键盘扫描 


uchar dig0,dig1;

void display(uchar dig0,uchar dig1);

void  delay1ms(int); // 声明延迟函数 

void  scanner(void); // 声明扫瞄函数 


//==主程序================================================

main() // 主程序开始 

{

while(1)

{

scanner(); // 扫瞄键盘及显示7段显示器 

// display(dig0,dig1);

}

} // 主程序结束 


// === 延时函数约1ms ================================

void delay1ms(int x)

{

int i,j; // 声明整数变数i 

for(i=0;i<x;i++) // 计数x次,延时约*1ms

for(j=0;j<120;j++); // 计数120次,延时约1ms 

}

// ======= 扫描4*4键盘显示函数 ================

void scanner(void) // 扫瞄函数开始 

{

uchar hang,lie1;  // 声明变数(hang:行lie1:列,dig:颢示位)

uchar lie,num; // 声明变数(lie:列键值,num:按键码)

for(hang=0;hang<7;hang++)     // for回圈,扫瞄第hang行 

{

KEYP  = scan[hang]; // 高4位输出扫瞄信号,低4位元输入列值 

display(dig0,dig1); 

// lie= ~KEYP & 0x0f;

// 读入KEYP低4位,清除高4位求出列键值

lie=P3;

if(lie != 0XFF) // 若有按键按下

{

if(lie == 0xFE)         lie1=0; // 第0列被按下 

else if(lie == 0xFD) lie1=1; // 第1列被按下 

else if(lie == 0xFB) lie1=2; // 第2列被按下 

else if(lie == 0xF7) lie1=3; // 第3列被按下 

else if(lie == 0xEF) lie1=4; // 第4列被按下 

else if(lie == 0xDF) lie1=5; // 第5列被按下 

else if(lie == 0xBF) lie1=6; // 第6列被按下 

// else if(lie == 0x7F) lie1=7; // 第7列被按下 

num = 7 * hang + lie1; // 计算出按键数值,然后赋值给num

  dig1=num/10;

dig0=num%10;

while(lie!= 0XFF) // 当按钮未放开

lie=P3; // 再读入列键值 

}

}


}

void display(uchar x,uchar y) //数码管显示子函数

{

SEG_0=1;

SEG7P=TAB[x];

delay1ms(1);

SEG_0=0;

SEG_1=1;

SEG7P=TAB[y];

delay1ms(1);

SEG_1=0; 

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-05-27
比较简单。。。追问

怎么破!???跪求!!!!