单片机课程设计报告(简易计算器)


简易计算器

摘 要:计算器是人们的日常生活中是最常见的电子产品之一,它应用极广、发展迅猛,并且不断出现着拥有更加强大功能的计算器。为了解和研究计算器,本次课设设计制作了一个简易计算器,能够在十四位的计算范围内进行“+”、“-”、“*”、“/”的基本运算,能进行负数以及小数点后两位的精确结果显示。该计算器以AT89C51单片机芯片作为核心。采用LCD1602工业字符液晶进行显示。完成的计算器经过检验能够完整的实现预设功能,各种细节完善,具有很高的使用价值。

关键词:单片机;简易计算器;AT89C51;LCD1602


Simple Calculator

Abstract :Calculator is People's Daily life is one of the most common electronic products, used very wide, developing rapidly, and constantly appear more powerful function with have calculators. In order to understand and study calculator, this class set design made a simple calculator, can the calculation in within 14 "+" and "-" and "*", "/" the basic computing, can carry out negative and two decimal places accurate results are shown. This calculator with AT89C51 chips as the core. Using liquid LCD1602 industrial characters displayed. Complete calculator after inspection can complete realization, various details preset functions to perfect, have high use value.

Keywords:MCU; Simple calculator;AT89C51;LCD1602

目录

中文摘要............................................................1

英文摘要............................................................2

单片机课程设计......................................................4

1  课程设计任务.....................................................4

   1.1  主要功能设计................................................4

   1.2  任务目的....................................................4

2 整体设计方案......................................................4

   2.1  方案论证....................................................4

   2.2  系统框图....................................................5

3  硬件电路的设计...................................................6

   3.1  计算机Protel总图............................................6

   3.2  显示电路设计方案............................................9

   3.3  键盘设计方案................................................9

   3.4  复位电路设计...............................................10

   3.5  晶振电路设计...............................................10

4  控制软件设计....................................................11

   4.1  程序时序总图...............................................11

   4.2  液晶显示软件设计...........................................12

   4.3  键盘输入软件设计...........................................13

   4.4  计算函数设置...............................................15

5  系统调试........................................................18

   5.1  硬件调试...................................................18

   5.2  软件调试...................................................18

参考文献...........................................................20

个人小结...........................................................21

附录...............................................................24

   附录1..........................................................24

   附录2..........................................................25

1课程设计任务

1.1 主要功能设计

以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602工业字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。

1.2 任务目的

通过本次课程设计提高我们的单片机硬件设计、软件编程能力,自主学习到更多的单片机应用知识。

2 整体设计方案

2.1 方案论证

计算器电路包括三个部分:

显示电路、4*4键扫描电路、单片机微控制电路。具体如下:

(1)LCD显示电路

     LCD1602作为一个成熟的产品,使用简单,模式固定,便于移植到各种类型的程序,但是初学者往往要注意结合LCD本身的时序图来完善初始化程序。又以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,故采用LCD.

(2)4*4键盘扫描电路

一般常采用3 种方法读取键值。一种是中断式,外两种是扫描法和反转法。

中断式:在键盘按下时产生一个外部中断通知CPU,并由中断处理程序通过不同的地

址读取数据线上的状态,判断哪个案件被按下。本实验采用中断式实现用户键盘接口。

扫描法:对键盘上的某一行送低电平,其他行为高电平,然后读取列值。若列值中有一

位是低,则表明该行与低电平对应列的键被按下;否则,扫描下一行。

反转法:先将所有行扫描线输出低电平,读列值。若列值有一位是低,则表明有键按下,

读列值;然后所有列扫描线输出低电平,再读行值。根据读到的值组合就可以查表1 得到的

键码。

   因为编程的方式,本次设计采用逐行扫描来读取键值,方便程序编写。

(3)单片机微控制电路:

微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复位电路的接法。

2.2 系统框图

系统框图2.1

3 硬件电路的设计

3.1 计算机Protel总图

 简易计算器电路原理图1.1

3.2 显示电路设计方案

LCD1602型液晶

(1) 显示特性

● 单5V电源电压,低功耗,长寿命,可靠性高

● 内置192种字符(160个5*7点阵字符和32个5*10点阵字符)

● 具有64个字节的自定义字符RAM,可自定义8个5*8点阵字符

● 或四个5*11点阵字符

● 显示方式:STN、半透、正显

