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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機的計算器設(shè)計資料 矩陣鍵盤+LCD1602顯示

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:288838 發(fā)表于 2018-3-7 18:55 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是本人畢業(yè)論文題目,下面是我搜藏的一些參考資料。材料中包含圖片格式的仿真,pcb,原理圖等內(nèi)容(word格式的論文)。

單片機源碼:
  1. //操作簡介
  2. // 按第一個數(shù),再按'+-*/',再按'='顯示出結(jié)果,然后按C清屏
  3. // 加最大9999+9999=19998
  4. // 減最大9999-0   =9999
  5. // 乘最大9999*9999=99980001
  6. // 除 1/9=0.1111 保留小數(shù)點后4位
  7. #include<reg51.h>
  8. #define uint unsigned int
  9. #define uchar unsigned char
  10. //--------LCD1602-------------------
  11. //P00-07==== D0-7
  12. sbit rs=P2^5;        //指令or數(shù)據(jù)
  13. sbit wela=P2^6;      //讀or寫
  14. sbit lcden=P2^7;         //使能信號
  15. //--------LCD1602-------------------
  16. //--------KEY-----------------------
  17. //P1口
  18. //--------KEY-----------------------
  19. uchar code table[]= "                ";

  20. long  int data_a,data_b;         //第一個數(shù)和第二個數(shù)
  21. long  int data_c;                        //計算結(jié)果

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

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

  102.         short temp1,temp2,temp,a=0xff;
  103.         P1=0xf0;                                                /* 輸入行值(或列值) */
  104.         LCD_Delay_ms(20);                                /* 延時 */
  105.         temp1=P1;                                                /* 讀列值(或行值) */
  106.         P1=0xff;
  107.         LCD_Delay_ms(20);                                /* 延時 */
  108.         P1=0x0f;                                                /* 輸入列值(或行值) */
  109.         LCD_Delay_ms(20);                                /* 延時 */        
  110.         temp2=P1;                                                /* 讀行值(或列值) */
  111.         P1=0xff;
  112.         temp=(temp1&0xf0)|(temp2&0xf);        /* 將兩次讀入數(shù)據(jù)組合 */
  113.         switch(temp)                                        /* 通過讀入數(shù)據(jù)組合判斷按鍵位置 */
  114.         {


  115.                 case 0x77 :a=0x0d;break;//  按鍵/   
  116.                 case 0x7b :a=0x0e; break;// 按鍵=        
  117.                 case 0x7d :a=0;           break;// 按鍵0
  118.                 case 0x7e :a=0x0f; break;// 按鍵CE

  119.                 case 0xb7 :a=0x0c;break;//         按鍵*
  120.                 case 0xbb :a=0x9;break; //  按鍵9
  121.                 case 0xbd :a=0x8;break; //  按鍵8
  122.                 case 0xbe :a=0x7;break; //         按鍵7

  123.                 case 0xd7 :a=0x0b;break;//  按鍵-
  124.                 case 0xdb :a=0x6;break; //         按鍵6
  125.                 case 0xdd :a=0x5;break; //         按鍵5
  126.                 case 0xde :a=0x4;break; //         按鍵4

  127.                 case 0xe7 :a=0x0a; break;// 按鍵+
  128.                 case 0xeb :a=3;break;        //  按鍵3
  129.                 case 0xed :a=2;break;        //  按鍵2
  130.                 case 0xee :a=1;break;        //  按鍵1

  131.                 default :a=0xff;
  132.         }
  133.         return a;                                                /* 返回按鍵值 */
  134. }
  135. void display_a() //顯示數(shù)據(jù)a
  136. {
  137.         dispaly[3]=data_a%10000/1000;    //千
  138.         dispaly[2]=data_a%1000/100;      //百
  139.         dispaly[1]=data_a%100/10;        //十
  140.         dispaly[0]=data_a%10;            //個

  141.         write_com(0x80+0);               //顯示數(shù)據(jù)a
  142.         if(data_a>999){        write_date('0'+dispaly[3]);}      //顯示千位
  143.         if(data_a>99){        write_date('0'+dispaly[2]);}                 //顯示百位
  144.         if(data_a>9){        write_date('0'+dispaly[1]);}     //顯示十位
  145.                               write_date('0'+dispaly[0]);      //顯示個位
  146. }

  147. void display_b() //顯示數(shù)據(jù)b
  148. {
  149.         write_com(0x80+7); //第一行
  150.         dispaly[3]=data_b%10000/1000;    //千
  151.         dispaly[2]=data_b%1000/100;      //百
  152.         dispaly[1]=data_b%100/10;        //十
  153.         dispaly[0]=data_b%10;            //個

  154. if(data_b>999){        write_date('0'+dispaly[3]); }     //顯示千位   
  155. if(data_b>99) {        write_date('0'+dispaly[2]); }    //顯示百位  
  156. if(data_b>9)  {        write_date('0'+dispaly[1]); }     //顯示十位
  157.                               write_date('0'+dispaly[0]);      //顯示個位
  158. }

  159. //計算結(jié)果
  160. void display_c(x)
  161. {

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

  164.                 dispaly[8]=data_c%1000000000/100000000;            //萬萬
  165.                 dispaly[7]=data_c%100000000/10000000;            //千萬
  166.                 dispaly[6]=data_c%10000000/1000000;                    //百萬
  167.                 dispaly[5]=data_c%1000000/100000;                    //十萬
  168.                 dispaly[4]=data_c%100000/10000;                            //萬
  169.                 dispaly[3]=data_c%10000/1000;                            //千
  170.                 dispaly[2]=data_c%1000/100;                              //百
  171.                 dispaly[1]=data_c%100/10;                                //十
  172.                 dispaly[0]=data_c%10;                                    //個
  173.                 write_com(0x80+6+0x40); //第一行
  174.                 if(x==4)
  175.                 {   
  176.                 if(data_c>99999999)        {        write_date('0'+dispaly[8]);}    //顯示萬萬
  177.                 if(data_c>9999999)        {        write_date('0'+dispaly[7]);}   //千萬
  178.                 if(data_c>999999)        {        write_date('0'+dispaly[6]);}    //百萬
  179.                 if(data_c>99999)        {        write_date('0'+dispaly[5]);}    //十萬
  180.                                                                 write_date('0'+dispaly[4]);    //萬
  181.                                                                 write_date('.');
  182.                                                                 write_date('0'+dispaly[3]);    //千
  183.                                                                 write_date('0'+dispaly[2]);    //百
  184.                                                                 write_date('0'+dispaly[1]);    //十
  185.                                                                 write_date('0'+dispaly[0]);    //個
  186.                 }
  187.         else{
  188.                 if(data_c>99999999)        {        write_date('0'+dispaly[8]);}    //顯示萬萬
  189.                 if(data_c>9999999)        {        write_date('0'+dispaly[7]);}    //千萬
  190.                 if(data_c>999999)        {        write_date('0'+dispaly[6]);}    //百萬
  191.                 if(data_c>99999)        {        write_date('0'+dispaly[5]);}    //十萬
  192.                 if(data_c>9999)                {        write_date('0'+dispaly[4]);}    //萬
  193.                 if(data_c>999)                {        write_date('0'+dispaly[3]);}    //千
  194.                 if(data_c>99)                {        write_date('0'+dispaly[2]);}    //百
  195.                 if(data_c>9)                {        write_date('0'+dispaly[1]);}    //十
  196.                                                                 write_date('0'+dispaly[0]);    //個
  197.                 }
  198.         }
  199.         else  //溢出時顯示錯誤
  200.         {
  201.                 write_com(0x80+11+0x40); //第一行
  202.                 write_date('E');         //顯示 E
  203.                 write_date('r');         //顯示R
  204.                 write_date('r');                 //顯示R
  205.                 write_date('o');                 //顯示O
  206.                 write_date('r');                 //顯示E
  207.         }
  208. }

  209. void eql(uchar x)//加減乘除運算
  210. {
  211.         switch(x)                /*功能鍵選擇*/
  212.                         {   
  213.                                 case 1:data_c=data_a+data_b;break;                   //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                        
  214.                                 case 2:if(data_a>=data_b){data_c=data_a-data_b;} /* - S=2 *///減
  215.                        else{data_c=data_b-data_a;W_lcd(5,1,'-');} //負(fù)數(shù)符號
  216.                                            break;           
  217.                                 case 3:data_c=(data_a*data_b);break;                  /* * S=3 *///乘
  218.                                 case 4:if(data_b==0){LCD_Write_String(0,1,"Error !");}else{data_c=(data_a*10000)/data_b;}break;                  /* / S=4 *///除//溢出時顯示錯誤
  219.                                 case 0:break;
  220.                         }         

  221. }

  222. void main()
  223. {
  224.         uchar   key=0xff;               //鍵值初始化
  225.         uchar   n=0;                                         //第1個數(shù)可以按1-4次
  226.         uchar   m=5;                                         //第2個數(shù)可以按1-4次
  227.         uchar   x=0;
  228.         data_a=0;                       //前一個數(shù)
  229.         data_b=0;                       //后一個數(shù)
  230.         data_c=0;                       //結(jié)果
  231.         init_lcd();                                          //1602液晶初始化
  232.         display_a();
  233.     while(1)
  234.           {
  235.                   key=keycheckdown();                        /*動態(tài)掃描鍵盤,返回按鍵對應(yīng)值,賦給j        key=0到f */
  236.                 if(0xff!=key)                                /*若返回值有效,進(jìn)入內(nèi)部處理程序*/
  237.                 {
  238.                   if(key<10)
  239.                   {
  240.                 if(n<4){data_a=data_a*10+key;m=5;display_a();}n++;  //首先輸入第一個數(shù)
  241.                     if(m<4){data_b=data_b*10+key;n=5;display_b();}m++;  //必須按了+-*/才能輸入第二個數(shù)               
  242.                   }
  243.           else
  244.           {        switch(key)                /*功能鍵選擇*/
  245.                                         {
  246.                                                 case 0xa:n=5;m=0;x=1;W_lcd(5,0,'+');break; //加  /* + S=1 */ /* 數(shù)值轉(zhuǎn)換函數(shù) */                                                                        
  247.                                                 case 0xb:n=5;m=0;x=2;W_lcd(5,0,'-');break;                  /* - S=2 *///減
  248.                                                 case 0xc:n=5;m=0;x=3;W_lcd(5,0,'*');break;                  /* * S=3 *///乘
  249.                                                 case 0xd:n=5;m=0;x=4;W_lcd(5,0,'/');break;                  /* / S=4 *///除
  250.                                                 case 0xe:n=5;m=5;eql(x);W_lcd(12,0,'=');display_c(x);break;           /* = */
  251.                                                 case 0xf:n=0;x=0;m=5; data_a=0;data_b=0;data_c=0;LCD_Write_String(0,0,table);LCD_Write_String(0,1,table);W_lcd(0,0,'0');break; /*     C*/
  252.                                         }                           
  253.                   }
  254.                         do{P1=0xf0;}while(P1!=0xf0);                /*等待按鍵松開*/
  255.                   }//(0xff!=key)         
  256.           }//while
  257. }//main
