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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2198|回復: 2
打印 上一主題 下一主題
收起左側

各位大佬,我想通過8255的A口接鍵盤控制B,C口的高低電平,該怎么改程序?

[復制鏈接]
跳轉到指定樓層
樓主
各位大佬,我想通過8255的A口接鍵盤控制B,C口的高低電平(例如,第一個按鍵按下后,PB0變為低電平,再按一下,PB0變為高電平),我應該怎么該程序
  1. #include<reg52.h>
  2. #include<absacc.h>
  3. #define PA XBYTE[0x7cff]   //A口地址定義
  4. #define PB XBYTE[0x7dff]   //B口地址定義
  5. #define PC XBYTE[0x7eff]   //C口地址定義
  6. #define COM XBYTE[0x7fff]  //控制地址定義

  7. void DelayM(unsigned int x)  //延時子程序
  8. {
  9.   unsigned char t;
  10.         while(x--)
  11.         {
  12.           for(t=0;t<120;t++);
  13.         }
  14. }

  15. unsigned char keyscan(void)  //鍵盤掃描
  16. {
  17.         unsigned temp,keynum;
  18.         PA=0xfe;
  19.         temp=PA;
  20.         temp=temp&0xf0;
  21.         if(temp!=0xf0)
  22.         {
  23.                 DelayM(20);
  24.                 temp=PA;
  25.                 temp=temp&0xf0;
  26.                 if(temp!=0xf0)
  27.                 {
  28.                         temp=PA;
  29.                         switch(temp)
  30.                         {
  31.                                 case 0xee:keynum=0;PB=0xfe;break;
  32.                           case 0xde:keynum=1;PB=0xfd;break;
  33.                                 case 0xbe:keynum=2;PB=0xfb;break;
  34.                                 case 0x7e:keynum=3;PB=0xf7;break;
  35.                         }
  36.                         while((temp&0xf0)!=0xf0)
  37.                         {
  38.                                 temp=PA;
  39.                         }
  40.                 }
  41.         }
  42.         
  43.         PA=0xfd;
  44.         temp=PA;
  45.         temp=temp&0xf0;
  46.         if(temp!=0xf0)
  47.         {
  48.                 DelayM(20);
  49.                 temp=PA;
  50.                 temp=temp&0xf0;
  51.                 if(temp!=0xf0)
  52.                 {
  53.                         temp=PA;
  54.                         switch(temp)
  55.                         {
  56.                                 case 0xed:keynum=4;PB=0xef;break;
  57.                           case 0xdd:keynum=5;PB=0xdf;break;
  58.                                 case 0xbd:keynum=6;PB=0xbf;break;
  59.                                 case 0x7d:keynum=7;PB=0x7f;break;
  60.                         }
  61.                         while((temp&0xf0)!=0xf0)
  62.                         {
  63.                                 temp=PA;
  64.                         }
  65.                 }
  66.         }
  67.         
  68.         PA=0xfb;
  69.         temp=PA;
  70.         temp=temp&0xf0;
  71.         if(temp!=0xf0)
  72.         {
  73.                 DelayM(20);
  74.                 temp=PA;
  75.                 temp=temp&0xf0;
  76.                 if(temp!=0xf0)
  77.                 {
  78.                         temp=PA;
  79.                         switch(temp)
  80.                         {
  81.                                 case 0xeb:keynum=8;PC=0xfe;break;
  82.                                 case 0xdb:keynum=9;PC=0xfd;break;
  83.                                 case 0xbb:keynum=10;PC=0xfb;break;
  84.                                 case 0x7b:keynum=11;PC=0xf7;break;
  85.                         }
  86.                         while((temp&0xf0)!=0xf0)
  87.                         {
  88.                                 temp=PA;
  89.                         }
  90.                 }
  91.         }
  92.         
  93.         PA=0xf7;
  94.         temp=PA;
  95.         temp=temp&0xf0;
  96.         if(temp!=0xf0)
  97.         {
  98.                 DelayM(20);
  99.                 temp=PA;
  100.                 temp=temp&0xf0;
  101.                 if(temp!=0xf0)
  102.                 {
  103.                         temp=PA;
  104.                         switch(temp)
  105.                         {
  106.                                 case 0xe7:keynum=12;PC=0xef;break;
  107.                                 case 0xd7:keynum=13;PC=0xdf;break;
  108.                                 case 0xb7:keynum=14;PC=0xbf;break;
  109.                                 case 0x77:keynum=15;PC=0x7f;break;
  110.                         }
  111.                         while((temp&0xf0)!=0xf0)
  112.                         {
  113.                                 temp=PA;
  114.                         }
  115.                 }
  116.         }
  117. }

  118. void main()
  119. {
  120.   COM=0x90;  //方式0,A口為輸入,B,C口為輸出
  121.         PA=0xff;
  122.         PB=0xff;
  123.   PC=0xff;
  124.   while(1)
  125.   {
  126.     keyscan();
  127.   }
  128. }
復制代碼




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

使用道具 舉報

沙發
ID:752974 發表于 2021-1-16 16:11 | 只看該作者
在此提供一點思路,供參考。
u8 temp;
  if(k1)//k1按下
    temp++;
  if(temp >1)
    temp = 0;
if(temp==1)
  PB &= 0xfe;//PB0輸出低電平,LED亮
else
  PB |= 0x01;//PB0輸出高電平,LED滅

回復

使用道具 舉報

板凳
ID:517466 發表于 2021-1-16 19:00 | 只看該作者
我查了8255的資料,感覺你使用好像有問題。如果想作為掃描鍵盤用,你應該使用PC口作為鍵盤矩陣使用。掃描矩陣要求一部分輸出,一部分輸入。
對8255,在設置好控制字后,是沒法讓PA口的一部分成為輸出,而另一部分成為輸出。PB也是一樣的。只有PC口是允許一部分成為輸入、而另一部分成為輸出的。
你的程序中,在設置控制字時,應使
1、PA口作為輸出口,PB口作為輸出口。
2、PC7-PC4作為輸出、PC3-PC0作為輸入;或者PC7-PC4作為輸入、PC3-PC0作為輸出;
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本黄色视 | 久久久久久久久久久国产 | 成人黄色在线 | 国产精品一区二区在线免费观看 | 精品一二三 | 国产麻豆精品视频 | 欧美日本在线观看 | 国产福利91精品一区二区三区 | 欧美日韩视频在线 | 亚洲经典av| 日本福利视频 | 亚洲综合在线视频 | 在线观看免费毛片 | 一级淫片观看 | 国产乱码精品一区二区三 | 日韩激情视频 | 在线小视频 | 清清草视频 | 超碰99在线| 日韩欧美国产综合 | 思思在线视频 | 五月色丁香 | 嫩草国产 | 久久精品一区二区三区不卡牛牛 | 丁香在线视频 | 国产精品激情 | 日韩一级二级三级 | 天堂中文资源在线 | 二区三区视频 | 久久久久一区 | 亚洲一级片 | 国产黄色精品视频 | 欧美精品成人 | 日本精品视频在线 | 一区二区高清 | 小日子的在线观看免费第8集 | 欧美日韩国产一区 | 香蕉视频一区二区 | 欧美啪啪网 | 欧美一二| 国产精品一区二区三区不卡 |