OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9838|回复: 17

STM32 对u8变量的位提取,谢谢

[复制链接]

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
发表于 2014-6-18 19:20:29 | 显示全部楼层 |阅读模式
5金钱
u8 B ;
B = 0x06; //1
HC138A = 1; HC138B = 1; HC138C = 1;  
PDA = B^1;  HC138A = 1;  delay_us(time);  HC138A = 0; //b 产生一个高电平给HC164芯片
PDA = B^5;  HC138A = 1;  delay_us(time);  HC138A = 0; //f
PDA = B^0;  HC138A = 1;  delay_us(time);  HC138A = 0; //a
PDA = B^6;  HC138A = 1;  delay_us(time);  HC138A = 0; //g
PDA = B^4;  HC138A = 1;  delay_us(time);  HC138A = 0; //e
PDA = B^3;  HC138A = 1;  delay_us(time);  HC138A = 0; //d
PDA = B^7;  HC138A = 1;  delay_us(time);  HC138A = 0; //h
PDA = B^2;  HC138A = 1;  delay_us(time);  HC138A = 0; //c  解析B0-B7对应数码管的abcd efgh
PDA = 1;    HC138C = 0; //这里就有关系PDA是高电平,方便后面控制
HC138A=1; HC138B=1; //Y3就是低电平了,就可以显示数字了,
delay_us(time1);
请问大神,在STM32中,怎么对这个“B”进行B^1的操作,谢谢。
有人遇到这样的问题吗?请问下是怎么解决的额,谢谢

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 19:21:38 | 显示全部楼层
自己顶顶起来,求围观,求讨论,应该也有人遇到这样的问题的额,
请问你是怎么解决的,谢谢
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 19:22:00 | 显示全部楼层
还得顶顶顶顶顶顶顶
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2014-6-18 19:36:35 | 显示全部楼层
C语言标准的按位取值操作

PDA = (B & (1 << bit));//bit代表位数,从低位数起.

C51是非标准的处理方式.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 21:11:43 | 显示全部楼层
回复【4楼】shihantu:
---------------------------------
u8 B ;
B = 0x06;  //1
HC138A = 1; HC138B = 1; HC138C = 1;  
PDA = (B & (1 << 1));  HC138A = 1;  delay_us(time);  HC138A = 0; //b 产生一个高电平给HC164芯片
PDA = (B & (1 << 5));  HC138A = 1;  delay_us(time);  HC138A = 0; //f
PDA = (B & (1 << 0));  HC138A = 1;  delay_us(time);  HC138A = 0; //a
PDA = (B & (1 << 6));  HC138A = 1;  delay_us(time);  HC138A = 0; //g
PDA = (B & (1 << 4));  HC138A = 1;  delay_us(time);  HC138A = 0; //e
PDA = (B & (1 << 3));  HC138A = 1;  delay_us(time);  HC138A = 0; //d
PDA = (B & (1 << 7));  HC138A = 1;  delay_us(time);  HC138A = 0; //h
PDA = (B & (1 << 2));  HC138A = 1;  delay_us(time);  HC138A = 0; //c  解析B0-B7对应数码管的abcd efgh
PDA = 1;    HC138C = 0; //这里就有关系PDA是高电平,方便后面控制
HC138A=1; HC138B=1;  //Y3就是低电平了,就可以显示数字了,
delay_us(time1);
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 21:13:48 | 显示全部楼层
回复【4楼】shihantu:
---------------------------------
你好,数码管什么整个黑了,说明PDA(abcdefgh)输出都是0,
/*数码管1显示“1”*/
HC138A = 1; HC138B = 1; HC138C = 1;  
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //b 产生一个高电平给HC164芯片
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //f
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //a
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //g
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //e
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //d
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //h
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //c  解析B0-B7对应数码管的abcd efgh
PDA = 1;    HC138C = 0; //这里就有关系PDA是高电平,方便后面控制
HC138A=1; HC138B=1;  //Y3就是低电平了,就可以显示数字了,
delay_us(time1);
我这样的话,是可以输出“1”的,
谢谢你,请问下,是不是我还有什么没注意到呢?
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 21:40:15 | 显示全部楼层
MDK里的bool型实际占用一个字节, 不算真正的bit.


stm32用bit banding来实际bit级的访问. 不过如果不是追求速度或节省存贮器, 也没有必要用这个功能. 有兴趣查一下手册,弄清楚memery map和地址换算就行了.

如果是想将移槙原有51程序, 我是这样做的:
有些bit定义的直接换成char,
有些sbit定义的, 如:
u8      bdata   CtrlState
sbit CtrlVisable    = CtrlState ^0;
sbit CtrlEnable     = CtrlState ^1;
......
改成位寻址的结构体:
struct{
    u8 CtrlVisable:1;
    u8 CtrlEnable:1;
    ......

}CtrlState;
这个说的是什么意思呢?不理解,
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 22:29:11 | 显示全部楼层
1 这里提供一种方法(简单但是繁琐点)
2 不过没事,都说了STM32功能强大,内存也大,可以实现就好了,
3 还是希望高手指教,
void HC164TEST2(u8 DATAT)
{
switch(DATAT)
{
//case 0x3f: //0
case 0:
HC138A = 1; HC138B = 1; HC138C = 1;  
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //b 产生一个高电平给HC164芯片
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //f
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //a
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //g
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //e
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0;  //d
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //h
PDA = 1;  HC138A = 1;  delay_us(time);  HC138A = 0; //c  解析B0-B7对应数码管的abcd efgh
PDA = 1;    HC138C = 0; //这里就有关系PDA是高电平,方便后面控制
HC138A=1; HC138B=1;  //Y3就是低电平了,就可以显示数字了,
delay_us(time1);
break; 
//case 0x06://1
case 1:

break;
//case 0x5b: // 2
case 2:

break;
//case 0x4f: // 3
case 3:

break;
//case 0x66: // 4
case 4:

break;
//case 0x6d: // 5
case 5:

break;
//case 0x7c://6
case 6:

break;
//case 0x07: //7
case 7:

break;
//case 0x7f: //8
case 8:

break;
//case 0x67: //9
case 9:

break;
default:  //其他的我他妈的不显示
HC138A = 1; HC138B = 1; HC138C = 1;  
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //b 产生一个高电平给HC164芯片
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //f
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //a
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //g
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //e
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //d
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //h
PDA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //c  解析B0-B7对应数码管的abcd efgh
PDA = 1;    HC138C = 0; //这里就有关系PDA是高电平,方便后面控制
HC138A=1; HC138B=1;  //Y3就是低电平了,就可以显示数字了,
delay_us(time1);
break;
}
}
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-18 22:30:47 | 显示全部楼层
顶起来,求围观,求方法
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-18 23:34:20 | 显示全部楼层
 回复【9楼】 wyudcl :
