利用共用体实现字节赋值和位赋值

1.外设控制函数模块

先给p0赋值,再选择打开对应的锁存器,再关闭锁存器,使值稳定。

#include <STC15F2K60S2.H>

//外设控制函数
void vDevice_Ctrl(unsigned char p2data,unsigned char p0data)
{
	P0 = p0data;    
	P2 = p2data;
	P2 = 0;
}

2.共用体赋值法

description:1.定义一个bits的结构体数据类型。

2.定义一个HexToBin的共用体数据类型。

3.对led_ctrl.hex赋值一个字节的数据,对应的b0——b7也会变化。

4.对led_ctrl.b.b0进行位赋值,对应的led_ctrl.hex也会对应变化。

共用体模块:

#ifndef __SYSTEM_H__
#define __SYSTEM_H__


typedef char s8;
typedef unsigned char u8;
typedef int s16;
typedef unsigned int u16;
typedef unsigned long u32;


//用typedef定义一个叫bits的结构体数据类型,从而可以用bits b;定义b为结构体的变量
typedef struct
{
	unsigned char b0: 1;
	unsigned char b1: 1;
	unsigned char b2: 1;
	unsigned char b3: 1;
	unsigned char b4: 1;
	unsigned char b5: 1;
	unsigned char b6: 1;
	unsigned char b7: 1;
}bits;

//用typedef定义一个叫HexToBin的共用体数据类型,从而可以用HexToBin led_ctrl;定义led_ctrl为共用体的变量
typedef union
{
	unsigned char hex;
	bits b;
}HexToBin;

#endif

3.示例:

通过对共用体变量赋值,完成控制led亮灭,打开/关闭蜂鸣器、继电器操作。

 相关电路分析在led和蜂鸣器继电器中已经有了详细的分析,此处不再赘述。

#include <STC15F2K60S2.H>
#include <intrins.h>
#include "Delay.h"
#include "Device.h"
#include "system.h"

HexToBin led_ctrl,buzzer_ctrl;

//初始化函数
void vSystem_Init(void)
{
	vDevice_Ctrl(0xa0,0);   //关闭蜂鸣器和继电器
}

void main(void)
{
	vSystem_Init();
	led_ctrl.hex = 0x55;    //进行字节赋值,希望L2,L4,L6,L8点亮
	vDevice_Ctrl(0x80,led_ctrl.hex);  //选通Y4c锁存器,并在p0口输出一个字节数据,完成点亮操作
	
	buzzer_ctrl.b.b4 = 1;    //进行位赋值,希望吸合继电器
	vDevice_Ctrl(0xa0,buzzer_ctrl.hex);  //选通Y5c锁存器,并在P0口输出一个字节数据,完成吸合操作
	while(1)
	{
		led_ctrl.b.b1 = 1;								//对led进行位赋值,希望熄灭L2
		vDevice_Ctrl(0x80,led_ctrl.hex); 		//选通Y4c锁存器,并在p0口输出一个字节数据,完成熄灭操作
		Delay_ms(200);
		
		led_ctrl.b.b1 = 0;							//对led进行位赋值,希望点亮L2
		vDevice_Ctrl(0x80,led_ctrl.hex); //选通Y4c锁存器,并在p0口输出一个字节数据,完成点亮操作
		Delay_ms(200);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值