请教 C51 如何才能接近A51

[复制链接]
6235|34
 楼主| Periodic 发表于 2012-2-21 15:24 | 显示全部楼层 |阅读模式
本帖最后由 Periodic 于 2012-2-21 15:26 编辑

#define DATA_0AH              (*(volatile unsigned char *)0x0A)
#define DATA_0BH              (*(volatile unsigned char *)0x0B)
#define DATA_0CH              (*(volatile unsigned char *)0x0C)
#define DATA_0DH              (*(volatile unsigned char *)0x0D)
#define DATA_0EH              (*(volatile unsigned char *)0x0E)
#define DATA_0FH              (*(volatile unsigned char *)0x0F)
#define DATA_08H              (*(volatile unsigned char *)0x08)
#define DATA_09H              (*(volatile unsigned char *)0x09)


void SYS_Init(void)
{
SYSCON=0;
DATA_0AH=0x00;  //R1_2
DATA_0BH=0x00;  //R1_3
DATA_0CH=0x00;  //R1_4
DATA_0DH=0x00;  //R1_5
DATA_0EH=0x00;  //R1_6
DATA_0FH=0x00;  //R1_7
DATA_08H=0x0B;     //R1_0
}
 楼主| Periodic 发表于 2012-2-21 15:26 | 显示全部楼层
本帖最后由 Periodic 于 2012-2-21 15:29 编辑

  1.         CLR        A                           
  2.         MOV        SYSCON,A               
  3.         MOV        0AH,A                        
  4.         MOV        0BH,A                        
  5.         MOV        0CH,A                        
  6.         MOV        0DH,A                        
  7.         MOV        0EH,A                        
  8.         MOV        0FH,A                        
  9.         MOV        08H,#0BH
 楼主| Periodic 发表于 2012-2-21 15:27 | 显示全部楼层
本帖最后由 Periodic 于 2012-2-21 15:28 编辑
  1.    115:         SYSCON=0;
  2. C:0x0003    E4       CLR      A
  3. C:0x0004    F5B1     MOV      SYSCON(0xB1),A
  4.    116:         DATA_0AH=0x00;    //R1_2
  5. C:0x0006    780A     MOV      R0,#0x0A
  6. C:0x0008    F6       MOV      @R0,A
  7.    117:         DATA_0BH=0x00;    //R1_3
  8. C:0x0009    08       INC      R0
  9. C:0x000A    F6       MOV      @R0,A
  10.    118:         DATA_0CH=0x00;    //R1_4
  11. C:0x000B    08       INC      R0
  12. C:0x000C    F6       MOV      @R0,A
  13.    119:         DATA_0DH=0x00;    //R1_5
  14. C:0x000D    08       INC      R0
  15. C:0x000E    F6       MOV      @R0,A
  16.    120:         DATA_0EH=0x00;    //R1_6
  17. C:0x000F    08       INC      R0
  18. C:0x0010    F6       MOV      @R0,A
  19.    121:         DATA_0FH=0x00;    //R1_7
  20.    122:  
  21. C:0x0011    08       INC      R0
  22. C:0x0012    F6       MOV      @R0,A
  23.    123:         DATA_08H=0x0B;      //R1_0
  24. C:0x0013    7808     MOV      R0,#0x08
  25. C:0x0015    760B     MOV      @R0,#0x0B
