第十四届智能车队员培训 I/O的使用 数据方向寄存器和数据寄存器的配置 MC9S12D64处理器
I/O的使用 数据方向寄存器和数据寄存器的配置
I/O输入输出的使用:
数据方向寄存器与数据寄存器
寄存器的概念:
PORTA、PORTB、PORTE和PORTK端口

DDRx决定对应引脚配置为输出口还是输入口,如果某位为“0”,则对应引脚设定为输入口;如果某位为“1”,则对应引脚设定为输出口。MCU复位后,DDRx值为0x00,引脚默认为输入口。 需要注意的是,PORTE端口是一个特例,它的最低两位只能为输入口,所以PORTE端口的数据方向寄存器最低两位是只读位,读取这两位始终返回“0”。
数据寄存器(Px)

数据寄存器Px中的8位对应每个端口中的相应引脚,如果某端口的引脚被定义为输出时,写入数据寄存器Px中的数值,则从对应引脚输出;如果某端口的引脚被定义为输入时,可以读取数据寄存器Px对应引脚的电平值。 需要注意PORTE端口是一个特例,它的最低两位只能为输入口,所以PORTE端口的数据寄存器最低两位是只读位。
简单演示程序一、
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */ //************主函数*************
void main(void)
{
DDRA=0x0F;//数据方向寄存器7-0 八位设置为 十六进制数0F 二进制为0000 1111 高四位引脚为输入 低四位引脚为输出
PORTA=0x0A;//数据寄存器7-0 八位设置为 十六进制数0A 二进制为0000 1010 高四位引脚悬空 低四位引脚1号和三号输出高电平0号和2号输出低电平
}
此时,A端口0号和2号引脚所控制的 LED灯点亮,其余灯灭。
原因:1号和3号引脚因输出高电平而不亮。7号-4号因数据方向寄存器设置为输入状态,因此无法改变LED灯电路控制端(电路开断)
疑问:为什么输出低电平LED灯会亮,高电平不亮?
解答:
在单片机开发的过程中,LED灯的亮灭控制与传统电路开关有所不同。统灯的亮灭控制由电路火线220V的开断所控制,而单片机开发中,LED灯的亮灭大多数需结合单片机实际电路设计来对LED灯的控制端进行控制。
如图:

