2024年3月30日发(作者:尧思彤)
一、C编程技巧
1. 注意WDT的溢出,如果程序开了WDT,但是没有定时执行WDTC指令的话,
程序就回出错误,可以在调试阶段不开WDT,在程序最终完成的时候,在最后一
步加入WDT功能.
2. C中定义的位识符,不可以直接用C语言操作,必须用汇编操作.比如:
Static unsigned char flag1@0x08;
Static bit key_valid@0x08@0;
…………
key_valid=1;(不能执行)
_asm
{BS %flag1,0}(可以执行)
3. 对于端口进行位操作时候,以下表达式不能执行:
if((P7_2= =0)||(P7_1= =0))
必须改写为:
if((P7&0x06)= =0x04)||(P7&0x06)= =0x02))
4. 下面语言不能执行:
temp6=(P7&0x07) (为什么?)
必须用汇编改写成:
_asm
{
MOV A,%P7
AND A,0x07
MOV %temp6,A
}
5.所有的位标志,都不能直接操作,必须先转换成字节类型再操作。
6.中断的设置TCC,CONT,ISR,IMR,之类的操作都必须用汇编,用C直接
执行时,常常出错误。
7.在中断保护和中断服务程序中,最好使用汇编,不要使用C,否则出现错误。
8.通过对CONT的bit6赋值可以开关总中断,但是不能当ENI和DISI使用,
因为CONT不可进行位操作,一旦操作CONT,整个CONT寄存器就会重新赋
值,而使得预分频器和分频比被重新设置。一般程序中只使用CONTW一次,
用于设置预分频器等;在这一次设置中,bit6的值可以确定在设置CONTW后,
全局中断是被打开还是关闭,如果bit6为0,则打开全局中断,否则则关闭全局
中断。然后不管在这里是打开还是关闭全局中断,都可以在后面的程序中使用
ENI和DISI来打开和关闭全局中断。
9.IOCF(IMR)是对于各个分中断的,允许和禁止设定。
10.0X3F(ISR)用于存储产生的中断标志。中断后需要将标志位清0。
11.使用中断前的操作顺序:设置CONTW(设置TCC)设置IOCFENI
进入中断后:DISIISR判断(TCC重新赋值)清ISR标志位
12. 虽然可以支持32bit数据类型,但是不支持32bit乘除法,不过32bit数据可
以做移位操作。
13. 在做充电放电检测时候,在外中断产生后的中断服务程序中,用放电电阻放
电是最有效的方式。
14. 子程序调用前需要指定子程序的页面,但是子程序执行完后,会自动返回原
来的调用页,所以调用子程序后,不需要使用页面返回指令。
15.最好少用移位指令,好象问题多多。
16.注意所使用的数据类型,如果数据长度超出范围,就会出现IDE很容易死
掉。特别在做乘法和除法的时候。
17. 注意程序中出现如果错误连续使用了两个“@”,IDE将会崩溃或者无法编译。
如:static bit moto_oprating@@0x20@3;
18.尽量少用乘法,除法,取模等运算。对于RAM稍多的MCU还可以接受,
但是对于153,156之类的MCU,尽量不用。极易出错误。
19.对于使用了多个if—else的中断服务程序中,如果多次调用一个延时程序,
IDE仿真时候很易出错。可以尝试调用另个延时程序,并在另一个延时程序中使
用另一个变量。
二、汇编编程技巧
1.当程序多于1K时,将出现跳页情况,这时如果有开中断处理程序,在进入中
断后,一定要把STATUS的PS0、PS1位复位为0(即回到第0页ROM),否则
当遇到有JMP或CALL等跳转指令时,程序将会出错!!!
2.当程序多于1K而使用跳转指令BS STATUS PS0或BS STATUS,PS1时,将会
影响到中断程序的中断时间,期分频系数不预计(即TCON受影响);并且中断
自动关闭。跳转返回后,一定要重新开中断(如ENI)。
3.注意子程序的嵌套级数。一般硬件所允许的X级堆栈至少减去一个中断程序所
用,即子程序最好使用X-1个嵌套;否则将会出错。
4.任何对R2(即PC)进行直接修改的指令,如:ADD R2,A | MOV R2,A | BC R2,x
等都将会使PC的第9位、10位清零,因此产生的跳转只限于一个程序的前256
个地址。TBL指令即除外,不会改变PC的9位、10位;执行TBL==PC+1+A;
可以解决以前对R2(即PC)直接修改所产生的后果。一般查表子程序放于程序
最前端,就是为了避开9位、10位清零。
5.八位单片机的高电平一般为4.5~5V,而低电平一般为1V以下;如何让单片
机产生一个2.5V电压呢?可以把要输出2.5V电平的I/O口设置为输出状态,并
置为高电平;接着把该输出口设置为输入状态,这时将输出一个2.5V电平电压。
5. 由于一个中文为两个字节,所以在注释时应当小心注意,避免在程序的注释
出现半个中文字的乱码现象;一旦出现这样的问题,可以导致编译出错或功
能不正常。
6. 对于P6.2口,需要先执行MOV A,@0x00;CONTW将TS bit设置为0后才
可以将它作为普通IO口使用。
2024年3月30日发(作者:尧思彤)
一、C编程技巧
1. 注意WDT的溢出,如果程序开了WDT,但是没有定时执行WDTC指令的话,
程序就回出错误,可以在调试阶段不开WDT,在程序最终完成的时候,在最后一
步加入WDT功能.
2. C中定义的位识符,不可以直接用C语言操作,必须用汇编操作.比如:
Static unsigned char flag1@0x08;
Static bit key_valid@0x08@0;
…………
key_valid=1;(不能执行)
_asm
{BS %flag1,0}(可以执行)
3. 对于端口进行位操作时候,以下表达式不能执行:
if((P7_2= =0)||(P7_1= =0))
必须改写为:
if((P7&0x06)= =0x04)||(P7&0x06)= =0x02))
4. 下面语言不能执行:
temp6=(P7&0x07) (为什么?)
必须用汇编改写成:
_asm
{
MOV A,%P7
AND A,0x07
MOV %temp6,A
}
5.所有的位标志,都不能直接操作,必须先转换成字节类型再操作。
6.中断的设置TCC,CONT,ISR,IMR,之类的操作都必须用汇编,用C直接
执行时,常常出错误。
7.在中断保护和中断服务程序中,最好使用汇编,不要使用C,否则出现错误。
8.通过对CONT的bit6赋值可以开关总中断,但是不能当ENI和DISI使用,
因为CONT不可进行位操作,一旦操作CONT,整个CONT寄存器就会重新赋
值,而使得预分频器和分频比被重新设置。一般程序中只使用CONTW一次,
用于设置预分频器等;在这一次设置中,bit6的值可以确定在设置CONTW后,
全局中断是被打开还是关闭,如果bit6为0,则打开全局中断,否则则关闭全局
中断。然后不管在这里是打开还是关闭全局中断,都可以在后面的程序中使用
ENI和DISI来打开和关闭全局中断。
9.IOCF(IMR)是对于各个分中断的,允许和禁止设定。
10.0X3F(ISR)用于存储产生的中断标志。中断后需要将标志位清0。
11.使用中断前的操作顺序:设置CONTW(设置TCC)设置IOCFENI
进入中断后:DISIISR判断(TCC重新赋值)清ISR标志位
12. 虽然可以支持32bit数据类型,但是不支持32bit乘除法,不过32bit数据可
以做移位操作。
13. 在做充电放电检测时候,在外中断产生后的中断服务程序中,用放电电阻放
电是最有效的方式。
14. 子程序调用前需要指定子程序的页面,但是子程序执行完后,会自动返回原
来的调用页,所以调用子程序后,不需要使用页面返回指令。
15.最好少用移位指令,好象问题多多。
16.注意所使用的数据类型,如果数据长度超出范围,就会出现IDE很容易死
掉。特别在做乘法和除法的时候。
17. 注意程序中出现如果错误连续使用了两个“@”,IDE将会崩溃或者无法编译。
如:static bit moto_oprating@@0x20@3;
18.尽量少用乘法,除法,取模等运算。对于RAM稍多的MCU还可以接受,
但是对于153,156之类的MCU,尽量不用。极易出错误。
19.对于使用了多个if—else的中断服务程序中,如果多次调用一个延时程序,
IDE仿真时候很易出错。可以尝试调用另个延时程序,并在另一个延时程序中使
用另一个变量。
二、汇编编程技巧
1.当程序多于1K时,将出现跳页情况,这时如果有开中断处理程序,在进入中
断后,一定要把STATUS的PS0、PS1位复位为0(即回到第0页ROM),否则
当遇到有JMP或CALL等跳转指令时,程序将会出错!!!
2.当程序多于1K而使用跳转指令BS STATUS PS0或BS STATUS,PS1时,将会
影响到中断程序的中断时间,期分频系数不预计(即TCON受影响);并且中断
自动关闭。跳转返回后,一定要重新开中断(如ENI)。
3.注意子程序的嵌套级数。一般硬件所允许的X级堆栈至少减去一个中断程序所
用,即子程序最好使用X-1个嵌套;否则将会出错。
4.任何对R2(即PC)进行直接修改的指令,如:ADD R2,A | MOV R2,A | BC R2,x
等都将会使PC的第9位、10位清零,因此产生的跳转只限于一个程序的前256
个地址。TBL指令即除外,不会改变PC的9位、10位;执行TBL==PC+1+A;
可以解决以前对R2(即PC)直接修改所产生的后果。一般查表子程序放于程序
最前端,就是为了避开9位、10位清零。
5.八位单片机的高电平一般为4.5~5V,而低电平一般为1V以下;如何让单片
机产生一个2.5V电压呢?可以把要输出2.5V电平的I/O口设置为输出状态,并
置为高电平;接着把该输出口设置为输入状态,这时将输出一个2.5V电平电压。
5. 由于一个中文为两个字节,所以在注释时应当小心注意,避免在程序的注释
出现半个中文字的乱码现象;一旦出现这样的问题,可以导致编译出错或功
能不正常。
6. 对于P6.2口,需要先执行MOV A,@0x00;CONTW将TS bit设置为0后才
可以将它作为普通IO口使用。