1.不能直接给P0^0赋值,如P0^0=1;
要先sbit LED = P0^0;
然后 LED = !LED;
解释:P1^0”只是个常数,表示寄存器P0的0位的位地址值。而
sbit led = P1^0;
才真正地定义了一个位变量。有了变量才能对此赋值。
2.关于51单片机里的data与code
data与code是指数据的存储类型,即存储在数据段还是程序段内,常用的就是data与code。
下面是我在12864多层菜单滚动显示时遇到的问题。
//菜单参数
typedef struct _MENU_PRMT
{
uchar ExitMark; //推出菜单(0-不推出,1-退出)
uchar Cursor; //光标值(当前光标位置)
uchar PageNo; //菜单页(显示开始项)
uchar Index; //菜单索引(当前选择的菜单项)
uchar DispNum; //显示项数(每页可以显示的菜单项)
uchar MaxPage; //最大页数(最大有多少种显示页)
} MENU_PRMT;
//菜单执行
typedef struct _MENU_TABLE
{
uchar *MenuName; //菜单项目名称
void (*ItemHook)(void); //菜单函数
}MENU_TABLE;
/*************************************************************************/
MENU_PRMT *pPrmt; <<=指向data段的指针
MENU_TABLE code *pTable; <<=指向code的指针
//---------------------------------- 主菜单 ---------------------------------------
MENU_PRMT GSetPrmt; <<=默认定义在data段
MENU_TABLE code GeneralSet[] = <<=定义在code段
{
{" -= 常规设置 =- ", Menu_Null },
{"1.转向设定 ", Menu_RotDirecSet},
{"2.速度设定 ", Menu_SpeedSet },
{"3.启动时间设定 ", Menu_Null },
{"4.停止时间设定 ", Menu_Null },
};
pPrmt = &GSetPrmt; <<=指针的赋值是一样的,别忘记变量前面的&
pTable = &GeneralSet;
typedef struct _MENU_PRMT
{
uchar ExitMark; //推出菜单(0-不推出,1-退出)
uchar Cursor; //光标值(当前光标位置)
uchar PageNo; //菜单页(显示开始项)
uchar Index; //菜单索引(当前选择的菜单项)
uchar DispNum; //显示项数(每页可以显示的菜单项)
uchar MaxPage; //最大页数(最大有多少种显示页)
} MENU_PRMT;
//菜单执行
typedef struct _MENU_TABLE
{
uchar *MenuName; //菜单项目名称
void (*ItemHook)(void); //菜单函数
}MENU_TABLE;
/*************************************************************************/
MENU_PRMT *pPrmt; <<=指向data段的指针
MENU_TABLE code *pTable; <<=指向code的指针
//---------------------------------- 主菜单 ---------------------------------------
MENU_PRMT GSetPrmt; <<=默认定义在data段
MENU_TABLE code GeneralSet[] = <<=定义在code段
{
{" -= 常规设置 =- ", Menu_Null },
{"1.转向设定 ", Menu_RotDirecSet},
{"2.速度设定 ", Menu_SpeedSet },
{"3.启动时间设定 ", Menu_Null },
{"4.停止时间设定 ", Menu_Null },
};
pPrmt = &GSetPrmt; <<=指针的赋值是一样的,别忘记变量前面的&
pTable = &GeneralSet;
下面是从网上粘来相关知识:
c51中的存储类型
code :程序存储区(64KB),
data :可直接寻址的内部数据存储区(128B)
idata:不可直接寻址的内部数据存储区(256B)
bdata:可位寻址内部数据存储区(16B)
xdata:外部数据存储区(64KB)
pdata:分页的外部数据存储区
code 是在 0000H .. 0FFFFH 之间的一个代码地址。
我用
ORG 5000H
TAB: DB 22H,3BH,43H,66H,5H,6DH,88H后,
CODE从5000H开始以后变成DB各位
ORG 5000H
TAB: DB 22H,3BH,43H,66H,5H,6DH,88H后,
CODE从5000H开始以后变成DB各位
data
是 在 0 到 127 之间的一个数据存储器地址,或者加 128 .. 255 范围内的一个特殊功能寄存器(SFR)地址。
bit
是在内部数据存储空间中 20H .. 2FH 区域中一个位的地址,
是在内部数据存储空间中 20H .. 2FH 区域中一个位的地址,