● 驱动方式:1/16DUTY,1/5BIAS

● 视角方式:6点

● 背光方式:底部LED

● 通讯方式:4位或8位并口可选

● 标准的接口特性,适配MC51和M6800系列MPU的操作时序

(2) 接口定义

(3)寄存器选择控制表

(4)液晶显示电路接线图

本次设计中15,16号脚分别接电源接地开启背光,DB0~DB7对应P1口,2号脚接电源,1和3脚接地。

3.3 键盘设计方案

12mm*12mm*8mm规格4*4矩阵排布键盘

(1)按键设置图

共设置16 个键,其中数字键0~9 共十个,符号健有加号键、减号键、等于号、清除键。操作设备是四行四列共16键的简单键盘。

其分布如图所示。

(2)按键功能

1~9为数字输入;

ON/C为清除健;

"+"、"-"、"*"、"\"、"="为符号输入;

(3)键盘连接图

键盘对应连接如图所示,接单片机P3口,在焊接过程中要注意短接虚焊,同时P3口接入510欧电阻进行上拉。

3.4 复位电路设计

途中的RC为延时电路,只要RST端出现2个机器周期的高电平就可以使单片机复位,单片机复位后RST端出现低电平。

3.5 晶振电路设计

单片机内部设有一个反向放大器构成的振荡器,18脚和19脚分别为振荡电路的输入和输出端,时钟由内部产生,定时器件为石英晶体和电容组成的并联谐振回路,电容C2,C3取值在5-30PF;Y1的取值在1.2~12M之间选取。

4 控制软件设计:

设计中采用C语言对单片机进行编程,采用的是自下而上的设计方式,先设计出每一个模块(子程序),然后再慢慢扩大,最后组成程序。

4.1 程序总时序图

4.2 液晶显示软件设计

(1)显示流程

(2)1602液晶显示时序图,通过时序图,所有编程问题都可以得以解决。

(3)由时序图可以写出液晶的初始化函数、功能设置函数、清屏函数、写指令函数、写数据函数。

void lcd1602_write_com(uchar com)      //向1602写入命令

{

      P1=com;

      rs=0;

    rw = 0;

      lcden=0;

      lcd1602_delay(10);

      lcden=1;

      lcd1602_delay(10);

      lcden=0;

     

}

void lcd1602_pos(uchar x,uchar y)          //1602定位

{                         

   uchar  pos;

   if (x==0)

     x=0x80;

   else if (x==1)

     x=0xc0;

   pos = x+y ; 

   lcd1602_write_com(pos);     //显示地址

}

void lcd1602_write_date(uchar date)         //向1602写入数据

{

      P1=date;

      rs=1;

    rw=0;

      lcden=0;

      lcd1602_delay(10);

      lcden=1;

      lcd1602_delay(10);

      lcden=0;      

}

void lcd1602_write_str(uchar *p)       //向1602写入一个字符串

{

      while(*p!='\0')

      {

        lcd1602_write_date(*p);

        p++;

      }

  

}

void lcd1602_init()                          //1602初始化

{

    rw=0;

      lcd1602_write_com(0x38);

      lcd1602_delay(20);

      lcd1602_write_com(0x0c);

      lcd1602_delay(20);

      lcd1602_write_com(0x06);

      lcd1602_delay(20);

      lcd1602_write_com(0x01);

      lcd1602_delay(20);

}

4.3 键盘输入软件设计

(1)键盘输入程序运行时序图  

(2)键盘扫描程序

void keyscan() // 键盘扫描程序

{

P3=0xfe;         //1111 ,1110,为0扫描 先扫描的第一行

if(P3!=0xfe)     

{

   delay(5);

   if(P3!=0xfe)   //防抖动过程

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case 0xe0:num=0;

       break;

     case 0xd0:num=1;

       break;

     case 0xb0:num=2;

       break;

     case 0x70:num=3;

       break;

    }

   }

   while(P3!=0xfe);

   if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

   {

       if(j!=0)

        {

          lcd1602_write_com(0x01);

          j=0;

         }

       if(flag==0)//没有按过符号键

    {

     a=a*10+table[num];     //将计算符号前输入的数存入a

    }

    else//如果按过符号键

    {

     b=b*10+table[num];     //将计算符号后输入的数存入a

    }

   }

   else//如果按下的是'/'

   {

    flag=1;

    fuhao=4;              //4表示除号已按

   }

   i=table1[num];

   lcd1602_write_date(0x30+i);  //显示在屏幕上

}

