打印
[51单片机]

51内核的单片机如何在程序里如何实现read_reg(unsigned char addr)?

[复制链接]
1656|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mohanwei|  楼主 | 2014-12-28 12:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    现在经常接触一些消费类的廉价SOC,特点是没有仿真器,没有调试器,调试程序的常规手段就是编译、烧录、观察LED闪烁来判断程序运行情况
    考虑通过串口、I2C等通信接口来调试,在程序里内嵌一些通用的内存、寄存器读写函数:
#include <ABSACC.H>//提供一些直接DATA,IDATA,XDATA,CODE等地址的宏
unsigned char read_idata(unsigend char addr)//读取0x00-0xFF范围的RAM
{
     return(DBYTE[addr]);
}
void write_idata(unsigend char addr,unsigned char value)//修改0x00-0xFF范围的RAM
{
     DBYTE[addr] = value;
}
这些都比较简单,其他xdata,code等类型地址的访问依此类推……

问题是SFR的访问似乎做不了:
unsigned char read_reg8(unsigend char addr)//读取8位寄存器(51内核的高128字节:0x80-0xFF)
{
查了一些资料,似乎都无法实现……甚至嵌入汇编也不行
}
void write_reg8(unsigned char addr,unsigned char value)//修改8位寄存器(51内核的高128字节:0x80-0xFF)
{
}

我能想到的就是最笨的方法:
unsigned char read_reg8(unsigend char addr)//读取8位寄存器(51内核的高128字节:0x80-0xFF)
{
    switch(addr)
    {
        case 0x80: return(P0);
        case 0x90: return(P1);
        case 0xA0: return(P2);
        ……依此类推,把所有已定义的寄存器地址都枚举一遍……
    }
}

以前流行过一阵子单片机预烧录一小段调试器、监视器代码,keil通过串口跟它通信,可以通过指令来读取、修改寄存器,不知它是怎么实现的?

相关帖子

沙发
mohanwei|  楼主 | 2014-12-28 12:49 | 只看该作者
贴上现在用的,先对付一下吧,有好的再替换掉……好在51的特殊功能寄存器地址只有8位,而且还有excel,拖一拖就全出来了:

