打印

请教 C51 如何才能接近A51

[复制链接]
5179|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 编辑

        CLR        A                           
        MOV        SYSCON,A               
        MOV        0AH,A                        
        MOV        0BH,A                        
        MOV        0CH,A                        
        MOV        0DH,A                        
        MOV        0EH,A                        
        MOV        0FH,A                        
        MOV        08H,#0BH

使用特权

评论回复
板凳
Periodic|  楼主 | 2012-2-21 15:27 | 只看该作者
本帖最后由 Periodic 于 2012-2-21 15:28 编辑
   115:         SYSCON=0; 
C:0x0003    E4       CLR      A
C:0x0004    F5B1     MOV      SYSCON(0xB1),A
   116:         DATA_0AH=0x00;    //R1_2
C:0x0006    780A     MOV      R0,#0x0A
C:0x0008    F6       MOV      @R0,A
   117:         DATA_0BH=0x00;    //R1_3
C:0x0009    08       INC      R0
C:0x000A    F6       MOV      @R0,A
   118:         DATA_0CH=0x00;    //R1_4
C:0x000B    08       INC      R0
C:0x000C    F6       MOV      @R0,A
   119:         DATA_0DH=0x00;    //R1_5
C:0x000D    08       INC      R0
C:0x000E    F6       MOV      @R0,A
   120:         DATA_0EH=0x00;    //R1_6
C:0x000F    08       INC      R0
C:0x0010    F6       MOV      @R0,A
   121:         DATA_0FH=0x00;    //R1_7
   122:  
C:0x0011    08       INC      R0
C:0x0012    F6       MOV      @R0,A
   123:         DATA_08H=0x0B;      //R1_0
C:0x0013    7808     MOV      R0,#0x08
C:0x0015    760B     MOV      @R0,#0x0B

使用特权

评论回复
地板
ayb_ice| | 2012-2-21 16:09 | 只看该作者
试试
#define DATA_0AH              (*(volatile unsigned char data *)0x0A)

使用特权

评论回复
5
Periodic|  楼主 | 2012-2-21 16:49 | 只看该作者
#define DATA_0AH              (*(volatile unsigned char data *)0x0A)
#define DATA_0BH              (*(volatile unsigned char data *)0x0B)
#define DATA_0CH              (*(volatile unsigned char data *)0x0C)
#define DATA_0DH              (*(volatile unsigned char data *)0x0D)
#define DATA_0EH              (*(volatile unsigned char data *)0x0E)
#define DATA_0FH              (*(volatile unsigned char data *)0x0F)

#define DATA_08H              (*(volatile unsigned char data *)0x08)
#define DATA_09H              (*(volatile unsigned char data *)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
}

使用特权

评论回复
6
Periodic|  楼主 | 2012-2-21 16:50 | 只看该作者
   114: void SYS_Init(void)  
   115: {
   116:  
   117:         SYSCON=0;
C:0x0003    E4       CLR      A
C:0x0004    F5B1     MOV      SYSCON(0xB1),A
   118:         DATA_0AH=0x00;    //R1_2
C:0x0006    780A     MOV      R0,#0x0A
C:0x0008    F6       MOV      @R0,A
   119:         DATA_0BH=0x00;    //R1_3
C:0x0009    08       INC      R0
C:0x000A    F6       MOV      @R0,A
   120:         DATA_0CH=0x00;    //R1_4
C:0x000B    08       INC      R0
C:0x000C    F6       MOV      @R0,A
   121:         DATA_0DH=0x00;    //R1_5
C:0x000D    08       INC      R0
C:0x000E    F6       MOV      @R0,A
   122:         DATA_0EH=0x00;    //R1_6
C:0x000F    08       INC      R0
C:0x0010    F6       MOV      @R0,A
   123:         DATA_0FH=0x00;    //R1_7
   124:  
C:0x0011    08       INC      R0
C:0x0012    F6       MOV      @R0,A
   125:         DATA_08H=0x0B;      //R1_0
C:0x0013    7808     MOV      R0,#0x08
C:0x0015    760B     MOV      @R0,#0x0B
   126: }

使用特权

评论回复
7
Periodic|  楼主 | 2012-2-21 16:50 | 只看该作者
回4楼 还是 一样没有变化

使用特权

评论回复
8
ayb_ice| | 2012-2-21 17:24 | 只看该作者
本帖最后由 ayb_ice 于 2012-2-21 17:25 编辑

