瑞客论坛

 找回密码
 立即注册
查看: 1060|回复: 1

应广单片机 MINI-C编程指南.pdf

[复制链接]

金币13583  第85名

183

主题

6

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

威望
68
贡献
119
热心值
1
金币
13583
注册时间
2020-8-31
发表于 2021-7-3 10:42 | 显示全部楼层 |阅读模式
应广 Mini-c编程指南,pdf文档,Mini-c语法规则和举例
尚诚科技杨帆,电话
,应广大陆技术支持,销售全系列应广空片,并承接小方案川发
3)条件编译
#if标识符
statement
#else
Statement 2
fendi
测试井if后面是否为真,为真则编译圩if和*else之间的程序,否则编译井else和# endif之间的稈序。其
中标识符只能为
或者定义的标识符
标识符
测试后面的标识符是否用
定义过,如果定义过则编译和之间的程序,否则编译
和之间程序。
标识符
测试
后面的标识符是否用
定义过,如果没有定义过则编译
和之间的程序,否则
编译和之间程序。
标识符
标识符的名称包含连续的字母、数字或下划线,并遵守下列规则:
第一个字符不可为数字
最长只能为27个字符
●区分大小写
●不可以使用保留字
MINI-C语言中的保留字
Break. case, const, continue, default
do, else, extern,
d. word, dword, int return switch void, while
asm bit, interrup
1.5数据类型:
MINI-C,支持的所有数据都是无符号数字,位长度有1位,8位,16位,24位,32位,分别如下表描
1.4数据类长度(bit)长度(byte)值域范围
型数据类型
bit
byte
8
0~255
int
8
0~65535
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
’应广大陆技术支持,销售全乐列应广空片,并承接小方案川发
ewer
0~16777215
dword
32
4
0~4294967295
常量
数字常量:
支持二进制,十进制以及进制的常数
(1).十六进制,以0x开头或者H结尾:例如:0xAB,0CDh
(2).进制,以D结尾或者不写
例如:12,34d
进制,以OB开头或者B结尾:例如:OB11001100,01011010B
(4).在二进制中,可以增加¨,以提高程序撰写的可读性
(5)
范例:
mov A 31h
MOV
A,49
MOV
A,OB110001
MOVA,’1
字符常量:可以为^A~Z,az^,,0~9作为常量的丌头,字符常量使用前需要
定义具体的数字,定义字符常量的作用是方便程序阅读。比如:
tdefine c ledon 0
井 define C BrIGhtNESS mAⅩ220;
变量
(1).变量名称不分人小写,变量开头为英文字母或者下滑线,如AZ,
a z
2).@不能做变量名称之开头,@用于系统定义最近的向前或者向后跳转地址
(3).非变量之名称开头则可以为AZ,az
(4).变量字符串长度不限。
(5).变量分位变量,单字节变量,双字节变量,三字节变量,和4字节变量。
请见1.4的数据类型表。
范例
位变量的定义:
在单核的单片机中,位变量必须存放在RAM前16,或者前32字节内,具体
根据IC的型号确定。位变量,可以指定具体RAM的位,也可以
由系统分配
定义一个具体RAM的位时,需要先定义一个或者儿个字节的变量
定义格式:bit位变量名:具体RAM名.x(x由07组成,或者更大的数字031)

Byte my flag://先定义一个字节,作为一些标志定义
Bit f key busy: my flag.0;/指定具休变量的具休第0位
Bit fled on: my flag.1;//指定具体变量的具体第1位
当不指定RAM位置的位定义,则具体RAM位置由系统分配,直接由bit定义:
定义格式:bit位变量名

Bit f usb on
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
’应广大陆技术支持,销售全乐列应广空片,并承接小方案川发
Bit f charge full
变量的定义:
变量的定义格式:数据类型变量名;
比如:
Byte my flag
Word t16 cnt
Word user piont;
Dword timer 10ms
1.8表达式:
算术表达式】
本发展系统已提供、+、-、&、|、、()、=、+=、-、&=、‖
等操作数。
以下为例:
BB1
BB2
+-(WW2+BY2)81234h
不过以下三点请注意:
(1).尚未提供连等的表达式,如下范例:
BB1
(BB2BB3)+2;
BBI
BB2= BB3
(2).对于++、-的操作数,暂时只允许如下单一格式。
BB1++;
WWI
(3).对于<冷、<>〉、<、>-、<<、>〉-的操作数,
如使用太复杂的表达式,最佳化可能不够理想,请多包涵。
<<对应到汇编语言是SL。
<<对应到汇编语言是SLC。
〉对应到汇编语言是SR。
>〉对应到汇编语言是SRC
运算子的优先级,由高排到低,分别为
功能
运算子
括号
增量、减量++
加减法
位移
、>>、〈<<、>>〉
位逻辑
位逻辑
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
’应广大陆技术支持,销售全乐列应广空片,并承接小方案川发
位逻辑
算术
【逻辑表达式】
提供支持
表达式。运算子的优先级,由高排到低,分别为:
功能
运算子
括号
增量、减量++
比较