復(fù)制代碼



全部資料51hei下載地址:
單片機的簡易計算器設(shè)計.zip (405.39 KB, 下載次數(shù): 382)


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

使用道具 舉報

沙發(fā)
ID:288936 發(fā)表于 2018-3-7 22:01 | 只看該作者
不錯,很詳細(xì)
回復(fù)

使用道具 舉報

板凳
ID:291942 發(fā)表于 2018-3-14 18:59 | 只看該作者
不錯 很齊全
回復(fù)

使用道具 舉報

地板
ID:299615 發(fā)表于 2018-3-30 20:09 | 只看該作者
請問你的矩陣鍵盤是單層板嗎
回復(fù)

使用道具 舉報

5#
ID:378914 發(fā)表于 2018-8-15 21:40 | 只看該作者
厲害!
回復(fù)

使用道具 舉報

6#
ID:422725 發(fā)表于 2018-11-12 20:18 | 只看該作者
厲害 看懂了
回復(fù)

使用道具 舉報

7#
ID:425850 發(fā)表于 2018-11-13 22:14 | 只看該作者
非常詳細(xì),感謝作者
回復(fù)

使用道具 舉報

8#
ID:791682 發(fā)表于 2020-6-28 12:22 | 只看該作者
這是用proteus軟件嗎
回復(fù)

