C语言:基于移位法 8位、16位、32位数据转

我们一般情况下,将数据高低位是从左边到右边划分的,比如0x1234,其中,12为此段数据的高16位,34为数据的低8位数

8位转16位

将2个8位数据high、low合成一个16位数据data_u16:

data_u16 = (high<<8) | low;

16位转8位

将一个16位数据data_u16拆分成2个8位数据high、low:

	high = (data_u16 >> 8) & 0xff;	 	//高8位
	low = 	data_u16 	   & 0xff; 		//低8位

8位转32位

将4个8位数据data_u8[4]合成一个32位数据data_u32:

data_u32 = (data_u8[0]<<24)|(data_u8[1]<<16)|(data_u8[2]<<8)|data_u8[3];

32位转8位

将一个32位数据data_u32拆分成4个8位数据data_u8[4]:

data_u8[0] = (data_u32 >> 24) & 0xff;	 
data_u8[1] = (data_u32 >> 16) & 0xff; 	   
data_u8[2] = (data_u32 >> 8)  & 0xff;
data_u8[3] =  data_u32        & 0xff;
//高位在前,低位在后

16位转32位

将2个16位数据data_u16[2]合成一个32位数据data_u32:

data_u32 = (data_u16[0]<<16)|data_u16[1];

32位转16位

将一个32位数据data_u32拆分成2个16位数据data_u16[2]:

data_u16[0] = (data_u32 >> 16) & 0xffff;	 //高16位
data_u16[1] =  data_u32        & 0xffff; 	 //低16位

比较方便的宏定义应用:

用于计算:

16和8互转,同理,不一一赘述

#define NUM_H(x) ((uint16_t)x&0xFF00>>8)  //16取高8
#define NUM_L(x) ((uint16_t)x&0x00FF)     //16取低8

#define CHARtoINT(xH,xL) ((uint16_t)xH<<8+xL)  //高低8转16

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个基于STC89C52单片机的四计算器程序的代码,可以进行加、减、乘、除四则运算,并且可以在4数码管上显示结果: ```c #include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit KEY1 = P1^0; // 按键1 sbit KEY2 = P1^1; // 按键2 sbit KEY3 = P1^2; // 按键3 sbit KEY4 = P1^3; // 按键4 sbit KEY5 = P1^4; // 按键5 sbit KEY6 = P1^5; // 按键6 sbit KEY7 = P1^6; // 按键7 sbit KEY8 = P1^7; // 按键8 sbit LSA = P2^2; // 数码管选择 sbit LSB = P2^3; sbit LSC = P2^4; sbit LSD = P2^5; sbit DIO = P2^0; // 数码管数据 sbit CLK = P2^1; // 数码管时钟 uchar code table[] = { // 数码管显示表 0x3f, // '0' 0x06, // '1' 0x5b, // '2' 0x4f, // '3' 0x66, // '4' 0x6d, // '5' 0x7d, // '6' 0x07, // '7' 0x7f, // '8' 0x6f // '9' }; uchar num1, num2, result; // 运算数和结果 uchar oper; // 运算符 void delay_ms(uint ms) // 延时函数,单:毫秒 { uint i, j; for(i=0; i<ms; i++) { for(j=0; j<120; j++); } } void display(uchar dat) // 数码管显示函数 { uchar i; for(i=0; i<8; i++) { DIO = dat & 0x01; // 取最低 dat >>= 1; // 右移一 CLK = 1; CLK = 0; } } void main() { while(1) { if(KEY1 == 0) // 按键1:加 { oper = '+'; num1 = 10; num2 = 5; result = num1 + num2; } if(KEY2 == 0) // 按键2:减 { oper = '-'; num1 = 10; num2 = 5; result = num1 - num2; } if(KEY3 == 0) // 按键3:乘 { oper = '*'; num1 = 10; num2 = 5; result = num1 * num2; } if(KEY4 == 0) // 按键4:除 { oper = '/'; num1 = 10; num2 = 5; result = num1 / num2; } if(KEY5 == 0) // 按键5:显示结果 { LSA = 0; // 第一(最高) LSB = 0; LSC = 0; display(table[result / 1000]); delay_ms(5); LSA = 1; // 第二 LSB = 0; LSC = 0; display(table[result % 1000 / 100]); delay_ms(5); LSA = 0; // 第三 LSB = 1; LSC = 0; display(table[result % 100 / 10]); delay_ms(5); LSA = 1; // 第四(最低) LSB = 1; LSC = 0; display(table[result % 10]); delay_ms(5); } if(KEY6 == 0) // 按键6:清零 { num1 = 0; num2 = 0; result = 0; LSA = 1; LSB = 1; LSC = 1; display(0x00); } } } ``` 需要注意的是,这个程序仅仅是一个简单的示例,实际上需要根据具体的需求进行修改和完善。另外,这个程序中使用了一个基于移位寄存器的数码管显示函数,需要确保在每次显示前选择正确的数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值