凌阳C语言应用_第1页
凌阳C语言应用_第2页
凌阳C语言应用_第3页
凌阳C语言应用_第4页
凌阳C语言应用_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八讲SPCE061A之C语言应用前言这个ppt的重点在于讲述如何使用C语言来对SPCE061A单片机进行编程。希望这个ppt对同学们有所帮助。

目录凌阳C语言简介凌阳C语言基础C和汇编混合编程用C来直接控制硬件

凌阳C语言简介

用C语言编程的优点寄存器分配、数据类型等由编译器管理。编程及调试的时间减少,大大缩短开发周期。明显增加软件可读性,便于改进和扩充。

用C语言可以很方便地对SPCE061A进行编程IDE直接提供了C语言的开发环境,C函数和汇编函数可以方便地进行相互调用。SoftwareLibraries

StandardClibrary

Hardwarelibrary SACM(Sunplusaudiocodingmethod)

凌阳C语言基础

unSPGCC认可的基本数据类型及其值域数据类型数据长度(bit)值域char16-32768~32767short,int16-32768~32767long32-2147483648~2147483647

unsignedchar160~65535unsignedshortunsignedint160~65535

unsignedlong320~4294967295

float,double32以IEEE格式表示的32位浮点数

数据类型应该注意的地方char和unsignedchar为16位 这与一般机器使用的GCC数据类型之间有一些差别。float与double均存储为32位浮点数

unSP汇编的float与double分别是32位与64位浮点数。

关于变量的signed和unsigned如果使用signed和unsigned两种数据类型,将使存储空间成倍增长。 因为使用signed和unsigned两种数据类型的库函数是不同的,使用signed和unsigned,就得同时使用这两种格式类型的库函数,最好采用unsigned格式。 在编程时,如果只强调程序的运算速度而又不进行负数运算时,最好采用unsigned格式。关于实参求值顺序unSPIDE和TurboC一样,实参的求值顺序是从右到左的,如下例:

i=3;printf("%d,%d",i,i++);

输出4,3

C和汇编混合编程

混合编程的三个方面C调用汇编函数汇编调用C函数

C中嵌入在线汇编

C调用汇编函数要求汇编函数名也以下划线“_”为前缀 因为C编译器产生的所有标号都以下划线“_”为前缀。在进行参数传递时,参数以相反的顺序(从右到左)被压入栈中。

汇编函数的16位返回值存放在寄存器R1中。32位的返回值存入寄存器对R1、R2中;其中低字在R1中,高字在R2中。C调用汇编的小例子

externintADD();intmain(void){inti,j,SUM;i=2;j=3;SUM=ADD(i,j);return0;}

.CODE.PUBLIC_ADD_ADD:.PROCPUSHBPTO[SP]; BP=SP+1;R1=[BP+3];//取得第一个参数R2=[BP+4];//取得第二个参数R1+=R2;POPBPFROM[SP];RETF;.ENDP

汇编调用C小例子EXTERNAL_ADD;.RAM.VARSUM.CODE.PUBLIC_main;_main:R1=3;PUSHR1TO[SP];//第2个参数//入栈R1=2;PUSHR1TO[SP];//第1个参数//入栈CALL_ADD;[SUM]=R1;SP+=2;//恢复SP指针.ENDC函数:int

ADD(int

i,intj){i=i+j;returni;}

C中嵌入在线汇编在线汇编指令格式:asm(“汇编指令模板”:输出参数:输入参数)

利用嵌入式汇编写端口寄存器

在C对P_IOA_Dir赋值0x1234,则嵌入汇编的实现方式如下:asm(“.defineP_IOA_Dir0x7002”);intmain(void){

asm("[P_IOA_Dir]=%0"::"r"(0x1234));}

利用嵌入式汇编读端口寄存器

把P_IOA_Dir的值读出并保存在C中的一个int变量j里

,则嵌入汇编的方式如下:asm(“.defineP_IOA_Dir0x7002”);intmain(void){

intj; asm("%0=[P_IOA_Dir]" :"=r"(j));}

用C来直接控制硬件

使用纯C对寄存器进行操作#defineP_IOA_Dir (volatileunsignedint*)0x7002intmain(void){

intj; *P_IOA_Dir=0x1234;j=*P_IOA_Dir;

}

用C进行IO设置//设置A口为带下拉电阻的输入

*P_IOA_Dir=0;*P_IOA_Attrib=0;*P_IOA_Data=0;

