• 单片机课程设计-四位加法计算器设计参考程序(c语言)


      1 #include<reg52.h>            
      2 typedef unsigned char uint8;
      3 typedef unsigned int uint16;
      4  
      5 sbit rw=P2^5;
      6 sbit rs=P2^6;
      7 sbit e=P2^7;
      8 sbit led=P3^7;
      9  
     10 uint8 key,num,ei,eii,p;
     11 uint8 fuhao;//定义具体的那个符号,是加减还是乘除。
     12 uint8 flag;    //定义有没有按下符号键,这个是统称
     13 long a,b,c,d;    //定义运算数据的第一个和第二个及等于的数变量
     14 uint8 k; //定义小数点后面显示的位数
     15  
     16 uint8 dat1[]={1,2,3,0x2b-0x30, 4,5,6,0x2d-0x30, 7,8,9,0x2a-0x30,
     17                                     0,0x01-0x30,0x3d-0x30,0x2b-0x30 };//保存显示的数据
     18 uint8 dat2[]="9999 revo rewsna";
     19 uint8 dat3[]="Hi welcome into";
     20 uint8 dat4[]="counter by yumo";
     21 void delay(uint16 i)
     22 {
     23     while(i--);
     24 }
     25 void lcdwrc(uint8 c)//写入命令
     26 {
     27     delay(1000);
     28     rs=0;//选择发送命令
     29     rw=0;//选择写入
     30     e=0;//使能
     31     
     32     P0=c;//放入命令
     33     e=1;//写时序
     34     delay(1000);//保持时间
     35     e=0;
     36 }
     37 void lcdwrd(uint8 dat)//写入数据
     38 {
     39     delay(1000);
     40     rs=1;//选择输入数据
     41     rw=0;//选择写入
     42     e=0;
     43     
     44     P0=dat;//写入数据
     45     e=1;//写入时序
     46     delay(1000);
     47     e=0;
     48     rs=0;
     49 }
     50  
     51 void lcdinit()//LCD初始化
     52 {
     53     delay(1500);
     54     lcdwrc(0x38);
     55     delay(500);
     56     lcdwrc(0x38);
     57     delay(500);
     58     lcdwrc(0x38);
     59     delay(500);
     60     lcdwrc(0x38);
     61     lcdwrc(0x08);
     62     lcdwrc(0x01);
     63     lcdwrc(0x06);
     64     lcdwrc(0x0c);
     65     key=0;
     66     num=0;
     67     flag=0;
     68     fuhao=0;
     69     a=0;
     70     b=0;
     71     c=0;
     72     d=0;
     73     led=0;
     74 }
     75  
     76 show()
     77 {
     78     for(eii=0;eii<15;eii++)
     79     {
     80         
     81         lcdwrd(dat3[eii]);
     82     }    
     83     lcdwrc(0xc0);//写命令函数使其到第二行第一个字符
     84     for(p=0;p<15;p++)
     85     {
     86         
     87         lcdwrd(dat4[p]);
     88     }    
     89     return 1;
     90 }
     91 void keyscan()
     92 {
     93     P1=0xfe;   //令第一行为0,然后判断是哪一列按下
     94     if(P1!=0xfe)
     95     {
     96         delay(1000);
     97         if(P1!=0xfe)
     98         {
     99             key=P1&0xf0;
    100             switch(key)
    101             {
    102                 case 0xe0: num=0;break;      //1
    103                 case 0xd0: num=1;break;      //2
    104                 case 0xb0: num=2;break;      //3
    105                 case 0x70: num=3;break;      //
    106             }
    107         }
    108         while(P1!=0xfe);
    109         if(num==0||num==1||num==2)     //确认第一行的数1,2,3
    110         {
    111             if(flag==0)     //没有按下符号键
    112             {
    113                 led=1;
    114                 a=a*10+dat1[num];    
    115             }
    116             else
    117             {
    118                 led=1;
    119                 delay(1000);
    120                 led=0;
    121                 delay(1000);
    122                 led=1;
    123                 b=b*10+dat1[num];
    124             }        
    125         }
    126         if(num==3)
    127         {
    128             led=0;
    129             flag=1;
    130             fuhao=1;//加号+    
    131         }
    132         lcdwrd(0x30+dat1[num]);
    133     }
    134  
    135     P1=0xfd;                //令第二行为0,判断是哪一列按下
    136     if(P1!=0xfd)
    137     {
    138         delay(1000);
    139         if(P1!=0xfd)
    140         {
    141             key=P1&0xf0;
    142             switch(key)
    143             {
    144                 case 0xe0: num=4;break;      //4
    145                 case 0xd0: num=5;break;      //5
    146                 case 0xb0: num=6;break;      //6
    147                 case 0x70: num=7;break;      //减—
    148             }    
    149         }
    150         while(P1!=0xfd);
    151         if(num==4||num==5||num==6)
    152         {
    153             if(flag==0)     //没有按下符号键
    154             {
    155                 led=1;
    156                 a=a*10+dat1[num];    
    157             }
    158             else
    159             {
    160                 led=1;
    161                 b=b*10+dat1[num];
    162             }            
    163         }
    164         else
    165         {
    166             led=0;
    167             flag=1;
    168             fuhao=2;//带表减号
    169         }
    170         lcdwrd(0x30+dat1[num]);
    171     }
    172  
    173     P1=0xfb;         //令第三行为0,判断哪一列按下
    174     if(P1!=0xfb)
    175     {
    176         delay(1000);
    177         if(P1!=0xfb)
    178         {
    179             key=P1&0xf0;
    180             switch(key)
    181             {
    182                 case 0xe0: num=8;break;      //7
    183                 case 0xd0: num=9;break;      //8
    184                 case 0xb0: num=10;break;  //9
    185                 case 0x70: num=11;break;  //乘*
    186             }    
    187         }
    188         while(P1!=0xfb);
    189         if(num==8||num==9||num==10)
    190         {
    191             if(flag==0)     //没有按下符号键
    192             {
    193                 led=1;
    194                 a=a*10+dat1[num];    
    195             }
    196             else
    197             {
    198                 led=1;
    199                 b=b*10+dat1[num];
    200             }            
    201         }
    202         else
    203         {
    204             led=0;
    205             flag=1;
    206             fuhao=3;//带表乘号*
    207         }
    208         lcdwrd(0x30+dat1[num]);
    209     }
    210  
    211     P1=0xf7;         //令第四行为0,判断哪一列按下
    212     if(P1!=0xf7)
    213     {
    214         delay(1000);
    215         if(P1!=0xf7)
    216         {
    217             key=P1&0xf0;
    218             switch(key)
    219             {
    220                 case 0xe0: num=12;break;  //0
    221                 case 0xd0: num=13;break;  //清除rst
    222                 case 0xb0: num=14;break;  //等号=
    223                 case 0x70: num=15;break;  //除/
    224             }    
    225         }
    226         while(P1!=0xf7);
    227         switch(num)
    228         {
    229             case 12: 
    230                     if(flag==0)     //没有按下符号键
    231                     {
    232                         led=1;
    233                         a=a*10+dat1[num];
    234                         lcdwrd(0x30);    
    235                     }
    236                     else
    237                     {
    238                         led=1;
    239                         b=b*10+dat1[num];
    240                         lcdwrd(0x30);
    241                     }
    242                     break;            
    243             case 13: 
    244                     lcdwrc(0x01);    //清屏指令            
    245                     a=0;
    246                     b=0;
    247                 c=0;
    248                     flag=0;
    249                     fuhao=0;
    250                     break;
    251             case 15:
    252                 
    253                     led=0;
    254                     flag=1;
    255                     fuhao=4;
    256                     lcdwrd(0x2f);//除号/
    257                     break;                    
    258             case 14:                     //如果是等于号
    259                     if(fuhao==1)//
    260                     {
    261                         lcdwrc(0x4f+0x80);
    262                         lcdwrc(0x04);//设置光标左移,屏幕不移动
    263                         c=a+b;
    264                         
    265                         if(c==0)
    266                         {
    267                             lcdwrc(0x4f+0x80);
    268                             lcdwrc(0x04);
    269                             lcdwrd(0x30);
    270                         }
    271                         while((c!=0)&&(c<=9999))     //一位一位显示
    272                         {
    273                             
    274                             lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
    275                             c=c/10;//取前面的结果数据    
    276                         }                        
    277                         if(c>9999)
    278                         {
    279                             for(ei=0;ei<=16;ei++)
    280                             {
    281                                 lcdwrd(dat2[ei]);            
    282                             }            
    283                         }                        
    284                         lcdwrd(0x3d); //显示等于号=
    285                         a=0;
    286                         b=0;
    287                         c=0;
    288                         flag=0;
    289                         fuhao=0;//全部清除为0
    290                     }                    
    291                     if(fuhao==2)   //
    292                     {
    293                         lcdwrc(0x4f+0x80);
    294                         lcdwrc(0x04);//设置光标左移,屏幕不移动
    295                         if(a>b)
    296                             c=a-b;
    297                         else
    298                             c=b-a;
    299                         
    300                         if((c==0))//此语句位置影响显示
    301                         {
    302                             lcdwrc(0x4f+0x80);
    303                             lcdwrc(0x04);
    304                             lcdwrd(0x30);
    305                         }
    306                         while((c!=0)&&(c<=9999))     //一位一位显示
    307                         {
    308                             lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
    309                             c=c/10;//取前面的结果数据    
    310                         }
    311                         if(c>9999) 
    312                         {
    313                             for(ei=0;ei<=16;ei++)
    314                             {
    315                                 lcdwrd(dat2[ei]);            
    316                             }                                
    317                         }                    
    318                         if(a<b)    lcdwrd(0x2d); //显示-号
    319                         lcdwrd(0x3d); //显示等于号=
    320                         a=0;
    321                         b=0;
    322                         flag=0;
    323                         fuhao=0;//全部清除为0
    324                     }                    
    325                     if(fuhao==3)//乘法        
    326                     {
    327                         lcdwrc(0x4f+0x80);
    328                         lcdwrc(0x04);//设置光标左移,屏幕不移动
    329                         c=a*b;
    330                         while((c!=0)&(c<=9999))     //一位一位显示
    331                         {
    332                             lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
    333                             c=c/10;//取前面的结果数据    
    334                         }
    335                         if (c>9999) 
    336                         {
    337                             for(ei=0;ei<=16;ei++)
    338                             {
    339                                 lcdwrd(dat2[ei]);            
    340                             }                    
    341                         }
    342                         if(a==0||b==0)
    343                         {
    344                             lcdwrd(0x30);
    345                         }
    346                         lcdwrd(0x3d); //显示等于号=
    347                         a=0;
    348                         b=0;
    349                         flag=0;
    350                         fuhao=0;//全部清除为0    
    351                     }                
    352                     if(fuhao==4)//除法
    353                     {
    354                         k=0;
    355                         lcdwrc(0x4f+0x80);
    356                         lcdwrc(0x04);//设置光标左移,屏幕不移动
    357                         c=(long)(((float)a/b)*10000);//强制转换为long。
    358                         while((c!=0)&&(c<=99990000))     //一位一位显示
    359                         {
    360                             k++;
    361                             lcdwrd(0x30+c%10);//显示结果的最后一位在0x4f的位置
    362                             c=c/10;//取前面的结果数据
    363                             if(k==4)//结果保留四位有效数字
    364                             {
    365                                 lcdwrd(0x2e);//显示一个点
    366                                 //k=0;//倘若K=0,那么每隔三位就有一个小数点,计算器上的逗号就是这个原理。
    367                             }        
    368                         }
    369                         if(c>99990000) 
    370                         {
    371                             for(ei=0;ei<=16;ei++)
    372                             {
    373                                 lcdwrd(dat2[ei]);            
    374                             }        
    375                         }
    376                         if(0<(a/b)<0.1001)
    377                         {
    378                             //lcdwrd(0x2e);
    379                             
    380                         }
    381                         if((a/b)<1)      //如果a比b小的话那么除的结果最高位是0
    382                         {
    383                             lcdwrd(0x30);    
    384                         }
    385                         if(b==0)//检错因为除数不能为0,否则就显示ERROR
    386                         {
    387                             lcdwrc(0x4f+0x80);
    388                             lcdwrc(0x04);
    389                             lcdwrd(0x52);
    390                             lcdwrd(0x4f);
    391                             lcdwrd(0x52);                                                
    392                             lcdwrd(0x52);
    393                             lcdwrd(0x45);
    394                         }
    395                         lcdwrd(0x3d); //显示等号
    396                         a=0;
    397                         b=0;
    398                         flag=0;
    399                         fuhao=0;//全部清除为0
    400                     }
    401                     break;
    402         }
    403     }
    404 }
    405 void main()
    406 {
    407     lcdinit();
    408     show();//个性化界面
    409     while(1)
    410     {        
    411         keyscan();    
    412     }
    413 }
    View Code

    此程序为51单片机课程设计时所编写,希望可以供大家参考学习。

  • 相关阅读:
    Android自定义之ScrollView下拉刷新
    android Viewpager取消预加载及Fragment方法的学习
    Android上下左右滑动,显示底层布局
    android权限大全
    android学习之VelocityTracker
    Android之自定义(上方标题随ViewPager手势慢慢滑动)
    Red Hat Enterprise Linux 7.5安装极点五笔
    Red Hat Enterprise Linux 7.5安装盘内容做本地YUM源
    RHEL7+Oracle11g笔记
    CentOS安装VNC方法
  • 原文地址:https://www.cnblogs.com/yumoz/p/9785700.html
Copyright © 2020-2023  润新知