仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//数码管段码端口
#define PP P1
//共阳极数码管段码
uchar code SEG7[]={/*0,1,2,3,4,5,6,7,8,9,*/
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,};
//数码管显示缓冲
uchar num[2];
//数码管位码端口
sbit q1=P3^0;
sbit q2=P3^1;
//延时函数ms
void _delay_ms(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<120;j++);
}
//数码管显示
void dis()
{
//显示第1位
PP=num[0];
q1=1;
_delay_ms(2);
q1=0;
//显示第2位
PP=num[1];
q2=1;
_delay_ms(2);
q2=0;
}
uchar keyn1=16;//按键值
uchar keyn=16;//缓冲
#define PK P2
void key_z()
{
PK=0X0F;
if(!(PK==0X0F))
{
if(!(PK==0X0F))
{
keyn1=0;
keyn=0;
PK=0X0F; //扫描行
if(PK==0X0E) keyn1=0;
if(PK==0X0D) keyn1=1;
if(PK==0X0B) keyn1=2;
if(PK==0X07) keyn1=3;
PK=0XF0; //扫描列
if(PK==0XE0) keyn=0+keyn1;
if(PK==0XD0) keyn=4+keyn1;
if(PK==0XB0) keyn=8+keyn1;
if(PK==0X70) keyn=12+keyn1;
//获取按键值
switch(keyn)
{
case 0: keyn1=1; break;
case 4: keyn1=2; break;
case 8: keyn1=3; break;
case 12:keyn1=10; break;
case 1: keyn1=4; break;
case 5: keyn1=5; break;
case 9: keyn1=6; break;
case 13:keyn1=11; break;
case 2: keyn1=7; break;
case 6: keyn1=8; break;
case 10:keyn1=9;break;
case 14:keyn1=12;break;
case 3: keyn1=14;break;//*
case 7: keyn1=0;break;
case 11:keyn1=15;break;//#
case 15:keyn1=13;break;
}
}
else keyn1=16;
PK=0X0F;while((!(PK==0X0F)));
}
}
uint shuju1;//计算数据1
uint shuju2;//计算数据2
uint res; //计算
uint bz; //运行标志
uint bzbu;//运行步骤
//显示控制
void dispaly()
{
if(bzbu==0) //数据1
{
num[0]=0xff;
num[1]=SEG7[shuju1%10];
}
if(bzbu==1)//符号
{
num[0]=0xff;
if(bz==0)num[1]=0xb9;
if(bz==1)num[1]=0xbf;
if(bz==2)num[1]=0x89;
if(bz==3)num[1]=0xcf;
}
if(bzbu==2)//数据2
{
num[0]=0xff;
num[1]=SEG7[shuju2%10];
}
if(bzbu==3) //结果
{
num[0]=SEG7[res%100/10];
num[1]=SEG7[res%10];
}
}
全部资料51hei下载地址:
简易矩阵计算器.rar
(60.1 KB, 下载次数: 40)
|