//设置B口为同相低电平输出

*P_IOA_Dir=0xffff;*P_IOB_Attrib=0xffff;*P_IOB_Data=0; 用C进行系统时钟设置

#defineP_SystemClock(volatileunsignedint*)0x7013

*P_SystemClock=System_InformationSystemInformation=CPUClock+32KMode+32KStatus+Fosc

PLL频率睡眠状态32K方式CPUclk选择b15~b8b7~b5b4b3b2~b0用C进行系统时钟设置

CPUClock的取值可以是以下几种:

C_Fosc

FoscC_Fosc_Div_2 Fosc/2C_Fosc_Div_4 Fosc/4C_Fosc_Div_8 Fosc/8(默认值)C_Fosc_Div_16 Fosc/16C_Fosc_Div_32 Fosc/32C_Fosc_Div_64 Fosc/64C_Sleep Stop(睡眠)用C进行系统时钟设置

32KHzMode的取值可以是以下几种:C_StrongMode

强振模式C_AutoMode

弱振模式(默认值)32KHzSleepStatus的取值可以是以下几种:C_32K_Work

睡眠时,32K时钟仍工作(默认)C_32K_Off

睡眠时,32K时钟停止工作用C进行系统时钟设置

Fosc的取值可以是以下几种:C_Fosc_24M 24.576M(默认值)C_Fosc_20M 20.480MC_Fosc_32M 32.768MC_Fosc_40M 40.960MC_Fosc_49M 49.152M用C进行系统时钟设置

这个例子是进行系统时钟设置。读者可以选择不同的Fosc_CLK和CPU_CLK,观察发光二极管亮灭快慢。

硬件连接:A口低八位接八个共阳的发光二极管现象:根据Fosc_CLK和CPU_CLK的不同,观察发光二极管亮灭速度也不同用C进行系统时钟设置

程序代码#include"SPCE061A.h"void Delay();#defineFosc_CLK_RATEC_Fosc_49M;//Fosc#defineCPU_CLK_RATEC_Fosc_Div_2;//CPUClk用C进行系统时钟设置

main(){ unsignedint

Fosc_CLK,CPU_CLK; *P_IOA_Dir=0x00FF;//IOA:[7..0]output *P_IOA_Attrib=0x00FF; *P_IOA_Data=0;用C进行系统时钟设置

Fosc_CLK=Fosc_CLK_RATE; CPU_CLK=CPU_CLK_RATE; *P_SystemClock=Fosc_CLK|CPU_CLK;

用C进行系统时钟设置

while(1){*P_IOA_Data=0x00FF;//LEDoffDelay();*P_IOA_Data=0;//LEDonDelay();}}用C写中断程序在IDE162下,中断服务程序只能用汇编(包括嵌入式汇编)来写。在IDE180下,用户多了一种选择,那就是可以用C来写中断。……用C写中断程序CASM功能INT_OFF()intoff禁止所有中断INT_IRQ()int

irq仅允许irq中断INT_FIQ()int

fiq仅允许fiq中断INT_FIQ_IRQ()int

fiq,irq允许fiq和irq中断IRQ_OFF()irqoff禁止irq中断IRQ_ON()irqon允许irq中断FIQ_OFF()fiqoff禁止fiq中断FIQ_ON()fiqon允许fiq中断用C写中断程序要求:定时0.5s,使A口的8个二极管闪烁。分析:定时0.5s采用哪个时基信号比较方便呢?SPCE061A单片机时基信号频率丰富,有2Hz、4Hz、8Hz、16Hz、32Hz、64Hz、128Hz、256Hz、512Hz、1024H、2048Hz、4096Hz等多种频率。我们可以很明显的看出2Hz时基信号中断是最方便的。只要触发2Hz的时基信号中断,就可以达到0.5s的定时目的。用C写中断程序#include “SPCE061A.h”main(){ INT_OFF(); *P_IOA_Dir=0x00FF; *P_IOA_Attrib=0x00FF; *P_IOA_Data=0x0000; *P_INT_Ctrl=C_IRQ5_2Hz;//Setupinterrupt

INT_IRQ();

while(1)

*P_Watchdog_Clear=C_WDTCLR;}用C写中断程序#include "SPCE061A.h"unsignedint

g_uiOutput=0x0000;voidIRQ5(void)__attribute__((ISR));voidIRQ5(void){ if(*P_INT_Ctrl&C_IRQ5_2Hz) { //I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论