#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单片机)相关推荐

  1. 打地鼠java代码流程图_51单片机 普中51 打地鼠游戏 仿真 程序 流程图

    51单片机 普中51 打地鼠游戏 仿真 程序 流程图 51单片机 普中51 打地鼠游戏 仿真 程序 流程图 普中51-单核-A3&A4开发板原理图 用到数码管.LED.矩阵按键 描述: (1) ...

  2. 基于普中51单片机开发板的温控风扇

    自学单片机也不算很久,刚好遇上了这一门的课程设计,查找了好多的资料发现都不算合适,合适的又要收费,那么最后呢才找到了一个有关我使用的开发板的温控风扇程序,也就是普中单片机开发板,该程序来自--黑51论 ...

  3. 普中51单片机-步进电机启停、变速控制级速度显示

    实验工具: ①普中51单片机-单核-A3,某宝买的:②28BYJ-48型号步进电机:③液晶数码管. 实现功能 实验一: ①按下独立按键K1,步进电机启动: ②按下K2,实现变速(由Delay(50)变 ...

  4. 学习历程--普中51单片机A2--直流电机实验

    今天学习了普中的直流电机实验部分,将自己的一些学习内容记录一下. 直流电机的官方定义:直流电机(direct current machine)是指能将直流电能转换成机械能(直流电动机)或将机械能转换成 ...

  5. 普中51单片机学习日记-点亮LED

    普中51单片机中LED小灯所用端口为P2端口,从P2^0到P2^7分别为从左到右八个小灯. 可以使用sbit关键字定义变量led,以此简化端口的输入,并且使程序的可读性增强. 当变量的值设置为0,即端 ...

  6. 工业顺序控制--基于普中51单片机模拟

    1.实验目的 掌握工业顺序控制的硬件设计.软件设计.软件编程和调试. 2.实验内容 利用单片机实验箱实现注塑机的顺序控制. 3.实验要求 单片机P1口控制注塑机的6道工序,利用6只发光管的亮与否来模拟 ...

  7. 基于STM 32、矩阵键盘和独立键盘实现LCD显示的智能计算器(带括号的加减乘除运算、混合四则运算)——普中科技单片机开发试验仪嵌入式开发

    0 引言 智能计算器是嵌入式开发的入门项目,本章使用STM 32芯片作为CPU,并将矩阵键盘和独立键盘作为输入外设,LCD1602作为显示屏,实现可输入的可视化智能计算器. 备注:最终生成的可执行HE ...

  8. 普中51—单核—A2学习第一天

    普中51-单核-A2学习第一天 于2020年2月12日星期三17:16记,学习第一天的起因是学校即将开始网课,我和舍友也参加了全国大学生电子科技竞赛.学长给我们安排了任务学习模电和单片机,因为刚开始放 ...

  9. 普中51秒表简单易懂

    用简单函数实现普中51单片机秒表 该秒表使用最简单的while.for.switch.if等函数的简单组合和38译码器来实现秒表的计时.暂停.存读数据功能(即回看).该秒表精确到毫秒级,最高纪录时间1 ...

  10. 普中51仿真器怎么下载操作

    普中51仿真器下载操作说明 大家好,我是爱吃饼干的小白鼠 首先安装普中51仿真器的驱动:(安装时,用管理员身份运行,最好要把 360 等杀毒软件先关掉 成功后再打开) 如果使用的是A2/A3/A4开发 ...

最新文章

  1. 的python如何降级_提效降本:蚂蚁金服如何用融合计算改造在线机器学习
  2. Geospark-SQL加载SHP数据
  3. jQuery EasyUI 选项卡面板tabs使用实例精讲
  4. 圣诞是我们这样过的,美女如云 (图)
  5. freemarker html 引入script_HTML编码规范
  6. cupsd进程_关于Linux操作系统进程操作(ps)命令简介
  7. 南京张治中故居违规重建后标价6400万元出售
  8. redis linux工具安装,linux 安装redis缓存工具
  9. getch和getchar的区别
  10. 简明python教程电子书下载_简明Python教程PDF
  11. 推荐6款好用、免费的远程控制软件【远程管理工具】
  12. 【蓝桥杯真题】2021年蓝桥杯省赛B组题目解析+代码(C/C++)
  13. 佳顺通用进销存系统去广告_免费在线进销存软件弊端之重复投资
  14. 个人空间岁末大回报活动12月24日获奖名单
  15. Java学习—画图程序项目(2)
  16. Espresso Idling Resource 使用
  17. 不同性质的公司在英文中不同说法
  18. java抢购_java redis 实现抢购秒杀
  19. Smartbi:银行数字化转型案例分享
  20. 计算机设备申请、,设备申请书范文(精选9篇)

热门文章

  1. windows/linux 查看vendor ID 和 product ID
  2. 【PHP代码审计】TP框架初次了解学习
  3. 自学实现SSM开发房屋租赁系统
  4. 曹哲 实时多人人体姿态识别 CVPR2017
  5. Parameter 0 of method modifyRequestBodyGatewayFilterFactory....真正的解决办法!!!!!
  6. 前端模块化(Warming up)
  7. 任正非致歉华为前程序员:回来吧,公司错了
  8. 机器学习笔记三—卷积神经网络与循环神经网络
  9. ROS noetic 使用serial
  10. android studio 的debug证书在哪里,Android Studio debug.keystore位置介绍