OC结构体



一.NSRange


1.NSRange是一个表示范围的结构体。

typedef struct _NSRange {
      NSUInteger location; //表示位置
      NSUInteger length;   //表述长度
} NSRange;

2.NSRange结构体里面有2个成员变量(unsigned long),一个表示位置(location),一个表示程度(length)。

使用范围:

(1)字符串:字符串位置(location)从0开始依次递增,长度(length)表示从这个位置开始多少长度。

(1)数组:数组的位置(location)也是从0开始依次递增,长度(length)表示从这个位置开始多少个(长度)元素个数。


3.NSRange的初始化

(1)像C语言数组一样直接 = {location的值,length的值}。

(2)和C语言一样用下标赋值 = {.location = 值,.length = 值}。

(3)前面二种方法基本不用,第三种方法最常用(用函数NSMakeRange):= NSMakeRange(loc的值,len的值)。


4.对象方法rangOfString(查找后面字符串在这个字符串对象中得范围)

[字符串对象  rangOfString:OC字符串],这个方法的返回值是NSRange类型。

如果这个字符串不在这个字符串对象里面,则会返回NSRange中loc = NSNotFound(int -1) ,length = 0。


5.NSStringFormRange函数

NSStringFormRange(NSRange变量)可以将NSRange变量转变成字符串方便输出,打印:{location的值,length的值}。不转变成字符串输出只能把结构体里面的成员变量一个一个输出。


二.NSPoint(CGPoint)


NS和CG开头的都是同一个类型的结构体,开发中一般用CG开头的,因为CG开头的是跨平台的。下面所要结构体都用CG开头。

1.CGPoint表示的是一个点(例如屏幕上的点,就是坐标点)

typedef struct _NSPoint {
      CGFloat x;
      CGFloat y;
} NSPoint;


2.CGPoint有2个double类型的成员变量,一个表示X轴的坐标,一个表示Y轴的坐标。


3.初始化方式

(1)C语言中结构体的2中初始化方式(不用)

(2)用函数CGPointMake或NSMakePoint初始化 = CGPointMake(x的值,y的值)。


4.NSStringFormPoint函数

NSStringFormPoint(CGPoint变量)可以将CGPoint变量转变成字符串方便输出,打印:{x的值,y的值}。


5.CGPointZero表示原点(0,0),即CGPointMake(0,0)。


三.NSSize(CGSize)


1.CGSize表示的是任意一个平面矩形(屏幕上的一个有长宽的矩形)

typedef struct _NSSize {

      CGFloat width; // 宽
      CGFloat height; // 高
} NSSize;

2.CGSize有2个double类型的成员变量,一个表示屏幕的宽,一个表示屏幕的高。

3.初始化方式

(1)C语言中结构体的2中初始化方式(不用)

(2)用函数CGSizeMake或NSMakeSize初始化 = CGSizeMake(宽的值,高的值)。


4.NSStringFormSize函数

NSStringFormSize(CGSize变量)可以将CGSize变量转变成字符串对象方便输出,打印:{宽的值,高的值}。


5.CGSizeZero表示一个点,即CGSizeMake(0,0)。


四.NSRect(CGRect)


1.CGRect表示的是一个选定的平面矩形(屏幕上的从某一点开始的矩形就是指定平面上的矩形)

struct CGRect {
   CGPoint origin;
   CGSize size;
};
typedef struct CGRect CGRect;


2.CGRect有2个结构体类型的成员变量,一个表示屏幕上德一点,一个表示屏幕上的矩形(任意)。

3.初始化方式

(1)C语言中结构体的2中初始化方式(不用)

(2)用函数CGRectMake或NSMakeRect初始化 = CGRectMake(点的x,点的y,矩形的宽,矩形的高)。


4.NSStringFormRect函数

NSStringFormRect(CGRect变量)可以将CGRect变量转变成字符串对象方便输出,打印:{{{x的值,y的值},{宽的值,高的值}}


5.CGRectZero表示一个原点,即CGRectMake(0,0)。


四.函数


1.比较两个点是否相同,返回值是BOOL型,相同返回YES,不相同返回NO:

CGPointEqualToPoint(CGPoint变量1,CGPoint变量2)。

2.比较两个矩形大小是否相同,返回值是BOOL型,相同返回YES,不相同返回NO:

CGPointEqualToSize(CGSize变量1,CGSize变量2)。

3.比较两个矩形位置和大小是否都相同,返回值是BOOL型,相同返回YES,不相同返回NO:

CGPointEqualToRect(CGRect变量1,CGRect变量2)。

4.判断一个点是否在这个指定位置矩形内,返回值是BOOL型,是返回YES,不在则返回NO

CGRectContainsPoint(CGRect变量,CGPoint变量)。


五.注意:


1.使用这些CGPointEqualToPointCGRectContainsPoint等函数的前提是添加CoreGraphics框架。

2.使用CGPointZero等的前提是添加CoreGraphics框架。




#include "stm32f10x.h"// Device header #include "PWM.h" #include "IC.h" #include "OLED.h" int main(void) { PWM_Init(); IC_Init(); OLED_Init(); OLED_ShowString(1,1,"Freq:"); while(1) { OLED_ShowNum(1,6,IC_GetFreq(),5); } } #include "stm32f10x.h" // Device header void PWM_Init(void) //输出一个频率1KHz的PWM波 { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(&TIM_OCInitStructure); //给OC结构体赋初值 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); TIM_InternalClockConfig(TIM2); //内部时钟 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时基单元 TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period=100-1; //ARR设为100,即CCR值为占空比 TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //先初始化PSC的值 TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); TIM_Cmd(TIM2,ENABLE); //计数器使能 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //GPIO口,推挽复用输出 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //输出比较模式PWM1 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //高极性,极性不反转 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //输出状态(使能) TIM_OCInitStructure.TIM_Pulse=0; //CCR的值,占空比=CRR/(ARR+1) TIM_OC1Init(TIM2,&TIM_OCInitStructure); //通道初始化 } void PWM_SetCompare1(uint16_t Compare) //更改占空比 { TIM_SetCompare1(TIM2,Compare); //单独更改CCR寄存器值,所以上面“Pulse”参数给0,且CCR值为占空比 } #include "stm32f10x.h" // Device header void IC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //带上拉模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); TIM_InternalClockConfig(TIM3); //内部时钟 TIM_Cmd(TIM3,ENABLE); //定时器使能 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period=65536-1; //输入捕获中一般设置最大(防溢出) TIM_TimeBaseInitStructure.TIM_Prescaler=72-1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); TIM_ICInitStructure.TIM_Channel=TIM_Channel_1; //选择通道 TIM_ICInitStructure.TIM_ICFilter=0xF; //滤波器 TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising; //极性(上升沿) TIM_ICInitStructure.TIM_ICPrescaler=TIM_ICPSC_DIV1; //1分频 TIM_ICInitStructure.TIM_ICSelection=TIM_ICSelection_DirectTI; //数据选择器(直连/交叉) TIM_ICInit(TIM3,&TIM_ICInitStructure); TIM_SelectInputTrigger(TIM3,TIM_TS_TI1FP1); //触发源选择 TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_Reset); //从模式选择 } uint32_t IC_GetFreq(void) { return 1000000/(TIM_GetCapture1(TIM3)); //fx=fc/N( 预分频后的值【1MHZ】 / CCR) } 为什么OLED不能显示1KHZ
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值