使用道具 舉報

9#
ID:859897 發(fā)表于 2020-12-19 23:01 | 只看該作者
能燒錄嗎?
回復(fù)

使用道具 舉報

10#
ID:861681 發(fā)表于 2022-2-22 23:59 來自手機 | 只看該作者
有點難懂
回復(fù)

使用道具 舉報

11#
ID:1032689 發(fā)表于 2022-6-6 23:35 來自手機 | 只看該作者
我在其他的網(wǎng)站也看到了,感謝感謝,寫的真好
回復(fù)

使用道具 舉報

12#
ID:1032689 發(fā)表于 2022-6-7 10:21 來自手機 | 只看該作者
想問下你這里P0,P2是指什么
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品视频一区二区三区四区 | 亚洲欧美另类在线观看 | 久久精品小视频 | 欧美日韩国产一区二区三区 | 日本精品久久久久久久 | 欧美日韩精品国产 | 亚洲h色| 亚洲综合在 | 久久另类| 99pao成人国产永久免费视频 | 夜夜夜操 | 香蕉大人久久国产成人av | 西西裸体做爰视频 | 日韩精品免费 | 91色在线| 精品免费国产一区二区三区四区 | 爱爱无遮挡 | 久久噜噜噜精品国产亚洲综合 | 中文字幕不卡视频在线观看 | 久久久久久久久久久久久久久久久久久久 | 亚洲国产精品久久久久婷婷老年 | 久久免费视频1 | 亚洲视频在线观看 | 一区二区三区在线电影 | 天堂资源最新在线 | 日本三级电影在线免费观看 | 免费黄色的网站 | 99精品免费视频 | 九九综合九九 | 视频一区二区国产 | 国产一级电影在线 | 久久久久成人精品免费播放动漫 | 免费在线观看av | 天天插天天操 | 一区二区视频在线 | 中文字幕视频在线观看 | 97caoporn国产免费人人 | 91一区| 麻豆天堂 | 国产成人精品一区二 | 国产精品完整版 |