找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1591|回复: 2
打印 上一主题 下一主题
收起左侧

IAP15W系列单片机怎样把不同的IO口组成一个八位数据

[复制链接]
跳转到指定楼层
楼主
ID:878906 发表于 2021-2-26 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如把P0.1、P0.2、P0.3、P0.4和P4.1、P4.2、P4.3、P4.4组成一个八位的数据,然后对这八位的数据进行读写?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2021-2-26 16:03 | 只看该作者
回复

使用道具 举报

板凳
ID:213173 发表于 2021-2-26 21:13 | 只看该作者
给你一个矩阵键盘4×4异组非顺序端口读写程序示例参考
  1. #include <STC15F2K60S2.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define PD ((P2<<3&0x80)|(P2<<4&0x40)|(P3&0x3f))//P2.4/P2.2+P3.0~3.5

  5. sbit dula=P2^6;                        //573段选
  6. sbit wela=P2^7;                        //573位选

  7. uchar code table[]={                //数组
  8.         0x3f,0x06,0x5b,0x4f,
  9.         0x66,0x6d,0x7d,0x07,
  10.         0x7f,0x6f,0x77,0x7c,
  11.         0x39,0x5e,0x79,0x71};
  12. uchar data dis_buf[2];
  13. uchar key=0;
  14. bit wei=0;

  15. void PX(uchar x)
  16. {
  17.         P3&=0xc0;                //低6位清0,P36、37不变
  18.         P3|=(x&0x3f);        //P3低6位赋值
  19.         P2&=0xeb;                //P2.4、2.2清0,其它位不变
  20.         P2|=((x>>3&0x10)|(x>>4&0x04));//P2.4、2.2赋值
  21. }
  22. void keyscan()                                        //按键扫描程序
  23. {
  24.         static bit sign=0;                        //按键自锁标志
  25.         static uint count=0;                //消抖计数变量                       
  26.         uchar num=0;                                        //临时变量
  27.         PX(0xf0);                                        //赋值PX 1111 0000
  28.         if(PD!=0xf0)                                //检测有按键按下
  29.         {
  30.                 if((++count>=100)&&(sign==0))        //100~1000,根据主循环周期调整约10~20ms
  31.                 {                       
  32.                         sign=1;                                //按键自锁标志置1
  33.                         num=PD;                                //保存PD值xxxx 0000,x为0或1
  34.                         num|=0x0f;                        //保存num按位或0x0f值xxxx 1111
  35.                         PX(num);                                //赋值PX xxxx 1111
  36.                         num=PD;                                //保存PD xxxx xxxx
  37.                         switch(num)
  38.                         {
  39.                                 case 0xee: key= 1; break;
  40.                                 case 0xde: key= 2; break;
  41.                                 case 0xbe: key= 3; break;
  42.                                 case 0x7e: key= 4; break;
  43.                                 case 0xed: key= 5; break;
  44.                                 case 0xdd: key= 6; break;
  45.                                 case 0xbd: key= 7; break;
  46.                                 case 0x7d: key= 8; break;
  47.                                 case 0xeb: key= 9; break;
  48.                                 case 0xdb: key=10; break;
  49.                                 case 0xbb: key=11; break;
  50.                                 case 0x7b: key=12; break;
  51.                                 case 0xe7: key=13; break;
  52.                                 case 0xd7: key=14; break;
  53.                                 case 0xb7: key=15; break;
  54.                                 case 0x77: key=16; break;
  55.                         }
  56.                 }
  57.         }
  58.         else                                                //键抬起
  59.         {
  60.                 sign=0;                                //按键自锁标志清0
  61.                 count=0;                                //消抖计数清0
  62.         }
  63. }

  64. int main()
  65. {
  66.         while(1)
  67.         {
  68.                 keyscan();
  69.                 dis_buf[0]=table[key/10];
  70.                 dis_buf[1]=table[key%10];
  71.                 P0=0x00;//消隐
  72.                 dula=1;
  73.                 dula=0;
  74.                 if(wei==0)
  75.                 {
  76.                         P0=0xfe;//送位码
  77.                         wela=1;
  78.                         wela=0;
  79.                         P0=dis_buf[0];//送段码
  80.                         dula=1;
  81.                         dula=0;
  82.                         wei=1;
  83.                 }
  84.                 else
  85.                 {
  86.                         P0=0xfd;
  87.                         wela=1;
  88.                         wela=0;
  89.                         P0=dis_buf[1];
  90.                         dula=1;
  91.                         dula=0;
  92.                         wei=0;
  93.                 }
  94.         }
  95. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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