Contents
1> P1口
- 没画【P1.0/T2】【P1.1/T2EX】第2功能;
1.1> 写 “0” 过程
D触发器FF1,输入0;
则,Q# = 1, NMOS管Q1导通,引脚【P1.n】接地输出0;LED1灭;
1.2> 写 “1” 过程
D触发器FF1,输入1;
则,Q# = 0, NMOS管Q1截止,引脚【P1.n】通过R1接到VCC,输出1,LED1亮;
1.3> 读引脚
测试电路,S1连接2-3引脚;
开关S2断开,引脚【P1.n】为高电平,读使能三态门G2,读到高电平”1“;
开关S2闭合,引脚【P1.n】为低电平,读使能三态门G2,读到低电平”0“;
/* C程序 */
unsigned char data = P1^0;
”准“双向问题:
如果对引脚先进行写‘0’操作,则NMOS管Q1导通,引脚【P1.n】接地;
这时无论开关S2断开,还是闭合,读引脚都是”0“;
所以读引脚前需,先写‘1’,使NMOS断开,这就是准双向的意思,要有”准“备;
😀这设计还挺麻烦;
1.4> 读 寄存器
读寄存器,读的就是D触发器Q端值,Q = D;
P1^0 = ~P1^0; // 这个是读寄存器;
2> P3口
增加了第2功能的输入与输出;
3> P0口
3.1> 作普通I/O口
功能选择为“0”, 则MUX1选择【Q#】输出端,
与门G4输出“0”,Q1截止
使NMOS管Q2漏极开漏输出;
- 为什么需要上拉电阻?
写“0”, Q2导通,接地,输出0,是正确的;
写“1”, Q2截止,Q1截止,这时P0端口是高阻状态,不是“1”, 因此必须上拉;
3.2> 作低8位地址/数据线, 用于扩展外部存储器
功能选择为“1”, 则2选1多路开关MUX1选择非门【G3】输出端,
这样,
地址/数据线写“0”时,与门G4输出0,Q1截止;非门G3输出1,Q2导通;P0端口输出“0”;
地址/数据线写“1”时,Q1导通,Q2截止,P0端口输出“1”;
- Q1与Q2构成推挽输出,不需要接上拉电阻;
3.3> 读外部存储器数据过程
CPU执行读数据指令时,
第一步:首先低8位地址信息写在【地址/数据】总线上;
第二步:CPU使开关MUX1连接到【Q#】端, 并向P0口写入FF;
第三步:“读引脚”使能,数据读到总线;
4> P2 口
功能1:通用I/O口;
功能2:高8位地址总线;