ayb_ice 发表于 2012-2-21 16:09 | 显示全部楼层
试试
#define DATA_0AH              (*(volatile unsigned char data *)0x0A)
 楼主| Periodic 发表于 2012-2-21 16:49 | 显示全部楼层
  1. #define DATA_0AH              (*(volatile unsigned char data *)0x0A)
  2. #define DATA_0BH              (*(volatile unsigned char data *)0x0B)
  3. #define DATA_0CH              (*(volatile unsigned char data *)0x0C)
  4. #define DATA_0DH              (*(volatile unsigned char data *)0x0D)
  5. #define DATA_0EH              (*(volatile unsigned char data *)0x0E)
  6. #define DATA_0FH              (*(volatile unsigned char data *)0x0F)

  7. #define DATA_08H              (*(volatile unsigned char data *)0x08)
  8. #define DATA_09H              (*(volatile unsigned char data *)0x09)




  9. void SYS_Init(void)
  10. {

  11.         SYSCON=0;
  12.         DATA_0AH=0x00;                //R1_2
  13.         DATA_0BH=0x00;                //R1_3
  14.         DATA_0CH=0x00;                //R1_4
  15.         DATA_0DH=0x00;                //R1_5
  16.         DATA_0EH=0x00;                //R1_6
  17.         DATA_0FH=0x00;                //R1_7

  18.         DATA_08H=0x0B;            //R1_0
  19. }
 楼主| Periodic 发表于 2012-2-21 16:50 | 显示全部楼层
  1.    114: void SYS_Init(void)  
  2.    115: {
  3.    116:  
  4.    117:         SYSCON=0;
  5. C:0x0003    E4       CLR      A
  6. C:0x0004    F5B1     MOV      SYSCON(0xB1),A
  7.    118:         DATA_0AH=0x00;    //R1_2
  8. C:0x0006    780A     MOV      R0,#0x0A
  9. C:0x0008    F6       MOV      @R0,A
  10.    119:         DATA_0BH=0x00;    //R1_3
  11. C:0x0009    08       INC      R0
  12. C:0x000A    F6       MOV      @R0,A
  13.    120:         DATA_0CH=0x00;    //R1_4
  14. C:0x000B    08       INC      R0
  15. C:0x000C    F6       MOV      @R0,A
  16.    121:         DATA_0DH=0x00;    //R1_5
  17. C:0x000D    08       INC      R0
  18. C:0x000E    F6       MOV      @R0,A
  19.    122:         DATA_0EH=0x00;    //R1_6
  20. C:0x000F    08       INC      R0
  21. C:0x0010    F6       MOV      @R0,A
  22.    123:         DATA_0FH=0x00;    //R1_7
  23.    124:  
  24. C:0x0011    08       INC      R0
  25. C:0x0012    F6       MOV      @R0,A
  26.    125:         DATA_08H=0x0B;      //R1_0
  27. C:0x0013    7808     MOV      R0,#0x08
  28. C:0x0015    760B     MOV      @R0,#0x0B
  29.    126: }
 楼主| Periodic 发表于 2012-2-21 16:50 | 显示全部楼层
回4楼 还是 一样没有变化
ayb_ice 发表于 2012-2-21 17:24 | 显示全部楼层
本帖最后由 ayb_ice 于 2012-2-21 17:25 编辑

INC R0
MOV @R0,A
其实这个效率很高了,只是两条指令看起来好象效率不高
与MOV DIRECT,A是一样的这样的编译结果更有利于减少中断延时
xm_smallp 发表于 2012-2-22 12:32 | 显示全部楼层
路过!!
wh6ic 发表于 2012-2-22 22:31 | 显示全部楼层
标准12周期51的话这两条指令执行效率与汇编的差别不大
但使用某些所谓单周期51时效率就差些,比如某款“单”周期51核片子,INC R0两个周期,MOV @R0,A三个周期,一共五个周期。而MOV Direct,A是三个周期。
只不过想要C51的方便,不想用麻烦的汇编,有时就得忍受它某些方面的低效率。
 楼主| Periodic 发表于 2012-2-24 14:01 | 显示全部楼层
