鹏仔先生-趣站-一个有趣的网站!
鹏仔先生

鹏仔先生

当前位置:网站首页 > 文字大全 > 正文

PIC单片机编程的问题 刚学 不太懂

作者:百变鹏仔日期:2023-08-12 15:05:37浏览:9分类:文字大全

PIC单片机编程的问题 刚学 不太懂

;?实例?供参考?可以直接仿真,多看看实例? 会有帮助的。

;?*********************************************************************

;?* ? GPIO0-V? GPIO1-I? GPIO2-LED1? GPIO4-LED2? GPIO5-OUT ? *

;?* ? GPIO3-10K *

;?*********************************************************************

? LIST?P=12F675

? INCLUDE?"P12F675.INC"? ;?包含MPLAB预定义的头文件

? __CONFIG(0x3FC4) ;?11?---1?1100?1000? 设定配置字信息

?;?_CPD_OFF?&?_CP_OFF?&?_BODEN_ON?&?_MCLRE_OFF?

?;?关代码-数据保护, 掉电复位使能,内部复位,

?;?_PWRTE_ON?&?_WDT_OFF?&?_INTRC_OSC_NOCLKOUT

?;?上电复位延时使能,关看门狗,内部振荡无时钟输出

;?*************************************************

;?*?寄存器定义及RAM分配 *

;?*************************************************

? ERRORLEVEL?-302 ;?编译输出结果中不要显示message

? cblock?0x20 ;?通用变量定义从该地址开始

? W_TEMP ;?中断服务程序用来临时保存W和STATUS?

? STATUS_TEMP

? FLAGS ?;?程序要使用的状态标志寄存器

? PWM_HIGH:2 ;?新的PWM高电平时间,保留两个字节

? PWM_LOW:2 ?;?新的PWM低电平时间,保留两个字节

? PWM_HIGH_CURRENT:2 ;?当前PWM的高电平时间锁存

? PWM_LOW_CURRENT:2 ?;?当前的PWM低电平时间锁存

? COUNTER ;?AD采样次数计数

? adsum:2 ;?16位的AD累加结果,用于平均运算,两个字节

? temp:2 ;?用于数学运算的临时变量,两个字节

? endc ? ;?结束cblock变量定义

? count EQU 38H

? result? EQU 39H

;************************************************

;I/O引脚初始化 ? *

;以及?A/D?初始化 *

;************************************************

;GP0?=?模拟电压输入

;GP1?=?没有使用

;GP2?=?没有使用

;GP3?=?只能作为输入,连接10K下拉电阻到地,ICSP烧录会使用该引脚

;GP4?=?PWM1? 输出引脚

;GP5?=?PWM2? 输出引脚

? ;?/?***?***?***?***?***?/ 代换定义

#define?PWM_OUTPUT ?GPIO,2? ;?GPIO,4

#define?LOAD_PWM FLAGS,0

#define?CALCULATE_AD FLAGS,1

#define?PWM_TICKS ? .1024 ;?PWM时间片的个数,如果PWM的分辨率是10位,

#define?TEST_PWM_HIGH? .512 ;?用于测试的50%占空比,高电平时间等于PWM时间片的一半

#define?TEST_PWM_LOW PWM_TICKS-TEST_PWM_HIGH? ;?低电平时间等于PWM时间片减高电平时间

#define?ISR_DELAY ? .16 ?;?从Timer1溢出到进入中断重新装载Timer1值的延时,

;?可通过软件模拟来确定该值

#define?NUM_AD_SAMPLES?.16 ?;?AD采样次数

#define?AD_TIME_INTERVAL?.10 ;?0xFF?-?(.245) AD时间间隔,10个cycle的循环

? ;?/?***?***?***?***?***?/ 定义双字节常数减变量的宏

? ;?const_input?-?input?=?output

sub_const_16?macro?const_input,?input,?output

? movlw low?const_input ;?W?=?low?双字节常数 L

? movwf temp

? movlw high?const_input? ;?W?=?high?双字节常数?H

? movwf temp+1

? movf input,w ;?W?=?input

? subwf temp,w ;?W?=?temp?-?W?

? movwf output ;?output?=?W

? movf input+1,w ?;?W?=?input+1

? btfss STATUS,C ? ;?C?=?1?->

