Board logo

标题: 用C语言编程时,如何给单片机的端口分配地址? [打印本页]

作者: robbyzhong    时间: 2005-12-31 14:53     标题: 用C语言编程时,如何给单片机的端口分配地址?

以前用汇编语言编程时,给单片机的各输入输出端口分配地址很容易理解,在初始化程序中先给各端口分配好地址,以后如果要改变这些端口的状态时,可以通过一些指令来直接改变这些端口的状态,现在我想如果用C语言来编程,如何控制这些端口?如何给这些端口分配地址?
作者: zenglian    时间: 2006-1-1 00:07

不知道你用的是那种单片机,一般来说单片机的端口的地址是固定的,当然如果是从总线扩展出来的地址就要看你的译码是多少。C语言操作其实更简单,改变状态直接赋值就可以了。
作者: robbyzhong    时间: 2006-1-1 12:38

单片机的每个输入输出管脚是不是在它的Datasheet中已经给它命名了,在写程序的时候直接赋值0或1就可以改变输入输出状态,我的理解对吗?
作者: zenglian    时间: 2006-1-1 21:52

可以说基本是这样,像51系列的单片机,在reg51.h里面对那些端口的地址和端口名称都对应起来了,所以只需要直接对口都名称操作就可以。像其他的单片机如果没有对应的头文件或者是由特殊的寄存器需要自己用宏定义来将端口名称和端口地址对应起来,然后操作端口名称。归根结底其实就是对地址操作,端口名称其实也是地址。
作者: robotone    时间: 2006-1-4 13:21

其实c编程和汇编差不多,只不过汇编按手册用地址一般是数字,c编程可以自己命名,可读性好点。
作者: yaoyuanhappy    时间: 2006-1-4 21:07

编大型的程序的时候你就会感觉到有C是多么幸福的一件事情
作者: sr0415    时间: 2006-1-6 13:05

必要时可以自己定义.就象用C直接操作计算机的地址(在单片机中,地址实际就是端口,只是我们在学指令系统的时候习惯用端口了,比如P1口)
作者: lbgy    时间: 2006-1-17 17:39

我觉得还是自己定义好一些,方便!
作者: zltwork    时间: 2006-1-18 08:57

请问版主 zenglian 例子如下
/*===========================================================================

KS0070(44780) 16x2 字符液晶屏驱动演示程序总线方式 晓奇
=============================================================================
连接线图: LCM-------51 LCM-------51 LCM--------51
DB0-----P0.0 DB4-----P0.4 RW-------P2.0
DB1-----P0.1 DB5-----P0.5 RS-------P2.1
DB2-----P0.2 DB6-----P0.6 E-------P2.7=>74ls00+wr+rd
DB3-----P0.3 DB7-----P0.7 VLCD接1K2电阻到GND

[注]:AT89C51的晶振频率为12MHz
============================================================================*/
//#pragma src // 产生汇编文件
#include
#include

//========= 变量类型标识的宏定义,大家都喜欢这么做 ==============
#define Uchar unsigned char
#define Uint unsigned int

// ================= LCM1602A端口地址定义 =======================
char xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0
char xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0
char xdata Lcd1602StatusPort _at_ 0x7dff; //E=1 RS=0 RW=1

以上端口定义时 如 Lcd1602CmdPort _at_ 0x7cff 即P2=0x7c p0=0xff 是这样吗?如不对的话为什么定义Lcd1602CmdPort 为 0x7cff 而不是 0x7dff或0x7eff
如果是 P2=0x7c p0=0xff 这样定义 那就相当于p2=01111100 即p20=0 p21=0 p27=0 (E=0 RS=0 RW=0)这与注释//E=1 RS=0 RW=0 不相符呀?是不是该例子有误?

如果有 Lcd1602CmdPort = 0x38; 请问单片机如何执行?即每步 p0=? p2=?
谢谢。

[此贴子已经被作者于2006-1-18 8:57:41编辑过]


作者: zenglian    时间: 2006-1-18 11:42

你要知道这是总线操作,这样定义没有问题,你看看总线操作的时许,会发出地址,数据还有读写指令.
作者: zltwork    时间: 2006-1-18 12:26

谢谢,因刚学,有很多东西还不清楚。现在加强总线的学习。
作者: zenglian    时间: 2006-1-19 10:39

不用谢,相互学习,相互交流。
作者: bignose_xgy    时间: 2006-3-30 09:50

版主好!我刚买了一个实验板,但是isp下载线我不知道该怎样去配置是他工作,能给点意见吗?谢谢!




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0