:handshake
uc_stm32f050 发表于 2012-2-24 16:17 | 显示全部楼层
IAR 8051 7.60:


  1. #define DATA_0AH              (*(volatile unsigned char __data *)0x0A)
  2. #define DATA_0BH              (*(volatile unsigned char __data *)0x0B)
  3. #define DATA_0CH              (*(volatile unsigned char __data *)0x0C)
  4. #define DATA_0DH              (*(volatile unsigned char __data *)0x0D)
  5. #define DATA_0EH              (*(volatile unsigned char __data *)0x0E)
  6. #define DATA_0FH              (*(volatile unsigned char __data *)0x0F)

  7. #define DATA_08H              (*(volatile unsigned char __data *)0x08)
  8. #define DATA_09H              (*(volatile unsigned char __data *)0x09)

  9. void SYS_Init(void)
  10. {

  11.         //SYSCON=0;
  12.         DATA_0AH=0x00;                //R1_2
  13.         DATA_0BH=0x00;                //R1_3
  14.         DATA_0CH=0x00;                //R1_4
  15.         DATA_0DH=0x00;                //R1_5
  16.         DATA_0EH=0x00;                //R1_6
  17.         DATA_0FH=0x00;                //R1_7

  18.         DATA_08H=0x0B;            //R1_0
  19. }

  1.         RSEG NEAR_CODE:CODE:NOROOT(0)
  2. //   15 void SYS_Init(void)
  3. SYS_Init:
  4. //   16 {
  5.         ; Saved register size: 0
  6.         ; Auto size: 0
  7. //   17
  8. //   18         //SYSCON=0;
  9. //   19         DATA_0AH=0x00;                //R1_2
  10.         MOV     0xa,#0x0
  11. //   20         DATA_0BH=0x00;                //R1_3
  12.         MOV     0xb,#0x0
  13. //   21         DATA_0CH=0x00;                //R1_4
  14.         MOV     0xc,#0x0
  15. //   22         DATA_0DH=0x00;                //R1_5
  16.         MOV     0xd,#0x0
  17. //   23         DATA_0EH=0x00;                //R1_6
  18.         MOV     0xe,#0x0
  19. //   24         DATA_0FH=0x00;                //R1_7
  20.         MOV     0xf,#0x0
  21. //   25
  22. //   26         DATA_08H=0x0B;            //R1_0
  23.         MOV     0x8,#0xb
  24. //   27 }
  25.         RET
 楼主| Periodic 发表于 2012-2-25 08:13 | 显示全部楼层
谢谢12楼   每次用分太多导致 无分可送
刘前辈 发表于 2012-2-25 12:04 | 显示全部楼层
本帖最后由 刘前辈 于 2012-2-25 12:13 编辑

很简单,直接寻址,避免用指针。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
刘前辈 发表于 2012-2-25 12:08 | 显示全部楼层
本帖最后由 刘前辈 于 2012-2-25 12:10 编辑
  1. #include <REG51.H>

  2. data  char   DATA_0AH     _at_ 0x0A;
  3. data  char   DATA_0BH     _at_ 0x0B;
  4. data  char   DATA_0CH     _at_ 0x0C;
  5. data  char   DATA_0DH     _at_ 0x0D;
  6. data  char   DATA_0EH     _at_ 0x0E;
  7. data  char   DATA_0FH     _at_ 0x0F;

  8. data  char   DATA_08H     _at_ 0x08;

  9. main()
  10. {
  11. DATA_0AH=0x00;
  12. DATA_0BH=0x00;
  13. DATA_0CH=0x00;
  14. DATA_0DH=0x00;
  15. DATA_0EH=0x00;
  16. DATA_0FH=0x00;

  17. DATA_08H=0x00;   

  18. while(1);
  19. }

、、
 楼主| Periodic 发表于 2012-2-25 12:52 | 显示全部楼层
2姨真是 51高手 云集的地方啊
 楼主| Periodic 发表于 2012-2-25 12:53 | 显示全部楼层
不过感觉还是12楼的 像C语言  16楼不太像哈哈
刘前辈 发表于 2012-2-25 13:39 | 显示全部楼层
本帖最后由 刘前辈 于 2012-2-25 13:47 编辑

12楼和LZ 那叫作间接寻址,最后得到直接寻址结果是编译器优化出来的。C51可能也行?

而2楼汇编最简结果那叫直接寻址,——汇编/C51中直接寻址方式是最快的。

《匠人手记》中花了大量篇幅讲解直接寻址/间接寻址概念,(多半没人注意看到)呵呵,这就是高手与人不同的地方。


  C51中   _at_   用于直接寻址方式定义;

ABSACC.H     中       DBYTE [ DATA_0A ]用于 间接寻址。 ——根本不用用户自己重新定义。




    下面再看HOT大叔怎么解决这个问题:“红杏出墙……伪本征函数”





、、
 楼主| Periodic 发表于 2012-2-25 14:20 | 显示全部楼层
直接寻址/间接寻址概念  -----------------
和这个无关  我是是想 以后 程序用在其他芯片上也能用。 但又希望效率高
tylhc002 发表于 2012-2-25 14:48 | 显示全部楼层
1# Periodic
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

670

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部