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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5567|回復: 0
收起左側

單片機LED-KEY按鍵顯示仿真實驗 含代碼 原理圖

[復制鏈接]
ID:761993 發表于 2020-5-26 21:51 | 顯示全部樓層 |閱讀模式
一、實驗目的
  • 學習掌握Proteus仿真軟件;
  • 熟悉C51編程;
  • 掌握按鍵、LED顯示綜合編程
二、實驗設備和器件
  • PC機一臺
  • PROTEUS仿真軟件一套

三、實驗原理圖

圖1  采用單片機I/O端口實現的鍵盤顯示接口電路


實際應用中經常采用單片機的I/O端口實現矩陣鍵盤及LED數碼管顯示接口功能,具體電路如圖3所示。單片機P3口用于矩陣鍵盤接口,P3.0~P3.3作為行掃描輸出線,P3.4~P3.7作為讀列輸入線;P0口和P2口用于LED數碼管顯示接口,從P0口輸出顯示段碼,P2口輸出顯示數位。

四、實驗內容
  • 將按鍵內容顯示在最右邊的LED上。
  • 初始顯示0~7,實現按鍵右移顯示。即;初始顯示01234567,按1后,顯示10123456,按2后顯示21012345,以此類推。
  • 自主設計一種按鍵+顯示程序。

五.實驗代碼及結果5.1問題一代碼及結果


  1. #include <reg51.h>
  2. #include <absacc.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar key1=16;//全局變量,key1為鍵碼,定義為16是為了讓初始時燈滅
  6. uchar code value[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
  7.                          0x5e,0x79,0x71,0x00}; //0~F的字段碼表
  8. //延時函數
  9. void delay(uint i)
  10. {
  11.    uint j;
  12.    for(i=0;j<i;j++){}
  13. }
  14. //判斷是否按鍵
  15. uchar checkkey()
  16. {
  17.      uchar key;
  18.      P3 = 0xF0;//
  19.      key = ~P3 & 0xff;//無鍵按下返回0fh
  20.      return ( key);
  21. }
  22. //顯示函數
  23. void display(void)
  24. {
  25.    P2=0x7f; //僅亮第8個燈  
  26.    P0=value[key1]; //鍵值  
  27. }
  28. //求按鍵值,沒有按鍵返回0ff,按鍵返回鍵值
  29. unsigned char key(void)
  30. {
  31.     unsigned char row,col=0,k=0xff,dd,scan;// 定義行、列、返回值
  32.     scan=0xfe;  // 行掃描碼
  33.     for(row=0;row<4;row++) // 行掃描
  34.       {
  35.          P3=scan; dd=P3/16;  // 行掃描值送P3
  36.          if(dd!=0x0f) // 列線不全為1 ,進入列掃描
  37.             {
  38.                     switch(dd&0x0f)//用case語句求鍵值
  39.                     {
  40.                               case(0x0e):k=0x00+row*4; break;
  41.                               case(0x0d):k=0x01+row*4; break;
  42.                               case(0x0b):k=0x02+row*4; break;
  43.                               case(0x07):k=0x03+row*4; break;
  44.                      }            
  45.              }
  46.           scan=scan*2+1; // 左移1位
  47.       }
  48.     return k; // 返回鍵值
  49. }
  50. void main(void)
  51. {
  52.     while(1)
  53.    {
  54.       while(checkkey()==0x0f)//沒有按鍵則顯示當前的數字
  55.       {
  56.         display();
  57.       }
  58.       key1=key(); //有按鍵求鍵值
  59.    }
  60. }
復制代碼