P3=0xfd;

.......

4.4 计算函数设置

因为只有16个健,所以计算上只设计了加减乘除的功能,下面是几个计算程序的关键部

  (1)加法部分

          j=1;

           if(fuhao==1){lcd1602_pos(1,16); 

      //按下等于键,光标前进至第二行最后一个显示处

                lcd1602_write_com(0x04);

      //设置从后住前写数据,每写完一个数据,光标后退一格

           c=a+b;   //相加后进行值的大小判定

           if((c>=-999999999999)&&(c<=999999999999))

           {

           while(c!=0)

           {

             lcd1602_write_date(0x30+c%10);

             c=c/10;

           }                          //计算结果输出

           lcd1602_write_date(0x3d);     //再写"="

           a=0;b=0;flag=0;fuhao=0;    //还原标志和计算初值

           }

           else

           {

           lcd1602_pos(1,11);

                lcd1602_write_str("RORRE"); //因为之前com(0x04),所以反写,以求简便

           }

           }

(2)减法部分

      else if(fuhao==2){lcd1602_pos(1,16);

                          lcd1602_write_com(0x04);

           if((a-b)>0)   

             c=a-b;

           else

             c=b-a;

             if((c>=-99999999)&&(c<=99999999))

                 {

           while(c!=0)

           {

             lcd1602_write_date(0x30+c%10);

             c=c/10;

           }

           if((a-b)<0)

             lcd1602_write_date(0x2d);

           lcd1602_write_date(0x3d);     //再写"="          

           a=0;b=0;flag=0;fuhao=0;

          }

               else

               {

         lcd1602_pos(1,11);

              lcd1602_write_str("RORRE");

               }

               }

(3)乘法部分

      else if(fuhao==3){lcd1602_pos(1,16);

                          lcd1602_write_com(0x04);

             c=a*b;

                           if((c>=-99999999)&&(c<=99999999))

                              {

             while(c!=0)

             {

             lcd1602_write_date(0x30+c%10);

             c=c/10;

             }

             lcd1602_write_date(0x3d);    

          a=0;b=0;flag=0;fuhao=0;

             }

                     else

                     {

                     lcd1602_pos(1,11);

                     lcd1602_write_str("RORRE");

                     }

                     }

(4)除法部分

      else if(fuhao==4){lcd1602_pos(1,16);

                          lcd1602_write_com(0x04);

            i=0;

            c=(long)(((float)a/b)*1000);

                     if((c>=-99999999)&&(c<=99999999))

                     {

            while(c!=0)

             {

               lcd1602_write_date(0x30+c%10);

               c=c/10;

           i++;

           if(i==3)

              lcd1602_write_date(0x2e);

             }

            if(a/b<=0)

              lcd1602_write_date(0x30);

            lcd1602_write_date(0x3d);                              

            a=0;b=0;flag=0;fuhao=0;

                    }

                                  else

                                  {

                            lcd1602_pos(1,11);

                       lcd1602_write_str("RORRE");

                                  }

                                  }

5 系统调试:

5.1 硬件调试

该设计硬件部分较为简单,按照电源指示灯,复位电路,液晶显示,键盘输入的顺序进行检。

最开始复位电路是出现了焊接问题的,不自锁开关的后的接脚焊错,导致开关完全无用。完善之后用万用表测试了复位电路是否能正常工作,经过测试,单片机的1脚电压为0,只是在复位的瞬间出现4.95V的高电平,从而使单片机复位。工作稳定。

然后编写程序对液晶进行了测试,程序是变化的两排显示规律字符,发现显示混乱字符,遂检查硬件焊接情况,发现是液晶部分焊点焊在了一起导致的,改过之后液晶能够正常显示。

测试键盘时编写的是一个扫描按键,不同的健输出特定的符号在液晶上显示,过程非常成功。

在确保保证硬件没有问题的情况下开始软件编程。

5.2 软件调试

(1)编程前先画了流程图,这样思路清晰,能按部就班的完成。

(2)子函数有显示部分、键盘扫描部分和计算部分,编写好后综合在一起。

(3)在将程序写在一起的过程中,使用KEIL C进行了仿真,仿真过程模拟了键盘的输入,同时观察各种情况时液晶的输出情况。

