51单片机实例:计算器(普中51单片机)
#include "reg52.h"
#include "stdio.h"
#include<intrins.h>
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
void DelayMs(x)
{
int y;
for(;x>0;x--)
for(y = 110;y>0;y--);
}
void LCD_Write_com(char com) //写入命令
{
RS = 0;
RW = 0;
EN = 0;
P0 = com;
DelayMs(5);
EN = 1;
DelayMs(5);
EN = 0;
}
void LCD_Write_data(char dat) //写入单个数据
{
RS = 1;
RW = 0;
EN = 0;
P0 = dat;
DelayMs(5);
EN = 1;
DelayMs(5);
EN = 0;
}
void LCD_Write_Char(int x,int y,char dat) //决定显示位置
{
if(y == 0)
LCD_Write_com(0x80+x);
else
LCD_Write_com(0x80+0x40+x);
LCD_Write_data(dat);
}
void Write_String(char x,char y,char *s)
{
while (*s)
{
LCD_Write_Char(x,y,*s);
s++;
x++;
}
}
void LCD_Init()
{
EN = 0;
LCD_Write_com(0x38);
LCD_Write_com(0x0c);
LCD_Write_com(0x06);
LCD_Write_com(0x01);
}
char KeyScan() //键盘扫描函数,使用行列反转扫描法
{
unsigned char cord_h,cord_l;//行列值中间变量 cord_h行,l为列
P1=0x0f; //行线输出全为0
cord_h=P1&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
DelayMs(10); //去抖
if((P1&0x0f)!=0x0f)
{
cord_h=P1&0x0f; //读入列线值
P1=cord_h|0xf0; //输出当前列线值
cord_l=P1&0xf0; //读入行线值
while((P1&0xf0)!=0xf0);//等待松开并输出
return(cord_h+cord_l);//键盘最后组合码值
}
}
return(0xff); //返回该值
}
char KeyPro()
{
switch(KeyScan())
{
case 0x77 :return '1' ;break;
case 0x7b :return '2' ;break;
case 0x7d :return '3' ;break;
case 0x7e :return '+' ;break;
case 0xbd :return '6' ;break;
case 0xbb :return '5' ;break;
case 0xb7 :return '4' ;break;
case 0xbe :return '-' ;break;
case 0xdb :return '8' ;break;
case 0xd7 :return '7' ;break;
case 0xde :return 'x' ;break;
case 0xdd :return '9' ;break;
case 0xe7 :return '.' ;break;
case 0xeb :return '0' ;break;
case 0xee :return '/' ;break;
case 0xed :return '=' ;break;
default:return 0xff;break;
}
}
main()
{
char i,sign,s;
unsigned char num;
char temp[16]; //最大输入16个
bit firstflag;
float a=0,b=0;
LCD_Init();
// LCD_Write_com(0x01); //清屏
while(1)
{
num = KeyPro();
if(num!=0xff)
{
if(i == 0)
LCD_Write_com(0x01);
if(('+' == num) || ('-' == num) || ('x' == num) || ('/' == num) || ('=' == num))
{
i =0;
if(firstflag==0) //flag=1为第一个数,0为第二个数
{
sscanf(temp,"%f " ,&a);
firstflag = 1;
}
else
sscanf(temp," %f " ,&b);
for(s = 0;s<16;s++)
temp[s] = 0;
LCD_Write_Char(0,1,num);
//
if(num != '=')
sign = num;
else
{
firstflag = 0;
switch(sign)
{
case '+' :a = a+b;break;
case '-' :a = a-b;break;
case 'x' :a = a*b;break;
case '/' :a = a/b;break;
default:break;
}
//LCD_Write_Char(1,1,answer);
sprintf(temp,"%g",a); //输出浮点型,无用的0不输出
Write_String(1,1,temp);//显示到液晶屏
sign = 0;
a = 0;
b = 0;
for(s=0;s<16;s++)
temp[s]=0;
}
}
else if(i<16)
{
if((1==i)&&(temp[0]=='0'))
{
if(num == '.')
{
temp[1]=num;
LCD_Write_Char(1,0,num);//输出数据
i++;
}
else
{
temp[0] = num;
LCD_Write_Char(0,0,num);
}
}
else
{
temp[i] = num;
LCD_Write_Char(i,0,num);
i++;
}
}
}
}
}
51单片机实例:计算器(普中51单片机)相关推荐
- 打地鼠java代码流程图_51单片机 普中51 打地鼠游戏 仿真 程序 流程图
51单片机 普中51 打地鼠游戏 仿真 程序 流程图 51单片机 普中51 打地鼠游戏 仿真 程序 流程图 普中51-单核-A3&A4开发板原理图 用到数码管.LED.矩阵按键 描述: (1) ...
- 基于普中51单片机开发板的温控风扇
自学单片机也不算很久,刚好遇上了这一门的课程设计,查找了好多的资料发现都不算合适,合适的又要收费,那么最后呢才找到了一个有关我使用的开发板的温控风扇程序,也就是普中单片机开发板,该程序来自--黑51论 ...
- 普中51单片机-步进电机启停、变速控制级速度显示
实验工具: ①普中51单片机-单核-A3,某宝买的:②28BYJ-48型号步进电机:③液晶数码管. 实现功能 实验一: ①按下独立按键K1,步进电机启动: ②按下K2,实现变速(由Delay(50)变 ...
- 学习历程--普中51单片机A2--直流电机实验
今天学习了普中的直流电机实验部分,将自己的一些学习内容记录一下. 直流电机的官方定义:直流电机(direct current machine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成 ...
- 普中51单片机学习日记-点亮LED
普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...
- 工业顺序控制--基于普中51单片机模拟
1.实验目的 掌握工业顺序控制的硬件设计.软件设计.软件编程和调试. 2.实验内容 利用单片机实验箱实现注塑机的顺序控制. 3.实验要求 单片机P1口控制注塑机的6道工序,利用6只发光管的亮与否来模拟 ...
- 基于STM 32、矩阵键盘和独立键盘实现LCD显示的智能计算器(带括号的加减乘除运算、混合四则运算)——普中科技单片机开发试验仪嵌入式开发
0 引言 智能计算器是嵌入式开发的入门项目,本章使用STM 32芯片作为CPU,并将矩阵键盘和独立键盘作为输入外设,LCD1602作为显示屏,实现可输入的可视化智能计算器. 备注:最终生成的可执行HE ...
- 普中51—单核—A2学习第一天
普中51-单核-A2学习第一天 于2020年2月12日星期三17:16记,学习第一天的起因是学校即将开始网课,我和舍友也参加了全国大学生电子科技竞赛.学长给我们安排了任务学习模电和单片机,因为刚开始放 ...
- 普中51秒表简单易懂
用简单函数实现普中51单片机秒表 该秒表使用最简单的while.for.switch.if等函数的简单组合和38译码器来实现秒表的计时.暂停.存读数据功能(即回看).该秒表精确到毫秒级,最高纪录时间1 ...
- 普中51仿真器怎么下载操作
普中51仿真器下载操作说明 大家好,我是爱吃饼干的小白鼠 首先安装普中51仿真器的驱动:(安装时,用管理员身份运行,最好要把 360 等杀毒软件先关掉 成功后再打开) 如果使用的是A2/A3/A4开发 ...
最新文章
- 的python如何降级_提效降本:蚂蚁金服如何用融合计算改造在线机器学习
- Geospark-SQL加载SHP数据
- jQuery EasyUI 选项卡面板tabs使用实例精讲
- 圣诞是我们这样过的,美女如云 (图)
- freemarker html 引入script_HTML编码规范
- cupsd进程_关于Linux操作系统进程操作(ps)命令简介
- 南京张治中故居违规重建后标价6400万元出售
- redis linux工具安装,linux 安装redis缓存工具
- getch和getchar的区别
- 简明python教程电子书下载_简明Python教程PDF
- 推荐6款好用、免费的远程控制软件【远程管理工具】
- 【蓝桥杯真题】2021年蓝桥杯省赛B组题目解析+代码(C/C++)
- 佳顺通用进销存系统去广告_免费在线进销存软件弊端之重复投资
- 个人空间岁末大回报活动12月24日获奖名单
- Java学习—画图程序项目(2)
- Espresso Idling Resource 使用
- 不同性质的公司在英文中不同说法
- java抢购_java redis 实现抢购秒杀
- Smartbi:银行数字化转型案例分享
- 计算机设备申请、,设备申请书范文(精选9篇)
热门文章
- windows/linux 查看vendor ID 和 product ID
- 【PHP代码审计】TP框架初次了解学习
- 自学实现SSM开发房屋租赁系统
- 曹哲 实时多人人体姿态识别 CVPR2017
- Parameter 0 of method modifyRequestBodyGatewayFilterFactory....真正的解决办法!!!!!
- 前端模块化(Warming up)
- 任正非致歉华为前程序员:回来吧,公司错了
- 机器学习笔记三—卷积神经网络与循环神经网络
- ROS noetic 使用serial
- android studio 的debug证书在哪里,Android Studio debug.keystore位置介绍