打印
[STM8]

C语言经典用法累积

[复制链接]
2884|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
catking25|  楼主 | 2015-12-18 09:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
typedef, union 和 struct来处理位变量数据然后在同一处理数据例如:
typedef union
{
struct
{
  u8 fBreak:1;
  u8 fBrock:1;
  u8 fBarerr:1;
  u8 fBatLow:1;
  u8 fBatHig:1;
  u8 fTrap:1;
  u8 fAmpErr:1;
  u8 fPwmDown:1;
}bit;
u8 allbits;
}Fgs_StopState;
在电机控制中或者其他控制中有很多标志位,例如刹车标志,低压,过压,过流标志等需要将在运动中的电机停止下来,我们在检测的时候只需要将为标量置一或置零,例如在定义一个联合体:Fgs_StopState Fstop;将某一位置一或清零就可以这么写:Fstop.bit.fAmpErr = 1;在处理数据的时候,我们便于将数据统一处理,所以再此调用 (xx) =allbits;就可以读出所有变量数据了。例如只要以上的变量只要有一个为一就将电机停止,那么在C语言中我们就可以这样:
                                   if(Fstop.allbits){ //电机停止运行}
                                   else           {//电机继续运行}

沙发
狼牙0354| | 2015-12-18 12:39 | 只看该作者
这样写,代码可读性比较高,不容易出错

使用特权

评论回复
板凳
handleMessage| | 2015-12-18 15:12 | 只看该作者
多谢楼主分享,经典实例啊!!!!

使用特权

评论回复
地板
sourceInsight| | 2015-12-18 15:25 | 只看该作者
Fstop.bit.fAmpErr = 1;??这句代码什么意思啊???

使用特权

评论回复
5
CallReceiver| | 2015-12-18 15:55 | 只看该作者
sourceInsight 发表于 2015-12-18 15:25
Fstop.bit.fAmpErr = 1;??这句代码什么意思啊???

将某一位置一或清零就可以这么写,楼主是这样解释的。(ฅ>ω<*ฅ)

使用特权

评论回复
6
bbapple| | 2015-12-18 16:17 | 只看该作者
为什么这个定义的结构体中定义的变量后的赋值都是1呢?

使用特权

评论回复
7
冰零分子| | 2015-12-18 16:39 | 只看该作者
bbapple 发表于 2015-12-18 16:17
为什么这个定义的结构体中定义的变量后的赋值都是1呢?

那不是赋值,那是定义成员占1位

使用特权

评论回复
8
silence的华华| | 2015-12-18 17:27 | 只看该作者

使用特权

评论回复
9
IC201505| | 2015-12-18 17:29 | 只看该作者
学习了!

使用特权

评论回复
10
cool_coder| | 2015-12-18 17:30 | 只看该作者
C 语言的“位域”(bit field)

使用特权

评论回复
11
oufuqiang| | 2015-12-18 20:41 | 只看该作者
本帖最后由 oufuqiang 于 2015-12-18 20:43 编辑

试了下,真心不错呢,代码效率没有被降低。#include <reg52.h>
#define u8 unsigned char
typedef union
{
struct
{
  u8 fBreak:1;
  u8 fBrock:1;
  u8 fBarerr:1;
  u8 fBatLow:1;
  u8 fBatHig:1;
  u8 fTrap:1;
  u8 fAmpErr:1;
  u8 fPwmDown:1;
}Bit;
u8 allbits;
}Fgs_StopState;
Fgs_StopState Fstop;

void main()
{
        Fstop.Bit.fAmpErr = 1;
        Fstop.allbits=0X00;
        Fstop.allbits=0XAA;
        while(1)
        {
                if(Fstop.allbits)
                        {
                                P0=0X55;
                        }
                else
                        {
                                P0=0XAA;
                        }
        }
}

汇编代码:
编译器好强大的说。




使用特权

评论回复
12
劭峰| | 2015-12-18 21:01 | 只看该作者
不明觉厉

使用特权

评论回复
13
风清扬mxz| | 2015-12-18 21:47 | 只看该作者
呵呵,不错,,不懂的小伙伴可以去看看C语言

使用特权

评论回复
14
leonliu_1128| | 2015-12-18 22:15 | 只看该作者
在CAN里面也必须这样

使用特权

评论回复
15
bbapple| | 2015-12-27 19:36 | 只看该作者
冰零分子 发表于 2015-12-18 16:39
那不是赋值,那是定义成员占1位

哦哦 原来是这样啊。学习啦:lol

使用特权

评论回复
16
numbqq| | 2015-12-29 09:48 | 只看该作者
:lol

使用特权

评论回复
17
董自祝| | 2015-12-29 11:28 | 只看该作者
大哥,下次再转我的帖子的时候请标明转啊!你这样让我怎么在其他地方更新我自己的东西啊:lol

使用特权

评论回复
18
pkuzhx| | 2015-12-29 14:22 | 只看该作者
确实学习了

使用特权

评论回复
19
sourceInsight| | 2015-12-29 21:13 | 只看该作者
CallReceiver 发表于 2015-12-18 15:55
将某一位置一或清零就可以这么写,楼主是这样解释的。(ฅ>ω

哦哦  多谢讲解。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Get busy living or get busy dying~~~ 自己选择的路

67

主题

202

帖子

5

粉丝