久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2496|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機計算器源程序 1602液晶顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:270093 發(fā)表于 2018-4-9 21:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
可以用語音來實現(xiàn)加減乘除之類計算 并顯示到1602上面

單片機源程序如下:
  1. /*
  2. 接盤按鍵說明:
  3. --------------------------------------------------
  4.             |  1  |  2  |  3  |  +  |  
  5.             - - - - - - - - - - - - -
  6.             |  4  |  5  |  6  |  -  |
  7.             - - - - - - - - - - - - -
  8.             |  7  |  8  |  9  |  *  |
  9.             - - - - - - - - - - - - -
  10.                               | C   |  0  |  =  |  /  |
  11. --------------------------------------------------*/
  12. #include<reg51.h>
  13. #define uint unsigned int
  14. #define uchar unsigned char
  15. #define XTAL 12000000 //CPU晶振頻率
  16. #define baudrate 9600 //通信波特率
  17. //--------LCD1602-------------------
  18. //P00-07==== D0-7
  19. sbit rs=P1^5;        //指令or數(shù)據(jù)   2.6
  20. sbit wela=P1^4;      //讀or寫   2.5
  21. sbit lcden=P1^6;         //使能信號    2.7
  22. sbit feng=P1^0;    //蜂鳴器
  23. //--------LCD1602-------------------
  24. //--------KEY-----------------------
  25. //P1口
  26. //--------KEY-----------------------
  27. uchar code table[]= "                ";

  28. unsigned char data_a,data_b; //計算結(jié)果
  29. unsigned char data_c;       
  30. unsigned char num1;  //第一個數(shù)
  31. unsigned char num2;  //第二個數(shù)
  32. unsigned char count;  //一個起識別作用的變量
  33. unsigned char yusuanfu; //加減乘除等運算符

  34. uchar dispaly[10];         //顯示緩沖

  35. //************************************************************************/
  36. // 描述: 延時t us函數(shù)
  37. //************************************************************************/
  38. void LCD_Delay_us(unsigned int t)
  39. {
  40.         while(t--);           //t=0,退出
  41. }
  42. //************************************************************************/
  43. // 描述: 延時t ms函數(shù)
  44. //************************************************************************/
  45. void LCD_Delay_ms(unsigned int t)
  46. {
  47.         unsigned int i,j;
  48.         for(i=0;i<t;i++)                       //執(zhí)行t次循環(huán)
  49.         for(j=0;j<113;j++)                     //執(zhí)行113次循環(huán)
  50.         ;
  51. }
  52. //************************************************************************/
  53. // 描述: 1602液晶寫指令
  54. //************************************************************************/
  55. void write_com(uchar com)            //1602液晶寫指令
  56. {
  57.         rs=0;                       //寫指令
  58.         lcden=0;                    //使能1602
  59.         P2=com;                     //寫入指令com
  60.         LCD_Delay_ms(1);            //延時1ms
  61.         lcden=1;                    //使能1602
  62.         LCD_Delay_ms(2);            //延時2ms  
  63.         lcden=0;                        //使能1602
  64. }
  65. //************************************************************************/
  66. // 描述:1602液晶寫數(shù)據(jù)
  67. //************************************************************************/
  68. void write_date(uchar date) //1602液晶寫數(shù)據(jù)
  69. {
  70.         rs=1;                        //寫數(shù)據(jù)
  71.         lcden=0;                     //使能1602
  72.         P2=date;                     //寫入數(shù)據(jù)date
  73.         LCD_Delay_ms(1);             //延時1ms
  74.         lcden=1;                     //使能1602
  75.         LCD_Delay_ms(2);             //延時2ms
  76.         lcden=0;                         //使能1602
  77. }
  78. //************************************************************************/
  79. // 描述:指定x,y寫入字符函數(shù)
  80. //************************************************************************/
  81. void W_lcd(unsigned char x,unsigned char y,unsigned char Data)
  82. {     
  83.          if (y == 0){write_com(0x80 + x);}   //第一行  
  84.          else{write_com(0xc0 + x);}          //第二行
  85.          write_date( Data);                  //寫入數(shù)據(jù)
  86. }
  87. //指定x,y寫入字符串函數(shù)
  88. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  89. {     
  90. if (y == 0){write_com(0x80 + x);}                 //第一行
  91. else{write_com(0xC0 + x);}                        //第二行
  92. while (*s)                                        //
  93.         {write_date( *s); s++;}                      //寫入數(shù)據(jù)
  94. }
  95. //************************************************************************/
  96. // 描述:初始化液晶,及畫面初始化
  97. //************************************************************************/
  98. void init_lcd(void)            //初始化液晶,及畫面初始化
  99. {
  100.         wela=0;                      //寫液晶
  101.         lcden=0;                     //使能1602
  102.         write_com(0x38);             //8 位總線,雙行顯示,5X7 的點陣字符
  103.         LCD_Delay_us(100);           //延時100us
  104.         write_com(0x0c);             //開顯示,無光標,光標不閃爍
  105.         write_com(0x06);             //光標右移動
  106.         write_com(0x01);             //清屏
  107.         write_com(0x80);             //DDRAM 地址歸0
  108. }
  109. //************************************************************************/
  110. // 描述: 反轉(zhuǎn)法鍵盤掃描
  111. //************************************************************************/
  112. short keycheckdown()                                /* 反轉(zhuǎn)法鍵盤掃描 */
  113. {

  114.         short temp1,temp2,temp,a=0xff;
  115.         P1=0xf0;                                                /* 輸入行值(或列值) */
  116.         LCD_Delay_ms(20);                                /* 延時 */
  117.         temp1=P1;                                                /* 讀列值(或行值) */
  118.         P1=0xff;
  119.         LCD_Delay_ms(20);                                /* 延時 */
  120.         P1=0x0f;                                                /* 輸入列值(或行值) */
  121.         LCD_Delay_ms(20);                                /* 延時 */       
  122.         temp2=P1;                                                /* 讀行值(或列值) */
  123.         P1=0xff;
  124.         temp=(temp1&0xf0)|(temp2&0xf);        /* 將兩次讀入數(shù)據(jù)組合 */
  125.         switch(temp)                                        /* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
  126.         {


  127.                 case 0x77 :a=0x0d;break; //  按鍵/   77
  128.                 case 0xb7 :a=0x0e; break;// 按鍵=          7b
  129.                 case 0xd7 :a=0;           break;// 按鍵0    7d
  130.                 case 0xe7 :a=0x0f; break;// 按鍵CE   7e

  131.                 case 0x7b :a=0x0c;break;//         按鍵*    b7
  132.                 case 0xbb :a=0x9;break; //  按鍵9    bb
  133.                 case 0xdb :a=0x8;break; //  按鍵8    bd
  134.                 case 0xeb :a=0x7;break; //         按鍵7    be

  135.                 case 0x7d :a=0x0b;break;//  按鍵-    d7
  136.                 case 0xbd :a=0x6;break; //         按鍵6    db
  137.                 case 0xdd :a=0x5;break; //         按鍵5    dd
  138.                 case 0xed :a=0x4;break; //         按鍵4    de

  139.                 case 0x7e :a=0x0a; break;// 按鍵+    e7
  140.                 case 0xbe :a=3;break;//  按鍵3      eb
  141.                 case 0xde :a=2;break;//  按鍵2      ed
  142.                 case 0xee :a=1;break;//  按鍵1      ee

  143.                 default :a=0xff;
  144.         }
  145.         return a;                                                /* 返回按鍵值 */
  146. }
  147. void display_a() //顯示運算結(jié)果
  148. {
  149.         dispaly[3]=data_a%10000/1000;    //千
  150.         dispaly[2]=data_a%1000/100;      //百
  151.         dispaly[1]=data_a%100/10;        //十
  152.         dispaly[0]=data_a%10;            //個

  153.         write_com(0x80+7);               //顯示運算結(jié)果在7的位置上
  154.         if(data_a>999){        write_date('0'+dispaly[3]);}      //顯示千位
  155.         if(data_a>99){        write_date('0'+dispaly[2]);}                 //顯示百位
  156.         if(data_a>9){        write_date('0'+dispaly[1]);}     //顯示十位
  157.                               write_date('0'+dispaly[0]);      //顯示個位
  158. }

  159. void display_num1()   //顯示數(shù)據(jù)a
  160. {
  161.   dispaly[3]=num1%10000/1000;    //千
  162.         dispaly[2]=num1%1000/100;      //百
  163.         dispaly[1]=num1%100/10;        //十
  164.         dispaly[0]=num1%10;            //個

  165.         write_com(0x80+0);               //顯示第一個數(shù)在0的位置上
  166.         if(num1>999){        write_date('0'+dispaly[3]);}      //顯示千位
  167.         if(num1>99){        write_date('0'+dispaly[2]);}                 //顯示百位
  168.         if(num1>9){        write_date('0'+dispaly[1]);}     //顯示十位
  169.                               write_date('0'+dispaly[0]);      //顯示個位
  170. }
  171. void display_yusuanfu()   //顯示運算符
  172. {
  173.          switch(yusuanfu)
  174.             {
  175.                 case 219: write_com(0x80+1); write_date('+'); break;      //寫屏“+?     在1的位置上
  176.                 case 221: write_com(0x80+1); write_date('-');  break;     //寫屏“-”     在1的位置上
  177.                 case 136: write_com(0x80+1); write_date('*');  break;     //寫屏“*”     在1的位置上
  178.                 case 223: write_com(0x80+1); write_date('/');  break;     //寫屏“/”     在1的位置上
  179.                                                 }
  180. }
  181. void display_num2()    //顯示第二個數(shù)
  182. {
  183.         dispaly[3]=num2%10000/1000;    //千
  184.         dispaly[2]=num2%1000/100;      //百
  185.         dispaly[1]=num2%100/10;        //十
  186.         dispaly[0]=num2%10;            //個

  187.         write_com(0x80+2);               //顯示第二個數(shù)在2的位置上
  188.         if(num1>999){        write_date('0'+dispaly[3]);}      //顯示千位
  189.         if(num1>99){        write_date('0'+dispaly[2]);}                 //顯示百位
  190.         if(num1>9){        write_date('0'+dispaly[1]);}     //顯示十位
  191.                               write_date('0'+dispaly[0]);      //顯示個位
  192. }
  193.        

  194. void display_c(x)  //此函數(shù)在此工程中沒有用到,僅提供一個思路
  195. {

  196.         if(data_c<100000000&&data_c>-1)//溢出時顯示錯誤
  197.         {       

  198.                 dispaly[8]=data_c%1000000000/100000000;            //萬萬
  199.                 dispaly[7]=data_c%100000000/10000000;            //千萬
  200.                 dispaly[6]=data_c%10000000/1000000;                    //百萬
  201.                 dispaly[5]=data_c%1000000/100000;                    //十萬
  202.                 dispaly[4]=data_c%100000/10000;                            //萬
  203.                 dispaly[3]=data_c%10000/1000;                            //千
  204.                 dispaly[2]=data_c%1000/100;                              //百
  205.                 dispaly[1]=data_c%100/10;                                //十
  206.                 dispaly[0]=data_c%10;                                    //個
  207.                 write_com(0x80+6+0x40); //第一行
  208.                 if(x==4)
  209.                 {   
  210.                         if(data_c>99999999)        {        write_date('0'+dispaly[8]);}    //顯示萬萬
  211.                         if(data_c>9999999)        {        write_date('0'+dispaly[7]);}   //千萬
  212.                         if(data_c>999999)        {        write_date('0'+dispaly[6]);}    //百萬
  213.                         if(data_c>99999)        {        write_date('0'+dispaly[5]);}    //十萬
  214.                         if(data_b!=0)                {
  215.                                                                         write_date('0'+dispaly[4]);    //萬
  216.                                                                         write_date('.');
  217.                                                                         write_date('0'+dispaly[3]);    //千
  218.                                                                         write_date('0'+dispaly[2]);    //百
  219.                                                                         write_date('0'+dispaly[1]);    //十
  220.                                                                         write_date('0'+dispaly[0]);    //個
  221.                                                                 }
  222.                 }
  223.         else{
  224.                 if(data_c>99999999)        {        write_date('0'+dispaly[8]);}    //顯示萬萬
  225.                 if(data_c>9999999)        {        write_date('0'+dispaly[7]);}    //千萬
  226.                 if(data_c>999999)        {        write_date('0'+dispaly[6]);}    //百萬
  227.                 if(data_c>99999)        {        write_date('0'+dispaly[5]);}    //十萬
  228.                 if(data_c>9999)                {        write_date('0'+dispaly[4]);}    //萬
  229.                 if(data_c>999)                {        write_date('0'+dispaly[3]);}    //千
  230.                 if(data_c>99)                {        write_date('0'+dispaly[2]);}    //百
  231.                 if(data_c>9)                {        write_date('0'+dispaly[1]);}    //十
  232.                                                                 write_date('0'+dispaly[0]);    //個
  233.                 }
  234.         }
  235.         else  //溢出時顯示錯誤
  236.         {
  237.                 write_com(0x80+11+0x40); //第一行
  238.                 write_date('E');         //顯示 E
  239.                 write_date('r');         //顯示R
  240.                 write_date('r');                 //顯示R
  241.                 write_date('o');                 //顯示O
  242.                 write_date('r');                 //顯示E
  243.         }
  244. }
  245. //加減乘除運算
  246. void eql(uchar x)  //此函數(shù)在此工程中沒有用到  提供一個思路
  247. {
  248.         switch(x)                /*功能鍵選擇*/
  249.                         {   
  250.                                 case 1:data_c=data_a+data_b;break;                   //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                       
  251.                                 case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
  252.                        else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負數(shù)符號
  253.                                            break;           
  254.                                 case 3:data_c=(data_a*data_b);break;                  /* * S=3 *///乘
  255.                                 case 4:if(data_b==0){LCD_Write_String(0,1,"Error !         ");}else{data_c=(data_a*10000)/data_b;}break;                  /* / S=4 *///除//溢出時顯示錯誤
  256.                                 case 0:break;
  257.                         }          

  258. }
  259. void UART_Init(void)  //  串口初始化
  260. {
  261.    SCON = 0x50;     
  262.    TMOD = 0x20;     
  263.    TH1  = 0xfd;     
  264.    TL1  = 0xfd;
  265.    EA   = 1;        
  266.    ES   = 1;        
  267.    TR1  = 1;
  268. }
  269. void INT_UartRcv(void) interrupt 4   //串口中斷函數(shù)
  270. {
  271.     unsigned char Rcv = 0;
  272.     if(RI)                    
  273.       {

  274.          RI  = 0;        
  275.          Rcv = SBUF;    //串口讀數(shù)據(jù)
  276.          if((Rcv>9||Rcv<0)&&(count==1))  //count=1,表明輸入的是運算符
  277.          {
  278.              yusuanfu = Rcv;    //將讀回的數(shù)據(jù)存入yunsuanfu這個變量
  279.              switch(yusuanfu)   //判斷讀回的運算符,并將他們顯示在屏上1的位置
  280.             {
  281.                 case 75 : write_com(0x80+1); write_date('+'); LCD_Delay_ms(1000); break;                                         
  282.                 case 77 : write_com(0x80+1); write_date('-');  break;
  283.                 case 248 : write_com(0x80+1); write_date('*');  break;
  284.                 case 79 : write_com(0x80+1); write_date('/');  break;
  285.                                                 }
  286.                                                 count++;
  287.           }
  288.          else if(count==2)  //count=2表明第二個數(shù)據(jù)來了
  289.          {
  290.                                           num2= Rcv-2;
  291.                                           display_num2();
  292.                                           count++;
  293.                                  }
  294.             
  295.                                  else if(count==3)   //count=3表明該計算結(jié)果了
  296.                                  {
  297.                                   switch(yusuanfu)  //判斷運算符是哪個,并執(zhí)行相應(yīng)的計算
  298.             {
  299.                                                           case  75:  data_a = num1 +num2-110;   break;   //檢測到”+“號,讓兩個數(shù)據(jù)相加
  300.                 case  77:  data_a = num1 -num2-146;  break;     //檢測到”-“號,讓兩個數(shù)據(jù)相減
  301.                 case 248:  data_a = ((num2-110) *num1);  break;  //檢測到”x“號,讓兩個數(shù)據(jù)相乘
  302.                 case  79:  data_a = num1 /(num2-110);  break;    //檢測到”/“號,讓兩個數(shù)據(jù)相除
  303.             }
  304.                                                     display_a();  //顯示運算結(jié)果
  305.                                                                 LCD_Delay_ms(1000);  //延時,讓顯示的結(jié)果延時一下
  306.                 count=0;  //計算完一遍,讓變量清0
  307.                                                           LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0'); //清屏,讓屏顯示0,表示已準備好計算下一次
  308.          }
  309.          else if (count==0)  //count=0,表示一次計算剛剛開始
  310.          {
  311.             num1 = Rcv-112;        // 第一個數(shù)據(jù)發(fā)回來的碼值減去112就是想要得到的數(shù)據(jù)               
  312.                                           display_num1();        // 顯示第一個數(shù)                             
  313.            count++;                //變量加1
  314.                                          feng=1;                 //蜂鳴器響一下,此語句是調(diào)試階段用到的
  315.                                          LCD_Delay_ms(1000);
  316.                                          feng=0;      //關(guān)掉蜂鳴器
  317.          }

  318.       }
  319. }
  320. void main()
  321. {
  322.   UART_Init();          //串口初始化
  323.         init_lcd();                                          //1602液晶初始化
  324.         while(1)      //什么也不做,等待執(zhí)行中斷函數(shù)
  325. {
  326.         ;
  327. }
  328. }