sfr c51reg_80H = 0x80;
sfr c51reg_81H = 0x81;
sfr c51reg_82H = 0x82;
sfr c51reg_83H = 0x83;
sfr c51reg_84H = 0x84;
sfr c51reg_85H = 0x85;
sfr c51reg_86H = 0x86;
sfr c51reg_87H = 0x87;
sfr c51reg_88H = 0x88;
sfr c51reg_89H = 0x89;
sfr c51reg_8AH = 0x8A;
sfr c51reg_8BH = 0x8B;
sfr c51reg_8CH = 0x8C;
sfr c51reg_8DH = 0x8D;
sfr c51reg_8EH = 0x8E;
sfr c51reg_8FH = 0x8F;
sfr c51reg_90H = 0x90;
sfr c51reg_91H = 0x91;
sfr c51reg_92H = 0x92;
sfr c51reg_93H = 0x93;
sfr c51reg_94H = 0x94;
sfr c51reg_95H = 0x95;
sfr c51reg_96H = 0x96;
sfr c51reg_97H = 0x97;
sfr c51reg_98H = 0x98;
sfr c51reg_99H = 0x99;
sfr c51reg_9AH = 0x9A;
sfr c51reg_9BH = 0x9B;
sfr c51reg_9CH = 0x9C;
sfr c51reg_9DH = 0x9D;
sfr c51reg_9EH = 0x9E;
sfr c51reg_9FH = 0x9F;
sfr c51reg_A0H = 0xA0;
sfr c51reg_A1H = 0xA1;
sfr c51reg_A2H = 0xA2;
sfr c51reg_A3H = 0xA3;
sfr c51reg_A4H = 0xA4;
sfr c51reg_A5H = 0xA5;
sfr c51reg_A6H = 0xA6;
sfr c51reg_A7H = 0xA7;
sfr c51reg_A8H = 0xA8;
sfr c51reg_A9H = 0xA9;
sfr c51reg_AAH = 0xAA;
sfr c51reg_ABH = 0xAB;
sfr c51reg_ACH = 0xAC;
sfr c51reg_ADH = 0xAD;
sfr c51reg_AEH = 0xAE;
sfr c51reg_AFH = 0xAF;
sfr c51reg_B0H = 0xB0;
sfr c51reg_B1H = 0xB1;
sfr c51reg_B2H = 0xB2;
sfr c51reg_B3H = 0xB3;
sfr c51reg_B4H = 0xB4;
sfr c51reg_B5H = 0xB5;
sfr c51reg_B6H = 0xB6;
sfr c51reg_B7H = 0xB7;
sfr c51reg_B8H = 0xB8;
sfr c51reg_B9H = 0xB9;
sfr c51reg_BAH = 0xBA;
sfr c51reg_BBH = 0xBB;
sfr c51reg_BCH = 0xBC;
sfr c51reg_BDH = 0xBD;
sfr c51reg_BEH = 0xBE;
sfr c51reg_BFH = 0xBF;
sfr c51reg_C0H = 0xC0;
sfr c51reg_C1H = 0xC1;
sfr c51reg_C2H = 0xC2;
sfr c51reg_C3H = 0xC3;
sfr c51reg_C4H = 0xC4;
sfr c51reg_C5H = 0xC5;
sfr c51reg_C6H = 0xC6;
sfr c51reg_C7H = 0xC7;
sfr c51reg_C8H = 0xC8;
sfr c51reg_C9H = 0xC9;
sfr c51reg_CAH = 0xCA;
sfr c51reg_CBH = 0xCB;
sfr c51reg_CCH = 0xCC;
sfr c51reg_CDH = 0xCD;
sfr c51reg_CEH = 0xCE;
sfr c51reg_CFH = 0xCF;
sfr c51reg_D0H = 0xD0;
sfr c51reg_D1H = 0xD1;
sfr c51reg_D2H = 0xD2;
sfr c51reg_D3H = 0xD3;
sfr c51reg_D4H = 0xD4;
sfr c51reg_D5H = 0xD5;
sfr c51reg_D6H = 0xD6;
sfr c51reg_D7H = 0xD7;
sfr c51reg_D8H = 0xD8;
sfr c51reg_D9H = 0xD9;
sfr c51reg_DAH = 0xDA;
sfr c51reg_DBH = 0xDB;
sfr c51reg_DCH = 0xDC;
sfr c51reg_DDH = 0xDD;
sfr c51reg_DEH = 0xDE;
sfr c51reg_DFH = 0xDF;
sfr c51reg_E0H = 0xE0;
sfr c51reg_E1H = 0xE1;
sfr c51reg_E2H = 0xE2;
sfr c51reg_E3H = 0xE3;
sfr c51reg_E4H = 0xE4;
sfr c51reg_E5H = 0xE5;
sfr c51reg_E6H = 0xE6;
sfr c51reg_E7H = 0xE7;
sfr c51reg_E8H = 0xE8;
sfr c51reg_E9H = 0xE9;
sfr c51reg_EAH = 0xEA;
sfr c51reg_EBH = 0xEB;
sfr c51reg_ECH = 0xEC;
sfr c51reg_EDH = 0xED;
sfr c51reg_EEH = 0xEE;
sfr c51reg_EFH = 0xEF;
sfr c51reg_F0H = 0xF0;
sfr c51reg_F1H = 0xF1;
sfr c51reg_F2H = 0xF2;
sfr c51reg_F3H = 0xF3;
sfr c51reg_F4H = 0xF4;
sfr c51reg_F5H = 0xF5;
sfr c51reg_F6H = 0xF6;
sfr c51reg_F7H = 0xF7;
sfr c51reg_F8H = 0xF8;
sfr c51reg_F9H = 0xF9;
sfr c51reg_FAH = 0xFA;
sfr c51reg_FBH = 0xFB;
sfr c51reg_FCH = 0xFC;
sfr c51reg_FDH = 0xFD;
sfr c51reg_FEH = 0xFE;
sfr c51reg_FFH = 0xFF;