? incf input+1,w ?;?W?=?input+1?+?1

? subwf temp+1,w ? ;?W?=?temp+1?-?W?

? movwf output+1 ? ;?output+1?=?W

? endm

? ;?/?***?***?***?***?***?/ 定义双字节常数加变量的宏

? ;?const_input?+?input?=?output

add_const_16?macro?const_input,?input,?output

? movlw low?const_input ;?W?=?low?双字节常数 L

? movwf temp

? movlw high?const_input? ;?W?=?high?双字节常数?H

? movwf temp+1

? movf input,w ;?W?=?input

? addwf temp,w ;?W?=?temp?+?W?

? movwf output ;?output?=?W

? movf input+1,w ?;?W?=?input+1

? btfsc STATUS,C ? ;?C?=?0?->

? incf input+1,w ?;?W?=?input+1?+?1

? addwf temp+1,w ? ;?W?=?temp+1?+?W?

? movwf output+1 ? ;?output+1?=?W

? endm

? ;?/?***?***?***?***?***?/ 程序开始

? ;?/?***?***?***?***?***?/

? org ?0000H ?;?芯片复位入口地址0x00

? goto MAIN000 ;?主程序

? ;?/?***?***?***?***?***?/ 中断服务子程序

? ;?/?***?***?***?***?***?/

? ;?INTCON,T0IF---TMR0? 溢出 INTCON,INTF---GP2/INT外部中断

? ;?INTCON,GPIF---GP5-GP0?引脚电平发生了变化

? ;?PIR1,EEIF---EEPROM?写操作完成? PIR1,ADIF---A/D?转换完成

? ;?PIR1,CMIF---比较器输入已改变 PIR1,TMR1IF---TMR1? 溢出

? org ?0004h ?;?中断入口地址0x0004

INTCON00? movwf W_TEMP ;?W_TEMP?=?W? 保存

? swapf STATUS,W ? ;?STATUS_TEMP?=?STATUS

? movwf STATUS_TEMP

? bcf ?STATUS,RP0 ;?选择Bank?0

INTCON02? movlw b'00000100' ;?把W的第四位置高,其他都是零

? xorwf GPIO,F ;?和GPIO异或,也就是把PWM输出脚的电平反转

;?判断中断种类

INTCON03? bcf ?PIR1,TMR1IF ;?清?T1?中断标志?Timer1?中断

? movlw HIGH?3CAFH ;?Timer1?=?50?mS? C350H

? movwf TMR1H ?;?FFFFH?-?C350H?=?3CAFH

? movlw LOW?3CAFH

? movwf TMR1L

? bsf ?CALCULATE_AD ? ;?置位?A/D?转换标志

? bsf ?LOAD_PWM ? ;?置位?PWM?标志

INTCON08? swapf STATUS_TEMP,W ?;?恢复STATUS寄存器

? movwf STATUS

? swapf W_TEMP,F ? ;?恢复W寄存器

? swapf W_TEMP,W

? retfie ;?从中断返回

? ;?/?***?***?***?***?***?/ 主程序

? ;?/?***?***?***?***?***?/

MAIN000 clrf GPIO ? ;?初始化GPIO端口寄存器为零

? bsf ?STATUS,?RP0 ;?选择Bank?1

? call 0x3FF ?;?读内部振荡出厂校准字,返回值在W寄存器内

? movwf OSCCAL ;?内部振荡器校准

? movlw b'11000011' ;?设置GP为输入,所有其他口为输出

? movwf TRISIO ?

? movlw 01h ;?使能Timer1中断?01h

? movwf PIE1

? movlw b'00010001' ;?AD采用FOSC/8?时钟,GP2是模拟口,

? movwf ANSEL ?;?其他口为数字IO

? movlw b'00001000' ;?Timer0设置为使用内部指令周期,无预分频

? movwf OPTION_REG

? bcf ?STATUS,?RP0 ;?选择Bank0

? movlw b'10000001' ;?A/D是右对齐格式,Vdd为参考,GP0作为AD输入口

? movwf ADCON0

? movlw b'00000111' ;?关掉内部比较器,让比较器的输入都为数字口

? movwf CMCON

? movlw 0C0h ? ;?使能周边外设中断和全局中断

? movwf INTCON

