资源简介
基于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安装手册
相关资源
- LLC谐振电感仿真
- 51单片机通过6050——DMP获取姿态角例
- 模拟仿真CDT规约报文
- 基于51单片机的智能导航小车
- 蚂蚁与木棍问题仿真
- 常见的乘法器Verilog源代码及仿真结果
- 基于51单片机 的智能交通灯设计 带
- 用OPNET仿真RIP协议实现路由仿真
- stc15两轮自平衡小车
- 51单片机读写SD卡程序,使用FAT文件系
- 相当不错的扩展卡尔曼和无迹卡尔曼
- 51单片机与触摸屏通信
- 用IEEE33节点做的仿真
- Keil_ARM_MDK 5.15 支持5.1以上MDK专业版的
- 洼田电源Proteus仿真,输出电压可调节
- AT89c51单片机流水灯
- 51单片机中用PWM控制LED亮度调节
- WFQ调度算法仿真源码
- DS18B20 51单片机,包括电路
- 28BYJ-48步进电机(51单片机)
- 基于STC89C51的CAN总线点对点通信模块设
- LED应用于照明的计算和仿真
- 基于NS2仿真组播路由协议实现的实验
- 直接序列扩频通信系统仿真程序.doc
- 89C51双机通信proteus仿真
- 单相Boost功率因数校正仿真
- Protues下的8255仿真
- 步进电机角度控制Proteus仿真
- 基于c51的音乐播发编程proteus仿真
- 基于51电子钟proteus仿真
评论
共有 条评论