日志档案

发表于 2007-1-26 8:29:03

4

标签: MCU  C  

Hi-TECHCforFortunemcus

   [注]这篇文章是我做了半年的一个项目-开发富晶半导体的C-Compiler及debug tool(合称:HTFSC)。FSC(富晶半导体)的MCU是基于RISC架构的,类PIC。所以我们这次的C-Compiler主要是与开发过picc的Hi-TECH公司合作,共同完成。他们只是做compiler模块,我们来做其他的工作,例如测试,debug tool都是我们自己完成的-主要是我在负责。下面我就把这个编译器的一些介绍奉献给大家,里面有很多实用的编程技巧和资料,藉此与诸位探讨一下(文中有引用一些网友的成果,在此一并感谢!)原创文章,谢绝转载!

1. FSC系列单片机C语言编程简介:

1.1  C语言开发FSC单片机的优点:

C语言以其结构化和能够产生高效代码的优点,已经逐渐成为单片机应用编程的首选开发工具之一。用C语言开发单片机有如下几个优点:

1.可以大幅度地加快开发进度,特别是一些需要复杂计算的单片机系统,程序量越大,用C语言开发就越有优势;

2.无需精通单片机的指令集和具体的硬件结构,只要有一定的了解就能够编写出具有很高专业水平的单片机程序;

3.可以实现软件的结构化编程,便于集体开发和分工合作;

4.C语言编写的源程序具有逻辑结构清晰,条理性强,可读性和可维护性好的特点,从而可以提高整个系统的可靠性;

5.可省去人工分配单片机资源的工作,只需要在代码中申明变量的类型,C编译器就会自动地分配相关的资源,无需人工干预,从而有效地避免了人工分配单片机资源的差错;

6.C语言编写的源程序可移植性好,当需要移植到不同型号的单片机中时,只要对一些与硬件相关的语句作适当的修改即可。

因此,用C语言进行FSC系列单片机的程序开发与使用汇编语言相比具有很多的优点。

1.2  相关的C语言基础知识:

C语言是一种应用广泛的高级语言,它具有编写代码效率高,软件调试直观,维护升级方便,代码的重复利用率高,便于跨平台的代码移植等等的优点,同时它还具有位操作等许多低级语言的特点,非常适合用来开发单片机等的嵌入式应用程序。

目前用于FSC系列单片机开发的C语言编译器主要是由HITECH公司www.htsoft.com开发的HTFSC编译器,同时结合富晶公司自主开发的Debug Tool共同组合而成,HTFSC编译器符合ANSI标准的C语言程序开发,同时又针对FSC单片机的一些特点进行了必要的扩展。

通常情况下,一个完整的C语言源程序大致包括:包含文件(头文件),变量定义,常量说明,函数定义,函数体,注释等部分,如例1-1所示。本节将对C语言的概念作一些介绍和说明,具体可以参考附件1及其他的C语言教程。

1-1

include  // 包含单片机内部的寄存器预定义

include “LCD.h” // 包含自己定义的头文件

 

// 编译预处理及常量定义

define uchar unsigned char

define uint   unsigned int

# define ulong unsigned long

 #define Lcdch0 0B01111101

#define Lcdch1 0B01100000

#define Lcdch2 0B00111110

#define Lcdch3 0B01111010

#define Lcdch4 0B01100011

#define Lcdch5 0B01011011

#define Lcdch6 0B01011111

#define Lcdch7 0B01110001

#define Lcdch8 0B01111111

#define Lcdch9 0B01111011

#define LcdchA 0B01110111

#define Lcdchb 0B01001111

#define LcdchC 0B00011101

#define Lcdchd 0B01101110

#define LcdchE 0B00011111

#define LcdchF 0B00010111

#define Lcdchi  0B00000100

#define LcdchL  0B00001101

#define Lcdchu  0B01001100

#define LcdchUu 0B01101101

#define Lcdcho  0B01001110

#define Lcdchr  0B00000110

#define Lcdchn  0B01000110

#define LcdchP  0B00110111

#define LcdchH  0B01100111

#define Lcdcht   0B00001111

#define LcdchUt  0B00010101

#define LcdchY   0B01101011

#define LcdDash  0B00000010

#define Lcdequ   0B00001010

 

// 声明本模块中所调用的函数类型

void  Clock(void) ;

void  delay(void) ;

void  LCD_display(unsigned char a) ;

void  systemini(void) ;

 

// 定义变量

const unsigned char lcd_num[] = { Lcdch0, Lcdch1, Lcdch2,Lcdch3, Lcdch4, Lcdch5,Lcdch6, Lcdch7,Lcdch8,Lcdch9, LcdchA, Lcdchb, LcdchC, Lcdchd, LcdchE,LcdchH,LcdchL } ;

uchar x,y ;

 

// 函数和子程序

void main(void) {

    systemini (); // 单片机的状态寄存器的设定

    LCD1=LCD2=LCD3=LCD4=LCD5=LCD6=0

    LCDENR=0X27

    LCD2= lcd_num[15] ; // “H”

    LCD3= lcd_num[14] ; // “E”

    LCD4= lcd_num[16] ; // “L”

    LCD5= lcd_num[16] ; // “L”

    LCD6= lcd_num[0]  ; // “O”

    While1{

     asm“CLRWDT”;// 清看门狗

     asm (“nop”) ;

     asm (“nop”) ;

     asm (“SLEEP”) ;

     delay();

}

}

 

Void delay(void){

     Unsigned char i ;

For(i=0;i=<20;i++ )

    Asm ( “nop”) ;

}

1.3 HTFSC中的变量定义:

   1.3.1 HTFSC 中的基本变量类型

 类型

大小()

数字类型

bit

1

逻辑类型

0 1

signed char

8

有符号字符

-128..+127*

unsigned char

8

无符号字符

0..255

signed short

16

有符号整数

-32768..+32767

unsigned short

16

无符号整数

0..65535

signed int

16

有符号整数

-32768..+32767

unsigned int

16

无符号整数

0..65535

signed long