&&

1.9几个特殊的符号或者符号串
(1)“;”分号: MINI-C语句的结束符,或者汇编屮的注释符,每一句 MINI-C语句,都必
须要有一个“;”做结束。
(2)“@”,简易标记符,有时为了避免取太多的标号名,可以使用简易的标记符。简易标
记符往往配合字母F和字母B用,以怗知编译器是向前还是向后跳转,此处说的前是
指后面书写程序,后指更早书写的程序。
例如
goto⑩F
跳跃到后面的@@标记1
:
//标记
goto
//跳跃到后面的@标记2
goto
//跳跃到前面的@标记1
@@
/标记2
goto @B
//眺跃到前面的@标记2
你也可以为简易的标记命名,那么跳越的距离就更有弹性了,如下例:
@@ XX
//标记XX
goto @
//跳跃到后面的@
@:
goto @B XX
//眺跃到前面的@标记XX
goto @F XX
//跳跃到后面的@标记XX
goto @B
//跳跃到前面的@
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
,应广大陆技术支持,销售全系列应广空片,并承接小方案川发
@@ XX
//标记XX
(3)“S”,取字节字符,利用取字节字符,可以方便的操作2个字节以上的变量,其中
$0,表示最低位,$1表示次低位,依此类推。“$”还有另外一种用法,给单片机系统寄

