[STM8] C语言经典用法累积

[复制链接]
3184|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;??这句代码什么意思啊???
CallReceiver 发表于 2015-12-18 15:55 来自手机 | 显示全部楼层
sourceInsight 发表于 2015-12-18 15:25
Fstop.bit.fAmpErr = 1;??这句代码什么意思啊???

将某一位置一或清零就可以这么写,楼主是这样解释的。(ฅ>ω<*ฅ)
bbapple 发表于 2015-12-18 16:17 来自手机 | 显示全部楼层
为什么这个定义的结构体中定义的变量后的赋值都是1呢?
冰零分子 发表于 2015-12-18 16:39 | 显示全部楼层
bbapple 发表于 2015-12-18 16:17
为什么这个定义的结构体中定义的变量后的赋值都是1呢?

那不是赋值,那是定义成员占1位
silence的华华 发表于 2015-12-18 17:27 | 显示全部楼层
IC201505 发表于 2015-12-18 17:29 | 显示全部楼层
学习了!
cool_coder 发表于 2015-12-18 17:30 | 显示全部楼层
C 语言的“位域”(bit field)
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;
                        }
        }
}

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



劭峰 发表于 2015-12-18 21:01 | 显示全部楼层
不明觉厉
风清扬mxz 发表于 2015-12-18 21:47 | 显示全部楼层
呵呵,不错,,不懂的小伙伴可以去看看C语言
leonliu_1128 发表于 2015-12-18 22:15 | 显示全部楼层
在CAN里面也必须这样
bbapple 发表于 2015-12-27 19:36 | 显示全部楼层
冰零分子 发表于 2015-12-18 16:39
那不是赋值,那是定义成员占1位

哦哦 原来是这样啊。学习啦:lol
numbqq 发表于 2015-12-29 09:48 | 显示全部楼层
董自祝 发表于 2015-12-29 11:28 | 显示全部楼层
大哥,下次再转我的帖子的时候请标明转啊!你这样让我怎么在其他地方更新我自己的东西啊:lol
pkuzhx 发表于 2015-12-29 14:22 | 显示全部楼层
确实学习了
sourceInsight 发表于 2015-12-29 21:13 | 显示全部楼层
CallReceiver 发表于 2015-12-18 15:55
将某一位置一或清零就可以这么写,楼主是这样解释的。(ฅ>ω

哦哦  多谢讲解。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

67

主题

202

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部