基于51单片机的简易计算器设计

该计算器系统51 系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入, 进行加、 减、乘、除的简单四则运算,并在 lcd屏幕上相应的显示结果。选择内部存储资源丰富的 51 单片 机,输入采用 4×4矩阵键盘,显示采用lcd1602屏幕模块进行显示。软件方面从分析计算器功能、 流程图设计,再到程序的编写进行系统设计。编程语言方面从程序总体设计以及高效性和功能性对 c 语言和汇编语言进行比较分析, 针对计算器四则运算算法特别是乘法和除法运算的实现,最终选 用全球编译效率最高的keil 公司的μvision5 软件,采用c语言进行编程,并用 proteus8 进行仿真。
部分程序:
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit rs=p2^6; //数据命令选择
sbit lcden=p2^7;//使能信号
uchar code table[]= ;
long int data_a,data_b; //第一个数和第二个数
long int data_c; //计算结果
uchar dispaly[10]; //显示缓冲
sbit music_rest =p2^2;//语音芯片复位脚
sbit music_data =p2^1;//语音芯片脉冲识别
sbit bus =p2^0;//语音芯片工作状态识别信号
uchar bbh,xm1,xm2,xm0;
void delay_us(unsigned int us)//延时函数
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void music(unsigned char music_count)
{
music_rest=1;
delay_us(200);
music_rest=0;
delay_us(200);
while(music_count>0)
{
music_data=1;
delay_us(100);
music_data=0;
delay_us(100);
music_count--;
}
}
//************************************************************************/
// 描述: 延时t us函数
//************************************************************************/
void lcd_delay_us(unsigned int t)
{
while(t--); //t=0,退出
}
//************************************************************************/
// 描述: 延时t ms函数
//************************************************************************/
void lcd_delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i;i++)>
for(j=0;j<113;j++) //执行113次循环
;
}
//************************************************************************/
// 描述: 1602液晶写指令
//************************************************************************/
void write_com(uchar com) //1602液晶写指令
{
rs=0; //写指令
lcden=0; //使能1602
p0=com; //写入指令com
lcd_delay_ms(1); //延时1ms
lcden=1; //使能1602
lcd_delay_ms(2); //延时2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:1602液晶写数据
//************************************************************************/
void write_date(uchar date) //1602液晶写数据
{
rs=1; //写数据
lcden=0; //使能1602
p0=date; //写入数据date
lcd_delay_ms(1); //延时1ms
lcden=1; //使能1602
lcd_delay_ms(2); //延时2ms
lcden=0; //使能1602
}
//************************************************************************/
// 描述:指定x,y写入字符函数
//************************************************************************/
void w_lcd(unsigned char x,unsigned char y,unsigned char data)
{
if (y == 0){write_com(0x80 + x);} //第一行
else{write_com(0xc0 + x);} //第二行
write_date( data); //写入数据
}
//指定x,y写入字符串函数
void lcd_write_string(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0){write_com(0x80 + x);} //第一行
else{write_com(0xc0 + x);} //第二行
while (*s) //
{write_date( *s); s++;} //写入数据
}
//************************************************************************/
// 描述:初始化液晶,及画面初始化
//************************************************************************/
void init_lcd(void) //初始化液晶,及画面初始化
{
lcden=0; //使能1602
write_com(0x38); //8 位总线,双行显示,5x7 的点阵字符
lcd_delay_us(100); //延时100us
write_com(0x0c); //开显示,无光标,光标不闪烁
write_com(0x06); //光标右移动
write_com(0x01); //清屏
write_com(0x80); //ddram 地址归0
}
//************************************************************************/
// 描述: 反转法键盘扫描
//************************************************************************/
short keycheckdown() /* 反转法键盘扫描 */
{
short temp1,temp2,temp,a=0xff;
p1=0xf0; /* 输入行值(或列值) */
lcd_delay_ms(20); /* 延时 */
temp1=p1; /* 读列值(或行值) */
p1=0xff;
lcd_delay_ms(20); /* 延时 */
p1=0x0f; /* 输入列值(或行值) */
lcd_delay_ms(20); /* 延时 */
temp2=p1; /* 读行值(或列值) */
p1=0xff;
temp=(temp1&0xf0)|(temp2&0xf); /* 将两次读入数据组合 */
switch(temp) /* 通过读入数据组合判断按键位置 */
{
case 0x77 :a=0x0d;music(27);while(!bus);break;// 按键/
case 0x7b :a=0x0e;music(31);while(!bus); break;// 按键=
case 0x7d :a=0;music(2);while(!bus);break;// 按键0
case 0x7e :a=0x0f; break;// 按键ce
case 0xb7 :a=0x0c;music(26);while(!bus);break;// 按键*
case 0xbb :a=0x9;music(11);while(!bus);break; // 按键9
case 0xbd :a=0x8;music(10);while(!bus);break; // 按键8
case 0xbe :a=0x7;music(9);while(!bus);break; // 按键7
case 0xd7 :a=0x0b;music(25);while(!bus);break;// 按键-
case 0xdb :a=0x6;music(8);while(!bus);break; // 按键6
case 0xdd :a=0x5;music(7);while(!bus);break; // 按键5
case 0xde :a=0x4;music(6);while(!bus);break; // 按键4
case 0xe7 :a=0x0a;music(24);while(!bus);break;// 按键+
case 0xeb :a=3;music(5);while(!bus);break; // 按键3
case 0xed :a=2;music(4);while(!bus);break; // 按键2
case 0xee :a=1;music(3);while(!bus);break; // 按键1
default :a=0xff;
}
return a; /* 返回按键值 */
}



TWS市场入局者众多 苹果继续保持领先地位
未来笔记本的发展会是小众化笔记本吗?
传感控制芯片SNJ08L152应用——SENT传感器
什么是CID (Calling Identity Deliv
5G就只有一个快字可言吗
基于51单片机的简易计算器设计
群联主控打入微软Xbox Series X主机供应链 拿下了其SSD主控的订单
2020年度“明灯杯”名师获奖名单
电蜂讲解FAKRA连接器接口插针的固定方法
从共享无线充电功能看三星的生态战略
百度AI开发者大会2021在哪看
VL100:高度集成的单芯片显示端口替代模式控制器
这个机器人解开魔方的时间为0.38秒 破世界纪录
迪士尼开发防抖动画算法助力机器人运动更稳定
无线振动传感器成功解决风机振动监测难题
碳化硅也要上天!飞机的电气化进展,从混合动力开始
Google去年利用人工智能移除超过70万款恶意应用
诺基亚X5怎么样 999元到底值不值得
3GPP将引领全球通信业发展的主导性标准化组织进入5G时代
什么是时钟偏差?它对现代系统的影响