单片机控制引脚在二极管反向,此二极管功能为开关二极管。二极管在正向电压作用下电阻很小,处于导通状态,相当于一只接通的开关;在反向电压作用下,电阻很大,处于截止状态,如同一只断开的开关。因此当单片机控制引脚为输出低电平时,二极管正向电压>反向电压 电路导通,LED灯亮。
复杂例程:
//*******************************************//
//*** 演示程序一 ***//
// ******************************************// //*******************************************//
//*描述: *//
//* 此程序包含以下几个模块: *//
//* 交通灯、矩阵键盘、继电器、拨码开关 *//
//* *//
//* 目的: *//
//* 完成简单的I/O控制,熟悉基本C语言编程 *//
//*******************************************// //用拨码开关来控制模块的调用//
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */ //////////////////////////////////////////// //全局变量的定义
unsigned int waittime=;//定义继电器延时计数变量
unsigned int jidianqi_star=;//定义继电器开关
unsigned int juzhengjianpan_star=; //矩阵键盘开关
unsigned int paomadeng_star=; //跑马灯开关
unsigned int times=;//跑马灯依次按键计数变量 //*************延时********************//
void delay(unsigned int num) //接收无符号延时变量 num
{
int i; //定义延时变量 i
//2重循环
for(num;num>;num--) //num循环减1
{
for(i=;i>=;i--); //在num循环减1内依次i循环减1
}
} //****************继电器模块***********//
void jidianqi(void) //无接收值继电器
{
delay();//定义 num=2000并调用延时函数
waittime++; // 继电器延时计数变量waittime+1
if(waittime<=) // 继电器延时计数变量waittime<=1
{ DDRK=0X30;//打开继电器两路输出电源 0X30 十六进制转二进制为 0011 0000 ,k端口数据方向寄存器4和5号引脚为输出
PORTK=0X20; // 0x20十六进制转二进制为 0010 0000 k端口数据寄存器第5号引脚高电平 红灯亮
}
else //否则 即 继电器延时计数变量waittime>1
{
DDRK=0X30; //打开继电器输出两路电源 0X30 十六进制转二进制为 0011 0000 k端口数据方向寄存器4和5号引脚为输出
PORTK=0X10; // 0x10十六进制转二进制为 0001 0000 k端口数据寄存器第4号引脚高电平 绿灯亮
} if(waittime==) // 当继电器延时计数变量waittime=2时
{
waittime=;//重新 赋值 继电器延时计数变量为下次使用
}
} //****************矩阵键盘模块*********//
void juzhengjianpan(void)//无接收值的矩阵
{
DDRH_DDRH0=;//接通行扫描线电源 H端口数据方向寄存器0号引脚为输出
while(PTH_PTH4==)//判断数据寄存器PH4引脚接受到按键按下的低电平信号
//默认输入 若加写DDRA=0;此按键屏蔽
PORTA_BIT7=;//PA7引脚低电平通电
PORTA_BIT7=;//PA7引脚高电平断电
while(PTH_PTH5==)//判断数据寄存器PH5引脚接受到按键按下的低电平信号
//默认输入 若加写DDRA=0;此按键屏蔽
PORTA_BIT6=;//PA6引脚低电平通电
PORTA_BIT6=; //PA6 引脚高电平断电
while(PTH_PTH6==)//判断数据寄存器PH6引脚接受到按键按下的低电平信号
//默认输入 若加写DDRA=0;此按键屏蔽
PORTA_BIT5=; //PA5 引脚低电平通电
PORTA_BIT5=; // PA5 引脚高电平断电
while(PTH_PTH7==)//判断数据寄存器PH7引脚接受到按键按下的低电平信号
//默认输入 若加写DDRA=0;此按键屏蔽
PTM_PTM5=;//PM5 引脚低电平通电
PTM_PTM5=; // PM5 引脚高电平断电
DDRH_DDRH0=; DDRH_DDRH1=;
while(PTH_PTH4==)
PORTA_BIT4=;
PORTA_BIT4=;
while(PTH_PTH5==)
PORTA_BIT3=;
PORTA_BIT3=;
while(PTH_PTH6==)
PORTA_BIT2=;
PORTA_BIT2=;
while(PTH_PTH7==)
PORTA_BIT1=;
PORTA_BIT1=;
DDRH_DDRH1=; DDRH_DDRH2=;
while(PTH_PTH4==)
PTM_PTM7=;
PTM_PTM7=;
while(PTH_PTH5==)
PORTB_BIT2=;
PORTB_BIT2=;
while(PTH_PTH6==)
PORTB_BIT0=;
PORTB_BIT0=;
while(PTH_PTH7==)
PTM_PTM6=;
PTM_PTM6=;
DDRH_DDRH2=; DDRH_DDRH3=;
while(PTH_PTH4==)
PORTK_BIT7=;
PORTK_BIT7=;
while(PTH_PTH5==)
PORTE_BIT2=;
PORTE_BIT2=;
while(PTH_PTH6==)
PORTE_BIT3=;
PORTE_BIT3=;
while(PTH_PTH7==)
PTM_PTM4=;
PTM_PTM4=;
DDRH_DDRH3=;
} //*****************拨码开关模块***********//
void bomakaiguang(void)
{
DDRJ_DDRJ1=; //
DDRJ_DDRJ0=; //
DDRB_BIT1=; //
DDRB_BIT3=; //
/* DDRB_BIT4=0; // 5 //此处拨码暂时无用
DDRB_BIT5=0; // 6
DDRB_BIT6=0; // 7
DDRA_BIT0=0; // 8
*/ if(PTJ_PTJ1==) //1号开关接通
{
jidianqi_star=;
}
else
{
jidianqi_star=; //定义继电器开关
} if(PTJ_PTJ0==) //2号开关接通
{
juzhengjianpan_star=;
}
else
{
juzhengjianpan_star=; //矩阵键盘开关打开
} if(PORTB_BIT1==) //3号开关接通打开
{
paomadeng_star=;
}
else
{
paomadeng_star=; //跑马灯开关打开
} } //*****************LED初始化*******************//
void LED_init()
{
DDRA=0XFE;//转换为2进制1111 1110 打开7654321
DDRB=0X05; //转换为2进制 0101打开30
DDRE=0X0C; //转换为2进制 1100打开32
DDRK=0X80; //转换为2进制 1000 0000打开7
DDRM=0XF0; //转换为2进制 1111 0000打开7654
PORTA=0XFE; //转换为2进制 1111 1110 打开7654321
PORTB=0X05; //转换为2进制 0101打开30
PORTE=0X0C; //转换为2进制 1100打开32
PORTK=0X80; //转换为2进制 1000 0000打开7
PTM=0XF0; //转换为2进制 1111 0000打开7654
} //*****************LED模块*************//
void paomadeng()
{ times++; //时间累加依次按键 switch(times)//一对多选择time作为输入 注意!!!!低电平灯亮 高电平灯灭
{
case :PORTA_BIT7=;PORTE_BIT3=;break;//time=1时,按下case 1按键执行PA7低电平灯亮,PE3高电平灯灭 break执行完后跳出
case :PORTA_BIT6=;PORTA_BIT7=;break; // time=2时,按下case 2按键执行PA6低电平灯亮,PA7高电平灯灭
case :PORTA_BIT5=;PORTA_BIT6=;break;
case :PORTA_BIT4=;PORTA_BIT5=;break;
case :PORTA_BIT3=;PORTA_BIT4=;break;
case :PORTA_BIT2=;PORTA_BIT3=;break;
case :PTIM=0X7F;PORTA_BIT2=; break; // 0x7f转换2进制为0111 1111 M端口6543210号高电平,PA2高电平灯灭
case :PORTB_BIT2=;PTM=0XFF; break; // PB2低电平灯亮,0xff转换2进制为1111 1111 M端口76543210号高电平灯灭
case :PORTB_BIT0=;PORTB_BIT2=;break;
case :PORTK_BIT7=;PORTB_BIT0=;break;
case :PORTE_BIT2=;PORTK_BIT7=; break;
case :PORTE_BIT3=;PORTE_BIT2=; break;
case :PTM=0XD0;PORTE_BIT3=; break; // 0xd0 转换2进制为 0110 1000 M端口653号高电平其余为低,PE3高电平灯灭
case :PORTA_BIT1=;PTM=0XFF; break;//PA1低电平灯亮 PTM 0xff 转换2进制为 1111 1111 M端口76543210号高电平
case :PTM=0XB0;PORTA_BIT1=; break;//PTM 0xb0 转换2进制为 1011 0000 M端口754高电平其余为低,PA1高电平
case :PTM=0XE0;PTM=0XFF; break; // 0xe0 转换2进制为 1110 0000 M端口765高电平其余为低,0xff 转换2进制为 1111 1111 M端口76543210高电平
case :PTM=0XFF; break; // 0xff 转换2进制为 1111 1111 M端口76543210高电平
default:break;//跳出按键
}
delay();//调用延时函数传值 500
if(times==)//如果 跑马灯依次按键计数变量time=17
times=;//重新赋值为0 为下次使用 } //**************主函数*****************//
void main(void)
{ LED_init(); //LED灯初始化
for(;;)
{
bomakaiguang(); //拨码开关
if(jidianqi_star==) //如果继电器通电
{
jidianqi(); //继电器
} if(juzhengjianpan_star==)
{
juzhengjianpan(); //矩阵键盘
} if(paomadeng_star==)
{
paomadeng(); //跑马灯
}
} }
第十四届智能车队员培训 I/O的使用 数据方向寄存器和数据寄存器的配置 MC9S12D64处理器的更多相关文章
- 第十四届智能车培训 PLL锁相环
什么是锁相环? PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时脉讯号,使高频器件正常工作,如内存的存取资料等.PLL用于振荡器中的反馈技术. 许多电子设备要正常工作 ...
- HDU 6467 简单数学题 【递推公式 && O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others) M ...
- HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6470 Count Time Limit: 6000/3000 MS (Java/Others) ...
- HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
简单数学题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
免费送气球 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 6463.超级无敌简单题-卡边界的暴力 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)
超级无敌简单题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题
第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 1.原题呈现 2.试题答案 3.题目解析 因博客园无法打出公式等,所以给你们几个小编推荐的链接去看看,在这里小编深感抱歉! https ...
- EOS基础全家桶(十四)智能合约进阶
简介 通过上一期的学习,大家应该能写一些简单的功能了,但是在实际生产中的功能需求往往要复杂很多,今天我就继续和大家分享下智能合约中的一些高级用法和功能. 使用docker编译 如果你需要使用不同版本的 ...
随机推荐
- git在工作中的用法总结-使用篇
上一篇介绍了git的环境安装配置,本篇对git在工作中常用的用法进行总结,已满足大部分的日常工作需求,对于其他的一些git命令用法在今后使用到时我也会更新上来,文中如有错误,欢迎大家指出来,谢谢~ 一 ...
- 安装LoadRunner时提示缺少vc2005_sp1_with_atl_fix_redist解决方案
操作系统重装后,安装LoadRunner11时,会报缺少vc2005_sp1_with_atl_fix_redist错误,类似下图所示: LR自动安装失败,在网上下载此组件安装后依然提示此信息,最终解 ...
- 反爬虫——使用chrome headless时一些需要注意的细节
以前我们介绍过chrome headless的用法(https://www.cnblogs.com/apocelipes/p/9264673.html). 今天我们要稍微提一下其中一个细节. 反爬和w ...
- C#字符串。
string类型不能被继承,它是密封类,sealed. 一.字符串的特性. 1.不可变性. class Program { static void Main(string[] args) { stri ...
- .net Core使用Orcle官方驱动连接数据库
最近在研究.net Core,因为公司的项目用到的都是Oracle数据库,所以简单试一下.net Core怎样连接Oracle. Oracle官方现在已经提供.net Core的官方驱动(预览版),也 ...
- struts2_项目运行报404
1.缺少jar包,commons-lang3-3.2.jar 参考网址:https://blog.csdn.net/u013457382/article/details/50972401 2.stru ...
- mapper代理开发步骤
1:先写Mapper接口,UserMapper.java 2:然后遵循4条开发规范,写映射文件,UserMapper.xml 3:将映射文件,UserMapper.xml加入到SqlMapConfig ...
- 如何将字符串格式的对象转换成真正的js对象?
1.如何将字符串格式的对象转换成真正的js对象? <script>//eval 的作用eval('var a = 100');console.log(a);</script> ...
- loj#6030. 「雅礼集训 2017 Day1」矩阵(贪心 构造)
题意 链接 Sol 自己都不知道自己怎么做出来的系列 不难观察出几个性质: 最优策略一定是先把某一行弄黑,然后再用这一行去覆盖不是全黑的列 无解当且仅当无黑色.否则第一个黑色所在的行\(i\)可以先把 ...
- CentOS7防火墙firewalld设置
添加80端口 重启后永久生效 firewall-cmd --zone=public --add-port=80/tcp --permanent 查看防火墙状态 systemctl status ...