tag 标签: 负数

相关博文
  • 热度 4
    2020-12-21 14:59
    5410 次阅读|
    0 个评论
    设备运行参数,需要保存到 EEPROM 中。运行参数数据类型不确定,有可能正负,也有可能不同长度。而 EEPROM 只能字节寻址。 不同编译器,数据类型的表示方法各异,且字节位置也会有区别。做字节转换会不通用。可以使用定义联合体的办法解决。 将需要存储的数据定义一个结构体,如下。参数可以任意数据类型,最后增加一个校验合字节,用于检查数据正确性。 typedef struct{ int16_t Kx; // 参数 1 int16_t Ky; // 参数 2 int16_t X0; // 参数 3 int16_t Y0; // 参数 4 uint8_t cs; // 校验合 }stTPParaTypeDef; #define PARALEN 9 // 上述结构体包含的字节数,可以用 sizeof(stTPParaTypeDef) 但有可能会出错。 定义一个联合体,联合体成员为参数结构及一个与参数结构等长的字节数组。 typedef union{ stTPParaTypeDef tp; uint8_t tpbyte ; }unTPParaTypeDef; 联合体中的结构和字节数组共用存储空间。 参数 0 参数 1 参数 2 参数 3 校验和 字节 0 字节 1 字节 2 字节 3 字节 4 字节 5 字节 6 字节 7 字节 8 unTPParaTypeDef unTPPara; // 定义一个全局参数联合体 需要保存参数时,先计算联合体内的字节数组校验合,然后把整个字节数组写到 EEPROM uint8_t SaveTPSetting(void){ uint8_t i,cs=0; cs = 0; for(i = 0;i<(PARALEN-1);i++){ cs += unTPPara.tpbyte ; } unTPPara.tp.cs = 0xFA - cs; AT24C64_WriteBytes(TPPARAADDR,unTPPara.tpbyte,PARALEN); return 1; } 需要获取数据时,按字节从 EEPROM 中读出相应长度的字节,放入联合体的字节数组中。并计算校验合,判别数据是否有效。 uint8_t GetTPSetting(void){ uint8_t i,cs = 0; AT24C64_ReadBytes(TPPARAADDR,unTPPara.tpbyte,PARALEN); for(i = 0;i
  • 热度 26
    2014-12-16 15:17
    4777 次阅读|
    0 个评论
            在没有使用QuartusII自带的Lpm_compare 这个模块时,自己理解的就是很简单的比较器,没有想到用到它有符号的功能就得出不一样的结果了。         首先要了解二进制有符号的情况,就拿4位的二进制来说。无符号的时候4位二进制中,0000-1111对应的是0-15,而有符号的二进制中,0000-0111是0-7,1000-1111是-8—1,在程序中可以实现,下图1是RTL级图,   在比较器中,a端是自己形成的4位二进制数从0000到1111一直累加,b端是选择用一个定值7来作比较,一个通过的是无符号的比较器,另一个通过有符号的比较器,得出来的结果由下图2所示。这是两个一样的图,只是把其中一个放大,可以看到计数到哪一位开始变化的。利用有符号的比较可以形成负数的形式,对于形成有负值的波形很有帮助。    
相关资源