5.2問題二結果及代碼


  1. <font color="rgb(0, 0, 0)">#include <reg51.h>
  2. #include <absacc.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar key1=16;//全局變量,key1為鍵碼,定義為16是為了讓初始時燈滅
  7. uchar code value[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
  8.                          0x5e,0x79,0x71,0x00}; //0~F的字段碼表
  9. uchar buf[8]={0,1,2,3,4,5,6,7};  
  10. //延時函數
  11. void delay(uint i)
  12. {
  13.    uint j;
  14.    for(i=0;j<i;j++){}
  15. }
  16. //判斷是否按鍵
  17. uchar checkkey()
  18. {
  19.      uchar key;
  20.      P3 = 0xF0;//
  21.      key = ~P3 & 0xff;//無鍵按下返回0fh
  22.      return ( key);
  23. }
  24. //顯示函數
  25. void display(void)
  26. {
  27.    uchar i,p,scan=0xfe;
  28.    for(i=0;i<8;i++)
  29.    {
  30.      p=buf[i];
  31.      P2=scan;
  32.      P0=value[buf[i]];
  33.      delay(1000);
  34.      scan=_crol_(scan,1);
  35.    }
  36. }
  37. //求按鍵值,沒有按鍵返回0ff,按鍵返回鍵值
  38. unsigned char key(void)
  39. {
  40.     unsigned char row,col=0,k=0xff,dd,scan;// 定義行、列、返回值
  41.     scan=0xfe;  // 行掃描碼
  42.     for(row=0;row<4;row++) // 行掃描
  43.       {
  44.          P3=scan; dd=P3/16;  // 行掃描值送P3
  45.          if(dd!=0x0f) // 列線不全為1 ,進入列掃描
  46.             {
  47.                      switch(dd&0x0f)//用case語句求鍵值
  48.                               {
  49.                                  case(0x0e):k=0x00+row*4; break;
  50.                                  case(0x0d):k=0x01+row*4; break;
  51.                                  case(0x0b):k=0x02+row*4; break;
  52.                                  case(0x07):k=0x03+row*4; break;
  53.                               }            
  54.              }
  55.           scan=scan*2+1; // 左移1位
  56.       }
  57.     while(checkkey()!=0x0f);
  58.     return k; // 返回鍵值
  59. }
  60. void main(void)
  61. {   
  62.       while(1)
  63.       {
  64.               key1=key();
  65.          if(key1!=0xff)
  66.           {
  67.                   buf[7]=buf[6];
  68.                   buf[6]=buf[5];
  69.                   buf[5]=buf[4];
  70.                   buf[4]=buf[3];
  71.                   buf[3]=buf[2];
  72.                   buf[2]=buf[1];
  73.                   buf[1]=buf[0];
  74.                   buf[0]=key1;
  75.           }
  76.               display();
  77.       }
  78. }</font>
復制代碼

