标签:
MCU C
[注]这篇文章是我做了半年的一个项目-开发富晶半导体的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语言编译器主要是由HI-TECH公司(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”
While(1){
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 |
|