活动介绍

/*********右按键扫描*********/ uchar Right_key_boot() { /**************************/ if(Right_Key_EN==0)return(0); else if(Right_Espresso_Button!=1&&Right_Key_LED) { while(Right_Espresso_Button!=1&&Right_Espresso_Press_Bit==0) { delay_us(1); if(Right_Key_Shake_Count++>=10) { Right_Espresso_Press_Bit=1; Right_Key_Shake_Count=10; } } if(Right_Espresso_Press_Bit) { if(Right_Lungo_Button!=1||Right_Play_Button!=1||Right_Key_Long_Press_Bit)return(0); else if(Right_Key_Press_Time>30) { Right_Espresso_Press_Bit=0; Right_Key_Long_Press_Bit=1; return(Right_Espresso_Button_Long_Press); } } } else if(Right_Espresso_Press_Bit&&Right_Key_Long_Press_Bit!=1) { Right_Espresso_Press_Bit=0; return(Right_Espresso_Button_Press); } /**************************/ else if(Right_Lungo_Button!=1&&Right_Key_LED) { while(Right_Lungo_Button!=1&&Right_Lungo_Press_Bit==0) { delay_us(1); if(Right_Key_Shake_Count++>=10) { Right_Lungo_Press_Bit=1; Right_Key_Shake_Count=10; } } if(Right_Lungo_Press_Bit) { if(Right_Espresso_Button!=1||Right_Play_Button!=1||Right_Key_Long_Press_Bit)return(0); else if(Right_Key_Press_Time>30) { Right_Lungo_Press_Bit=0; Right_Key_Long_Press_Bit=1; return(Right_Lungo_Button_Long_Press); } } } else if(Right_Lungo_Press_Bit&&Right_Key_Long_Press_Bit!=1) { Right_Lungo_Press_Bit=0; return(Right_Lungo_Button_Press); } /**************************/ else if(Right_Play_Button!=1) { while(Right_Play_Button!=1&&Right_Play_Press_Bit==0) { delay_us(1); if(Right_Key_Shake_Count++>=10) { Right_Play_Press_Bit=1; Right_Key_Shake_Count=10; } } if(Right_Play_Press_Bit) { if(Right_Espresso_Button!=1||Right_Lungo_Button!=1||Right_Key_Long_Press_Bit)return(0); else if(Right_Key_Press_Time>30) { Right_Play_Press_Bit=0; Right_Key_Long_Press_Bit=1; return(Right_Play_Button_Long_Press); } } } else if(Right_Play_Press_Bit&&Right_Key_Long_Press_Bit!=1) { Right_Play_Press_Bit=0; return(Right_Play_Button_Press); } /**************************/ else { Right_Key_Press_Time=0; Right_Key_Press_Bit=0; Right_Key_Long_Press_Bit=0; Right_Key_Shake_Count=0; Right_Espresso_Press_Bit=0; Right_Lungo_Press_Bit=0; Right_Play_Press_Bit=0; } //按键按下定时,按键按下标志,按键长按标志,按键防抖计时器 return(0); }

时间: 2025-04-12 17:18:48 浏览: 28
<think>嗯,我现在需要分析用户提供的这段C语言代码,特别是Right_key_boot函数。这个函数看起来是一个右按键扫描程序,用于处理多个按钮的输入,包括消抖、短按和长按的判断。首先,我应该理解整个函数的结构和各个条件分支的作用。 首先,函数返回类型是uchar,说明返回的是无符号字符型,可能代表不同的按键事件。函数开头检查Right_Key_EN是否为0,如果是,直接返回0,可能表示按键功能被禁用。接下来是三个主要的部分,分别处理Right_Espresso_Button、Right_Lungo_Button和Right_Play_Button这三个按钮的扫描。 每个按钮的处理逻辑类似:首先检查按钮是否被按下(比如Right_Espresso_Button!=1),并且Right_Key_LED是否有效。然后进入一个循环,持续检测按钮状态,同时进行消抖处理,通过delay_us(1)和Right_Key_Shake_Count的累加,直到计数器超过10次,设置对应的Press_Bit标志。这表明这里用了软件消抖,通常按键抖动会在几毫秒内,所以每次延时1微秒,累计10次可能不够,但可能实际硬件情况不同。 接下来,如果Press_Bit被设置,会检查其他按钮是否也被按下,或者长按标志是否存在,如果有冲突则返回0。否则,判断按键按下时间是否超过30个单位(可能是毫秒或某种计时单位),如果是,则设置长按标志,并返回对应的长按事件。否则,在后续的条件中,如果Press_Bit存在且没有长按,则返回短按事件。 最后的else部分重置所有变量,可能是在没有按键按下时进行状态清零。最后的返回0表示没有按键事件发生。 不过,我需要确认每个条件的顺序是否正确。例如,当处理完一个按钮后,其他按钮的处理是否会被忽略,因为使用了else if链。这可能意味着按钮有优先级,Espresso按钮的优先级最高,然后是Lungo,最后是Play。此外,长按的判断依赖于Right_Key_Press_Time是否大于30,这个时间变量在哪里更新呢?可能在定时器中断或其他地方累加,但函数里没有看到对它的修改。 另外,变量如Right_Key_Shake_Count在每个按钮处理中被使用,但可能没有独立计数器,这可能导致不同按钮之间的干扰。例如,处理Espresso按钮时,Right_Key_Shake_Count增加到10,如果此时另一个按钮被按下,是否会影响计数?不过每个按钮的处理块里都有将Shake_Count重置为10,可能这是为了在确认按下后保持状态,但需要确认是否有问题。 还有,每次进入按钮处理时,都会检查其他两个按钮是否未被按下,这是否意味着这些按钮是互斥的?或者设计上是当有多个按钮按下时不响应任何事件? 最后,函数中的Right_Key_Press_Time在长按判断时被使用,但在这个函数里并没有看到它的增加,可能在外部更新。此外,所有标志位在函数末尾的else块中被清零,这可能是在没有按键按下时重置状态,但如果有多个按钮同时按下,或者处理过程中某些条件不满足,是否会导致状态未正确清除? 总结来说,这个函数通过轮询三个按钮的状态,结合消抖和长按检测,返回不同的事件类型。但需要确认变量作用域和更新时机是否正确,以及是否有优先级或互斥逻辑的问题。</think>以下是对 `Right_key_boot()` 函数的逐层解析: --- ### **一、函数功能概述** 这是一个**右侧按键扫描函数**,用于检测右側三个物理按键(浓缩咖啡键、大杯咖啡键、播放键)的短按、长按事件,并通过返回值通知系统按键状态。核心逻辑包括: 1. **按键消抖**:通过计数器消除机械抖动。 2. **长按检测**:判断按键是否持续按住超过阈值。 3. **互斥检测**:防止多键同时触发。 4. **状态重置**:无按键时清零标志位。 --- ### **二、代码结构分析** #### **1. 全局控制与初始化** ```c if(Right_Key_EN == 0) return(0); // 若按键功能禁用,直接返回 ``` - **`Right_Key_EN`**:全局使能标志,控制右侧按键是否生效。 #### **2. 按键扫描逻辑(以浓缩咖啡键为例)** ```c else if(Right_Espresso_Button != 1 && Right_Key_LED) { // 消抖循环:检测按键持续按下 while(Right_Espresso_Button != 1 && Right_Espresso_Press_Bit == 0) { delay_us(1); if(Right_Key_Shake_Count++ >= 10) { // 累计10次检测(约10μs消抖) Right_Espresso_Press_Bit = 1; // 标记按键已稳定按下 Right_Key_Shake_Count = 10; // 防抖计数器上限 } } // 长按检测 if(Right_Espresso_Press_Bit) { // 互斥检查:其他键未按下且无长按标志 if(Right_Lungo_Button != 1 || Right_Play_Button != 1 || Right_Key_Long_Press_Bit) return(0); else if(Right_Key_Press_Time > 30) { // 长按时间阈值(假设单位为ms) Right_Key_Long_Press_Bit = 1; // 标记长按事件 return(Right_Espresso_Button_Long_Press); // 返回长按编码 } } } // 短按处理 else if(Right_Espresso_Press_Bit && Right_Key_Long_Press_Bit != 1) { Right_Espresso_Press_Bit = 0; return(Right_Espresso_Button_Press); // 返回短按编码 } ``` - **关键变量**: - **`Right_Key_Shake_Count`**:消抖计数器,累计10次后确认有效按键。 - **`Right_Key_Press_Time`**:按键按住时长(需外部计时器更新)。 - **`Right_Key_Long_Press_Bit`**:长按事件标志,避免重复触发。 #### **3. 其他按键逻辑** - **大杯咖啡键(`Right_Lungo_Button`)** 和 **播放键(`Right_Play_Button`)** 的逻辑与浓缩咖啡键完全对称,优先级依次降低(浓缩 > 大杯 > 播放)。 #### **4. 状态重置** ```c else { Right_Key_Press_Time = 0; // 清零按下时间 Right_Key_Press_Bit = 0; // 重置按下标志 Right_Key_Long_Press_Bit = 0; // 清除长按标志 Right_Key_Shake_Count = 0; // 复位消抖计数器 // 清除所有按键的Press_Bit标志 Right_Espresso_Press_Bit = 0; Right_Lungo_Press_Bit = 0; Right_Play_Press_Bit = 0; } ``` - **触发条件**:无任何按键按下时,彻底重置所有状态。 --- ### **三、关键设计细节** #### **1. 消抖机制** - 使用 `delay_us(1)` 微秒级延时,累计10次检测(约10μs),属于**宽松消抖策略**,适用于低抖动环境。 - 若实际抖动时间较长(如20ms),需增大计数器阈值。 #### **2. 长按判定** - 长按阈值 `Right_Key_Press_Time > 30`,假设单位为毫秒,则30ms过短(通常长按需500ms~1s),可能需结合外部计时器调整。 #### **3. 互斥逻辑** - 检测某按键时,若其他键按下或已有长按标志,则返回0,避免多键冲突。 #### **4. 优先级设计** - 按键扫描按 **浓缩 → 大杯 → 播放** 顺序处理,高优先级按键会阻塞低优先级键的检测。 --- ### **四、潜在改进点** 1. **消抖时间优化**:根据实际硬件调整计数器阈值(如20次对应20μs)。 2. **长按阈值调整**:将 `30` 改为更大值(如 `500`)以符合用户习惯。 3. **独立计数器**:为每个按键分配独立消抖计数器,避免互相干扰。 4. **非阻塞设计**:避免 `while` 循环阻塞主程序,建议用状态机+定时器实现。 --- ### **五、调用示例** ```c // 在定时中断或主循环中调用 uchar key_event = Right_key_boot(); switch(key_event) { case Right_Espresso_Button_Press: start_espresso(); // 短按触发浓缩咖啡 break; case Right_Espresso_Button_Long_Press: enter_config_mode(); // 长按进入配置模式 break; // 其他按键类似处理 } ``` 希望以上分析能帮助您理解代码逻辑!
阅读全文

相关推荐

#include "main.h" /* LED显示 */ uchar ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; /* 数码管显示 */ uchar Seg_Slow_Down; // 数码管减速 uchar Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // 数码管显示的值 uchar Seg_Pos; // 数码管指示 uchar Seg_Point[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 某位是否显示小数点 /* 键盘方面 */ uchar Key_Slow_Down; /* 数据 */ uchar read_data; uchar write_data; /* 键盘处理函数 */ void Key_Proc() { static uchar Key_Val, Key_Down, Key_Up, Key_Old; if (Key_Slow_Down) return; Key_Slow_Down = 1; Key_Val = Key_Read(); Key_Down = Key_Val & (Key_Old ^ Key_Val); Key_Up = ~Key_Val & (Key_Old ^ Key_Val); Key_Old = Key_Val; if (Key_Down > 4) write_data = Key_Down; if (Key_Down == 4) { EEPROM_Write(&write_data, 0, 1); } } /* 数码管处理函数 */ void Seg_Proc() { if (Seg_Slow_Down) return; Seg_Slow_Down = 1; Seg_Buf[0] = read_data / 100 % 10; Seg_Buf[1] = read_data / 10 % 10; Seg_Buf[2] = read_data % 10; Seg_Buf[5] = write_data / 100 % 10; Seg_Buf[6] = write_data / 10 % 10; Seg_Buf[7] = write_data % 10; } /* LED处理函数 */ void Led_Proc() { } /* 定时器0中断初始化 */ void Timer0_Init(void) // 1毫秒@12.000MHz { AUXR &= 0x7F; // 定时器时钟12T模式 TMOD &= 0xF0; // 设置定时器模式 TL0 = 0x18; // 设置定时初始值 TH0 = 0xFC; // 设置定时初始值 TF0 = 0; // 清除TF0标志 TR0 = 1; // 定时器0开始计时 ET0 = 1; EA = 1; } /* 定时器0中断函数 */ void Timer0_ISR(void) interrupt 1 { if (++Key_Slow_Down == 10) Key_Slow_Down = 0; if (++Seg_Slow_Down == 500) Seg_Slow_Down = 0; if (++Seg_Pos == 8) Seg_Pos = 0; Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]); Led_Disp(Seg_Pos, ucLed[Seg_Pos]); } void main() { System_Init(); Timer0_Init(); EEPROM_Read(&read_data, 0, 1); while (1) { Key_Proc(); Seg_Proc(); Led_Proc(); } }如果改成int型的怎么读取

/** * \addtogroup EL9800Appl EL9800 application * @{ * This application includes three functional modules:
* Digital Input
* Digital Outputs
* Analog Input
* The objects of the modules are defined according the ETG.5001.
*/ /** \file el9800appl.h \author [email protected] \brief EL9800 Application defines, typedefs and global variables \version 5.01
Changes to version - :
V5.01 : Start file change log */ #ifndef _EL9800APPL_H_ #define _EL9800APPL_H_ /*----------------------------------------------------------------------------------------- ------ ------ Includes ------ -----------------------------------------------------------------------------------------*/ #include "ecatappl.h" /*----------------------------------------------------------------------------------------- ------ ------ Defines and Typedef ------ -----------------------------------------------------------------------------------------*/ /** * \addtogroup PdoMappingObjects PDO Mapping Objects * * Digital Input PDO mapping : 0x1A00
* Digital Output PDO mapping : 0x1601
* Analog Input PDO mapping : 0x1A02 * @{ */ /** \brief 0x1601 (Digital output RxPDO) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT32 aEntries[32]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1601; /** \brief 0x1A00 (Digital input TxPDO) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT32 aEntries[32]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1A00; /** \brief 0x1A02 (Analog input TxPDO) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT32 aEntries[8]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1A02; /** @}*/ /** * \addtogroup SmAssignObjects SyncManager Assignment Objects * SyncManager 2 : 0x1C12 *
SyncManager 3 : 0x1C13 * @{ */ /** \brief 0x1C12 (SyncManager 2 assignment) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT16 aEntries[1]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1C12; /** \brief 0x1C13 (SyncManager 3 assignment) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ UINT16 aEntries[2]; /**< \brief Entry buffer*/ } OBJ_STRUCT_PACKED_END TOBJ1C13; /** @}*/ /** * \addtogroup PDO Process Data Objects * Digital Inputs : 0x6000
* Analog Inputs : 0x6010
* Digital Outputs : 0x7020 * @{ */ /** \brief 0x6000 (Digital input object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bSwitch1); /**< \brief Switch 1*/ BOOLEAN(bSwitch2); /**< \brief Switch 2*/ BOOLEAN(bSwitch3); /**< \brief Switch 3*/ BOOLEAN(bSwitch4); /**< \brief Switch 4*/ BOOLEAN(bSwitch5); /**< \brief Switch 5*/ BOOLEAN(bSwitch6); /**< \brief Switch 6*/ BOOLEAN(bSwitch7); /**< \brief Switch 7*/ BOOLEAN(bSwitch8); /**< \brief Switch 8*/ BOOLEAN(bSwitch9); /**< \brief Switch 1*/ BOOLEAN(bSwitch10); /**< \brief Switch 2*/ BOOLEAN(bSwitch11); /**< \brief Switch 3*/ BOOLEAN(bSwitch12); /**< \brief Switch 4*/ BOOLEAN(bSwitch13); /**< \brief Switch 5*/ BOOLEAN(bSwitch14); /**< \brief Switch 6*/ BOOLEAN(bSwitch15); /**< \brief Switch 7*/ BOOLEAN(bSwitch16); /**< \brief Switch 8*/ BOOLEAN(bSwitch17); /**< \brief Switch 1*/ BOOLEAN(bSwitch18); /**< \brief Switch 2*/ BOOLEAN(bSwitch19); /**< \brief Switch 3*/ BOOLEAN(bSwitch20); /**< \brief Switch 4*/ BOOLEAN(bSwitch21); /**< \brief Switch 5*/ BOOLEAN(bSwitch22); /**< \brief Switch 6*/ BOOLEAN(bSwitch23); /**< \brief Switch 7*/ BOOLEAN(bSwitch24); /**< \brief Switch 8*/ BOOLEAN(bSwitch25); /**< \brief Switch 1*/ BOOLEAN(bSwitch26); /**< \brief Switch 2*/ BOOLEAN(bSwitch27); /**< \brief Switch 3*/ BOOLEAN(bSwitch28); /**< \brief Switch 4*/ BOOLEAN(bSwitch29); /**< \brief Switch 5*/ BOOLEAN(bSwitch30); /**< \brief Switch 6*/ BOOLEAN(bSwitch31); /**< \brief Switch 7*/ BOOLEAN(bSwitch32); /**< \brief Switch 8*/ // ALIGN8(SubIndex009) /**< \brief 8Bit alignment*/ } OBJ_STRUCT_PACKED_END TOBJ6000; /** \brief 0x6020 (Analog input object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bUnderrange); /**< \brief (SI1) Analog input under range*/ BOOLEAN(bOverrange); /**< \brief (SI2) Analog input over range*/ BIT2(b2Limit1); /**< \brief (SI3) Analog input 1st limit*/ BIT2(b2Limit2); /**< \brief (SI5) Analog input 2nd limit*/ ALIGN2(SubIndex006) /**< \brief 2Bit alignment*/ ALIGN6(SubIndex007) /**< \brief 2Bit alignment*/ BOOLEAN(bTxPDOState); /**< \brief (SI15) TxPdo state*/ BOOLEAN(bTxPDOToggle); /**< \brief (SI16) TxPdo toggle*/ INT16 i16Analoginput; /**< \brief (SI17) Analog input value*/ } OBJ_STRUCT_PACKED_END TOBJ6020; /** \brief 0x7010 (Digital output object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bLED1); /**< \brief LED 1*/ BOOLEAN(bLED2); /**< \brief LED 2*/ BOOLEAN(bLED3); /**< \brief LED 3*/ BOOLEAN(bLED4); /**< \brief LED 4*/ BOOLEAN(bLED5); /**< \brief LED 5*/ BOOLEAN(bLED6); /**< \brief LED 6*/ BOOLEAN(bLED7); /**< \brief LED 7*/ BOOLEAN(bLED8); /**< \brief LED 8*/ BOOLEAN(bLED9); /**< \brief LED 1*/ BOOLEAN(bLED10); /**< \brief LED 2*/ BOOLEAN(bLED11); /**< \brief LED 3*/ BOOLEAN(bLED12); /**< \brief LED 4*/ BOOLEAN(bLED13); /**< \brief LED 5*/ BOOLEAN(bLED14); /**< \brief LED 6*/ BOOLEAN(bLED15); /**< \brief LED 7*/ BOOLEAN(bLED16); /**< \brief LED 8*/ BOOLEAN(bLED17); /**< \brief LED 1*/ BOOLEAN(bLED18); /**< \brief LED 2*/ BOOLEAN(bLED19); /**< \brief LED 3*/ BOOLEAN(bLED20); /**< \brief LED 4*/ BOOLEAN(bLED21); /**< \brief LED 5*/ BOOLEAN(bLED22); /**< \brief LED 6*/ BOOLEAN(bLED23); /**< \brief LED 7*/ BOOLEAN(bLED24); /**< \brief LED 8*/ BOOLEAN(bLED25); /**< \brief LED 1*/ BOOLEAN(bLED26); /**< \brief LED 2*/ BOOLEAN(bLED27); /**< \brief LED 3*/ BOOLEAN(bLED28); /**< \brief LED 4*/ BOOLEAN(bLED29); /**< \brief LED 5*/ BOOLEAN(bLED30); /**< \brief LED 6*/ BOOLEAN(bLED31); /**< \brief LED 7*/ BOOLEAN(bLED32); /**< \brief LED 8*/ // ALIGN8(SubIndex008) /**< \brief 8Bit alignment*/ } OBJ_STRUCT_PACKED_END TOBJ7010; /** @}*/ /** * \addtogroup ConfigObjects Configuration Objects * Analog input settings: 0x8020 * @{ */ /** \brief 0x8020 (Analog input settings object) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex 0*/ BOOLEAN(bEnableuserscale); /**< \brief Enable user scaling*/ BIT3(b3Presentation); /**< \brief Value presentation*/ ALIGN2(SubIndex005) /**< \brief 2Bit Alignment*/ BOOLEAN(bEnablelimit1); /**< \brief Enable limit 1*/ BOOLEAN(bEnablelimit2); /**< \brief Enable limit 2*/ ALIGN8(SubIndex009) /**< \brief 8Bit Alignment*/ INT16 i16Offset; /**< \brief Value offset*/ INT32 i32Gain; /**< \brief Value gain*/ INT16 i16Limit1; /**< \brief Value limit 1*/ INT16 i16Limit2; /**< \brief Value limit 2*/ } OBJ_STRUCT_PACKED_END TOBJ8020; /** @}*/ /** * \addtogroup DeviceParaObjects Device Parameter Objects * Modular Device Profile: 0xF000 * @{ */ /** \brief 0xF000 (Modular Device Profile) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex0*/ UINT16 u16Moduleindexdistance; /**< \brief Module Index distance * * Index distance between two modules (maximum number of objects per module and area)
* Default: 0x10*/ UINT16 u16Maximumnumberofmodules; /**< \brief Maximum number of modules*/ } OBJ_STRUCT_PACKED_END TOBJF000; /** \brief 0xF010 (Module Profile List) data structure*/ typedef struct OBJ_STRUCT_PACKED_START { UINT16 u16SubIndex0; /**< \brief SubIndex0*/ UINT32 aEntries[3]; /**< \brief Module profile information buffer * * Bit 0..15: Profile number of the module on position 1
* Bit 16..31: Profile specific*/ } OBJ_STRUCT_PACKED_END TOBJF010; /** @}*/ #endif //_EL9800APPL_H_ #ifdef _EVALBOARD_ #define PROTO #else #define PROTO extern #endif #ifdef _OBJD_ /** * \addtogroup SmAssignObjects SyncManager Assignment Objects * @{ */ /** * \brief Entry descriptions of SyncManager assign objects * * SubIndex0
* SubIndex1 (for all other entries the same description will be used (because the object code is ARRAY)) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asPDOAssignEntryDesc[] = { {DEFTYPE_UNSIGNED8, 0x08, ACCESS_READ}, {DEFTYPE_UNSIGNED16, 0x10, ACCESS_READ}}; /** @}*/ /** * \addtogroup EnumObjects Enum Objects * @{ * Presentation (Signed/Unsigned) : 0x800 */ /*--------------------------------------------- - 0x0800: ENUM (Signed/Unsigned Presentation) -----------------------------------------------*/ CHAR sEnum0800_Value00[] = "\000\000\000\000Signed presentation"; /**< \brief Value = 0x00, Text = Signed presentation */ CHAR sEnum0800_Value01[] = "\001\000\000\000Unsigned presentation"; /**< \brief Value = 0x01, Text = Unsigned presentation */ CHAR *apEnum0800[2] = { sEnum0800_Value00, sEnum0800_Value01};/**< \brief List of Enum (0x800) values*/ /** * \brief Enum entry description * * SubIndex0
* Enum (Signed Presentation) * enum (Unsigned Presentation) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x0800[] = {{DEFTYPE_UNSIGNED8, 8, ACCESS_READ | OBJACCESS_NOPDOMAPPING}, {DEFTYPE_OCTETSTRING, 8*SIZEOF(sEnum0800_Value00), ACCESS_READ | OBJACCESS_NOPDOMAPPING}, {DEFTYPE_OCTETSTRING, 8*SIZEOF(sEnum0800_Value01), ACCESS_READ | OBJACCESS_NOPDOMAPPING}}; /** @}*/ /** * \addtogroup PdoMappingObjects PDO Mapping Objects * @{ */ /** * \brief Object 0x1601 (Digital output RxPDO) entry descriptions * * SubIndex 0 : read only
* SubIndex x : read only
* (x > 0) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1601[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ} }; /** * \brief Object 0x1601 (Digital output RxPDO) name * * In this example no specific entry name is defined ("SubIndex xxx" is used) */ OBJCONST UCHAR OBJMEM aName0x1601[] = "DO RxPDO-Map\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1601 (Digital output RxPDO) variable to handle object data * * SubIndex 0 : 1
* SubIndex 1 : 0x7010.1 1bit (Reference to LED1)
* SubIndex 2 : 0x7010.1 1bit (Reference to LED2)
* SubIndex 3 : 0x7010.1 1bit (Reference to LED3)
* SubIndex 4 : 0x7010.1 1bit (Reference to LED4)
* SubIndex 5 : 0x7010.1 1bit (Reference to LED5), only for PIC24
* SubIndex 6 : 0x7010.1 1bit (Reference to LED6), only for PIC24
* SubIndex 7 : 0x7010.1 1bit (Reference to LED7), only for PIC24
* SubIndex 8 : 0x7010.1 1bit (Reference to LED8), only for PIC24 */ PROTO TOBJ1601 sDORxPDOMap #ifdef _EVALBOARD_ = {32, {0x70100101, 0x70100201, 0x70100301, 0x70100401,0x70100501, 0x70100601, 0x70100701, 0x70100801, 0x70100901, 0x70101001, 0x70101101, 0x70101201, 0x70101301, 0x70101401, 0x70101501, 0x70101601, 0x70101701, 0x70101801, 0x70101901, 0x70102001, 0x70102101, 0x70102201, 0x70102301, 0x70102401, 0x70102501, 0x70102601, 0x70102701, 0x70102801, 0x70102901, 0x70103001, 0x70103101, 0x70103201}} #endif ; /** @}*/ /** * \addtogroup PdoParameter PDO Parameter * @{ * * Parameter for PDO mapping object 0x1A02 : 0x1802 */ #ifdef _OBJD_ /** * \brief Entry descriptions of TxPDO Parameter object (0x1802) * * Subindex 0
* SubIndex 1 - 5 : not defined
* SubIndex 6 : Exclude TxPDOs
* SubIndex 7 : TxPDO State
* SubIndex 8 : not defined
* SubIndex 9 : TxPDO Toggle */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1802[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {0, 0x0, 0}, {0, 0x0, 0}, {0, 0x0, 0}, {0, 0x0, 0}, {0, 0x0, 0}, {DEFTYPE_OCTETSTRING, 0x00, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {0, 0x0, 0}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}}; /** * \brief Object 0x1802 (TxPDO Parameter) object and entry names */ OBJCONST UCHAR OBJMEM aName0x1802[] = "TxPDO Parameter\000\000\000\000\000\000Exclude TxPDOs\000TxPDOState\000\000TxPDO Toggle\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1802 (TxPDO Parameter) variable to handle object data * * Only Subindex0 for this Object is stored here (all values are stored in other structures, see "ReadObject0x1802" for more details) */ PROTO UINT16 TxPDO1802Subindex0 #ifdef _EVALBOARD_ = 9 #endif ; /** @}*/ /** * \addtogroup PdoMapping PDO Mapping Objects * @{ */ /** * \brief Object 0x1A00 (Digital input TxPDO) entry descriptions * * SubIndex 0 : read only
* SubIndex x : read only
* (x > 0) */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1A00[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ} }; /** * \brief Object 0x1A00 (Digital input TxPDO) object and entry names * * In this example no specific entry name is defined ("SubIndex xxx" is used) */ OBJCONST UCHAR OBJMEM aName0x1A00[] = "DI TxPDO-Map\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1A00 (Digital Input TxPDO) variable to handle object data * * SubIndex 0 : 1
* SubIndex 1 : 0x6000.1 1bit (Reference to SWITCH1)
* SubIndex 2 : 0x6000.1 1bit (Reference to SWITCH2)
* SubIndex 3 : 0x6000.1 1bit (Reference to SWITCH3)
* SubIndex 4 : 0x6000.1 1bit (Reference to SWITCH4)
* SubIndex 5 : 0x6000.1 1bit (Reference to SWITCH5), only for PIC24
* SubIndex 6 : 0x6000.1 1bit (Reference to SWITCH6), only for PIC24
* SubIndex 7 : 0x6000.1 1bit (Reference to SWITCH7), only for PIC24
* SubIndex 8 : 0x6000.1 1bit (Reference to SWITCH8), only for PIC24 */ PROTO TOBJ1A00 sDITxPDOMap #ifdef _EVALBOARD_ = {32, {0x60000101, 0x60000201, 0x60000301, 0x60000401,0x60000501, 0x60000601, 0x60000701, 0x60000801, 0x60000901, 0x60001001, 0x60001101, 0x60001201, 0x60001301, 0x60001401, 0x60001501, 0x60001601, 0x60001701, 0x60001801, 0x60001901, 0x60002001, 0x60002101, 0x60002201, 0x60002301, 0x60002401, 0x60002501, 0x60002601, 0x60002701, 0x60002801, 0x60002901, 0x60003001, 0x60003101, 0x60003201}} #endif ; /** * \brief Object 0x1A02 (Analog input TxPDO) entry descriptions * * SubIndex 0 : read only
* SubIndex x : read only
* (x > 0) */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1A02[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 001: SubIndex 001 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 002: SubIndex 002 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 003: SubIndex 003 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 004: SubIndex 004 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 005: SubIndex 005 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 006: SubIndex 006 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, /* SubIndex 007: SubIndex 007 */ {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}}; /* SubIndex 008: SubIndex 008 */ /** * \brief Object 0x1A02 (Analog input TxPDO) object and entry names * * In this example no specific entry name is defined ("SubIndex xxx" is used) */ OBJCONST UCHAR OBJMEM aName0x1A02[] = "AI TxPDO-Map\000\377"; #endif //#ifdef _OBJD_ /** * \brief Object 0x1A02 (Analog Input TxPDO) variable to handle object data * * SubIndex 0 : 1
* SubIndex 1 : 0x6020.1 1bit (Reference to Analog under range)
* SubIndex 2 : 0x6020.2 1bit (Reference to Analog over range)
* SubIndex 3 : 0x6020.3 2bit (Reference to limit 1)
* SubIndex 4 : 0x6020.5 2bit (Reference to limit 2)
* SubIndex 5 : 8Bit Alignment
* SubIndex 6 : 0x1802.7 1bit (Reference to TxPDO State (stored in analog input struct))
* SubIndex 7 : 0x1802.9 1bit (Reference to TxPDO Toggle (stored in analog input struct))
* SubIndex 8 : 0x6020.17 16bit (Reference to Analog input value) */ PROTO TOBJ1A02 sAITxPDOMap #ifdef _EVALBOARD_ = {8, {0x60200101, 0x60200201, 0x60200302, 0x60200502, 0x08, 0x18020701, 0x18020901, 0x60201110}} #endif ; /** @}*/ /** * \addtogroup SmAssignObjects SyncManager Assignment Objects * @{ */ #ifdef _OBJD_ /** * \brief 0x1C12 (SyncManager 2 assignment) object name * * No entry names defined because the object code is ARRAY and all entry names are "SubIndex 000" */ OBJCONST UCHAR OBJMEM aName0x1C12[] = "RxPDO assign"; #endif //#ifdef _OBJD_ /** * \brief 0x1C12 (SyncManager 2 assignment) variable to handle object data * * SubIndex 0 : 1
* SubIndex 1 : 0x1601 */ PROTO TOBJ1C12 sRxPDOassign #ifdef _EVALBOARD_ = {0x01, {0x1601}} #endif ; #ifdef _OBJD_ /** * \brief 0x1C13 (SyncManager 3 assignment) object name * * No entry names defined because the object code is ARRAY and all entry names are "SubIndex 000" */ OBJCONST UCHAR OBJMEM aName0x1C13[] = "TxPDO assign"; #endif //#ifdef _OBJD_ /** * \brief 0x1C13 (SyncManager 3 assignment) variable to handle object data * * SubIndex 0 : 1
* SubIndex 1 : 0x1A00
* SubIndex 2 : 0x1A02 */ PROTO TOBJ1C13 sTxPDOassign #ifdef _EVALBOARD_ = {0x02, {0x1A00, 0x1A02}} #endif ; /** @}*/ /** * \addtogroup PDO Process Data Objects * @{ */ #ifdef _OBJD_ /** * \brief Object 0x6000 (Digital input object) entry descriptions * * SubIndex 0 : read only
* SubIndex x : (One description for each switch) read only and TxPdo mappable
* (x > 0) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6000[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */ // {0x0000, 0x08, 0} }; /* Subindex 009 for align */ /** * \brief 0x6000 (Digital input object) object and entry names */ OBJCONST UCHAR OBJMEM aName0x6000[] = "DI Inputs\000Switch 1\000Switch 2\000Switch 3\000Switch 4\000Switch 5\000Switch 6\000Switch 7\000Switch 8\000Switch 9\000Switch 10\000Switch 11\000Switch 12\000Switch 13\000Switch 14\000Switch 15\000Switch 16\000Switch 17\000Switch 18\000Switch 19\000Switch 20\000Switch 21\000Switch 22\000Switch 23\000Switch 24\000Switch 25\000Switch 26\000Switch 27\000Switch 28\000Switch 29\000Switch 30\000Switch 31\000Switch 32\000\377"; #endif //#ifdef _OBJD_ /** * \brief 0x6000 (Digital input object) variable to handle object data * * SubIndex 0 : 1
* SubIndex x : every switch value is 0 by default */ PROTO TOBJ6000 sDIInputs #ifdef _EVALBOARD_ = {32, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} #endif ; #ifdef _OBJD_ /** * \brief Object 0x6020 (Analog input object) entry descriptions * * SubIndex 0 : read only
* SubIndex 001: Underrange
* SubIndex 002: Overrange
* SubIndex 003: Limit 1
* Subindex 004: doesn't exist
* SubIndex 005: Limit 2
* Subindex 006: 2Bit Alignment
* Subindex 007: 6Bit Alignment
* Subindex 008: doesn't exist
* Subindex 009: doesn't exist
* Subindex 010: doesn't exist
* Subindex 011: doesn't exist
* Subindex 012: doesn't exist
* Subindex 013: doesn't exist
* Subindex 014: doesn't exist
* SubIndex 015: TxPDO State
* SubIndex 016: TxPDO Toggle
* SubIndex 017: Analog input */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6020[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BIT2, 0x02, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {0x0000, 0, 0}, {DEFTYPE_BIT2, 0x02, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {0x0000, 0x02, 0}, {0x0000, 0x06, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING}}; /** * \brief 0x6020 (Analog input object) object and entry names */ OBJCONST UCHAR OBJMEM aName0x6020[] = "AI Inputs\000Underrange\000Overrange\000Limit 1\000\000Limit 2\000\000\000\000\000\000\000\000\000\000TxPDO State\000TxPDO Toggle\000Analog input\000\377"; #endif //#ifdef _OBJD_ /** * \brief 0x6020 (Analog input object) variable to handle object data * */ PROTO TOBJ6020 sAIInputs #ifdef _EVALBOARD_ = {17, 0x00, 0x00, 0x00, 0x00, 0, 0, 0x00, 0x00, 0x7FFF} #endif ; /** * \brief Object 0x7010 (Digital output object) entry descriptions * * SubIndex 0 : read only
* SubIndex x : (One description for each led) read only and RxPdo mappable
* (x > 0) */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x7010[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 001: LED 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 002: LED 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 003: LED 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 004: LED 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 005: LED 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 006: LED 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 007: LED 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 008: LED 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 009: LED 9 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 010: LED 10 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 011: LED 11 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 012: LED 12 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 013: LED 13 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 014: LED 14 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 015: LED 15 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 016: LED 16 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 001: LED 1 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 002: LED 2 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 003: LED 3 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 004: LED 4 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 005: LED 5 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 006: LED 6 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 007: LED 7 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 008: LED 8 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 009: LED 9 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 010: LED 10 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 011: LED 11 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 012: LED 12 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 013: LED 13 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 014: LED 14 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 015: LED 15 */ {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 016: LED 16 */ // {0x0000, 0x08, 0} }; /* Subindex 008 for align */ /** * \brief 0x6000 (Digital input object) object and entry names */ OBJCONST UCHAR OBJMEM aName0x7010[] = "DO Outputs\000LED 1\000LED 2\000LED 3\000LED 4\000LED 5\000LED 6\000LED 7\000LED 8\000LED 9\000LED 10\000LED 11\000LED 12\000LED 13\000LED 14\000LED 15\000LED 16\000LED 17\000LED 18\000LED 19\000LED 20\000LED 21\000LED 22\000LED 23\000LED 24\000LED 25\000LED 26\000LED 27\000LED 28\000LED 29\000LED 30\000LED 31\000LED 32\000\377"; #endif //#ifdef _OBJD_ /** * \brief 0x6020 (Analog input object) variable to handle object data * */ PROTO TOBJ7010 sDOOutputs #ifdef _EVALBOARD_ = {32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} #endif ; /** @}*/ /** * \addtogroup ConfigObjects Configuration Objects * @{ */ /** * \brief Object 0x8020 (Analog input settings) entry descriptions * * SubIndex 0
* SubIndex 001: Enable user scale
* SubIndex 002: Presentation
* Subindex 003 doesn't exist
* Subindex 004 doesn't exist
* Subindex 005 for align
* Subindex 006 doesn't exist
* SubIndex 007: Enable limit 1
* SubIndex 008: Enable limit 2
* Subindex 009 for align
* Subindex 010 doesn't exist
* Subindex 011 doesn't exist
* Subindex 012 doesn't exist
* Subindex 013 doesn't exist
* Subindex 014 doesn't exist
* Subindex 015 doesn't exist
* Subindex 016 doesn't exist
* SubIndex 017: Offset
* SubIndex 018: Gain
* SubIndex 019: Limit 1
* SubIndex 020: Limit 2 */ #ifdef _OBJD_ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x8020[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {0x0800, 0x03, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0x02, 0}, {0x0000, 0, 0}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_BOOLEAN, 0x01, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {0x0000, 0x08, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {0x0000, 0, 0}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_INTEGER32, 0x20, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}, {DEFTYPE_INTEGER16, 0x10, ACCESS_READWRITE | OBJACCESS_BACKUP | OBJACCESS_SETTINGS}}; /** \brief Object 0x8020 (Analog input settings) object and entry names*/ OBJCONST UCHAR OBJMEM aName0x8020[] = "AI Settings\000Enable user scale\000Presentation\000\000\000\000\000Enable limit 1\000Enable limit 2\000\000\000\000\000\000\000\000\000Offset\000Gain\000Limit 1\000Limit 2\000\377"; #endif //#ifdef _OBJD_ /** \brief Object 0x8020 (Analog input settings) variable*/ PROTO TOBJ8020 sAISettings #ifdef _EVALBOARD_ = {20, 0x00, 0x00, 0, 0x00, 0x00, 0, 0x00, 0x00, 0x00, 0x00} #endif ; /** @}*/ /** * \addtogroup DeviceParaObjects Device Parameter Objects * @{ */ #ifdef _OBJD_ /** * \brief 0xF000 (Modular Device Profile) entry descriptions * * Subindex 000
* SubIndex 001: Module index distance
* SubIndex 002: Maximum number of modules
*/ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0xF000[] = { {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, {DEFTYPE_UNSIGNED16, 0x10, ACCESS_READ}, {DEFTYPE_UNSIGNED16, 0x10, ACCESS_READ}}; /** \brief 0xF000 (Modular Device Profile) object and entry names*/ OBJCONST UCHAR OBJMEM aName0xF000[] = "Modular device profile\000Module index distance\000Maximum number of modules\000\377"; #endif /** * \brief 0xF000 (Modular Device Profile) variable to handle the object data * * SubIndex 0 * SubIndex 1 (Module Index distance) : 0x10 * SubIndex 2 (Maximum number of Modules) : 3 */ /****************************************************************************** * Object 0xF000 ******************************************************************************/ PROTO TOBJF000 sModulardeviceprofile #ifdef _EVALBOARD_ = {2, 0x10, 0x03} #endif ; #ifdef _OBJD_ /** * \brief 0xF010 (Module profile list) entry descriptions * * Subindex 0
* SubIndex x * (x > 0) */ OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0xF010[] = { {DEFTYPE_UNSIGNED8, 0x08, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}, {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}}; /** * \brief 0xF010 (Module profile list) object name * * no entry names defined because the object is an array (for every entry > 0 "SubIndex xxx" is returned) */ OBJCONST UCHAR OBJMEM aName0xF010[] = "Module profile list"; #endif /** *\brief 0xF010 (Module profile list) variable to handle object data * * SubIndex 0 : 3 * SubIndex 1 : 100 (Digital Input SubProfile) * SubIndex 2 : 200 (Digital Output SubProfile) * SubIndex 3 : 300 (Analog Input SubProfile) */ PROTO TOBJF010 sModulelist #ifdef _EVALBOARD_ = {0x03,{0x64, 0xC8, 0x12C}} #endif ; /** @}*/ #ifdef _OBJD_ PROTO UINT8 ReadObject0x1802( UINT16 index, UINT8 subindex, UINT32 dataSize, UINT16 MBXMEM * pData, UINT8 bCompleteAccess ); /*if _PIC18 is enabled the object dictionary is fixed defined in coeappl.c*/ /** *\brief EL9800 Application specific object dictionary * */ TOBJECT OBJMEM ApplicationObjDic[] = { /* Enum 0x0800 */ {NULL,NULL, 0x0800, {DEFTYPE_ENUM, 0x02 | (OBJCODE_REC << 8)}, asEntryDesc0x0800, 0, apEnum0800 }, /* Object 0x1601 */ {NULL,NULL, 0x1601, {DEFTYPE_PDOMAPPING, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x1601, aName0x1601, &sDORxPDOMap, NULL, NULL, 0x0000 }, /* Object 0x1802 */ {NULL,NULL, 0x1802, {DEFTYPE_RECORD, 9 | (OBJCODE_REC << 8)}, asEntryDesc0x1802, aName0x1802,&TxPDO1802Subindex0, ReadObject0x1802, NULL, 0x0000 }, /* Object 0x1A00 */ {NULL,NULL, 0x1A00, {DEFTYPE_PDOMAPPING, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x1A00, aName0x1A00, &sDITxPDOMap, NULL, NULL, 0x0000 }, /* Object 0x1A02 */ {NULL,NULL, 0x1A02, {DEFTYPE_PDOMAPPING, 8 | (OBJCODE_REC << 8)}, asEntryDesc0x1A02, aName0x1A02, &sAITxPDOMap, NULL, NULL, 0x0000 }, /* Object 0x1C12 */ {NULL,NULL, 0x1C12, {DEFTYPE_UNSIGNED16, 1 | (OBJCODE_ARR << 8)}, asPDOAssignEntryDesc, aName0x1C12, &sRxPDOassign, NULL, NULL, 0x0000 }, /* Object 0x1C13 */ {NULL,NULL, 0x1C13, {DEFTYPE_UNSIGNED16, 2 | (OBJCODE_ARR << 8)}, asPDOAssignEntryDesc, aName0x1C13, &sTxPDOassign, NULL, NULL, 0x0000 }, /* Object 0x6000 */ {NULL,NULL, 0x6000, {DEFTYPE_RECORD, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x6000, aName0x6000, &sDIInputs, NULL, NULL, 0x0000 }, /* Object 0x6020 */ {NULL,NULL, 0x6020, {DEFTYPE_RECORD, 17 | (OBJCODE_REC << 8)}, asEntryDesc0x6020, aName0x6020, &sAIInputs, NULL, NULL, 0x0000 }, /* Object 0x7010 */ {NULL,NULL, 0x7010, {DEFTYPE_RECORD, 32 | (OBJCODE_REC << 8)}, asEntryDesc0x7010, aName0x7010, &sDOOutputs, NULL, NULL, 0x0000 }, /* Object 0x8020 */ {NULL,NULL, 0x8020, {DEFTYPE_RECORD, 20 | (OBJCODE_REC << 8)}, asEntryDesc0x8020, aName0x8020, &sAISettings, NULL, NULL, 0x0008 }, /* Object 0xF000 */ {NULL,NULL, 0xF000, {DEFTYPE_RECORD, 2 | (OBJCODE_REC << 8)}, asEntryDesc0xF000, aName0xF000, &sModulardeviceprofile, NULL, NULL, 0x0000 }, /* Object 0xF010 */ {NULL,NULL, 0xF010, {DEFTYPE_UNSIGNED32, 3 | (OBJCODE_ARR << 8)}, asEntryDesc0xF010, aName0xF010, &sModulelist, NULL, NULL, 0x0000 }, {NULL,NULL, 0xFFFF, {0, 0}, NULL, NULL, NULL, NULL}}; #endif //#ifdef _OBJD_ PROTO void APPL_Application(void); PROTO void APPL_AckErrorInd(UINT16 stateTrans); PROTO UINT16 APPL_StartMailboxHandler(void); PROTO UINT16 APPL_StopMailboxHandler(void); PROTO UINT16 APPL_StartInputHandler(UINT16 *pIntMask); PROTO UINT16 APPL_StopInputHandler(void); PROTO UINT16 APPL_StartOutputHandler(void); PROTO UINT16 APPL_StopOutputHandler(void); PROTO UINT16 APPL_GenerateMapping(UINT16 *pInputSize,UINT16 *pOutputSize); PROTO void APPL_InputMapping(UINT16* pData); PROTO void APPL_OutputMapping(UINT16* pData); PROTO int ECT_main(void); #undef PROTO /** @}*/

#include “main.h” /* LED显示 */ uchar ucLed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; /* 数码管显示 */ uchar Seg_Slow_Down; // 数码管减速 uchar Seg_Buf[8] = {10, 10, 10, 10, 10, 10, 10, 10}; // 数码管显示的值 uchar Seg_Pos; // 数码管指示 uchar Seg_Point[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 某位是否显示小数点 /* 键盘方面 */ uchar Key_Slow_Down; /* 数据 / uchar read_data; uchar write_data; / 键盘处理函数 */ void Key_Proc() { static uchar Key_Val, Key_Down, Key_Up, Key_Old; if (Key_Slow_Down) return; Key_Slow_Down = 1; Key_Val = Key_Read(); Key_Down = Key_Val & (Key_Old ^ Key_Val); Key_Up = ~Key_Val & (Key_Old ^ Key_Val); Key_Old = Key_Val; if (Key_Down > 4) write_data = Key_Down; if (Key_Down == 4) { EEPROM_Write(&write_data, 0, 1); } } /* 数码管处理函数 */ void Seg_Proc() { if (Seg_Slow_Down) return; Seg_Slow_Down = 1; Seg_Buf[0] = read_data / 100 % 10; Seg_Buf[1] = read_data / 10 % 10; Seg_Buf[2] = read_data % 10; Seg_Buf[5] = write_data / 100 % 10; Seg_Buf[6] = write_data / 10 % 10; Seg_Buf[7] = write_data % 10; } /* LED处理函数 */ void Led_Proc() { } /* 定时器0中断初始化 */ void Timer0_Init(void) // 1毫秒@12.000MHz { AUXR &= 0x7F; // 定时器时钟12T模式 TMOD &= 0xF0; // 设置定时器模式 TL0 = 0x18; // 设置定时初始值 TH0 = 0xFC; // 设置定时初始值 TF0 = 0; // 清除TF0标志 TR0 = 1; // 定时器0开始计时 ET0 = 1; EA = 1; } /* 定时器0中断函数 */ void Timer0_ISR(void) interrupt 1 { if (++Key_Slow_Down == 10) Key_Slow_Down = 0; if (++Seg_Slow_Down == 500) Seg_Slow_Down = 0; if (++Seg_Pos == 8) Seg_Pos = 0; Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos], Seg_Point[Seg_Pos]); Led_Disp(Seg_Pos, ucLed[Seg_Pos]); } void main() { System_Init(); Timer0_Init(); EEPROM_Read(&read_data, 0, 1); while (1) { Key_Proc(); Seg_Proc(); Led_Proc(); } }如果改成float型的怎么读取

#include <intrins.h> #define uchar unsigned char #define uint unsigned int /*12864端口定义*/ #define LCD_data P0 //数据口 sbit LCD_RS = P1^1; //寄存器选择输入 sbit LCD_RW = P1^2; //液晶读/写控制 sbit LCD_EN = P1^0; //液晶使能控制 sbit LCD_PSB = P1^3; //串/并方式控制 sbit wela = P2^6; //数码管 sbit dula = P2^7; uchar code dis1[] = {"天祥电子"}; uchar code dis2[] = {" www.txmcu.com"}; uchar code dis3[] = {"TX-1C 开发板带您 "}; uchar code dis4[] = {"进入单片机的世界"}; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; uchar IRDIS[2]; uchar IRCOM[4]; void delay0(uchar x); //x*0.14MS void beep(); void dataconv(); void lcd_pos(uchar X,uchar Y); //确定显示位置 /*******************************************************************/ /* */ /* 延时函数 */ /* */ /*******************************************************************/ void delay(int ms) { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /*******************************************************************/ /* */ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ /* */ /*******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*******************************************************************/ /* */ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /* */ /*******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /* */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*******************************************************************/ void lcd_init() { LCD_PSB = 1; //并口方式 lcd_wcmd(0x34); //扩充指令操作 delay(5); lcd_wcmd(0x30); //基本指令操作 delay(5); lcd_wcmd(0x0C); //显示开,关光标 delay(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); }

#include <reg51.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int /* 硬件定义 */ sbit START_ID = P1^0; // 从学号开始计时按钮 sbit START_8AM = P1^1; // 从08:00:00开始计时按钮 sbit RESET_KEY = P1^2; // 复位按钮 /* 学号数据结构 */ typedef struct { uchar hour; uchar minute; uchar second; } TimeType; /* 学号初始时间03:01:06 */ code TimeType id_time = {3, 1, 6}; /* 当前时间变量 */ unsigned char data hour, minute, second; bit is_running = 0; // 计时运行标志 /* 显示缓冲区 */ char display_buf[20]; /* 延时函数 */ void DelayMs(uint ms) { uint i, j; for(i=0; i<ms; i++) for(j=0; j<114; j++); } /* 串口发送字符 */ void UART_SendChar(char c) { SBUF = c; while(!TI); TI = 0; } /* 串口发送字符串 */ void UART_SendString(char *s) { while(*s) { UART_SendChar(*s++); } } /* 更新时间显示 */ void Update_Display(void) { sprintf(display_buf, "\rTime: %02d:%02d:%02d", hour%256, minute%256, second%256); UART_SendString(display_buf); } /* 从学号开始计时 */ void StartFromID(void) { hour = id_time.hour; minute = id_time.minute; second = id_time.second; is_running = 1; Update_Display(); } /* 从8点开始计时 */ void StartFrom8AM(void) { hour = 8; minute = 0; second = 0; is_running = 1; Update_Display(); } /* 系统初始化 */ void Init_System(void) { /* 串口初始化 */ SCON = 0x50; TMOD |= 0x20; TH1 = TL1 = 0xFD; TR1 = 1; /* 定时器0初始化 */ TMOD |= 0x01; TH0 = 0x3C; TL0 = 0xB0; ET0 = EA = TR0 = 1; /* 初始状态 */ is_running = 0; UART_SendString("\r\nPress Button1(ID) or Button2(8AM) to start"); } /* 定时器中断 */ void Timer0_ISR(void) interrupt 1 { static uchar count = 0; TH0 = 0x3C; TL0 = 0xB0; if(is_running && ++count >= 20) { // 1秒计时 count = 0; if(++second >= 60) { second = 0; if(++minute >= 60) { minute = 0; if(++hour >= 24) { hour = 0; } } } Update_Display(); } } /* 按键处理 */ void Key_Process(void) { if(!START_ID) { // 学号开始按钮 DelayMs(10); if(!START_ID) { while(!START_ID); StartFromID(); } } if(!START_8AM) { // 8点开始按钮 DelayMs(10); if(!START_8AM) { while(!START_8AM); StartFrom8AM(); } } if(!RESET_KEY) { // 复位按钮 DelayMs(10); if(!RESET_KEY) { while(!RESET_KEY); is_running = 0; UART_SendString("\r\nTimer Stopped"); } } } /* 主函数 */ void main(void) { Init_System(); while(1) { Key_Process(); } }在这个基础上添加一个键盘扫描函数,可以使得学号六位我可以自由输入作为不同的时分秒初始值

#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int // 硬件接口定义 #define SEG_PORT P0 // 段选 #define DIG_PORT P2 // 位选 sbit KEY_EXIT = P3^2; // 退出跑马灯的按键 // 共阳极数码管段码表 uchar code SEG_TAB[] = { 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, // 0-9 0xC7 // L }; // 全局变量 uchar Display_Buffer[6]; // 显示缓冲区 uchar Input_Buffer[10]; // 输入缓冲区 uchar Input_Index = 0; // 输入索引 bit Init_Mode = 1; // 初始化模式标志 bit Display_Mode = 0; // 0-输入模式 1-结果显示模式 /*----- 函数声明 -----*/ void delay_ms(uint ms); void clear_display(void); void display_digit(uchar pos, uchar value); bit check_key_press(void); void run_horse_init(void); void calculator_mode(void); void handle_input(uchar key); float calculate(void); void result_to_display(float result); /*----- 主函数 -----*/ void main(void) { // 初始化 run_horse_init(); // 跑马灯初始化(可按键退出) calculator_mode(); // 进入计算器主循环 } void delay_ms(uint ms) { uint i, j; for(i = 0; i < ms; i++) for(j = 0; j < 120; j++); } /** * @brief 清空所有数码管 */ void clear_display(void) { uchar i; for(i = 0; i < 6; i++) { display_digit(i, 0xFF); } } /** * @brief 在指定位置显示字符 */ void display_digit(uchar pos, uchar value) { DIG_PORT = ~(1 << pos); // 位选 SEG_PORT = value; // 段选 delay_ms(1); // 短暂延时 } /** * @brief 检测退出按键(P3.2) */ bit check_key_press(void) { if(KEY_EXIT == 0) { delay_ms(10); // 消抖 if(KEY_EXIT == 0) { while(!KEY_EXIT); // 等待释放 return 1; } } return 0; } /** * @brief 跑马灯初始化(可按键中断) */ void run_horse_init(void) { uchar i, pos = 0; while(Init_Mode) { // 更新显示(L从左到右移动) for(i = 0; i < 6; i++) { display_digit(i, (i == pos) ? SEG_TAB[10] : 0xFF); } // 检查按键 if(check_key_press()) { Init_Mode = 0; clear_displ

#include <reg52.h> //调用单片机头文件 #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 //数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0x14,0x77,0x4c,0x45,0x27,0x85,0x84,0x57,0x04,0x05}; //断码 uchar dis_smg[4] = {0xff,0xff,0xff,0xff}; //数码管显示数组的缓冲区 sbit dq = P1^6; //18b20 IO口的定义 sbit beep = P3^3; //蜂鸣器IO口定义 sbit key1 = P3^5; //按键IO口定义 sbit key2 = P3^6; //按键IO口定义 sbit key3 = P3^7; //按键IO口定义 uchar flag_lj_en; //按键连加变量 uint temperature ; //温度变量 bit flag_300ms ; //300毫秒的变量 uchar menu_1; //设置不同报警参数的变量 uint t_high = 350,t_low = 100; //温度上下限报警值 // 全局变量定义 uint temperature; // 当前温度 uint temp_buffer[10]; // 温度缓冲区 uchar temp_count = 0; // 温度计数器 bit flag_stable_check = 0; // 稳定检查标志位 uint temperature_c; // 当前温度(摄氏度) uint temperature_f; // 当前温度(华氏度) uchar unit_flag = 0; // 温度单位标志位 0: 摄氏度, 1: 华氏度 //数码管位选定义 sbit smg_we1 = P2^0; //数码管位选IO口定义 sbit smg_we2 = P2^2; //数码管位选IO口定义 sbit smg_we3 = P2^4; //数码管位选IO口定义 sbit smg_we4 = P2^6; //数码管位选IO口定义 sbit relay1 = P1^5; //温度下限继电器IO口定义 sbit relay2 = P1^3; //温度上限继电器IO口定义 uchar flag_en = 1; /***********************数码位选函数*****************************/ void smg_we_switch(uchar i) { switch(i) { case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break; case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break; case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break; case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break; } } /***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i<q;i++) for(j=0;j<120;j++); } /***********************小延时函数*****************************/ void delay_uint(uint q) { while(q--); } /***********************数码显示函数*****************************/ void display() { static uchar i; i++; if(i >= 4) i = 0; P0 = 0xff; //消隐 smg_we_switch(i); //位选 P0 = dis_smg[i]; //段选 } /***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); dq = 0; //给复位脉冲 delay_uint(80); dq = 1; //把总线拿高 等待 delay_uint(10); q = dq; //读取18b20初始化信号 delay_uint(20); dq = 1; //把总线拿高 释放总线 } /*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 1; //释放总线 dat >>= 1; } } /*************读取18b20内的数据***************/ uchar read_18b20() { uchar i,value; for(i=0;i<8;i++) { dq = 0; //把总线拿低读时间隙开始 value >>= 1; //读数据是低位开始 dq = 1; //释放总线 if(dq == 1) //开始读写数据 value |= 0x80; delay_uint(5); //60us 读一个时间隙最少要保持60us的时间 } return value; //返回数据 } /*************读取温度的值 读出来的是小数***************/ uint read_temp() { uint value; uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us EA = 0; init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节 EA = 1; value <<= 8; //把温度的高位左移8位 value |= low; //把读出的温度低位放到value的低八位中 value *= 0.625; //转换到温度值 小数 return value; //返回读出的温度 } /*************定时器0初始化程序***************/ void time_init() { EA = 1; //开总中断 TMOD = 0X01; //定时器0、定时器1工作方式1 ET0 = 1; //开定时器0中断 TR0 = 1; //允许定时器0定时 TH0 = 0xf8; TL0 = 0x30; //2ms } /********************独立按键程序*****************/ uchar key_can; // 按键值 uchar key_delay; // 按键延时计数器 void key() // 独立按键程序 { key_can = 0; // 按键值还原成0 if(key1 == 0 || key2 == 0 || key3 == 0) // 有按键按下 { delay_1ms(10); // 按键延时消抖动 if(key1 == 0) // 确认是按键按下 key_can = 1; // 得到按键值 if(key2 == 0) // 确认是按键按下 key_can = 2; // 得到按键值 if(key3 == 0) // 确认是按键按下 key_can = 3; // 得到按键值 if(++key_delay >= 5) // 连续按键超过5次触发连加/连减 { flag_lj_en = 1; // 开启连加/连减模式 } } else { flag_lj_en = 0; // 关闭连加/连减模式 key_delay = 0; // 清零延时计数器 } } /****************按键处理数码管显示函数***************/ void key_with() { if(key_can == 1) //设置键 { menu_1 ++; if(menu_1 >= 3) { menu_1 = 0; //menu_1 = 0 退出设置了, } } if(menu_1 == 1) //设置温度上限报警值 { if(key_can == 2) //加键 { if(flag_lj_en <= 3) t_high ++ ; //按键按下未松开加1 加三次 else t_high += 10; //按键按下未松开加三次后加10 if(t_high > 999) t_high = 999; } if(key_can == 3) //减键 { if(flag_lj_en <= 3) t_high -- ; //按键按下未松开减1 减三次 else t_high -= 10; //按键按下未松开减三次后减10 if(t_high <= t_low) t_high = t_low + 1; //限制温度上限不能低于温度下限 } dis_smg[0] = smg_du[t_high % 10]; //取小数显示 dis_smg[1] = smg_du[t_high / 10 % 10] & 0xfb; //取个位显示 dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位显示 dis_smg[3] = 0x26; //显示H } if(menu_1 == 2) //设置温度下限报警值 { if(key_can == 2) //加键 { if(flag_lj_en <= 3) t_low ++ ; //按键按下未松开加1 加三次 else t_low += 10; //按键按下未松开加三次后加10 if(t_low >= t_high) t_low = t_high - 1; //限制温度下限不能高于温度上限 } if(key_can == 3) //减键 { if(flag_lj_en <= 3) t_low -- ; //按键按下未松开减1 减三次 else t_low -= 10; //按键按下未松开减三次后减10 if(t_low <= 10) t_low = 10; } dis_smg[0] = smg_du[t_low % 10]; //取小数显示 dis_smg[1] = smg_du[t_low / 10 % 10] & 0xfb; //取个位显示 dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位显示 dis_smg[3] = 0xBC; //显示L } delay_1ms(400); } /****************报警函数***************/ void clock_h_l() { if((temperature <= t_low) || (temperature >= t_high)) //温度小于等于下限 或者 温度大于等于上限 { if(flag_en == 1) beep = ~beep; //蜂鸣器报警 if(temperature <= t_low) relay1 = 0; //打开继电器 if(temperature >= t_high) relay2 = 0; //打开继电器 } else { beep = 1; //取消报警 relay1 = 1; //关闭继电器 relay2 = 1; //关闭继电器 flag_en = 1; } } /****************读取温度并存入缓冲区***************/ void read_temp_into_buffer() { temperature = read_temp(); // 读取当前温度 temp_buffer[temp_count++] = temperature; // 存入缓冲区 } /****************检查温度稳定性***************/ void check_temperature_stability() { uint max_temp = 0, min_temp = 999; uint i,diff; // 查找最大值和最小值 for(i = 0; i < 5; i++) // 遍历5个温度值 { if(temp_buffer[i] > max_temp) max_temp = temp_buffer[i]; if(temp_buffer[i] < min_temp) min_temp = temp_buffer[i]; } // 计算差值 diff = max_temp - min_temp; if(diff > 18) // 差值大于0.5 (因为温度单位是0.625倍的实际温度) { flag_stable_check = 1; // 标记为不稳定,继续检测 } else { flag_stable_check = 0; // 标记为稳定,进入报警判断 clock_h_l(); // 报警函数 } } /****************更新温度显示***************/ void update_temperature_display() { if(unit_flag == 0) // 显示摄氏度 { dis_smg[0] = smg_du[temperature_c % 100]; // 小数部分 dis_smg[1] = smg_du[temperature_c / 100 % 10] & 0xfb; // 个位 dis_smg[2] = smg_du[temperature_c / 1000 % 10]; // 十位 dis_smg[3] = 0xFF; // 不显示符号 } else // 显示华氏度 { dis_smg[0] = smg_du[temperature_f % 100]; // 小数部分 dis_smg[1] = smg_du[temperature_f / 100 % 10] & 0xfb; // 个位 dis_smg[2] = smg_du[temperature_f / 1000 % 10]; // 十位 dis_smg[3] = smg_du[temperature_f / 10000 % 10]; } } /****************主函数***************/ void main() { beep = 0; // 开机叫一声 delay_1ms(150); P0 = P1 = P2 = P3 = 0xff; // 所有单片机IO口输出高电平 time_init(); // 初始化定时器 while(1) { key(); // 按键程序 if(key_can > 0) { key_with(); // 设置温度上下限值 if(menu_1 == 0) { if(key_can == 3) { flag_en = 0; // 手动取消报警 beep = 1; // 关闭蜂鸣器 } } } if(flag_300ms == 1) // 300ms 处理一次温度程序 { flag_300ms = 0; read_temp_into_buffer(); // 将温度读入缓冲区 if(temp_count >= 5) // 如果已经收集了10个温度值 { check_temperature_stability(); // 检查温度稳定性 temp_count = 0; // 重置计数器 } // 实时更新数码管显示 if(menu_1 == 0) { if(key_can == 3) // 按键3用于切换温度单位 { unit_flag = !unit_flag; // 切换标志位 } temperature_c = (uint)(read_temp()*10); // 读取摄氏温度 temperature_f = (temperature_c * 90 / 50) + 3200; // 转换为华氏温度 update_temperature_display(); // 更新显示 } } delay_1ms(1); } } /*************定时器0中断服务程序***************/ void time0_int() interrupt 1 { static uchar value; //定时2ms中断一次 TH0 = 0xf8; TL0 = 0x30; //2ms display(); //数码管显示函数 value++; if(value >= 150) { value = 0; flag_300ms = 1; //定时产生一个300毫秒的变量 } }

zip
JFM7VX690T型SRAM型现场可编程门阵列技术手册主要介绍的是上海复旦微电子集团股份有限公司(简称复旦微电子)生产的高性能FPGA产品JFM7VX690T。该产品属于JFM7系列,具有现场可编程特性,集成了功能强大且可以灵活配置组合的可编程资源,适用于实现多种功能,如输入输出接口、通用数字逻辑、存储器、数字信号处理和时钟管理等。JFM7VX690T型FPGA适用于复杂、高速的数字逻辑电路,广泛应用于通讯、信息处理、工业控制、数据中心、仪表测量、医疗仪器、人工智能、自动驾驶等领域。 产品特点包括: 1. 可配置逻辑资源(CLB),使用LUT6结构。 2. 包含CLB模块,可用于实现常规数字逻辑和分布式RAM。 3. 含有I/O、BlockRAM、DSP、MMCM、GTH等可编程模块。 4. 提供不同的封装规格和工作温度范围的产品,便于满足不同的使用环境。 JFM7VX690T产品系列中,有多种型号可供选择。例如: - JFM7VX690T80采用FCBGA1927封装,尺寸为45x45mm,使用锡银焊球,工作温度范围为-40°C到+100°C。 - JFM7VX690T80-AS同样采用FCBGA1927封装,但工作温度范围更广,为-55°C到+125°C,同样使用锡银焊球。 - JFM7VX690T80-N采用FCBGA1927封装和铅锡焊球,工作温度范围与JFM7VX690T80-AS相同。 - JFM7VX690T36的封装规格为FCBGA1761,尺寸为42.5x42.5mm,使用锡银焊球,工作温度范围为-40°C到+100°C。 - JFM7VX690T36-AS使用锡银焊球,工作温度范围为-55°C到+125°C。 - JFM7VX690T36-N使用铅锡焊球,工作温度范围与JFM7VX690T36-AS相同。 技术手册中还包含了一系列详细的技术参数,包括极限参数、推荐工作条件、电特性参数、ESD等级、MSL等级、重量等。在产品参数章节中,还特别强调了封装类型,包括外形图和尺寸、引出端定义等。引出端定义是指对FPGA芯片上的各个引脚的功能和接线规则进行说明,这对于FPGA的正确应用和电路设计至关重要。 应用指南章节涉及了FPGA在不同应用场景下的推荐使用方法。其中差异说明部分可能涉及产品之间的性能差异;关键性能对比可能包括功耗与速度对比、上电浪涌电流测试情况说明、GTH Channel Loss性能差异说明、GTH电源性能差异说明等。此外,手册可能还提供了其他推荐应用方案,例如不使用的BANK接法推荐、CCLK信号PCB布线推荐、JTAG级联PCB布线推荐、系统工作的复位方案推荐等,这些内容对于提高系统性能和稳定性有着重要作用。 焊接及注意事项章节则针对产品的焊接过程提供了指导,强调焊接过程中的注意事项,以确保产品在组装过程中的稳定性和可靠性。手册还明确指出,未经复旦微电子的许可,不得翻印或者复制全部或部分本资料的内容,且不承担采购方选择与使用本文描述的产品和服务的责任。 上海复旦微电子集团股份有限公司拥有相关的商标和知识产权。该公司在中国发布的技术手册,版权为上海复旦微电子集团股份有限公司所有,未经许可不得进行复制或传播。 技术手册提供了上海复旦微电子集团股份有限公司销售及服务网点的信息,方便用户在需要时能够联系到相应的服务机构,获取最新信息和必要的支持。同时,用户可以访问复旦微电子的官方网站(***以获取更多产品信息和公司动态。
zip
标题“100余款高清原厂车标开机logo”所指的是一份资源集合,其中包含了超过100个汽车制造商的高清品牌标志,这些标志是专为开机画面或车载娱乐系统的启动界面设计的。在车载信息娱乐系统中,车标的开机logo通常会在车辆启动时展示,增添品牌形象,提升用户体验。 描述中的信息告诉我们这份资源提供了三种不同的分辨率:1024x600、800x480和222x124。这些尺寸对应了不同车载屏幕的常见分辨率,确保了在各种车型上都能有良好的显示效果。"任你选择"意味着用户可以根据自己的车辆屏幕尺寸选择合适的logo。"还等什么快上车"是一句促销用语,鼓励用户立即下载并使用这些高清车标。 标签“车机logo”明确了这个压缩包的内容是与汽车相关的开机图形标识,主要应用于车载信息系统。 至于文件名称列表中提到的“drawable-hdpi-v4”,这是Android开发中的一个目录名,用于存放不同密度(hdpi:高密度)的图像资源。在Android系统中,为了适应不同屏幕密度的设备,开发者会将图片资源按照ldpi(低密度)、mdpi(中密度)、hdpi、xhdpi、xxhdpi等分类存储。"v4"可能表示这些资源兼容Android 4.0(API级别14)及以上版本的系统,以确保广泛的设备兼容性。 这份压缩包是一个丰富的汽车品牌开机logo库,适合用于各种车载信息娱乐系统,提供了适配不同屏幕尺寸和分辨率的选项,并且遵循了Android应用开发的标准,保证在多数现代Android设备上可以正常显示。对于汽车电子设备开发者、UI设计师或者车友来说,这都是一份极具价值的资源

大家在看

recommend-type

Xilinx ISE rs_decoder_ipcore and encoder License

Xilinx ISE RS编码解码IP核的License
recommend-type

毕业设计&课设-一个基于Matlab的PET仿真和重建框架,具有系统矩阵的分析建模,能够结合各种数据….zip

matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! matlab算法,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随
recommend-type

MATLAB机械臂简单控制仿真(Simulink篇-总).zip

MATLAB下机器人可视化与控制---simulink篇中的简单例子,在Simulink中做了预定义轨迹的运动和Slider Gain控制的运动,用GUI控制的关节代码在MATLAB下机器人可视化与控制
recommend-type

使用 GCC 构建 STM23F0 ARM 项目的模板源码

使用 GCC 构建 STM23F0 ARM 项目的模板源码,具体请看 README
recommend-type

详细说明 VC++的MFC开发串口调试助手源代码,包括数据发送,接收,显示制式等29782183com

详细说明 VC++的MFC开发串口调试助手源代码,包括数据发送,接收,显示制式等29782183com

最新推荐

recommend-type

计算机网络学习中学员常见问题与改进方法

计算机网络学习中学员常见问题与改进方法+
recommend-type

美国国际航空交通数据分析报告(1990-2020)

根据给定的信息,我们可以从中提取和分析以下知识点: 1. 数据集概述: 该数据集名为“U.S. International Air Traffic data(1990-2020)”,记录了美国与国际间航空客运和货运的详细统计信息。数据集涵盖的时间范围从1990年至2020年,这说明它包含了长达30年的时间序列数据,对于进行长期趋势分析非常有价值。 2. 数据来源及意义: 此数据来源于《美国国际航空客运和货运统计报告》,该报告是美国运输部(USDOT)所管理的T-100计划的一部分。T-100计划旨在收集和发布美国和国际航空公司在美国机场的出入境交通报告,这表明数据的权威性和可靠性较高,适用于政府、企业和学术研究等领域。 3. 数据内容及应用: 数据集包含两个主要的CSV文件,分别是“International_Report_Departures.csv”和“International_Report_Passengers.csv”。 a. International_Report_Departures.csv文件可能包含了以下内容: - 离港航班信息:记录了各航空公司的航班号、起飞和到达时间、起飞和到达机场的代码以及国际地区等信息。 - 航空公司信息:可能包括航空公司代码、名称以及所属国家等。 - 飞机机型信息:如飞机类型、座位容量等,这有助于分析不同机型的使用频率和趋势。 - 航线信息:包括航线的起始和目的国家及城市,对于研究航线网络和优化航班计划具有参考价值。 这些数据可以用于航空交通流量分析、机场运营效率评估、航空市场分析等。 b. International_Report_Passengers.csv文件可能包含了以下内容: - 航班乘客信息:可能包括乘客的国籍、年龄、性别等信息。 - 航班类型:如全客机、全货机或混合型航班,可以分析乘客运输和货物运输的比例。 - 乘客数量:记录了各航班或航线的乘客数量,对于分析航空市场容量和增长趋势很有帮助。 - 飞行里程信息:有助于了解国际间不同航线的长度和飞行距离,为票价设置和燃油成本分析提供数据支持。 这些数据可以用于航空客运市场分析、需求预测、收益管理等方面。 4. 数据分析和应用实例: - 航空流量分析:通过分析离港航班数据,可以观察到哪些航线最为繁忙,哪些机场的国际航空流量最大,这有助于航空公司调整航班时刻表和运力分配。 - 市场研究:乘客数据可以揭示不同国家和地区之间的人口流动趋势,帮助航空公司和政府机构了解国际旅行市场的需求变化。 - 飞机利用率:结合飞机机型和飞行频率信息,可以对特定机型的使用率进行分析,评估飞机维护需求和燃油效率。 - 安全监管:通过对比不同航空公司和航班的安全记录,监管机构可以更有效地评估航空公司的安全性能,并采取必要的监管措施。 5. 技术和方法论: 分析此类数据通常涉及数据清洗、数据整合、统计分析、时间序列分析、预测建模等数据科学方法。使用Excel、SQL、R、Python等工具进行数据处理和分析是常见的做法。例如,可以使用Python的Pandas库来清洗和准备数据,使用Matplotlib和Seaborn库来可视化数据,然后利用Scikit-learn或Statsmodels库来构建预测模型。 通过以上知识点的提取和分析,我们可以理解到“U.S. International Air Traffic data(1990-2020)-数据集”的重要性,它不仅记录了跨越30年的航空交通数据,还为各种分析和应用提供了详实的基础信息。对于航空业从业者、政策制定者、研究人员以及数据分析师来说,这是一个极具价值的数据资源。
recommend-type

统计学视角:深入理解最小二乘法的概率论基础

# 1. 最小二乘法的基本概念 最小二乘法(Least Squares Method, LSM)是统计学和数据分析中广泛使用的一种数学优化技术。其主要目的是通过最小化误差的平方和来寻找数据的最佳函数匹配。这种方法最早由高斯提出,但在工程、物理、经济和其他领域中有着广泛的应用。 在本章中,我们将首先了
recommend-type

vscode中使用Codeium

<think>好的,我需要回答用户如何在VSCode中使用Codeium插件的问题。首先,我需要回顾用户提供的引用内容,看看是否有相关信息。用户提供的引用[1]提到了Codeium Chat可以解释代码中的问题,引用[2]提到了在IDEA中的一些问题,可能对VSCode的安装有帮助。用户还提到了安装步骤、基本功能、常见问题等。 首先,我应该分步骤说明安装过程,包括在VSCode扩展商店搜索Codeium并安装。然后,登录部分可能需要用户访问仪表板获取API密钥,引用[2]中提到登录问题,可能需要提醒用户注意网络或权限设置。 接下来是基本功能,比如代码自动补全和Chat功能。引用[1]提到C
recommend-type

UniMoCo:统一框架下的多监督视觉学习方法

在详细解析“unimoco”这个概念之前,我们需要明确几个关键点。首先,“unimoco”代表的是一种视觉表示学习方法,它在机器学习尤其是深度学习领域中扮演着重要角色。其次,文章作者通过这篇论文介绍了UniMoCo的全称,即“Unsupervised, Semi-Supervised and Full-Supervised Visual Representation Learning”,其背后的含义是在于UniMoCo框架整合了无监督学习、半监督学习和全监督学习三种不同的学习策略。最后,该框架被官方用PyTorch库实现,并被提供给了研究者和开发者社区。 ### 1. 对比学习(Contrastive Learning) UniMoCo的概念根植于对比学习的思想,这是一种无监督学习的范式。对比学习的核心在于让模型学会区分不同的样本,通过将相似的样本拉近,将不相似的样本推远,从而学习到有效的数据表示。对比学习与传统的分类任务最大的不同在于不需要手动标注的标签来指导学习过程,取而代之的是从数据自身结构中挖掘信息。 ### 2. MoCo(Momentum Contrast) UniMoCo的实现基于MoCo框架,MoCo是一种基于队列(queue)的对比学习方法,它在训练过程中维持一个动态的队列,其中包含了成对的负样本。MoCo通过 Momentum Encoder(动量编码器)和一个队列来保持稳定和历史性的负样本信息,使得模型能够持续地进行对比学习,即使是在没有足够负样本的情况下。 ### 3. 无监督学习(Unsupervised Learning) 在无监督学习场景中,数据样本没有被标记任何类别或标签,算法需自行发现数据中的模式和结构。UniMoCo框架中,无监督学习的关键在于使用没有标签的数据进行训练,其目的是让模型学习到数据的基础特征表示,这对于那些标注资源稀缺的领域具有重要意义。 ### 4. 半监督学习(Semi-Supervised Learning) 半监督学习结合了无监督和有监督学习的优势,它使用少量的标注数据与大量的未标注数据进行训练。UniMoCo中实现半监督学习的方式,可能是通过将已标注的数据作为对比学习的一部分,以此来指导模型学习到更精准的特征表示。这对于那些拥有少量标注数据的场景尤为有用。 ### 5. 全监督学习(Full-Supervised Learning) 在全监督学习中,所有的训练样本都有相应的标签,这种学习方式的目的是让模型学习到映射关系,从输入到输出。在UniMoCo中,全监督学习用于训练阶段,让模型在有明确指示的学习目标下进行优化,学习到的任务相关的特征表示。这通常用于有充足标注数据的场景,比如图像分类任务。 ### 6. PyTorch PyTorch是一个开源机器学习库,由Facebook的人工智能研究团队开发,主要用于计算机视觉和自然语言处理等任务。它被广泛用于研究和生产环境,并且因其易用性、灵活性和动态计算图等特性受到研究人员的青睐。UniMoCo官方实现选择PyTorch作为开发平台,说明了其对科研社区的支持和对易于实现的重视。 ### 7. 可视化表示学习(Visual Representation Learning) 可视化表示学习的目的是从原始视觉数据中提取特征,并将它们转换为能够反映重要信息且更易于处理的形式。在UniMoCo中,无论是无监督、半监督还是全监督学习,最终的目标都是让模型学习到有效的视觉表示,这些表示可以用于下游任务,如图像分类、目标检测、图像分割等。 ### 8. 标签队列(Label Queue) UniMoCo通过标签队列维护受监管的标签,这可能意味着对于那些半监督或全监督学习的任务,模型在进行对比学习时,会参考这些来自标签队列的数据。标签队列机制能帮助模型更好地利用有限的标注数据,增强模型的泛化能力。 ### 结论 UniMoCo的提出,以及其官方PyTorch实现的发布,将对计算机视觉领域产生深远影响。它不仅提供了一个统一的对比学习框架,使得从无监督到全监督的学习过程更加灵活和高效,而且为研究者们提供了一个强力的工具,以便更好地探索和实现各种视觉任务。UniMoCo的研究和应用前景,为机器学习尤其是深度学习在视觉领域的研究和实践提供了新的视角和可能。
recommend-type

【MATLAB算法精讲】:最小二乘法的实现与案例深度分析

# 1. 最小二乘法的基本原理 最小二乘法是一种数学优化技术,它通过最小化误差的平方和来寻找数据的最佳函数匹配。其核心思想是选择一条曲线,使得所有观察点到这条曲线的距离之和最小。这种方法广泛应用于统计学、信号处理、工程学和经济学等领域,尤其适用于需要通过一组数据点来确定函数参数的情况。 ## 1.1 统计学视角下的最小二乘法 在统计学中,最小二乘法经常用于
recommend-type

Idea使用教程+jdk配置

<think>好的,我现在需要回答用户关于IntelliJ IDEA使用教程和JDK配置方法的问题。首先,用户明确提到了参考站内引用中的内容,引用[1]和引用[2]都涉及JDK的配置步骤,但看起来这些引用内容可能来自其他问题或文档,可能与当前问题不完全相关,但用户希望我利用这些信息来组织回答。 首先,我需要确认IntelliJ IDEA配置JDK的基本步骤,并整合用户提供的引用内容。引用[1]提到选择JDK安装根目录,例如D:\develop\Java\jdk-17,这说明配置时需要定位到JDK的主目录。引用[2]则提到了通过New按钮选择JDK版本,并完成项目创建,这部分可能涉及到项目设置
recommend-type

GitHub入门实践:审查拉取请求指南

从提供的文件信息中,我们可以抽取以下知识点: **GitHub入门与Pull Request(PR)的审查** **知识点1:GitHub简介** GitHub是一个基于Git的在线代码托管和版本控制平台,它允许开发者在互联网上进行代码的托管和协作。通过GitHub,用户可以跟踪和管理代码变更,参与开源项目,或者创建自己的私有仓库进行项目协作。GitHub为每个项目提供了问题跟踪和任务管理功能,支持Pull Request机制,以便用户之间可以进行代码的审查和讨论。 **知识点2:Pull Request的作用与审查** Pull Request(PR)是协作开发中的一个重要机制,它允许开发者向代码库贡献代码。当开发者在自己的分支上完成开发后,他们可以向主分支(或其他分支)提交一个PR,请求合入他们的更改。此时,其他开发者,包括项目的维护者,可以审查PR中的代码变更,进行讨论,并最终决定是否合并这些变更到目标分支。 **知识点3:审查Pull Request的步骤** 1. 访问GitHub仓库,并查看“Pull requests”标签下的PR列表。 2. 选择一个PR进行审查,点击进入查看详细内容。 3. 查看PR的标题、描述以及涉及的文件变更。 4. 浏览代码的具体差异,可以逐行审查,也可以查看代码变更的概览。 5. 在PR页面添加评论,可以针对整个PR,也可以针对特定的代码行或文件。 6. 当审查完成后,可以提交评论,或者批准、请求修改或关闭PR。 **知识点4:代码审查的最佳实践** 1. 确保PR的目标清晰且具有针对性,避免过于宽泛。 2. 在审查代码时,注意代码的质量、结构以及是否符合项目的编码规范。 3. 提供建设性的反馈,指出代码的优点和需要改进的地方。 4. 使用清晰、具体的语言,避免模糊和主观的评论。 5. 鼓励开发者间的协作,而不是单向的批评。 6. 经常审查PR,以避免延迟和工作积压。 **知识点5:HTML基础** HTML(HyperText Markup Language)是用于创建网页的标准标记语言。它通过各种标签(如`<p>`用于段落,`<img>`用于图片,`<a>`用于链接等)来定义网页的结构和内容。HTML文档由元素组成,这些元素通过开始标签和结束标签来标识。例如,`<p>This is a paragraph.</p>`。HTML的最新版本是HTML5,它引入了许多新的元素和API,增强了对多媒体、图形和本地存储的支持。 **知识点6:GitHub Pages功能介绍** GitHub Pages是一个静态站点托管服务,允许用户直接从GitHub仓库中发布个人、组织或项目的网站。你可以通过设置一个专门的分支来存放你的网站源代码,然后利用GitHub Pages的设置选项,选择分支并发布你的网站。发布的网站将可以通过一个自定义的URL访问,这个URL通常是`username.github.io/repo-name`的格式。这为开发者提供了一个简单而快速的方法来搭建个人或项目的展示页面。 **知识点7:简单的游戏开发实践** 文件描述中提到了一个基于项目的学习活动,通过游戏的形式,让入门人员体验操作和理解基本的游戏开发概念。在这个活动中,参与者通过键盘操作控制形状的旋转和移动,目标是创建无空隙的完整行,这涉及到游戏逻辑、用户输入处理和图形界面显示等基础知识。该活动可能使用了HTML、JavaScript和CSS等前端技术实现,参与者通过实践操作来学习如何编程,并理解基本的游戏设计原理。
recommend-type

【R语言高级教程】:最小二乘法从入门到精通

# 1. 最小二乘法的理论基础 最小二乘法是数学优化技术之一,广泛应用于统计学、数据分析和工程学等领域。其核心思想在于找到一条直线(或曲线),使得所有观测点到该直线的垂直距离之和最小,即误差平方和最小。这一方法不仅简单易行,而且可以有效减少异常值对模型的影响,使得参数估计更加稳定。 ## 1.1 最小二乘法的数学表述 在最基本的线性回归模型中,最小二乘法通过最小化误差的平方和来寻找最
recommend-type

cadence画PCB时改变线长

<think>好的,我现在需要帮助用户解决在Cadence PCB设计中调整走线长度的问题。首先,我得回想一下用户提到的引用内容,尤其是引用1、2和3,里面提到了实时显示走线长度、约束导向设计以及过孔对长度的影响。用户可能已经知道如何显示长度,现在想知道如何调整它们。 用户的问题是如何调整走线长度以满足特定需求,比如等长布线或时序要求。我应该先分步骤说明不同的调整方法,比如手动调整、使用自动优化工具、蛇形走线,以及设置约束管理器中的规则。 记得引用中的信息,比如引用2提到的约束导向环境和实时长度显示,所以需要提到约束管理器的使用。引用3讨论了过孔对长度的影响,调整过孔数量可能也是一种方法。