(4)问题一:开始的思路是采用一个单独的键盘扫描。如:

int keyfound()

{

  unsigned char keyvalue,keyscan,keyin;

  unsigned int i,j,flag;

  keyscan=0xef;             //初始扫描位置设定

  keyvalue=0;

  flag=0;

  for(i=0;i<4;i++)            //开始逐行扫描

  {

    P3=keyscan;              

    keyin=P2;

    keyin=keyin&0x0f;

    if(keyin!=0x0f)

    {

      for(j=0;j<4;j++) //扫描到有按键按下的行再进行列的扫描            

      if(((keyin>>j)&1)==0)

      {

        keyvalue=keyvalue+j;    

        flag=1;

        break;

      }

    }

    else

      {

        keyvalue+=4;

        keyscan=keyscan<<1;     //没有按键按下,扫描下一行

      }

       while(keyin&0x0f!=0x0f);    //按键松开后再反回值

       return(keyvalue);

  }

}

在此基础上,对每一个按键的返回值进行IF语句的筛选(这里的返回值指第几个按键),判断出是数字还是符号,符号再利用语句分别编写计算程式,结果显示,液晶清零。

在编写过程中从按键的返回值到液晶的显示出现了问题,遂放弃了该思路。换作在逐行扫描的过程中。每扫描一个按键就进行判断,若是数字则判断符号标志然后返回到特定的字符中进行特定方式的累加,与此同时在屏幕上进行正确显示。若是等号,则依照之前的符号标志和符号前后输入数字进行加减乘除的运算,并输出。

(5)问题二:编写过程中出现了液晶对比度太深,显示字符串时没有第一个字母。

解决这个问题,首先再次检查了液晶焊接的1、2、3号脚,确认无误后为看起来更清楚,讲背光焊接,然后检查程序,发现是液晶初始化的问题。在液晶初始化的程序中,设置问题。

(6)问题三:在设计中,计算结果显示在液晶第二行,为了看起来很舒服,将输入第一个符号的位置调到第二行最后并且写入命令(0x04);设置从后住前写数据,每写完一个数据,光标后退一格。

在这个设计中。从后往前写数据的方式开始使显示顺序出现了问题,不管是一些计算结果的显示还是最后溢出ERROR的显示都不正确,遂先使用数组的方式调整输出顺序使计算结果能够正常显示,再将溢出时字符输出倒写,简单解决问题。

(7)问题四:计算器在使用过程中必须注意很多基础问题,例如连续输入0时的屏幕显示应该不会出现一排的0,例如一次计算完成后,再按键盘,再没有连续计算功能的前提下应该自动清零,方便使用以及诸多以方便使用、符合实际为缘由的细节需要改进。在这个过程中使用合适的语句判定基本解决了。

参考文献

[1] 宋彩利.单片机原理与C51编程[M].西安交通大学出版社,2008.6

[2] 谭浩强.C程序设计[M].清华大学出版社,2009.10

[3] 兰吉昌.51单片机应用设计百例[M].化学工业出版社,2009.2

[4] 于永.51单片机-C语言常用模块与综合系统设计实例精讲[M].电子工业出版社,2007.4

[5] 王明亮.1602字符液晶[EB/OL]. http://baike.baidu.com/view/1871999.htm

[6] 陈俊.51单片机LCD1602计算器版本三[EB/OL].http://www.selfcap.cpm

[7] 何明.51电子入门[EB/OL]. http://www.51dz.com/0/n1603.htm

[8] 李明洋.中国电子开发[EB/OL]. [EB/OL]. http://www.ourdev.cn

附件

附录1

硬件设计电路的元件清单

附录2

硬件电路实图

附录3

程序清单

#include<reg51.h>

#define uint unsigned int

#define uchar unsigned char

sbit lcden=P2^0;

sbit rs=P2^2;

sbit rw=P2^1;

sbit busy=P1^7;

char i,j,temp,num;

long a,b,c;

uchar flag,fuhao;

uchar code table[]={

7,8,9,0,

4,5,6,0,

1,2,3,0,

0,0,0,0};

uchar code table1[]={

7,8,9,0x2f-0x30,

4,5,6,0x2a-0x30,

1,2,3,0x2d-0x30,

0x01-0x30,0,0x3d-0x30,0x2b-0x30};

void lcd1602_delay(uint x);

