你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

学习机器风格的单片机程序(3)

[复制链接]
GKoSon 发布时间:2018-5-3 16:45
正好昨天论坛有童鞋问了一个问题,这是C语音的一个小细节。如下:ok case1:用的比较少 直接用的 struct{ }ringbuf;
  1. #define Buffer_MAX_SIZE 10
  2. struct{
  3.         unsigned int  headPosition;
  4.         unsigned int  tailPosition;
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];
  6. }ringbuf;

  7. int main()
  8. {
  9.     ringbuf.headPosition=2;
  10. }
复制代码
ok case2:墙裂推荐用法 typedef struct { }ringbuf;     ringbuf Ringbuf;
  1. #define Buffer_MAX_SIZE 10
  2. typedef struct {
  3.         unsigned int  headPosition;
  4.         unsigned int  tailPosition;
  5.         unsigned int  *Dat_Buf[Buffer_MAX_SIZE];
  6. }ringbuf;

  7. ringbuf Ringbuf;

  8. int main()
  9. {
  10.         Ringbuf.headPosition=2;
  11. }
复制代码
ok case3:类似于上面 也就是typedef struct _ringbuf{}ringbuf;的 _ringbuf可有可无
  1. <blockquote>#define Buffer_MAX_SIZE 10
复制代码
好了 开始机器风格的第三章,跟第二章一样,但是他更加简洁。第二章用的是case3 本章我们用case2
第一部分:框架
  1. typedef struct
  2. {
  3.     KeyParmaType        KeyParma;
  4.     DeviceFixedPwsType  DevicePwd;
  5.     PwdSavePosType      PwdSavePos;
  6.     PwdSaveVarType      PwdSaveVar;
  7. }_TouchKeyVarType;

  8. typedef struct
  9. {
  10.     void                (*AddOpenLog)( void *pL , BYTE *UsePwd);
  11.     void                (*AddTempPwd)( void *pL , BYTE *ucPwd , DWORD dTimeStamp);
  12.     void                (*TouchI2CInit)( void);
  13.     void                (*TouchLightInit)( void);
  14.     void                (*LightOn)(void);
  15.     void                (*LightOff)(void);
  16.     void                (*ParmaClear)(void *pL);
  17.     BYTE                (*InspectPwd)(void *pL , BYTE *UserPwd , BYTE *InputPwd , BYTE len);
  18.     WORD                (*ReadTouchIc)(void);//Read value form touch ic
  19.     TouchKeyValeType    (*ReadKeyVaule )( void *pL); //Read key value
  20. }_TouchKeyConstType;

  21. typedef struct
  22. {
  23.     _TouchKeyConstType  *TKConst;
  24.     _TouchKeyVarType    *TKVar;
  25. }_TouchKeyHandleType , *TouchKeyHandleType;
复制代码
可以看到 它的风格_TouchKeyVarType这种,_ 开头的就直接是名字了。最后封在一起
                      _TouchKeyHandleType , *TouchKeyHandleType;----------用_     和    名字区分
前面第二章是 BeeperType,           *PBeeper;--------------------用Type和*p名字区分


第二部分:实例化
  1. _TouchKeyVarType  TouchKeyVar;
复制代码
一样的 数据成员暂时不管
方法成员则实例化 比如下面的实现
void SetTouchLightOpen ( void )
{
    GPIO_SetBits ( TOUCH_LIGHT_PORT, TOUCH_LIGHT_PIN );
}


