找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD1602显示实验数值显示有什么好方法

[复制链接]
ID:987773 发表于 2021-12-21 23:01 | 显示全部楼层 |阅读模式
用LCD1602和16个按键实现十进制数的加减乘除四则运算
c是运算结果(即等号后面的数值)有没有比较好的方法显示
两个输入数的范围是0~32767,也就是运算结果范围也很大
从高到低或从低到高提取数字都行
但是要像下图那样在第二行的左边用的C语言

屏幕截图 2021-12-21 225856.png
回复

使用道具 举报

ID:944932 发表于 2021-12-21 23:21 | 显示全部楼层
#include "r_lcd1602drv.h"
#include "r_matrixKeypad.h"
u8 keyValueTab[][2]={
                    {0xee,'1'},{0xed,'2'},{0xeb,'3'},{0xe7,'+'},
                    {0xde,'4'},{0xdd,'5'},{0xdb,'6'},{0xd7,'-'},
                    {0xbe,'7'},{0xbd,'8'},{0xbb,'9'},{0xb7,'*'},
                    {0x7e,'.'},{0x7d,'0'},{0x7b,'='},{0x77,'/'}
                    };
u8 GetKeyValue(u32 scanCode)
{
    int i;
    for(i=0;i<16;i++)
        if(scanCode==keyValueTab[i][0])
            return keyValueTab[i][1];
    return 0;
}

int main()
{
    r_lcd1602drv lcd;
    r_matrixKeypad keypad;
   
   
    uchar buf[20];
    u32 scanCode;
   
    float f=0,f1=0;

    u8  datBuf[20];
    u8  datBuf1[20];
    u8  datBufIdx=0;
    u8  datBufIdx1=0;
  
    u8 keyValue;
    u8 isPoint=0;
    u8 isadd=0;
    u8 isde=0;

   
    u32 pins[]={Pin3,Pin4,Pin5,Pin6,Pin7,Pin8,Pin9,Pin10};
    u32 rowPins[]={Pin5,Pin6,Pin7,Pin8};
    u32 colPins[]={Pin1,Pin2,Pin3,Pin4};
    InitSystem();
    lcd.SetRsPin(GPIOB,Pin0);
    lcd.SetRwPin(GPIOB,Pin1);
    lcd.SetEnPin(GPIOB,Pin2);
    lcd.SetDataPins(GPIOB,pins,8);
    lcd.Init();
    keypad.SetRowPort(GPIOA,rowPins,4);
    keypad.SetColPort(GPIOA,colPins,4);
   
    while(1)
    {
    scanCode=keypad.GetScanCode();
      
        if(scanCode!=0)
        {  
         
          if(isde==1)
          {
            isde=0;
            datBufIdx=0;
            datBufIdx1=0;
            lcd.Init();
            lcd.SetRowCol(0,0);
            for(u8 i=0;i<20;i++)
            {
               datBuf[i]=0;
               datBuf1[i]=0;
               
            }
          }
         
          if((isadd=='+')|(isadd=='-')|(isadd=='*')|(isadd=='/'))
          {
           keyValue=GetKeyValue(scanCode);
            if(keyValue>='0'&&keyValue<='9')
            {
                datBuf1[datBufIdx1++]=keyValue;
                lcd.DispChar(keyValue);
            }
            if(keyValue=='.')
            {
                if(isPoint==0)
                {
                    datBuf1[datBufIdx1++]=keyValue;
                    lcd.DispChar(keyValue);
                    isPoint=1;
                }
            }
         
          }
         
          if(isadd==0)
          {
           keyValue=GetKeyValue(scanCode);
            if(keyValue>='0'&&keyValue<='9')
            {
                datBuf[datBufIdx++]=keyValue;
                lcd.DispChar(keyValue);
            }
            if(keyValue=='.')
            {
                if(isPoint==0)
                {
                    datBuf[datBufIdx++]=keyValue;
                    lcd.DispChar(keyValue);
                    isPoint=1;
                }
            }
            if((keyValue=='+')|(keyValue=='-')|(keyValue=='*')|(keyValue=='/'))
            {            
              isadd=keyValue;
              isPoint=0;
              lcd.DispChar(keyValue);            
            }
         
          }
   
            if(keyValue=='=')
            {
               sscanf((char *)datBuf,"%f",&f);
               sscanf((char *)datBuf1,"%f",&f1);              
              switch(isadd)     
              {
              case '+':f=f1+f;break;
              case '-':f=f-f1;break;
              case '*':f=f*f1;break;
              case '/':f=f/f1;break;
              }
               lcd.SetRowCol(1,0);
               sprintf((char *)buf,"%.2f",f);
               lcd.DispString(buf);
               isPoint=0;
               datBufIdx=0;
               datBufIdx1=0;
               isde=1;
               isadd=0;
            }
           
        }
    }
    }
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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