? movlw b'00000001' ;?Timer1是1:1预分频,内部时钟源,

? movwf T1CON ?;?振荡频率/4,不带门控

? movlw .16 ;?AD?次数?=?10

? movwf COUNTER

MAIN010 btfss CALCULATE_AD ? ;?=?1?->? 主循环

? goto MAIN010

? bcf ?CALCULATE_AD ? ;?清?A/D?转换标志

? bsf ?STATUS,RP0 ;?选择bank1

? movf ADRESL,W ? ;?W?=?AD?L

? addwf adsum,F ;?adsum?=?AD?L

? btfsc STATUS,C ? ;?C?=?0?->

? incf adsum+1,F ?;?adsum+1?=?adsum+1?+?1

? bcf ?STATUS,RP0 ;?选择Bank0

? movf ADRESH,W ? ;?W?=?AD?H

? addwf adsum+1,F ?;?adsum+1?=?AD?H

? bsf ?ADCON0,GO_DONE ;?启动?AD?下一次转换

? decfsz? COUNTER,F ?;?转换?计数器?-?1?=?0?->

? goto MAIN010 ;?循环

? movfw adsum

? movwf result ;?result?=?w

? CALL LED000

? movfw adsum+1

? movwf result ;?result?=?w

? CALL LED000

? movlw .16 ;?AD?次数?=?10

? movwf COUNTER

? clrf adsum ?;?清?A/D?累加和?/?平均值?寄存器

? clrf adsum+1

? goto MAIN010

? ;?/?***?***?***?***?***?/ 串行输出

LED000 movlw 8 ?;?串行输出?8?位?w?=?8

movwf count ?;?count?=?w

LED001 bcf ?TRISIO,4 ? ;?清零

btfsc result,0 ? ;?result.7=0?->

bsf ?TRISIO,4 ? ;?0010?0000

bsf ?TRISIO,5 ?;?产生时钟脉冲?GP4?=?1

bcf ?TRISIO,5 ? ; ? GP4?=?0

RRF ?result,1 ? ;?左移获取下一个结果位

decfsz? count,1 ?;?-?1

goto LED001 ;??0 循环下位

RETURN ? ;?=?0

? ;?/?***?***?***?***?***?/

? end ;?程序结束符

学习C语言需要哪些软件

Block 变量拥有 blocks 的引用。你可以使用和声明函数指针类似的语法来声明它 们,除了它们使用^修饰符来替代 * 修饰符。Block 类型可以完全操作其他 C 系统 类型。以下都是合法的 block 声明:

void (^blockReturningVoidWithVoidArgument)(void);

int (^blockReturningIntWithIntAndCharArguments)(int, char);

void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int);

Blocks 还支持可变参数(...)。一个没有使用任何参数的 block 必须在参数列表 上面用 void 标明。

Blocks 被设计为类型安全的,它通过给编译器完整的元数据来合法使用 blocks、 传递到 blocks 的参数和分配的返回值。你可以把一个 block 引用强制转换为任意类型 的指针,反之亦然。但是你不能通过修饰符 * 来解引用一个 block,因此一个 block 的大小是无法在编译的时候计算的。

你同样可以创建 blocks 的类型。当你在多个地方使用同一个给定的签名的 block 时,这通常被认为是最佳的办法。

typedef float (^MyBlockType)(float, float);

MyBlockType myFirstBlock = // ... ;

MyBlockType mySecondBlock = // ... ;

3.2 创建一个block

你可以使用 ^ 修饰符来标识一个 block 表达式的开始。它通常后面跟着一个被 () 包含起来的参数列表。Block 的主体一般被包含在 {} 里面。下面的示例定义了一个 简单的 block,并把它赋值给前面声明的变量(oneFrom)。这里 block 使用一个标准 C 的结束符 ; 来结束。

int (^oneFrom)(int);

oneFrom = ^(int anInt) {

return anInt - 1;

};

如果你没有显式的给 block 表达式声明一个返回值,它会自动的从 block 内容推 断出来。如果返回值是推断的,而且参数列表也是 void,那么你同样可以省略参数列 表的 void。如果或者当出现多个返回状态的时候,它们必须是完全匹配的(如果有必 要可以使用强制转换)。

3.3 全局blocks

