标题: 单片机不同的io口怎样用十六进制赋值? [打印本页]

作者: xia20    时间: 2020-4-3 02:01
标题: 单片机不同的io口怎样用十六进制赋值?
如:p1.0 p2.4 p3.3 p3.6 整合成一个如下用:mn(0xff)。
本人新手,希望大佬您的指点,鄙人不胜感激!

作者: csmyldl    时间: 2020-4-3 08:21
把各IO口的低位排右,8根IO口线依次为高电平为1,低电平为0排好,如11110100,按第4位转换成十六进制就行,上述排列为F4
作者: moluxiyan    时间: 2020-4-3 08:29
你把十六进制赋值对应的位提取出来,然后分别赋值给那些IO口,约定好哪个位对应那个IO口

作者: 那个谁和谁    时间: 2020-4-3 08:52
不行吧,都不是一组口
作者: 春风十里吹    时间: 2020-4-3 09:18
用位域,具体你上网上参考一下别人的代码,用到的基本知识是结构体与共用体
作者: hbcqd    时间: 2020-4-3 09:20
可以打开Keil编程的#include<reg51.h>就可以看到以下内容:
/*  BYTE Register  */
sfr P0   = 0x80;
sfr P1   = 0x90;
sfr P2   = 0xA0;
sfr P3   = 0xB0;根据以上这个,可以确定你提出的问题,谢谢分享!

作者: 春风十里吹    时间: 2020-4-3 09:54
还是给你看看是行径 回事,如下:

#include <stdio.h>

//下面是你要整合的I/O口
/*
#define  SEG1 p1.0
#define  SEG2 p2.4
#define  SEG2 p3.3
#define  SEG2 p3.6
.................
*/
#define  uint unsigned  int
union test{
    uint reg;
    struct {
        uint SEG1:1;
        uint SEG2:1;
        uint SEG3:1;
        uint SEG4:1;
        uint SEG5:1;
        uint SEG6:1;
        uint SEG7:1;
        uint SEG8:1;


    }bits;
};


int main(void)
{
    union test mytest;

    mytest.reg = 0x3a;//这里是你要放的数据,可以在C编译器上改变数据看执行结果


    printf("SEG1=%x\n", mytest.bits.SEG1);
    printf("SEG2=%x\n", mytest.bits.SEG2);
    printf("SEG3=%x\n", mytest.bits.SEG3);
    printf("SEG4=%x\n", mytest.bits.SEG4);
    printf("SEG5=%x\n", mytest.bits.SEG5);
    printf("SEG6=%x\n", mytest.bits.SEG6);
    printf("SEG7=%x\n", mytest.bits.SEG7);
    printf("SEG8=%x\n", mytest.bits.SEG8);



    return 0;
}


作者: xia20    时间: 2020-4-3 17:23
谢谢各位大佬指点。
作者: liu5678    时间: 2020-4-3 18:26
七楼说的挺好的,结构体与共用体就行
作者: 青YU    时间: 2021-3-10 14:48
各位大佬,我按照7楼的操作去给IO口赋值,可以实现联合体里的数据改变,但是IO口没有相应的变化

1615358837(1).png (19.3 KB, 下载次数: 55)

1615358837(1).png

1615358802(1).png (16.63 KB, 下载次数: 71)

1615358802(1).png

作者: 青YU    时间: 2021-3-10 14:51
各位大佬,我按照7楼大佬的操作去做,对联合体的color赋值,最后的结果并没有完成对IO的赋值,只有结构体里的变量改变,请问是哪里有问题吗
#define   LED5_P                P24
#define   LED4_P                P25
#define   LED3_P                P26
#define   LED2_P                P01
#define   LED1_P                P27
#define   LED_R                 P03
#define   LED_G                 P02
#define   LED_B                 P00
typedef union {
        u16 color;
        struct {
                u16 LED1_P:1;//低位
                u16 LED2_P:1;
                u16 LED3_P:1;
                u16 LED4_P:1;
                u16 LED5_P:1;
                u16 LED_R:1;
                u16 LED_G:1;
                u16 LED_B:1;//高位
        }bits;
}led_rgb_t;