INC R0
MOV @R0,A
其实这个效率很高了,只是两条指令看起来好象效率不高
与MOV DIRECT,A是一样的这样的编译结果更有利于减少中断延时

使用特权

评论回复
9
xm_smallp| | 2012-2-22 12:32 | 只看该作者
路过!!

使用特权

评论回复
10
wh6ic| | 2012-2-22 22:31 | 只看该作者
标准12周期51的话这两条指令执行效率与汇编的差别不大
但使用某些所谓单周期51时效率就差些,比如某款“单”周期51核片子,INC R0两个周期,MOV @R0,A三个周期,一共五个周期。而MOV Direct,A是三个周期。
只不过想要C51的方便,不想用麻烦的汇编,有时就得忍受它某些方面的低效率。

使用特权

评论回复
11
Periodic|  楼主 | 2012-2-24 14:01 | 只看该作者
:handshake

使用特权

评论回复
12
uc_stm32f050| | 2012-2-24 16:17 | 只看该作者
IAR 8051 7.60:


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

#define DATA_08H              (*(volatile unsigned char __data *)0x08)
#define DATA_09H              (*(volatile unsigned char __data *)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
}

        RSEG NEAR_CODE:CODE:NOROOT(0)
//   15 void SYS_Init(void)
SYS_Init:
//   16 {
        ; Saved register size: 0
        ; Auto size: 0
//   17
//   18         //SYSCON=0;
//   19         DATA_0AH=0x00;                //R1_2
        MOV     0xa,#0x0
//   20         DATA_0BH=0x00;                //R1_3
        MOV     0xb,#0x0
//   21         DATA_0CH=0x00;                //R1_4
        MOV     0xc,#0x0
//   22         DATA_0DH=0x00;                //R1_5
        MOV     0xd,#0x0
//   23         DATA_0EH=0x00;                //R1_6
        MOV     0xe,#0x0
//   24         DATA_0FH=0x00;                //R1_7
        MOV     0xf,#0x0
//   25
//   26         DATA_08H=0x0B;            //R1_0
        MOV     0x8,#0xb
//   27 }
        RET

使用特权

评论回复
13
Periodic|  楼主 | 2012-2-25 08:13 | 只看该作者
谢谢12楼   每次用分太多导致 无分可送

使用特权

评论回复
14
刘前辈| | 2012-2-25 12:04 | 只看该作者
本帖最后由 刘前辈 于 2012-2-25 12:13 编辑

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


使用特权

评论回复
15
刘前辈| | 2012-2-25 12:08 | 只看该作者
本帖最后由 刘前辈 于 2012-2-25 12:10 编辑
#include <REG51.H> 

data  char   DATA_0AH     _at_ 0x0A;
data  char   DATA_0BH     _at_ 0x0B;
data  char   DATA_0CH     _at_ 0x0C;
data  char   DATA_0DH     _at_ 0x0D;
data  char   DATA_0EH     _at_ 0x0E;
data  char   DATA_0FH     _at_ 0x0F;

data  char   DATA_08H     _at_ 0x08;

main()
{
DATA_0AH=0x00;
DATA_0BH=0x00;
DATA_0CH=0x00;
DATA_0DH=0x00;
DATA_0EH=0x00;
DATA_0FH=0x00;

DATA_08H=0x00;   

while(1);
}

、、

使用特权

评论回复
16
Periodic|  楼主 | 2012-2-25 12:52 | 只看该作者
2姨真是 51高手 云集的地方啊

使用特权

评论回复
17
Periodic|  楼主 | 2012-2-25 12:53 | 只看该作者
不过感觉还是12楼的 像C语言  16楼不太像哈哈

使用特权

评论回复
18
刘前辈| | 2012-2-25 13:39 | 只看该作者
本帖最后由 刘前辈 于 2012-2-25 13:47 编辑

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

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

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


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

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




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





、、

使用特权

评论回复
19
Periodic|  楼主 | 2012-2-25 14:20 | 只看该作者
直接寻址/间接寻址概念  -----------------
和这个无关  我是是想 以后 程序用在其他芯片上也能用。 但又希望效率高

使用特权

评论回复
20
tylhc002| | 2012-2-25 14:48 | 只看该作者
1# Periodic

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

670

帖子

2

粉丝