keil转iar的一些东西.txt 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. 1.sbit
  2. 在Keil中的sbit LED_POWER = P0^4;需要改为宏的形式:#define LED_POWER P0_bit.pin5
  3. __sfr __no_init volatile union
  4. {
  5. unsigned char P0; /* Port 0 */
  6. union{
  7. struct /* Port 0 */
  8. {
  9. unsigned char AD0 : 1;
  10. unsigned char AD1 : 1;
  11. unsigned char AD2 : 1;
  12. unsigned char AD3 : 1;
  13. unsigned char AD4 : 1;
  14. unsigned char AD5 : 1;
  15. unsigned char AD6 : 1;
  16. unsigned char AD7 : 1;
  17. };
  18. struct /* Port 0 */
  19. {
  20. unsigned char pin0 : 1;
  21. unsigned char pin1 : 1;
  22. unsigned char pin2 : 1;
  23. unsigned char pin3 : 1;
  24. unsigned char pin4 : 1;
  25. unsigned char pin5 : 1;
  26. unsigned char pin6 : 1;
  27. unsigned char pin7 : 1;
  28. };
  29. } P0_bit;
  30. } @ 0x80;
  31. 2.code和const
  32. 只需要吧code关键字替换为const就行了。但是编译报错,说定义的常量数组太大,这是为什么。打开工程的option选项,首页右下角有个关于常量位置的设置,选择将常量放到代码空间即可。
  33. 3.寄存器位的访问
  34. 由于IAR中不支持直接的位访问,所以对于CY、TR0之类的寄存器位都要通过位段的形式来访问,好在51的寄存器不多。
  35. 4.中断函数的写法
  36. 在keil中,中断函数是如下形式
  37. void Timer0_isr(void) interrupt 1
  38. {
  39. //code
  40. }
  41. 而在IAR中是这样
  42. #pragma vector=timer0
  43. __interrupt void Timer0_isr(void)
  44. {
  45. //code
  46. }
  47. 这里 __interrupt 表示Timer0_isr()是一个中断函数,#pragma vector 说明该中断函数的入口地址。