图中的三位数字就是按下相应按键的时候数码管显示的数字,右边第一列的数字和右边第二列的显示相同,求大神
#include <REG51xD2.H>//包含头文件
#define uchar unsigned char
#define uint unsigned int
sbit P20 =P2^0;
sbit P33=P3^3;
sbit SEG1 = P2^6;
sbit SEG2 =P2^7;
sbit SEG3 =P2^5;
unsigned int ui_cord_h,ui_cord_l;//行列值
unsigned int ui_temp,ui_tempP33,ui_tempP20;
unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。
uchar keyscan(void); //主要的矩阵键盘扫描函数。
void delay(uint i);
void main()
{
uchar uc_key;
uchar uc_gewei, uc_shiwei, uc_baiwei;
//变量初始化
ui_cord_h=0x0000;
ui_cord_l=0x0000;
//端口初始化
P0 = 0XFF;
P20 =1;
P33=1;
while(1)
{
uc_key=keyscan();//调用键盘扫描,
uc_baiwei = uc_key/100;
uc_shiwei = uc_key%100/10;
uc_gewei = uc_key%10;
P1=0XFF;
P1= ~dofly[uc_gewei];
SEG1 =1;
SEG2 =0;
SEG3 =0;
delay(10);
P1=0XFF;
P1= ~dofly[uc_shiwei];
SEG1 =0;
SEG2 =1;
SEG3 =0;
delay(10);
P1=0XFF;
P1= ~dofly[uc_baiwei];
SEG1 =0;
SEG2 =0;
SEG3 =1;
delay(10);
}
}
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位
{
//行线5位写0 列线5位写1
P0=0x1f;
P20 =0;
P33= 0;
//读取 列线值
ui_tempP20=P20;
ui_tempP20<<=8;
ui_tempP33=P33;
ui_tempP33<<=9;
ui_cord_h=(P0&0x1f)|ui_tempP20|ui_tempP33; // 列线肯定有一个为0,读入列线值
//cord_h 是一个unsgined int 类型,最高几位 会不会不是0;===============王
if(ui_cord_h!=0x001f) //先检测有无按键按下
{
delay(100); //去抖
if(ui_cord_h!=0x001f)
{ //0000 0011 1110 0000
//cord_h=P3&0x0f; //读入列线值 至此已经确定按下的按键在哪一个列,
// cord_h=P0&0x0f|((P20&0)<<8)|((P33&0)<<9);
// 0000 00 00 0001 1110
//====================ui_cord_h 已经确定
ui_tempP20=P20;
ui_tempP20<<=8;
ui_tempP33=P33;
ui_tempP33<<=9;
//=================================
ui_cord_h=(P0&0x1f)|ui_tempP20|ui_tempP33; // 列线肯定有一个为0,读入列值
/////////////////////////===============================================
// P3=cord_h|0xf0; //输出当前列线值 只把被按下按键的列拉低 XXXX 1110
// 0000 00 00 0001 1110
// 0000 00 11 1110 0000
// 0000 00 11 1111 1110
//行列翻转
// ui_cord_h 0000 00 XX XXX1 1110 例如 0000 00 01 1111 1110
ui_temp = ui_cord_h|0x03E0;
// 0000 0011 1110 0000
// P0= ui_temp&0x03E0;
// P0=ui_temp&0x00FF;
//P0 = 0X00FE &0XE0 =0XE0
P0=(ui_temp&0x00FF)&0X03E0;
P20 =(ui_temp&0x0100)>>8;
P33= (ui_temp&0x0200)>>9;
//再次读取键值
ui_tempP20= P20;
ui_tempP33= P33;
ui_cord_l=(P0&0xE0)|(ui_tempP20<<8)|(ui_tempP33<<9); // 列线肯定有一个为0,读入列线值
//cord_l=P3&0xf0; //读入行线值
// cord_l=temp&0xf0; //读入行线值
return(ui_cord_h+ui_cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
void delay(uint i)//延时函数
{
while(i--);
}
|