MC语言 一、 前言 MC(MCU COMPILE)语言是针对计算机(最重要是单片机)在控制和检测领域开发的计算机语言,它最主要的是编程比较方便,读起来比较直接,方便校对,占用的空间(数据和程序空间)也比较小,等特点。还具有中英文编程的优点。 二、 编程 我们都知道单片机是什么,单片机是需要编写程序的,可怎么编程?怎么编程效率高哪?这可能有很多朋友回答不出来,因为很多朋友不知道什么是单片机的效率,我们都知道单片机有数据和程序空间,而且它们都不是很大的(这里是不扩充系统,也就是它的本身拥有的)。怎么利用好这个空间,这就是单片机效率的一个方面。 编写程序我们要注意这个方面(效率问题),编程语言没有好坏只有实用与不实用之分。不管您是使用汇编语言还是使用C语言,当然还有MC语言或更高级语言,能够完成任务是最终目的,这中间可能存在我们前面提到的“效率”问题。怎么能把这个“效率”放到最高,这就是我们要讨论的问题。我们都知道计算机语言分低级、中级、高级语言,这个级别不是语言的质量(好坏,语言级别高低)之分,而是用于适合人的表达之分。语言级别越高越适合人的表达,对机器来讲,语言越高级其效率就越低(就是占用的数据和程序空间就越大)。在单片机这个领域,一般都使用汇编语言和C语言,因为我们要符合这个领域的要求。汇编语言虽然版本比较低下,编写程序比较麻烦,但它比较直接,占用的空间资源比较小,也比较灵活;C语言编写的程序比较方便,人看到的表达比较清楚,但它资源的空间资源比较大,条条框框也比较多,虽然阅读比较方便,但单片机空间资源本身就小,对于大一点系统可能就难以应付了(不增加系统)。在这个方面年纪长一点还是用汇编语言多一点,年轻的用C语言还是多一点,这不是说明语言的高级,而是说明年纪长的接触单片机比较早,使用汇编语言比较顺手,C语言的条条框框也比较多,学习起来也比较麻烦,因此就继续使用汇编语言,而年轻人本身本来就没有负担(没有过多的语言压力),而C语言也是发展的趋势,学习C语言就成为自然而然的事情。我就属于用汇编语言那种人,接触计算机比较早一点,在单板机出现前,就使用了计算机芯片,记得当时用的8085芯片,后来单板机出现了又改用Z80芯片,因为汇编语言没有通用性,又得学习Z80的汇编指令系统,单片机出现了以后,又学习了8051、PIC16C58、PIC16C71的汇编指令系统,感觉真是有点累。根据这些情况,我就开发了MC(MCU COMPILE)编译软件。根据应用领域以及单片机的特点,单片机主要应用于控制或检测方面,舍去了于此无关的指令系统,而且编程也简单了,使它具有通用性,成立了一个语言系统,我就把它称为MC语言。而且对MCS51来说没有距离问题,我们都知道MCS51有LJMP、AJMP、SJMP以及JZ、JNZ、JC、JNC、JB、JNB、JBC、CJNE、DJNZ、ACALL、LCALL,它们反应都是距离问题,而使用了JUMP和CALL代替了LJMP、AJMP、SJMP和ACALL、LCALL,在MC语言里,都根据程序的实际情况,以最节约程序空间的方式表达出来。另外MC编译器可以使用汉字编写程序。 第一个例子 用MCS51汇编语言编写的程序 ;变量赋值 TMH0 EQU XX TML0 EQU XX ;程序开始 ORG 0 ;伪指令 SJMP MAIN ;跳转到初始化部分 ;中断矢量表 : : ORG 0BH ;定时器0中断地址 AJMP TIME0 ;跳转到定时器0服务程序地址 : : MAIN: ORG XX SETB ET0 ;允许时钟0中断 MOV TMOD, #11H;使用内部时钟,时钟0和1都为方式1(十六位计数) MOV TH0, #TMH0;送入定时器0高位初始值 MOV TL0, #TML0;送入定时器0低位初始值 SETB TR0 ;定时器0可以计数 SETB EA ;打开中断 ;进行了各种初始化 : : MAIN_LOOP: ;主循环开始 JB P0.1,LOOP0 ;条件1 : : ;执行某些操作 LAST_OPERATION: ;最后的操作 AJMO MAIN_LOOP ;返回主循环开始 LOOP0: ;符合条件1的操作 : : AJMP LAST_OPERATION TIME0: ;定时器0中断子程序 PUSH ACC ;累加器压栈 PUSH PSW ;状态字压栈 MOV TH0, #TMH0 MOV TL0, #TML0 CLR RS0 SETB RS1 ;改变寄存器组 : : ;一些操作 P0P PSW ;弹栈 POP ACC ;弹栈 RETI ;中断返回 如果使用MC语言,可以这样编写 定义 TMH0 为 XX,TML0 为 XX MC语言对于没有 ORG 或 地址 的伪指令在第一条会产生 JUMP MAIN 指令,并产生中断矢量表和服务的MAIN段名以及中断的状态。 中断 2 內触发 1 时钟 XXXXXXXX TIME0 ;初始化 : : ;主循环开始 MAIN_LOOP: //主循环开始 如果 P0.1 跳转 LOOP0 结束如果 : : LAST_OPERATION: 跳转 MAIN_LOOP LOOP0: : : 跳转 LAST_OPERATION TIME0: 压栈 A 压栈 PSW TH0=TMH0 TL0=TML0 RS0=F RS1=T : : 弹栈 PSW 弹栈 A 中断返回 另外一个例子 变量名1=变量名2(256)乘上变量名3(256)= 65536d(1,00000000,00000000b) 用MCS51汇编语言编写程序: 变量名1 EQU 20H 变量名2 EQU 23H 变量名3 EQU 25H //变量的地址 MOV R0, #变量名1 //乘积清零 CLR A MOV @R0, A INC R0 MOV @R0, A INC R0 MOV @R0, A //准备乘法 MOV R0, #变量名2 MOV @R0, #0 INC R0 MOV @R0, #1 MOV R0, #变量名3 MOV @R0, #0 INC R0 MOV @R0, #1 MOV R2, #16 MAIN_LOOP: MOV R0, #变量名3 CLR C MOV A, @R0 RLC A MOV @R0, A INC R0 MOV A, @R0 RLC A MOV @R0, A PUSH PSW //乘积乘上2 MOV R1, #变量名1 CLR C MOV A, @R1 RLC A MOV @R1, A INC R1 MOV A, @R1 RLC A MOV @R1, A INC R1 MOV A, @R1 RLC A MOV @R1, A POP PSW JNC OFFSET1 MOV A, R0 MOV B, A //保存乘数 MOV R0, #变量名1 MOV R1, #变量名2 MOV A, @R0 ADD A, @R1 MOV @R0, A INC R0 INC R1 MOV A, @R0 ADDC A, @R1 MOV @R0, A INC R0 MOV A, @R0 ADDC A, #0 MOV @R0, A MOV A, B MOV R0, A OFFSET1: DJNZ R2, MAIN_LOOP 用MC语言编写: 定义 变量名1 为 3,变量名2 为 2,变量名3 为 2 变量名2=256 变量名3=256 变量名1=变量名2*变量名3 就这样简单。
|