---------------------------------
在另外一个贴回复你了
用联合体+结构体的方式
[mw_shl_code=c,true]//FC游戏手柄数据格式定义 //1,表示没有按下,0表示按下. typedef union _FC_GamePad_TypeDef { u8 ctrlval; struct { u8 a:1; //A键 u8 b:1; //B键 u8 select:1;//Select键 u8 start:1; //Start键 u8 up:1; //上 u8 down:1; //下 u8 left:1; //左 u8 right:1; //右 }b; }FC_GamePad_TypeDef ; extern FC_GamePad_TypeDef fcpad; //fc游戏手柄[/mw_shl_code]
以上,就是一个u8的类型定义.
使用方法:
[mw_shl_code=c,true]//data:得到的Select/Start键数据 //数据格式如下: //data:b4,b5有效. //b4=1,Select键按下 //b5=1,Start键按下 void GAMEPAD_nFun_Decode(u8 data) { if(data&0X10)fcpad.b.select=1; //Select键按下 else fcpad.b.select=0; //Select键松开 if(data&0X20)fcpad.b.start=1; //Start键按下 else fcpad.b.start=0; //Start键松开 } [/mw_shl_code]



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-18 23:34:41 | 显示全部楼层
fcpad.ctrlval就是整个u8的值.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-20 09:30:36 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
void HC164TEST1(u8 DATAD)
{
/*数码管1显示“1”*/
HC138A = 1; HC138B = 1; HC138C = 1;  
if(DATAD&0x02)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //b 1产生一个高电平给HC164芯片
if(DATAD&0x20)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //f 5
if(DATAD&0x01)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //a 0
if(DATAD&0x40)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //g 6
if(DATAD&0x10)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //e 4
if(DATAD&0x08)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //d 3
if(DATAD&0x80)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0;  //h 7
if(DATAD&0x04)PDA = 1;else DA = 0;  HC138A = 1;  delay_us(time);  HC138A = 0; //c 2  解析B0-B7对应数码管的abcd efgh
PDA = 1;    HC138C = 0; //这里就有关系PDA是高电平,方便后面控制
//delay_us(time1);
}
谢谢原子,你说的是不是我上面这个意思,我看不太懂怎么用,是不是,这样的,这可以达到目的,谢谢你。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-20 23:15:46 | 显示全部楼层
回复【12楼】wyudcl:
---------------------------------
哦,不好意思.
你这个下载测试下吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-21 11:54:38 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
谢谢,原子老大,谢谢
回复

使用道具 举报

16

主题

253

帖子

0

精华

高级会员

Rank: 4

积分
565
金钱
565
注册时间
2013-10-16
在线时间
52 小时
 楼主| 发表于 2014-6-21 11:55:31 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
11楼的这个程序,可以实现目的的,
回复

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-6-21 14:16:23 | 显示全部楼层
虽然看不懂,但位操作你可以用位段呀
于20150522停用该账号:http://www.microstar.club
回复

使用道具 举报

5

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2012-8-2
在线时间
8 小时
发表于 2014-10-31 09:59:20 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
我在.h中声明了联合,用extern声明了变量,但还是出现了 Error: L6218E: Undefined symbol main_flag3 (referred from usart.o).

typedef union _MainTabunion_TypeDef     
{  
     u8 ctrlval;  
     struct 
    {  
u8 Bit0:1;  
    u8 Bit1:1;  
    u8 Bit2:1; 
    u8 Bit3:1; 
    u8 Bit4:1; 
    u8 Bit5:1;  
    u8 Bit6:1; 
    u8 Bit7:1; 
  }MainTab;  
}MainTabunion_TypeDef; 

extern MainTabunion_TypeDef  main_flag3
#define welding main_flag3.MainTab.Bit0
#define checksilk_pannel                           main_flag3.MainTab.Bit1
#define save_blank main_flag3.MainTab.Bit2
#define Uart_busy main_flag3.MainTab.Bit3
#define InError main_flag3.MainTab.Bit4
#define InshowError main_flag3.MainTab.Bit5
#define showmodechanged main_flag3.MainTab.Bit6
#define savechn_blank             main_flag3.MainTab.Bit7

.c中Uart_busy=1或者0
conscience,confidence,courage
回复

使用道具 举报

7

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2015-4-28
在线时间
2 小时
发表于 2015-12-24 23:49:31 | 显示全部楼层
回复【11楼】正点原子:
----------------------------
谢谢原子哥的解答
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 20:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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