菜鸟89c51 4X4的难题,各位大侠来帮帮。。

2019-07-16 07:06发布

4x4键盘与4个7节显示器实验


电路图:
4x4键盘与4个7节显示器实验






51程序:



#include
<reg51.h>
// 定义8051暂存器之标头档
#define
KEYP
P2
// 扫瞄输出端口(高位元)及键盘输入端口(低位元)
#define
SEG7P
P0

// 7节显示器(g~a)输出埤
unsigned char code TAB[17]=
// 共阳7节显示器(g~a)编码
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99,
// 数字0-4
  
0x92, 0x82, 0xf8, 0x80, 0x98,
// 数字5-9
  
0xa0, 0x83, 0xa7, 0xa1, 0x84,
// 字母a-e(10-14)
  
0x8e, 0xbf};  
// 字母F(15),负号(-)
unsigned char disp[4]={ 0xbf, 0xbf, 0xbf, 0xbf }; // 显示阵列初值为负号(-)
unsigned char scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7显示器及键盘之扫瞄码
void  delay1ms(int);
// 声明延迟函数
void  scanner(void);
// 声明扫瞄函数
//==主程序================================================
main()
// 主程序开始
{
while(1)
// 无穷回圈,程序一直跑

scanner();
// 扫瞄键盘及显示7段显示器
}
// 主程序结束
// === 延迟函数,延迟约x*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键盘及4个7节显示器函数 ================
void scanner(void)
// 扫瞄函数开始
{
unsigned char col,row,dig;  // 声明变数(col:行,row:列,dig:颢示位)

unsigned char rowkey,kcode;
// 声明变数(rowkey:列键值,kcode:按键码)

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

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

SEG7P = disp[col];
// 输出第col行数字

rowkey= ~KEYP & 0x0f;

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


if(rowkey != 0)
// 若有按键

{
if(rowkey == 0x01)     
row=0;
// 若第0列被按下

else if(rowkey == 0x02)
row=1;
// 若第1列被按下

else if(rowkey == 0x04)
row=2;
// 若第2列被按下

else if(rowkey == 0x08)
row=3;
// 若第3列被按下

kcode = 4 * col + row;
// 算出按键之号码

for(dig = 0; dig < 3 ; dig++)
// 显示阵列之左3字

disp[dig]=disp[dig+1];
// 将右侧编码左移1位

disp[3]=TAB[kcode];
// 键值编码後,写入最右侧

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


rowkey=~KEYP & 0x0f;
// 再读入列键值

}
//
if叙述(有按键时)结束


delay1ms(4);
//
延迟4ms

}
//
for回圈结束(扫瞄col行)
}
//
扫瞄函数scanner()结束







碰到的问题是按钮不起作用,是不是程序错了,麻烦各位帮帮忙看看。。。





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。