找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2085|回复: 2
收起左侧

各位大佬,我想通过8255的A口接键盘控制B,C口的高低电平,该怎么改程序?

[复制链接]
ID:844447 发表于 2021-1-15 10:27 | 显示全部楼层 |阅读模式
各位大佬,我想通过8255的A口接键盘控制B,C口的高低电平(例如,第一个按键按下后,PB0变为低电平,再按一下,PB0变为高电平),我应该怎么该程序
1.JPG
  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. }
复制代码




回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表