復(fù)制代碼

所有資料51hei提供下載:
1-計算器程序.rar (51.11 KB, 下載次數(shù): 10)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区成人 | 国产婷婷色一区二区三区 | 男人天堂999 | 免费的av网站 | 久久久国产一区 | 久久久久久久国产精品 | 欧美 日韩 综合 | 成人国产在线视频 | 亚洲欧洲激情 | 日韩成人一区 | 国产精品日女人 | 一区二区三区免费网站 | 精品国产免费一区二区三区演员表 | 欧美福利 | av一区二区三区 | 日韩一级黄色毛片 | 亚洲综合精品 | 国产午夜精品一区二区三区 | 中文字幕亚洲一区二区三区 | 看片一区 | 久久蜜桃资源一区二区老牛 | 久久久久国产一区二区三区不卡 | 成人乱人乱一区二区三区软件 | 亚洲精品一区在线 | 麻豆久久精品 | 欧美日韩高清一区二区三区 | 国产精品日韩在线观看一区二区 | 免费观看一级毛片 | 国产精品1区 | 亚洲精品v日韩精品 | 玖玖视频免费 | 一区二区在线不卡 | 色成人免费网站 | 欧美日韩亚洲国产 | 日韩人体在线 | 热99| 毛片毛片毛片毛片毛片 | 欧产日产国产精品视频 | 亚洲人成网站777色婷婷 | 草草视频在线观看 | 免费看黄色国产 |