器赋值。赋值格式,$寄存器名数值1,数值2,数值3..。
例如我们需要将一个双字节word变量的低位加1,高位保持不变:
Word timer 10ms cnt
timer 10ms cnt $0++://
A= timer10 ms cnt.$1;//把高位字节赋给A
例2.利用$给个别寄存器赋值,
由于仿真器版本和实体IC有时在寄存名不同,或者设置位有效是用1表示,还是用0表
示也可能不同,所以用S赋值寄存器的值,就可以告诉编译器在仿真时应该用到与仿真器实际
控制寄存器相适应的值,而不是$符号赋值的真实值,$符号赋的值是给实体IC使用的。正是
因为如此,所以,个别型号的部分寄存器的赋值,必须要采用$米赋值,这个在PMC232的ADCM
中表现特别明显
比如,你在PMCl31的程序设计中,如果ADCM的值需要赋值为0x84;
在PC131的程序中直接这样书写编详器是认可的:
Adcm= 0x84
但是如果是PMC232的程序设计,上面的表述可能会被编译器卡掉,不认这种书写方式,需要
用$赋值:
$ADCM12bit,/4;/此值按规格书描述,也是0x84.看IC文件,可以看出ADCM寄存器的
/设置主要分为两部分:AD转换的位数,最新规格已经只保留了12位
/转换了,其他数位已被修订到没有了。保留位,默认设置为0.
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
’应广大陆技术支持,销售全乐列应广空片,并承接小方案川发
6-24. ADC Mode register (adcm),Io address =0x21
Bit Reset R/w
Description
Bit resolution
7-5000 WO 100: 12-bit, AD 12-bit result [11: 0]=[ adcrh[7: 01, adar[7: 4])
others reserved
Reserved (keep u tor tuture compatiblity
ADC clack source selection
000: sysc/
001: sysCk</2
010: sysck<4
3100Wo011:ysck8,
100:ysck16,
101:svsc32
110:svsc64
111: syscl128
0
Reserved
()“”,取系统变量地址。
【利用&读取变量的地址】
如果我们想用上例的数组作一个 Queue,可以用如下的方法。
WORD
Point
Point
Bu
uffer
thile (1)
calculate acc
冰 Point
A
Point +t
// Point plus one each time
if (point == Buffer [BUF SIZE// until (Point = Buffer
bottom of buffer
Point.
Buffer
// set point to the initial value
of Buffer
【利用&产生变量的参考名称】
如果我们想要在同一个变量地址上,拥有不同的变量名称,可以川如下的方法。
WORD Point, Data[21
byte varl
Point$0;//Var1跟 Point的 Low Byte是同一地址
bYte var2
Point$1;/Var2眼 Point的 High Byte是同地址。
bYte var3
Data[0]$1;/var3跟Data[0]的 High byte是同一地址。
Word var4
Data[1];∥var4跟Data[1]是同一地址
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
,应广大陆技术支持,销售全系列应广空片,并承接小方案川发
(4)“SYS”,系统保留特殊字符,用于一些檢测或者特定地址取值。
比如不同的IC,能支持的指令集合不一样,当记忆不清楚时,可以采用“SYS”来做
检测,检测格式如下:
SYS(OP:指令):如果指令存在则返回1
比如,我们想定义一个宏指令来取代 swapo指令的部分功能, swapo指令不是所有的应广单
片机都能支持的,有部分资源更高一点的IC才支持。
#if SYS (OP: SWAPC IOn)
//判断是否有 swap I0.n的指令
swap EQU
swapo
//将 swapo直接代换成 swapo指令
#else
swap macro lob
//以宏指令取代 swapo指令
0
//该指令只是将C送给I0,而且会有毛刺
tOss
CF
en
#end if
swapo
I0 Bit;
/ swapo就可变成通用命令。
其它类似命令,如
SYS (OP: COMP A I)
A跟立即值比较
SYS (OP: PUSHW index)// push word memory
SYS (OP: SWAP M)
// swap byte memory
SYS(OP: XOR IO A)
Xor register,
A
SYS (OP: STOPEXE
SYS (OP: PMODE N)
/
都可以用来判断指令是否支持
关于·SYS语法,还有
Var=>SYS(SIZE.RAM);//得到目前使用IC的 RAM SIze(单位为Byte
Var=>SYS(SIZE.ROM);//得到目前使用IC的 ROM Size(单位为Word)
Var=〉SYS(ADR.ROL);/得到 Roll code的起始地址
SYS(ADR.IHRC);//得到IHRC的校正地址
SP
SYS( STACK:n);//重新设定第n个FPPA的SP的值为
//预设的设定起始地址。
(5)“ PRAGMA”:使用# PRAGMA指令,可以做一些编译的特殊控制,如卜介绍:
(1)在Mini-C的项日中,有些指令会自动使用一些 Local memory当作运算川,

DELAY 10000
我的博客空间:
欢迎光临;我的拍拍店
第页

尚诚科技杨帆,电话
,应广大陆技术支持,销售全系列应广空片,并承接小方案川发
A =*point +*Pointl
但在作多次烧录时,如果你想自行分配所有 Memory的资源,
你必须除能这种语法,以免变量的排序地址不如预期
如果要除能这项检查,必须在.PRE栏案中,加入以卜指令才可。
#PRAGMA DISABLE SYS LOCAL
1.10指针:
无论是程序空间,还是RAM空间,每个单元空间都有一个地址,这个地址也是该室间的
指针。如果能够通过地址来访问该空间,会让程序操作上更灵活。需要通过地址访问程序或
者RM空间时,就需要用一个变量来存放这些单元的地址,然后再通过这个地址去访问所需
要的空间。存放这些地址的变量是指针变量。在MINⅠC中,所有的双字节变量都可以做为指
针变量使用
定义一个指针变量:
Word user pointer
例如:定义一个指针变量来清0内部RAM;
user pointer=SYS( RAM SIZE)-1;/取得当前芯片的RAM字节数
d
冰 user pointer=0
While(-- user pointers)
2.语句.
程序的执行部分,就是语句,有赋值语句,if语句, switch语句等
2.1赋值语句用“-”作为赋值符号,
格式为:变量=变量或者常数;//注意每个语句的结束符“;”不能少的。
如:a=250;
2.2if语句,if语句是用来判定所给条件是否满足,根据判定结果的真或者假决定执行
的操作。
MINI-C支持的表达式,不能有算数操作,只能是很直观的逻辑表达式,但是,如
果算数表达式中的常数是一个标记,比如ROM地址符,被作为特例允许使用。比如
范例: Label
DC12,34,56
WORD
Point
if( Point== Label+3) Point= Label;//实际上编译完成后, Label+
3也是一个固定常数
我的博客空间:
欢迎光临;我的拍拍店
第页
游客,如果您要查看本帖隐藏内容请回复


回复

使用道具 举报

金币683  第2400名

0

主题

316

回帖

2166

积分

金牌会员

Rank: 6Rank: 6

威望
889
贡献
594
热心值
0
金币
683
注册时间
2021-9-22
发表于 2022-4-15 10:57 | 显示全部楼层
楼主加油,我们都看好你哦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|瑞客论坛 |网站地图

GMT+8, 2024-11-24 22:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表