在文件级别,你可以把 block 作为全局标示符:

#import

int GlobalInt = 0;

int (^getGlobalInt)(void) = ^{ return GlobalInt; };

第四章 Blocks和变量

本文描述 blocks 和变量之间的交互,包括内存管理。

你可以引用三种标准类型的变量,就像你在函数里面引用那样:

全局变量,包括静态局部变量。

全局函数(在技术上而言这不是变量)。

封闭范围内的局部变量和参数。

Blocks 同样支持其他两种类型的变量:

在函数级别是__block变量。这些在block里面是可变的(和封闭范围),并任何引

用 block 的都被保存一份副本到堆里面。

引入const。

最后,在实现方法里面,blocks也许会引用Objective-C的实例变量。参阅“对象

和 Block 变量”部分。

在 block 里面使用变量遵循以下规则:

全局变量可访问,包括在相同作用域范围内的静态变量。

传递给block的参数可访问(和函数的参数一样)。

程序里面属于同一作用域范围的堆(非静态的)变量作为const变量(即只读)。

它们的值在程序里面的 block 表达式内使用。在嵌套 block 里面,该值在最近的

封闭范围内被捕获。

属于同一作用域范围内并被__block存储修饰符标识的变量作为引用传递因此是

可变的。

属于同一作用域范围内block的变量,就和函数的局部变量操作一样。

每次调用 block 都提供了变量的一个拷贝。这些变量可以作为 const 来使用,或在 block 封闭范围内作为引用变量。

下面的例子演示了使用本地非静态变量:

int x = 123;

void (^printXAndY)(int) = ^(int y) {

printf("%d %d\n", x, y);

};

printXAndY(456); // prints: 123 456

正如上面提到的,在 block 内试图给 x 赋一个新值会导致错误发生:

int x = 123;

void (^printXAndY)(int) = ^(int y) {

x = x + y; // error

printf("%d %d\n", x, y);

};

为了可以在 block 内修改一个变量,你需要使用__block 存储类型修饰符来标识该 变量。参阅“__block 存储类型”部分。

4.2 __block存储类型

你可以指定引入一个变量为可更改的,即读-写的,通过应用__block 存储类型修 饰符。局部变量的__block 的存储和 register、auto、static 等存储类型相似,但它们之 间不兼容。

__block 变量保存在变量共享的作用域范围内,所有的 blocks 和 block 副本都声明 或创建在和变量的作用域相同范围内。所以,如果任何 blocks 副本声明在栈内并未超 出栈的结束时,该存储会让栈帧免于被破坏(比如封装为以后执行)。同一作用域范 围内给定的多个 block 可以同时使用一个共享变量。

作为一种优化,block存储在栈上面,就像blocks本身一样。如果使用Block_copy 拷贝了 block 的一个副本(或者在 Objective-C 里面给 block 发送了一条 copy 消息), 变量会被拷贝到堆上面。所以一个__block 变量的地址可以随时间推移而被更改。

使用__block 的变量有两个限制:它们不能是可变长的数组,并且它们不能是包 含有 C99 可变长度的数组变量的数据结构。

以下举例说明了如何使用__block 变量:

__block int x = 123; // x lives in block storage

void (^printXAndY)(int) = ^(int y) {

x = x + y;

printf("%d %d\n", x, y);

};

printXAndY(456); // prints: 579 456

// x is now 579

下面的例子显示了 blocks 和其他几个类型变量间的交互:

extern NSInteger CounterGlobal;

static NSInteger CounterStatic;

{

NSInteger localCounter = 42;

__block char localCharacter;

void (^aBlock)(void) = ^(void) {

++CounterGlobal;

++CounterStatic;

CounterGlobal = localCounter; // localCounter fixed at block creation

localCharacter = 'a'; // sets localCharacter in enclosing scope

};

++localCounter; // unseen by the block

localCharacter = 'b';

aBlock(); // execute the block

// localCharacter now 'a'

}

4.3 对象(Object)和Block变量

Block 提供了支持 Objective-C 和 Objective-C++的对象,和其他 blocks 的变量。

4.3.1 Objective-C对象