5.3問題三結果及代碼
實現功能為:計算并顯示個位數的一次減法。手動按鍵,前10個鍵為數字1-9,第11個鍵為減號,第12個鍵為等號。當按鍵時,第一個燈會顯示相應的數,例如輸入按鍵‘8-2=’,第一個燈會依次顯示按鍵對應的字符,當再按‘=’時,就會顯示減法結果。弊端是只能算個位減法,僅能算一次,只有第一個燈可以顯示輸入的數值,不能動態顯示。

  1. #include <reg51.h>
  2. #include <absacc.h>
  3. #include <intrins.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. uchar key1=12;//全局變量,key1為鍵碼,定義為16是為了讓初始時燈滅
  7. uchar key2,key3;//全局變量,key1為鍵碼,定義為16是為了讓初始時燈滅
  8. uchar code value[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x09,0x00};//0-9,減號,等號
  9. uchar buf[13]={0,1,2,3,4,5,6,7,9,10,11,12};  
  10. //延時函數
  11. void delay(uint i)
  12. {
  13.    uint j;
  14.    for(i=0;j<i;j++){}
  15. }
  16. //判斷是否按鍵
  17. uchar checkkey()
  18. {
  19.      uchar key;
  20.      P3 = 0xF0;//
  21.      key = ~P3 & 0xff;//無鍵按下返回0fh
  22.      return ( key);
  23. }
  24. //顯示函數
  25. void display(void)
  26. {
  27.    uchar scan=0xfe;
  28.    P2=scan;
  29.    P0=value[key1];
  30. }
  31. //求按鍵值,沒有按鍵返回0ff,按鍵返回鍵值
  32. unsigned char key(void)
  33. {
  34.     unsigned char row,col=0,k=0xff,dd,scan;// 定義行、列、返回值
  35.     scan=0xfe;  // 行掃描碼
  36.     for(row=0;row<4;row++) // 行掃描
  37.       {
  38.          P3=scan; dd=P3/16;  // 行掃描值送P3
  39.          if(dd!=0x0f) // 列線不全為1 ,進入列掃描
  40.             {
  41.                      switch(dd&0x0f)//用case語句求鍵值
  42.                               {
  43.                                  case(0x0e):k=0x00+row*4; break;
  44.                                  case(0x0d):k=0x01+row*4; break;
  45.                                  case(0x0b):k=0x02+row*4; break;
  46.                                  case(0x07):k=0x03+row*4; break;
  47.                               }            
  48.              }
  49.           scan=scan*2+1; // 左移1位
  50.       }
  51.    while(checkkey()!=0x0f);
  52.     return k; // 返回鍵值
  53. }
  54. void main(void)
  55. {  uchar i=0,j=0;
  56.    while(1)
  57.    {  
  58.        key1=key();
  59.        if(key1!=0xff)//如果有鍵按下
  60.          {
  61.                   if(i==0)//如果被減數按下,鍵值賦給key2
  62.                     {key2=key1;}
  63.                   if(i==2)
  64.                     {key3=key1;}//如果減數按下,鍵值賦給key3
  65.                   if(i==4)
  66.                     {
  67.                      key1=key2-key3;//如果(被減數-減數=)操作完成,則再按=,顯示減法結果
  68.                     }
  69.                   display();
  70.                   i++;
  71.                 }  
  72.      }
  73. }
復制代碼

6.實驗總結
我認為實驗比較難的地方是按鍵會有延時,而機器的處理速度太快,這就導致預期的結果和實際顯示的效果不一致。因此在編輯代碼時,一定要考慮到手按鍵會有延時的影響。
在求按鍵值的子程序里,什么時候把按鍵值返回需要根據不同的實驗做相應的改變,例如:按鍵結束后返回按鍵值,和按鍵時返回鍵值的效果是不一樣的,這也導致在主程序中判斷按鍵是否產生的不同。在問題二中,我就是因為沒有在按鍵結束后返回鍵值,導致不能產生正確效果。
If里邊不能嵌套for語句,在實驗一中掃描列時,我嵌套了for,導致程序不能進入for循環。后來我改成了case語句才成功。

以上的Word格式文檔51黑下載地址:
實驗10.docx (219.4 KB, 下載次數: 7)


評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人深夜福利网站 | 日韩中文在线观看 | 一区二区免费视频 | 黄网站免费在线观看 | 成年网站在线观看 | 五月花丁香婷婷 | 欧美久久一级 | 91精品国产综合久久久久 | 成人免费视频观看 | 国产999精品久久久久久 | 国产色婷婷久久99精品91 | 久久国产精品一区二区三区 | 天堂一区二区三区 | 操射视频 | 日韩精品视频在线 | 亚洲精品视频观看 | 国产成人精品一区二区三区视频 | 国产性生活一级片 | 亚洲欧美日韩高清 | 国产精品不卡一区 | 91国在线视频 | 一区二区在线免费观看视频 | 爱爱免费视频网站 | 国产美女永久免费无遮挡 | 精品一区二区三区在线视频 | 国产目拍亚洲精品99久久精品 | 97视频网站 | 成人国产精品色哟哟 | 国产精品不卡视频 | 欧美www在线 | 国产精品美女久久久久aⅴ国产馆 | av天天爽| 欧美激情在线播放 | 99精品久久 | 国产亚洲第一页 | 欧美一级欧美一级在线播放 | 天天舔天天 | 天天天操 | wwwsihu| 午夜黄色| www.免费看片.com |