资源简介

基于AT89C51单片机的简易计算器的仿真和源码,仿真是用Proteus软件画的,程序用keil软件编写的。 仿真可以实现100以内的数字的连续加减乘除运算,超过100系统会报错,并触发蜂鸣器。 按键部分为16个按键,显示部分为4个数码管。

资源截图

代码片段和文件信息

#include 
#define uchar unsigned char
sbit speaker=P1^3;//蜂鸣器
sbit ADDR0=P1^4;
sbit ADDR1=P1^5;
sbit ADDR2=P1^6;
sbit ADDR3=P1^7;
sbit KEY_IN_1=P2^4;
sbit KEY_IN_2=P2^5;
sbit KEY_IN_3=P2^6;
sbit KEY_IN_4=P2^7;
sbit KEY_OUT_1=P2^3;
sbit KEY_OUT_2=P2^2;
sbit KEY_OUT_3=P2^1;
sbit KEY_OUT_4=P2^0;
uchar code LedChar[10]={0xc00xf90xa40xb00x990x920x820xf80x800x90};
uchar code LedChar2[10]={0x400x790x240x300x190x120x020x780x000x10};
uchar LedBuff[4]={0xFF0xFF0xFF0xFF};
uchar KeySta[4][4]={{1111}{1111}{1111}{1111}};//全部矩阵按键的当前状态
uchar a[4]={0000};//按键数字记录
uchar sz=0;//数字
uchar ysfh=0;//运算符号
uchar gl=0;//归零
uchar dy=0;//等于
uchar cs=0;//数字按下次数
uchar SPEAKER=1;
void display(uchar n)//键号处理
{
 switch(n)
 {
 case 0:gl=1;break;//ce
 case 1:sz=0;break;//0
 case 2:dy=1;break;//=
 case 3:ysfh=1;break;//+
 case 4:sz=1;break;//1
 case 5:sz=2;break;//2
 case 6:sz=3;break;//3
 case 7:ysfh=2;break;//-
 case 8:sz=4;break;//4
 case 9:sz=5;break;//5
 case 10:sz=6;break;//6
 case 11:ysfh=3;break;//×
 case 12:sz=7;break;//7
 case 13:sz=8;break;//8
 case 14:sz=9;break;//9
 case 15:ysfh=4;break;//÷
 default: break;
 }
}
void main()//主函数
{
 uchar k=0;
 uchar ij;//键号确定变量
 uchar b0=0b1=0b2=0;//按键数字备份,保存前一次的值
 uchar jh;//键号
 long x=0y=0z=0;
 uchar xsd=0;//小数点
 uchar backup[4][4]={{1111}{1111}{1111}{1111}};//按键值备份,保存前一次的值
 TMOD=0x01;//选用定时器的工作方式1
 TH0=(65536-9000)/256;//9ms定时,存入高8位
 TL0=(65536-9000)%256;//9ms定时,存入低8位
 TR0=1;//开始定时
 EA=1;//开总中断
 ET0=1;//开T0中断
 P0=LedChar[0];//默认显示 0
 while(1)
 {
  if(SPEAKER==0)
   speaker=!speaker;
  LedBuff[0]=LedChar[a[0]];
  LedBuff[1]=LedChar[a[1]];
  if(xsd==0)
   LedBuff[2]=LedChar[a[2]];
  else
  {
   LedBuff[2]=LedChar2[a[2]];
  }
  LedBuff[3]=LedChar[a[3]];
  switch(k)
  {
   case 0:ADDR3=1;ADDR2=1;ADDR1=1;ADDR0=0;k++;P0=LedBuff[0];break;//数码管动态显示第一位
   case 1:ADDR3=1;ADDR2=1;ADDR1=0;ADDR0=1;k++;P0=LedBuff[1];break;//数码管动态显示第二位
   case 2:ADDR3=1;ADDR2=0;ADDR1=1;ADDR0=1;k++;P0=LedBuff[2];break;//数码管动态显示第三位
   case 3:ADDR3=0;ADDR2=1;ADDR1=1;ADDR0=1;k=0;P0=LedBuff[3];break;//数码管动态显示第四位
   default: break;
  }
  for(i=0;i<4;i++)//循环检测 4*4 的矩阵按键
  { 
   for(j=0;j<4;j++)
   {
    if(backup[i][j]!=KeySta[i][j])//检测按键动作
{
     if(backup[i][j]!=0)//按键按下时执行动作
 { 
  jh=i*4+j;
  display(jh);//对键号进行处理
  if(jh==1 || jh==4 || jh==5 || jh==6 || jh==8 || jh==9 || jh==10 || jh==12 || jh==13 || jh==14)//0~9
  {
   if(dy==1)
   {
    dy=0;
a[0]=0;
    a[1]=0;
    a[2]=0;
    a[3]=0;
    b0=0;
    b1=0;
    b2=0;
    cs=0;
    ysfh=0;
    SPEAKER=1;
xsd=0;
   }
   cs++;
   b0=a[0];
   b1=a[1];
   b2=a[2];
   a[0]=sz;
   a[1]=b0;
   a[2]=b1;
   a[3]=b2;
  }
  if(cs>2)//溢出 数字必须小于100
  {
   if(cs==3)
   {
    SPEAKER=0;
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
xsd=0;
   }
   if(cs==4)
   {
    SPEAKER=1;
cs=1;
   }

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6589  2016-06-22 21:19  计算器仿真\JSQ.c

     文件     122289  2016-06-22 21:19  计算器仿真\JSQ.DSN

     文件       7473  2016-06-22 21:14  计算器仿真\JSQ.hex

     目录          0  2019-04-12 11:04  计算器仿真

----------- ---------  ---------- -----  ----

               136351                    4


评论

共有 条评论