在引用计数的环境里面,默认情况下当你在 block 里面引用一个 Objective-C 对象的时 候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被 retain。 但是被__block 存储类型修饰符标记的对象变量不会被 retain. 注意:在垃圾回收机制里面,如果你同时使用__weak 和__block 来标识一个变量,那么该 block 将不会保证它是一直是有效的。

如果你在实现方法的时候使用了 block,对象的内存管理规则更微妙:

如果你通过引用来访问一个实例变量,self 会被 retain。

如果你通过值来访问一个实例变量,那么变量会被 retain。

下面举例说明两个方式的不同:

dispatch_async(queue, ^{

// instanceVariable is used by reference, self is retained

doSomethingWithObject(instanceVariable);

});

id localVariable = instanceVariable;

dispatch_async(queue, ^{

// localVariable is used by value, localVariable is retained (not self)

doSomethingWithObject(localVariable);

4.3.2 C++对象

通常你可以在 block 内使用 C++的对象。在成员函数里面,通过隐式的导入 this 指针引用成员变量和函数,结果会很微妙。有两个条件可以让 block 被拷贝:

如果你拥有__block存储的类,它本来是一个基于栈的C++对象,那么通常会使用 copy 的构造函数。

如果你在 block 里面使用任何其他 C++基于栈的对象,它必须包含一个 const copy 的构造函数。该 C++对象使用该构造函数来拷贝。

4.3.3 Blocks

当你拷贝一个 block 时,任何在该 block 里面对其他 blocks 的引用都会在需要的 时候被拷贝,即拷贝整个目录树(从顶部开始)。如果你有 block 变量并在该 block 里 面引用其他的 block,那么那个其他的 block 会被拷贝一份。

当你拷贝一个基于栈的 block 时,你会获得一个新的 block。但是如果你拷贝一个 基于堆的 block,你只是简单的递增了该 block 的引用数,并把原始的 block 作为函数 或方法的返回值。

五章 使用Blocks

5.1 调用一个Block

如果你声明了一个 block 作为变量,你可以把它作为一个函数来使用,如下面的

两个例子所示:

int (^oneFrom)(int) = ^(int anInt) {

return anInt - 1;

};

printf("1 from 10 is %d", oneFrom(10));

// Prints "1 from 10 is 9"

float (^distanceTraveled) (float, float, float) =

^(float startingSpeed, float acceleration, float time) {

float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);

return distance;

};

float howFar = distanceTraveled(0.0, 9.8, 1.0);

// howFar = 4.9

然而你通常会把 block 作为参数传递给一个函数或方法。在这种情况下,你通过 需要创建一个”内联(inline)”的 block。

5.2 使用Block作为函数的参数

你可以把一个 block 作为函数的参数就像其他任何参数那样。然而在很多情况下, 你不需要声明blocks;相反你只要简单在需要它们作为参数的地方内联实现它们。下 面的例子使用 qsort_b 函数。qsort_b 和标准 qsort_r 函数类似,但是它最后一个参数用 block.

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine"};

qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, constvoid *r) {

char *left = *(char **)l;

char *right = *(char **)r;

return strncmp(left, right, 1);

});

// Block implementation ends at "}"

// myCharacters is now { "Charles Condomine", "George", "TomJohn" }

注意函数参数列表包含了一个 block。

下一个例子显示了如何在 dispatch_apply 函数里面使用 block。dispatch_apply 声明 如下:

void dispatch_apply(size_t iterations, dispatch_queue_t queue, void(^block)(size_t));

该函数提交一个 block 给批处理队列来多次调用。它需要三个参数;第一个指定 迭代器的数量;第二个指定一个要提交 block 的队列;第三个是 block 它本身,它自 己需要一个参数(当前迭代器的下标)。

你可以使用 dispatch_apply 来简单的打印出迭代器的下标,如下:

#include

size_t count = 10;

dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_apply(count, queue, ^(size_t i) {

printf("%u\n", i);

});

5.3 使用Block作为方法的参数

Cocoa 提供了一系列使用 block 的方法。你可以把一个 block 作为方法的参数就像 其他参数那样。

下面的例子确定数组前面五个元素中第一个出现在给定的过滤器集中任何一个 的下标。

NSArray *array = [NSArray arrayWithObjects: @"A", @"B", @"C", @"A",@"B", @"Z",@"G", @"are", @"Q", nil];

NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];