extern led_rgb_t  led_rgb;
作者: han0097    时间: 2021-5-29 22:49
青YU 发表于 2021-3-10 14:51
各位大佬,我按照7楼大佬的操作去做,对联合体的color赋值,最后的结果并没有完成对IO的赋值,只有结构体里 ...

怎么样?解决没?
作者: 1027669350    时间: 2021-11-9 19:46
青YU 发表于 2021-3-10 14:51
各位大佬,我按照7楼大佬的操作去做,对联合体的color赋值,最后的结果并没有完成对IO的赋值,只有结构体里 ...

我也是这个问题,有好的解决方法吗

作者: 188610329    时间: 2021-11-9 20:39
1027669350 发表于 2021-11-9 19:46
我也是这个问题,有好的解决方法吗

又是你???……,  说了没有好方法,不管是联合体也好,函数也好,说到底,到最后实施的时候,还是要分别对每个IO进行赋值,你看了单片机输入输出结构,对总线的定义有了理解,就不会这么问了。
作者: lkc8210    时间: 2021-11-10 09:35
1027669350 发表于 2021-11-9 19:46
我也是这个问题,有好的解决方法吗

void IO_out(uchar dat)
{
  P34=dat&0x80;
  P30=dat&0x40;
  P12=dat&0x20;
  P10=dat&0x10;
  P30=dat&0x08;
  P33=dat&0x04;
  P13=dat&0x02;
  P11=dat&0x01;
}
作者: npn    时间: 2021-11-10 14:11
单片机、不管是什么数字芯片只能处理二进制,十六进制是编译器的写法。
作者: hack2800    时间: 2023-6-23 14:40
lkc8210 发表于 2021-11-10 09:35
void IO_out(uchar dat)
{
  P34=dat&0x80;

感谢分享!
作者: coody_sz    时间: 2023-6-23 16:55
位操作,一位一位传输。
作者: 君工创    时间: 2023-6-24 04:20
楼主想对端口重组
作者: 三极管一样的人    时间: 2024-12-19 08:57
lkc8210 发表于 2021-11-10 09:35
void IO_out(uchar dat)
{
  P34=dat&0x80;

AI 修复了下
void IO_out(uchar dat) {
    // 假设P34、P30、P33、P12、P10、P13、P11是单片机上的引脚
    // 这里使用位与运算和位掩码来确定每个引脚的状态
    P34 = (dat & 0x80) ? 1 : 0; // 如果dat的最高位是1,则P34=1;否则P34=0
    P30 = (dat & 0x40) ? 1 : 0; // 如果dat的次高位是1,则P30=1(注意这里修改了原代码中的重复错误)
    P12 = (dat & 0x20) ? 1 : 0;
    P10 = (dat & 0x10) ? 1 : 0;
    // 修正了P30的重复使用,改为P31(假设存在P31引脚)
    P31 = (dat & 0x08) ? 1 : 0;
    P33 = (dat & 0x04) ? 1 : 0;
    P13 = (dat & 0x02) ? 1 : 0;
    P11 = (dat & 0x01) ? 1 : 0; // 如果dat的最低位是1,则P11=1;否则P11=0
}

作者: Graves    时间: 2024-12-19 10:00
三极管一样的人 发表于 2024-12-19 08:57
AI 修复了下
void IO_out(uchar dat) {
    // 假设P34、P30、P33、P12、P10、P13、P11是单片机上的引 ...

条件运算符不用也行,可以试一下,结果一样的
作者: jjy1039    时间: 2024-12-19 11:35
void mn(uchar dat)//从dat的低位到高位依次给io赋值
{
p10= dat & 1 ;
p24= (dat & (1 << 1))>>1 ;
p33= (dat & (1 << 2))>>2 ;
p36= (dat & (1 << 3))>>3 ;
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1