找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1460|回复: 1
收起左侧

电子计算器led显示

[复制链接]
ID:442132 发表于 2019-1-15 18:50 | 显示全部楼层 |阅读模式
#include<reg51.h>    //包含单片机寄存器的头文件
#define uchar unsigned char
#define uint  unsigned int
#define KEY 0xff
sbit RS=P3^2;    //寄存器选择位
sbit RW=P3^3;    //读写选择位
sbit E=P3^4;     //使能信号位
//sbit BF=P1^7;    //忙碌标志位

uchar code KEY_TABLE[]={0xb7,0xee,0xde,0xbe,0xed,0xdd,0xbd,0xeb,0xdb,0xbb};
uchar code num[]={'0','1','2','3','4','5','6','7','8','9'};
long num1,num2,res;

void delay(uint z)
{
    uint i,j;       
         for(i=z;i>0;i--)
          for(j=110;j>0;j--);                 
}                          
                                          
void Write_com (uchar com) //将指令或显示地址写入液晶显示器 入口 com
{      
         RS=0;                  //RS和RW同时为低电平,(写指令)
         RW=0;   
         E=0;                  
       
         delay(3);              
         P0=com;               //将数据送入P1口
       
         delay(3);              
         E=1;                  

         delay(3);            
         E=0;                  //E先置0 E=1 -> E=0 液晶显示器开始执行命令
}

void Write_data(uchar date)         //将数据写入液晶显示器  入口 data
{
          RS=1;              //RS为高电平,RW为低电平,(写数据)
          RW=0;
          E=0;            
          P0=date;           //数据送入P1口,将数据写入液晶显示器
          
         delay(3);      
          E=1;         

         delay(3);     
         E=0;                     //E先置0 E=1 -> E=0 液晶显示器开始执行命令
}                 

void LCDinit(void)             //对LCD进行初始化
{
   delay(10);             //首次写指令给LCD一段反应时间
   Write_com(0x38);       //显示模式设置
        delay(3);      

        Write_com(0x0e);     //显示模式设置:显示开,有光标,光标不闪烁         P157
        delay(3);

        Write_com(0x06);    //显示模式设置:光标右移,字符不移
        delay(3);

        Write_com(0x01);    //清屏幕指令
        delay(3);
       
        Write_com(0x80+0x00);
        delay(3);
}

uchar keyscan()        //键盘扫描,返回扫描值
{       
        uchar temp1,temp2,key;
        P2=0xf0;                                     //置行为0,列为1
        if(P2!=0xf0)                            //有无按键被按下
        {
                delay(10);
                if(P2!=0xf0)                                  //语句仍为真 则有按键被按下
                {
                        temp1=P2;                                 //读入列值
                       
                        P2=0x0f;                                 //列 0, 行 1
                        delay(3);
                       
                        temp2=P2;                                 //读入行值
                        key=temp1|temp2;
                       
                        while(P2!=0x0f);
                        return key;
                }
        }
        return KEY;       
}

uchar key_IN()                     //对键盘扫描值译码并显示
{
        uchar i,key;
        key=keyscan();
        if(key!=KEY)                                  //确定读入的按键值
        {
        switch(key)
        {
        case 0x7e:Write_data('+');return '+';
        case 0x7d:Write_data('-');return '-';
        case 0x7b:Write_data('*');return '*';
        case 0x77:Write_data('/');return '/';
        case 0xd7:Write_com(0x80+0x40); Write_data('=');return '=';
        case 0xe7:Write_com(0x01); num1=0;num2=0;break;       //清零
        default:
        break;
        }
        for(i=0;i<10;i++)
        {
                if(key==KEY_TABLE[i])                                         //确定读入的按键值
                        {
                        Write_data(num[i]);
                        return i;
                        }
        }
        }
        return KEY;
}
void count()                                            //对计算进行处理,并显示计算结果
{

        uchar key,i=0,a[9];
        long num0;
        key=key_IN();

        if((key=='+')||(key=='-')||(key=='*')||(key=='/'))
        {
                num2=num1;                                                                                                // num1=50 num2=50  num1=0                  输入了50
                num1=0;
                res=key;
        }

        if(key<10)                                                                                                         
        {
                num1=num1*10+key;                                                                          //num1=2  num1=2*10+0= 20
        }                                  

        if(key=='=')
        {
                Write_com(0x80+0x41);
                switch(res)                                            //对算法进行处理
                {
                   case '+':num0=num1+num2; break;
                   case '-':
                         if(num2>num1)
                                num0=(num2-num1);
                         if(num2<num1)
                        {
                                Write_data('-');
                                num0=num1-num2;
                        }
                   break;
                   case '*':num0=(num1*num2);break;
                   case '/':
                        if(num1>0)
                                num0=(num2/num1);
                        else
                                Write_data('0');
                                break;       
                   default:num0=0;
                   break;
                }

                /////显示计算结果
                               
                        if(0==num0)
                        {
                                if(0!=res)
                                        Write_data('0');
                        }
                       
                        while(num0>0)
                         {         
                                i++;
                                a[i]=num0%10;                                         
                                num0=num0/10;
                               
                         }
                        for(;i>0;i--)
                        {
                                Write_data(num[a[i]]);
                        }                                                         
                     num1=0;num2=0;res=0;
        }
}

void main(void)            //主函数
{
    num1=0;num2=0;
    LCDinit();              //调用LCD初始化函数  
    Write_com(0x00);                          
        while(1)
        {
                count();
        }
}


回复

使用道具 举报

ID:1 发表于 2019-1-16 03:58 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表