第三部:使用
现在gTKHandle就是一个全局变量了,它是一个句柄,(不是指针它是实体),它包含password的全部属性,拿去用吧。
如果喜欢指针怎么办?
  1. void vKeyInputTask ( void * pvParameters )
  2. {
  3.     TouchKeyHandleType pHandle = &gTKHandle;//指针出场
复制代码



最后详细说一个案例:注意ReadKeyVaule
1
void vKeyInputTask ( void * pvParameters )
{
    TouchKeyHandleType pHandle = &gTKHandle;//指针出场
    KeyParmaType *KeyData = &pHandle->TKVar->KeyParma;
    BYTE ic_door = 0;

    pwd_log ( "Into touch key task ,password is init...\r\n" );
    PasswordParmaInit ( pHandle );

    while ( 1 )
    {
        if ( xSemaphoreTake ( xBinarySemaphoreTouchPwd, portMAX_DELAY ) == pdTRUE )
        {
            if ( KeyData->ucInputKeyFlag == INPUT_KEY )
            {
                TouchKeyValeType    KeyValue = KEY_INIT;

                KeyData->ucInputKeyFlag = NO_KEY;
                KeyValue = pHandle->TKConst->ReadKeyVaule ( pHandle );---完成死循环 定时轮训这个函数。

。。。}

2
前面已经初始化了
_TouchKeyConstType TouchKeyConst =
{
    .AddTempPwd = GetTempPwd,
    .ReadKeyVaule = ReadTouchKeyVaule,
。。。};

3
我们看ReadTouchKeyVaule的实现(你无法找到它的调用的啦!!)
  1. TouchKeyValeType ReadTouchKeyVaule ( void *pL )
  2. {
  3.     TouchKeyHandleType pHandle = ( TouchKeyHandleType ) pL;
  4.     WORD ReadVal = 0;
  5.     TouchKeyValeType ucKey = KEY_INIT;

  6.     ReadVal = pHandle->TKConst->ReadTouchIc();

  7.     switch ( ReadVal )
  8.     {
  9.     case 0x0001:
  10.         ucKey = KEY_ENTER;
  11.         pwd_log ( "Input # key \r\n" );
  12.         break;

  13.     case 0x0002:
  14.         ucKey = KEY_0;
  15.         pwd_log ( "Input 0 key  \r\n" );
  16.         break;

  17.     case 0x0004:
  18.         ucKey = KEY_BACK;
  19.         pwd_log ( " Input * key  \r\n" );
  20.         break;

  21.     case 0x0008:
  22.         ucKey = KEY_9;
  23.         pwd_log ( " Input 9 key  \r\n" );
  24.         break;

  25.     case 0x0010:
  26.         ucKey = KEY_8;
  27.         pwd_log ( " Input 8 key  \r\n" );
  28.         break;

  29.     case 0x0020:
  30.         ucKey = KEY_7;
  31.         pwd_log ( " Input 7 key  \r\n" );
  32.         break;

  33.     case 0x0040:
  34.         ucKey = KEY_6;
  35.         pwd_log ( " Input 6 key  \r\n" );
  36.         break;

  37.     case 0x0080:
  38.         ucKey = KEY_5;
  39.         pwd_log ( " Input 5 key  \r\n" );
  40.         break;

  41.     case 0x0100:
  42.         ucKey = KEY_4;
  43.         pwd_log ( " Input 4 key  \r\n" );
  44.         break;

  45.     case 0x0200:
  46.         ucKey = KEY_3;
  47.         pwd_log ( " Input 3 key  \r\n" );
  48.         break;

  49.     case 0x0400:
  50.         ucKey = KEY_2;
  51.         pwd_log ( " Input 2 key  \r\n" );
  52.         break;

  53.     case 0x0800:
  54.         ucKey = KEY_1;
  55.         pwd_log ( " Input 1 key  \r\n" );
  56.         break;

  57.     default :
  58.         pwd_log ( "Read error value = %x.\r\n", ReadVal );
  59.         break;
  60.     }

  61.     BeepRunCycle ( gpBeeper, 1, 50, 10 );
  62.     return ucKey;
  63. }
复制代码
隔一段时间就执行一下,知道你按密码了。类似于刷卡板实时轮训,知道你刷卡了。

是的 上面的函数嵌套了按键板的IIC读函数,同上
  1. #define DEVICE_ID   0xA0
  2. WORD ReadTouchKey(void)
  3. {
  4.   BYTE uD[4]={0x00,0x00,0x00,0x00};
  5.   uint16_t touchDataTemp = 0;
  6.   //LED_Backlight_Out(1);
  7.   //iic_read_all(DEVICE_ID,8,4,uD);
  8.   TouchKeyReadValue(&gTouchKeyI2c,0xA0,8 ,uD , 4);
  9.   touchDataTemp = uD[1];
  10.   touchDataTemp <<= 8;
  11.   touchDataTemp |= uD[0];

  12.   return touchDataTemp;
  13. }
复制代码


收藏 评论2 发布时间:2018-5-3 16:45

举报

2个回答
GKoSon 回答时间:2018-5-3 18:03:23
正在看这个虐心的代码
老大让我给产品提提建议
我。。。。。
我就说我们看到的吧
编码风格
2.png
1.png
单片机爱好者 回答时间:2020-6-24 19:41:02
本来三行就搞定的东西,写这么多,看不懂~~~~~

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版