本帖最后由 bluekun 于 2011-3-30 20:02 编辑
最近想用数码管和矩阵键盘做个简单的计算器出来,可碰到了些麻烦~希望大虾们能帮解决一下~感激不尽!!附部分自己写的程序
/*-------------------
用矩阵键盘和数码管实现
简易计算器功能
--------------------*/
#include<reg52.h>
#define uc unsigned char
#define ui unsigned int
uc table[]={0x3f,0x06,0x5b,0x4f, //0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uc con_data[]={0,0,0};
uc temp_h,key,temp_l; //定义矩阵键盘扫描时所用到的变量
uc e_shi,e_ge,e;
ui i=100;
/*-------------
毫秒延时子函数
-------------*/
void delayms(ui z)
{
ui x;
while(z--)
{
for(x=0;x<120;x++);
}
}
/*--------------
键盘扫描子函数
--------------*/
uc scan()
{
P3=0x0f;
temp_h=P3;
if(temp_h!=0x0f)
{
delayms(5);
if(temp_h!=0x0f)
{
temp_h=P3; //temp_h=P3&0x0f;
P3=0xf0; //P3=temp_h|0xf0;
temp_l=P3&0xf0;
return(temp_h+temp_l);
}
}
return(0xff);
}
/*--------------------
加法子函数
-------------------*/
uc add()
{
key=scan();
switch(key)
{
case 0x7e:P0=table[0];con_data[0]=0;break;
case 0x7d: P0=table[1];con_data[1]=1;break;
case 0x7b: P0=table[2];con_data[1]=2;break;
case 0x77: P0=table[3];con_data[1]=3;break;
case 0xbe: P0=table[4];con_data[1]=4;break;
case 0xbd: P0=table[5];con_data[1]=5;break;
case 0xbb: P0=table[6];con_data[1]=6;break;
case 0xb7: P0=table[7];con_data[1]=7;break;
case 0xde: P0=table[8];con_data[1]=8;break;
case 0xdd: P0=table[9];con_data[1]=9;break;
}
con_data[2]=con_data[0]+con_data[1];
return con_data[2];
}
/*-----------------
等于子函数,按键实现
等号功能并显示
------------------*/
void equ()
{
e=add();
if(e>9)
{
e_shi=e/10;
e_ge=e%10;
while(i--)
{
P0=table[e_shi];
P2=0;
delayms(2);
P0=table[e_ge];
P2=1;
delayms(2);
}
}
else P0=table[e];
}
/*---------------
主函数
---------------*/
main()
{
P2=0;
while(1)
{
key=scan();
switch(key)
{
case 0x7e: P0=table[0];con_data[0]=0;break;
case 0x7d: P0=table[1];con_data[0]=1;break;
case 0x7b: P0=table[2];con_data[0]=2;break;
case 0x77: P0=table[3];con_data[0]=3;break;
case 0xbe: P0=table[4];con_data[0]=4;break;
case 0xbd: P0=table[5];con_data[0]=5;break;
case 0xbb: P0=table[6];con_data[0]=6;break;
case 0xb7: P0=table[7];con_data[0]=7;break;
case 0xde: P0=table[8];con_data[0]=8;break;
case 0xdd: P0=table[9];con_data[0]=9;break;
case 0xdb:add();break;
//case 0xd7:sub();break;
//case 0xee:mul();break;
//case 0xed:div();break;
//case 0xeb:;break;
case 0xe7:equ();break;
}
}
}
问题的水平不是很高,大虾们笑过后要援手哦,不然白笑了~~~ |