unsigned char C51_Read_SFR8(unsigned char addr)//读取8051指定地址的SFR
{
    switch(addr)
    {
        case 0x80: return(c51reg_80H);
        case 0x81: return(c51reg_81H);
        case 0x82: return(c51reg_82H);
        case 0x83: return(c51reg_83H);
        case 0x84: return(c51reg_84H);
        case 0x85: return(c51reg_85H);
        case 0x86: return(c51reg_86H);
        case 0x87: return(c51reg_87H);
        case 0x88: return(c51reg_88H);
        case 0x89: return(c51reg_89H);
        case 0x8A: return(c51reg_8AH);
        case 0x8B: return(c51reg_8BH);
        case 0x8C: return(c51reg_8CH);
        case 0x8D: return(c51reg_8DH);
        case 0x8E: return(c51reg_8EH);
        case 0x8F: return(c51reg_8FH);
        case 0x90: return(c51reg_90H);
        case 0x91: return(c51reg_91H);
        case 0x92: return(c51reg_92H);
        case 0x93: return(c51reg_93H);
        case 0x94: return(c51reg_94H);
        case 0x95: return(c51reg_95H);
        case 0x96: return(c51reg_96H);
        case 0x97: return(c51reg_97H);
        case 0x98: return(c51reg_98H);
        case 0x99: return(c51reg_99H);
        case 0x9A: return(c51reg_9AH);
        case 0x9B: return(c51reg_9BH);
        case 0x9C: return(c51reg_9CH);
        case 0x9D: return(c51reg_9DH);
        case 0x9E: return(c51reg_9EH);
        case 0x9F: return(c51reg_9FH);
        case 0xA0: return(c51reg_A0H);
        case 0xA1: return(c51reg_A1H);
        case 0xA2: return(c51reg_A2H);
        case 0xA3: return(c51reg_A3H);
        case 0xA4: return(c51reg_A4H);
        case 0xA5: return(c51reg_A5H);
        case 0xA6: return(c51reg_A6H);
        case 0xA7: return(c51reg_A7H);
        case 0xA8: return(c51reg_A8H);
        case 0xA9: return(c51reg_A9H);
        case 0xAA: return(c51reg_AAH);
        case 0xAB: return(c51reg_ABH);
        case 0xAC: return(c51reg_ACH);
        case 0xAD: return(c51reg_ADH);
        case 0xAE: return(c51reg_AEH);
        case 0xAF: return(c51reg_AFH);
        case 0xB0: return(c51reg_B0H);
        case 0xB1: return(c51reg_B1H);
        case 0xB2: return(c51reg_B2H);
        case 0xB3: return(c51reg_B3H);
        case 0xB4: return(c51reg_B4H);
        case 0xB5: return(c51reg_B5H);
        case 0xB6: return(c51reg_B6H);
        case 0xB7: return(c51reg_B7H);
        case 0xB8: return(c51reg_B8H);
        case 0xB9: return(c51reg_B9H);
        case 0xBA: return(c51reg_BAH);
        case 0xBB: return(c51reg_BBH);
        case 0xBC: return(c51reg_BCH);
        case 0xBD: return(c51reg_BDH);
        case 0xBE: return(c51reg_BEH);
        case 0xBF: return(c51reg_BFH);
        case 0xC0: return(c51reg_C0H);
        case 0xC1: return(c51reg_C1H);
        case 0xC2: return(c51reg_C2H);
        case 0xC3: return(c51reg_C3H);
        case 0xC4: return(c51reg_C4H);
        case 0xC5: return(c51reg_C5H);
        case 0xC6: return(c51reg_C6H);
        case 0xC7: return(c51reg_C7H);
        case 0xC8: return(c51reg_C8H);
        case 0xC9: return(c51reg_C9H);
        case 0xCA: return(c51reg_CAH);
        case 0xCB: return(c51reg_CBH);
        case 0xCC: return(c51reg_CCH);
        case 0xCD: return(c51reg_CDH);
        case 0xCE: return(c51reg_CEH);
        case 0xCF: return(c51reg_CFH);
        case 0xD0: return(c51reg_D0H);
        case 0xD1: return(c51reg_D1H);
        case 0xD2: return(c51reg_D2H);
        case 0xD3: return(c51reg_D3H);
        case 0xD4: return(c51reg_D4H);
        case 0xD5: return(c51reg_D5H);
        case 0xD6: return(c51reg_D6H);
        case 0xD7: return(c51reg_D7H);
        case 0xD8: return(c51reg_D8H);
        case 0xD9: return(c51reg_D9H);
        case 0xDA: return(c51reg_DAH);
        case 0xDB: return(c51reg_DBH);
        case 0xDC: return(c51reg_DCH);
        case 0xDD: return(c51reg_DDH);
        case 0xDE: return(c51reg_DEH);
        case 0xDF: return(c51reg_DFH);
        case 0xE0: return(c51reg_E0H);
        case 0xE1: return(c51reg_E1H);
        case 0xE2: return(c51reg_E2H);
        case 0xE3: return(c51reg_E3H);
        case 0xE4: return(c51reg_E4H);
        case 0xE5: return(c51reg_E5H);
        case 0xE6: return(c51reg_E6H);
        case 0xE7: return(c51reg_E7H);
        case 0xE8: return(c51reg_E8H);
        case 0xE9: return(c51reg_E9H);
        case 0xEA: return(c51reg_EAH);
        case 0xEB: return(c51reg_EBH);
        case 0xEC: return(c51reg_ECH);
        case 0xED: return(c51reg_EDH);
        case 0xEE: return(c51reg_EEH);
        case 0xEF: return(c51reg_EFH);
        case 0xF0: return(c51reg_F0H);
        case 0xF1: return(c51reg_F1H);
        case 0xF2: return(c51reg_F2H);
        case 0xF3: return(c51reg_F3H);
        case 0xF4: return(c51reg_F4H);
        case 0xF5: return(c51reg_F5H);
        case 0xF6: return(c51reg_F6H);
        case 0xF7: return(c51reg_F7H);
        case 0xF8: return(c51reg_F8H);
        case 0xF9: return(c51reg_F9H);
        case 0xFA: return(c51reg_FAH);
        case 0xFB: return(c51reg_FBH);
        case 0xFC: return(c51reg_FCH);
        case 0xFD: return(c51reg_FDH);
        case 0xFE: return(c51reg_FEH);
        case 0xFF: return(c51reg_FFH);
        default: return(0xFF);
    }
}
void C51_Write_SFR8(unsigned char addr,unsigned char value)//修改8051指定地址的SFR
{
    switch(addr)
    {
        case 0x80: c51reg_80H = value; break;
        case 0x81: c51reg_81H = value; break;
        case 0x82: c51reg_82H = value; break;
        case 0x83: c51reg_83H = value; break;
        case 0x84: c51reg_84H = value; break;
        case 0x85: c51reg_85H = value; break;
        case 0x86: c51reg_86H = value; break;
        case 0x87: c51reg_87H = value; break;
        case 0x88: c51reg_88H = value; break;
        case 0x89: c51reg_89H = value; break;
        case 0x8A: c51reg_8AH = value; break;
        case 0x8B: c51reg_8BH = value; break;
        case 0x8C: c51reg_8CH = value; break;
        case 0x8D: c51reg_8DH = value; break;
        case 0x8E: c51reg_8EH = value; break;
        case 0x8F: c51reg_8FH = value; break;
        case 0x90: c51reg_90H = value; break;
        case 0x91: c51reg_91H = value; break;
        case 0x92: c51reg_92H = value; break;
        case 0x93: c51reg_93H = value; break;
        case 0x94: c51reg_94H = value; break;
        case 0x95: c51reg_95H = value; break;
        case 0x96: c51reg_96H = value; break;
        case 0x97: c51reg_97H = value; break;
        case 0x98: c51reg_98H = value; break;
        case 0x99: c51reg_99H = value; break;
        case 0x9A: c51reg_9AH = value; break;
        case 0x9B: c51reg_9BH = value; break;
        case 0x9C: c51reg_9CH = value; break;
        case 0x9D: c51reg_9DH = value; break;
        case 0x9E: c51reg_9EH = value; break;
        case 0x9F: c51reg_9FH = value; break;
        case 0xA0: c51reg_A0H = value; break;
        case 0xA1: c51reg_A1H = value; break;
        case 0xA2: c51reg_A2H = value; break;
        case 0xA3: c51reg_A3H = value; break;
        case 0xA4: c51reg_A4H = value; break;
        case 0xA5: c51reg_A5H = value; break;
        case 0xA6: c51reg_A6H = value; break;
        case 0xA7: c51reg_A7H = value; break;
        case 0xA8: c51reg_A8H = value; break;
        case 0xA9: c51reg_A9H = value; break;
        case 0xAA: c51reg_AAH = value; break;
        case 0xAB: c51reg_ABH = value; break;
        case 0xAC: c51reg_ACH = value; break;
        case 0xAD: c51reg_ADH = value; break;
        case 0xAE: c51reg_AEH = value; break;
        case 0xAF: c51reg_AFH = value; break;
        case 0xB0: c51reg_B0H = value; break;
        case 0xB1: c51reg_B1H = value; break;
        case 0xB2: c51reg_B2H = value; break;
        case 0xB3: c51reg_B3H = value; break;
        case 0xB4: c51reg_B4H = value; break;
        case 0xB5: c51reg_B5H = value; break;
        case 0xB6: c51reg_B6H = value; break;
        case 0xB7: c51reg_B7H = value; break;
        case 0xB8: c51reg_B8H = value; break;
        case 0xB9: c51reg_B9H = value; break;
        case 0xBA: c51reg_BAH = value; break;
        case 0xBB: c51reg_BBH = value; break;
        case 0xBC: c51reg_BCH = value; break;
        case 0xBD: c51reg_BDH = value; break;
        case 0xBE: c51reg_BEH = value; break;
        case 0xBF: c51reg_BFH = value; break;
        case 0xC0: c51reg_C0H = value; break;
        case 0xC1: c51reg_C1H = value; break;
        case 0xC2: c51reg_C2H = value; break;
        case 0xC3: c51reg_C3H = value; break;
        case 0xC4: c51reg_C4H = value; break;
        case 0xC5: c51reg_C5H = value; break;
        case 0xC6: c51reg_C6H = value; break;
        case 0xC7: c51reg_C7H = value; break;
        case 0xC8: c51reg_C8H = value; break;
        case 0xC9: c51reg_C9H = value; break;
        case 0xCA: c51reg_CAH = value; break;
        case 0xCB: c51reg_CBH = value; break;
        case 0xCC: c51reg_CCH = value; break;
        case 0xCD: c51reg_CDH = value; break;
        case 0xCE: c51reg_CEH = value; break;
        case 0xCF: c51reg_CFH = value; break;
        case 0xD0: c51reg_D0H = value; break;
        case 0xD1: c51reg_D1H = value; break;
        case 0xD2: c51reg_D2H = value; break;
        case 0xD3: c51reg_D3H = value; break;
        case 0xD4: c51reg_D4H = value; break;
        case 0xD5: c51reg_D5H = value; break;
        case 0xD6: c51reg_D6H = value; break;
        case 0xD7: c51reg_D7H = value; break;
        case 0xD8: c51reg_D8H = value; break;
        case 0xD9: c51reg_D9H = value; break;
        case 0xDA: c51reg_DAH = value; break;
        case 0xDB: c51reg_DBH = value; break;
        case 0xDC: c51reg_DCH = value; break;
        case 0xDD: c51reg_DDH = value; break;
        case 0xDE: c51reg_DEH = value; break;
        case 0xDF: c51reg_DFH = value; break;
        case 0xE0: c51reg_E0H = value; break;
        case 0xE1: c51reg_E1H = value; break;
        case 0xE2: c51reg_E2H = value; break;
        case 0xE3: c51reg_E3H = value; break;
        case 0xE4: c51reg_E4H = value; break;
        case 0xE5: c51reg_E5H = value; break;
        case 0xE6: c51reg_E6H = value; break;
        case 0xE7: c51reg_E7H = value; break;
        case 0xE8: c51reg_E8H = value; break;
        case 0xE9: c51reg_E9H = value; break;
        case 0xEA: c51reg_EAH = value; break;
        case 0xEB: c51reg_EBH = value; break;
        case 0xEC: c51reg_ECH = value; break;
        case 0xED: c51reg_EDH = value; break;
        case 0xEE: c51reg_EEH = value; break;
        case 0xEF: c51reg_EFH = value; break;
        case 0xF0: c51reg_F0H = value; break;
        case 0xF1: c51reg_F1H = value; break;
        case 0xF2: c51reg_F2H = value; break;
        case 0xF3: c51reg_F3H = value; break;
        case 0xF4: c51reg_F4H = value; break;
        case 0xF5: c51reg_F5H = value; break;
        case 0xF6: c51reg_F6H = value; break;
        case 0xF7: c51reg_F7H = value; break;
        case 0xF8: c51reg_F8H = value; break;
        case 0xF9: c51reg_F9H = value; break;
        case 0xFA: c51reg_FAH = value; break;
        case 0xFB: c51reg_FBH = value; break;
        case 0xFC: c51reg_FCH = value; break;
        case 0xFD: c51reg_FDH = value; break;
        case 0xFE: c51reg_FEH = value; break;
        case 0xFF: c51reg_FFH = value; break;
        default: break;
    }
}

使用特权

评论回复
板凳
ayb_ice| | 2014-12-29 08:05 | 只看该作者
"我能想到的就是最笨的方法:"

答对了,只能用这种方法,因为SFR只能直接寻址

使用特权

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

本版积分规则

个人签名:试一下能否设置签名档

177

主题

9320

帖子

24

粉丝