BOOL (^test)(id obj, NSUInteger idx, BOOL *stop);

test = ^ (id obj, NSUInteger idx, BOOL *stop) {

if (idx

if ([filterSet containsObject: obj]) {

return YES;

}

}

return NO;

};

NSIndexSet *indexes = [array indexesOfObjectsPassingTest:test];

NSLog(@"indexes: %@", indexes);

下面的例子确定一个 NSSet 是否包含一个由局部变量指定的单词,并且如果条件 成立把另外一个局部变量(found)设置为 YES(并停止搜索)。注意到 found 同时被声 明为__block 变量,并且该 block 是内联定义的:

__block BOOL found = NO;

NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma",@"X", nil];

NSString *string = @"gamma";

[aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {

if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {

*stop = YES;

found = YES;

}

}];

// At this point, found == YES

5.4 拷贝Blocks

通常,你不需要 copy(或 retain)一个 block.在你希望 block 在它被声明的作用域 被销毁后继续使用的话,你子需要做一份拷贝。拷贝会把 block 移到堆里面。

你可以使用 C 函数来 copy 和 release 一个 block:

Block_copy();

Block_release();

如果你使用 Objective-C,你可以给一个 block 发送 copy、retain 和 release(或 autorelease)消息。

为了避免内存泄露,你必须总是平衡 Block_copy()和 Block_release()。你必须平衡 copy 或 retain 和release(或 autorelease)--除非是在垃圾回收的环境里面。

5.5 需要避免的模式

一个 block 的文本(通常是^{...})是一个代表 block 的本地栈数据结构地址。 因此该本地栈数据结构的作用范围是封闭的复合状态,所以你应该避免下面例子显示 的模式:

void dontDoThis() {

void (^blockArray[3])(void); // an array of 3 block references

for (int i = 0; i

blockArray[i] = ^{ printf("hello, %d\n", i); };

// WRONG: The block literal scope is the "for" loop

}

}

void dontDoThisEither() {

void (^block)(void);

int i = random():

if (i > 1000) {

block = ^{ printf("got i at: %d\n", i); };

// WRONG: The block literal scope is the "then" clause

}

// ...

}

5.6 调试

你可以在 blocks 里面设置断点并单步调试。你可以在一个 GDB 的对话里面使用

invoke-block 来调用一个 block。如下面的例子所示:

$ invoke-block myBlock 10 20

如果你想传递一个 C 字符串,你必须用引号括这它。例如,为了传递 this string 给doSomethingWithString 的 block,你可以类似下面这样写:

$ invoke-block doSomethingWithString ""this string""

结束语

Block 是 iOS 4.0 之后添加的新特性支持。本人亲测感觉使用 Block 最大的便利就 是简化的回调过程。以前使用 UIView 的动画,进程要控制动画结束后进行相应的处 理。iOS 4.0 之后,UIView 新增了对 Block 的支持,现在只要使用简单的一个 Block 代码就可以在写动画的代码部分直接添加动画结束后的操作。还有就是在使用Notification 时候 Block 也非常有帮助。反正多用就可以体会到 Block的优美了。

对了,使用 Block 要谨记别造成对象互相引用对方导致引用计数进入一个循环导 致对象无法被释放。iOS 5.0 之后的 ARC 也是无法解决该潜在的互相引用的问题的。 所以写 Block 的时候要注意这点。因为 Block 往往在后台自动对一些它引用了的对象 进行 retain 操作。具体形式这里就不距离了,大家在使用的时候多体会一下。

学c语言可以用的软件推荐如下:

1、TurboC是由美国Borland公司开发的一套C语言程序开发工具,Borland公司是一家专门从事软件开发、研制的大公司。该公司相继推出了一套Turbo系列软件,如TurboBASIC、TurboPascal、TurboProlog,这些软件很受用户欢迎。TurboC集成了程序编辑、调试、链接等多种功能。

2、WIN-TC是一个TC2WINDOWS平台开发工具。该软件使用TC2为内核,提供WINDOWS平台的开发界面,因此也就支持WINDOWS平台下的功能,例如剪切、复制、粘贴和查找替换等。

鹏仔 微信 15129739599

百科狗 baikegou.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

  • 上一篇:已经是第一篇了
  • 下一篇:已经是最后一篇了
内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)