void lcd1602_write_str(uchar *p);

void lcd1602_write_com(uchar com);

void lcd1602_delay1(uint x);

void lcd1602_pos(uchar x,uchar y);

void lcd1602_write_date(uchar date);

void lcd1602_init();

void lcd1602_delay(uint x)

{

      uint a,b;

      for(a=x;a>0;a--)

             for(b=10;b>0;b--);

}

void lcd1602_delay1(uint x)

{

      uint a,b;

      for(a=x;a>0;a--)

             for(b=100;b>0;b--);

}

void lcd1602_write_com(uchar com)      //向1602写入命令

{

      P1=com;

      rs=0;

    rw = 0;

      lcden=0;

      lcd1602_delay(10);

      lcden=1;

      lcd1602_delay(10);

      lcden=0;

     

}

void lcd1602_pos(uchar x,uchar y)          //1602定位

{                         

   uchar  pos;

   if (x==0)

     x=0x80;

   else if (x==1)

     x=0xc0;

   pos = x+y ; 

   lcd1602_write_com(pos);     //显示地址

}

void lcd1602_write_date(uchar date)         //向1602写入数据

{

      P1=date;

      rs=1;

    rw=0;

      lcden=0;

      lcd1602_delay(10);

      lcden=1;

      lcd1602_delay(10);

      lcden=0;      

}

void lcd1602_write_str(uchar *p)       //向1602写入一个字符串

{

      while(*p!='\0')

      {

        lcd1602_write_date(*p);

        p++;

      }

  

}

void lcd1602_init()                          //1602初始化

{

    rw=0;

      lcd1602_write_com(0x38);

      lcd1602_delay(20);

      lcd1602_write_com(0x0c);

      lcd1602_delay(20);

      lcd1602_write_com(0x06);

      lcd1602_delay(20);

      lcd1602_write_com(0x01);

      lcd1602_delay(20);

    num=-1;

lcden=1; //使能信号为高电平

i=0;

j=0;

a=0;     //第一个参与运算的数

b=0;     //第二个参与运算的数

c=0;

flag=0; //flag表示是否有符号键按下,

fuhao=0; // fuhao表征按下的是哪个符号

}   

void delay(uchar z) // 延迟函数

{

uchar y;

for(z;z>0;z--)

   for(y=0;y<110;y++);

}

void keyscan() // 键盘扫描程序

{

P3=0xfe;

if(P3!=0xfe)

{

   delay(5);

   if(P3!=0xfe)

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case 0xe0:num=0;

       break;

     case 0xd0:num=1;

       break;

     case 0xb0:num=2;

       break;

     case 0x70:num=3;

       break;

    }

   }

   while(P3!=0xfe);

   if(num==0||num==1||num==2)//如果按下的是'7','8'或'9

   {

       if(j!=0)

        {

          lcd1602_write_com(0x01);

          j=0;

         }

       if(flag==0)//没有按过符号键

    {

     a=a*10+table[num];

    }

    else//如果按过符号键

    {

     b=b*10+table[num];

    }

   }

   else//如果按下的是'/'

   {

    flag=1;

    fuhao=4;//4表示除号已按

   }

   i=table1[num];

   lcd1602_write_date(0x30+i);

}

P3=0xfd;

if(P3!=0xfd)

{

   delay(5);

   if(P3!=0xfd)

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case 0xe0:num=4;

         break;

     case 0xd0:num=5;

         break;

     case 0xb0:num=6;

         break;

     case 0x70:num=7;

         break;

    }

   }

   while(P3!=0xfd);

   if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'

   {

    if(j!=0)

        {

          lcd1602_write_com(0x01);

          j=0;

         }

       if(flag==0)//没有按过符号键

    {

     a=a*10+table[num];

    }

    else//如果按过符号键

    {

     b=b*10+table[num];

    }

   }

   else//如果按下的是'/'

   {

    flag=1;

    fuhao=3;//3表示乘号已按

   }

   i=table1[num];

   lcd1602_write_date(0x30+i);

}

P3=0xfb;

if(P3!=0xfb)

