资源简介
基于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
- 上一篇:超级模块POST学习工具
- 下一篇:ELK安装手册
相关资源
- 交通灯multisim仿真(附图)
- 51单片机通信采样proteus仿真方波转化
- 基本放大电路multisim仿真.ms14
- 一个labview仿真的函数信号发生器.vi
- 60个HFSS 仿真模型库
- 基于MCS_51单片机的工业屏柜散热方案
- MCS_51单片机与8255A的接口设计
- Quartus II 15.0中仿真Altera三速以太网I
- Quartus II 15.0中仿真Altera三速以太网I
- 51单片机PWM程序,占空比、周期可调整
- 瑞利信道的仿真,包括信号的调制,
- 51单片机多功能自行车测速仪
- proteus仿真 AT89C51输出各种波形
- 一种红外遥控编解码仿真
- 00
- 用51单片机实现G代码翻译
- 简易的电阻电容测量电路
- 毕业论文之温度传感器DS18B20(源码
- 51单片机基于protues的几个仿真实例
- 38k单片机红外发送代码、keil
- 51单片机PCB设计图
- PC -- 单片机的串口数据传输系统设计
- 51单片机控制舵机程序
- saber 扫频分析仿真文件
- 武汉理工大学 单片机课程设计 16*16点
- 步进电机protues仿真
- 51单片机读取温度数据存储到SD卡中并
- 【单片机】51单片机数码管显示万年历
- 单片机与PC机串口通讯仿真
- 毕业设计 单片机 对讲机 protues仿真
评论
共有 条评论