{

   delay(5);

   if(P3!=0xfb)

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case 0xe0:num=8;

         break;

     case 0xd0:num=9;

         break;

     case 0xb0:num=10;

         break;

     case 0x70:num=11;

         break;

    }

   }

   while(P3!=0xfb);

   if(num==8||num==9||num==10)//如果按下的是'1','2'或'3'

   {

    if(j!=0)

        {

          lcd1602_write_com(0x01);

          j=0;

         }

      if(flag==0)//没有按过符号键

    {

     a=a*10+table[num];

    }

    else//如果按过符号键

    {

     b=b*10+table[num];

    }

   }

   else if(num==11)//如果按下的是'-'

   {

    flag=1;

    fuhao=2;//2表示减号已按

   }

   i=table1[num];

   lcd1602_write_date(0x30+i);

}

P3=0xf7;

if(P3!=0xf7)

{

   delay(5);

   if(P3!=0xf7)

   {

    temp=P3&0xf0;

    switch(temp)

    {

     case 0xe0:num=12;

         break;

     case 0xd0:num=13;

         break;

     case 0xb0:num=14;

         break;

     case 0x70:num=15;

         break;

    }

   }

   while(P3!=0xf7);

   switch(num)

   {

    case 12:{lcd1602_write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"

     break;

    case 13:{                //按下的是"0"

       if(flag==0&a!=0)//没有按过符号键

       {

        a=a*10;

        lcd1602_write_date(0x30);

       }

       else if(flag==1&b!=0)//如果按过符号键

       {

        b=b*10;

        lcd1602_write_date(0x30);

        }

       else

       {

        lcd1602_pos(0,0);  lcd1602_write_str("0");

        }

      }

     break;

    case 14:{j=1;

           if(fuhao==1){lcd1602_pos(1,16);  lcd1602_write_com(0x04);

           c=a+b;

           if((c>=-99999999)&&(c<=99999999))

           {

           while(c!=0)

           {

             lcd1602_write_date(0x30+c%10);

             c=c/10;

           }

           lcd1602_write_date(0x3d);     //再写"="

           a=0;b=0;flag=0;fuhao=0;

           }

           else

           {

           lcd1602_pos(1,11);  lcd1602_write_str("RORRE");

           }

           }

      else if(fuhao==2){lcd1602_pos(1,16);  lcd1602_write_com(0x04);

           if((a-b)>0)

             c=a-b;

           else

             c=b-a;

             if((c>=-99999999)&&(c<=99999999))

                 {

           while(c!=0)

           {

             lcd1602_write_date(0x30+c%10);

             c=c/10;

           }

           if((a-b)<0)

             lcd1602_write_date(0x2d);

           lcd1602_write_date(0x3d);     //再写"="          

           a=0;b=0;flag=0;fuhao=0;

          }

               else

               {

         lcd1602_pos(1,11);  lcd1602_write_str("RORRE");

               }

               }

      else if(fuhao==3){lcd1602_pos(1,16);  lcd1602_write_com(0x04);

             c=a*b;

                           if((c>=-99999999)&&(c<=99999999))

                              {

             while(c!=0)

             {

             lcd1602_write_date(0x30+c%10);

             c=c/10;

             }

             lcd1602_write_date(0x3d);    

          a=0;b=0;flag=0;fuhao=0;

             }

                     else

                     {

                     lcd1602_pos(1,11);  lcd1602_write_str("RORRE");

                     }

                     }

      else if(fuhao==4){lcd1602_pos(1,16);  lcd1602_write_com(0x04);

            i=0;

            c=(long)(((float)a/b)*1000);

                     if((c>=-99999999)&&(c<=99999999))

                     {

            while(c!=0)

             {

               lcd1602_write_date(0x30+c%10);

               c=c/10;

           i++;

           if(i==3)

              lcd1602_write_date(0x2e);

             }

            if(a/b<=0)

              lcd1602_write_date(0x30);

            lcd1602_write_date(0x3d);                              

            a=0;b=0;flag=0;fuhao=0;

                    }

                                  else

                                  {

              lcd1602_pos(1,11);  lcd1602_write_str("RORRE");

                                  }

                                  }

      }

     break;

     case 15:{lcd1602_write_date(0x30+table1[num]);flag=1;fuhao=1;}

     break;

   }

}

}

main()

{  unsigned int i;

lcd1602_init();

lcd1602_pos(0,1);

lcd1602_write_str("C51 calculator");

lcd1602_pos(1,1);

lcd1602_write_str("By sdju BG0801");

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

for(i=10000;i>0;i++);

lcd1602_init();

while(1)

{

   keyscan();

}

}

相关推荐