第十四届智能车队员培训 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端口的数据寄存器最低两位是只读位。
简单演示程序一、
1 #include <hidef.h> /* common defines and macros */ 2 #include "derivative.h" /* derivative-specific definitions */ 3 4 //************主函数************* 5 void main(void) 6 { 7 DDRA=0x0F;//数据方向寄存器7-0 八位设置为 十六进制数0F 二进制为0000 1111 高四位引脚为输入 低四位引脚为输出 8 PORTA=0x0A;//数据寄存器7-0 八位设置为 十六进制数0A 二进制为0000 1010 高四位引脚悬空 低四位引脚1号和三号输出高电平0号和2号输出低电平 9 }
此时,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=0;//定义继电器延时计数变量 unsigned int jidianqi_star=0;//定义继电器开关 unsigned int juzhengjianpan_star=0; //矩阵键盘开关 unsigned int paomadeng_star=0; //跑马灯开关 unsigned int times=0;//跑马灯依次按键计数变量//*************延时********************// void delay(unsigned int num) //接收无符号延时变量 num { int i; //定义延时变量 i//2重循环for(num;num>0;num--) //num循环减1 { for(i=100;i>=0;i--); //在num循环减1内依次i循环减1 } }//****************继电器模块***********// void jidianqi(void) //无接收值继电器 { delay(2000);//定义 num=2000并调用延时函数waittime++; // 继电器延时计数变量waittime+1if(waittime<=1) // 继电器延时计数变量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==2) // 当继电器延时计数变量waittime=2时 {waittime=0;//重新 赋值 继电器延时计数变量为下次使用 } }//****************矩阵键盘模块*********// void juzhengjianpan(void)//无接收值的矩阵 {DDRH_DDRH0=1;//接通行扫描线电源 H端口数据方向寄存器0号引脚为输出 while(PTH_PTH4==0)//判断数据寄存器PH4引脚接受到按键按下的低电平信号//默认输入 若加写DDRA=0;此按键屏蔽PORTA_BIT7=0;//PA7引脚低电平通电PORTA_BIT7=1;//PA7引脚高电平断电while(PTH_PTH5==0)//判断数据寄存器PH5引脚接受到按键按下的低电平信号//默认输入 若加写DDRA=0;此按键屏蔽PORTA_BIT6=0;//PA6引脚低电平通电PORTA_BIT6=1; //PA6 引脚高电平断电while(PTH_PTH6==0)//判断数据寄存器PH6引脚接受到按键按下的低电平信号//默认输入 若加写DDRA=0;此按键屏蔽PORTA_BIT5=0; //PA5 引脚低电平通电PORTA_BIT5=1; // PA5 引脚高电平断电while(PTH_PTH7==0)//判断数据寄存器PH7引脚接受到按键按下的低电平信号//默认输入 若加写DDRA=0;此按键屏蔽PTM_PTM5=0;//PM5 引脚低电平通电PTM_PTM5=1; // PM5 引脚高电平断电DDRH_DDRH0=0;DDRH_DDRH1=1;while(PTH_PTH4==0)PORTA_BIT4=0;PORTA_BIT4=1;while(PTH_PTH5==0)PORTA_BIT3=0;PORTA_BIT3=1;while(PTH_PTH6==0)PORTA_BIT2=0;PORTA_BIT2=1;while(PTH_PTH7==0)PORTA_BIT1=0;PORTA_BIT1=1;DDRH_DDRH1=0;DDRH_DDRH2=1;while(PTH_PTH4==0)PTM_PTM7=0;PTM_PTM7=1;while(PTH_PTH5==0)PORTB_BIT2=0;PORTB_BIT2=1;while(PTH_PTH6==0)PORTB_BIT0=0;PORTB_BIT0=1;while(PTH_PTH7==0)PTM_PTM6=0;PTM_PTM6=1;DDRH_DDRH2=0;DDRH_DDRH3=1;while(PTH_PTH4==0)PORTK_BIT7=0;PORTK_BIT7=1;while(PTH_PTH5==0)PORTE_BIT2=0;PORTE_BIT2=1;while(PTH_PTH6==0)PORTE_BIT3=0;PORTE_BIT3=1;while(PTH_PTH7==0)PTM_PTM4=0;PTM_PTM4=1;DDRH_DDRH3=0; }//*****************拨码开关模块***********// void bomakaiguang(void) {DDRJ_DDRJ1=0; // 1DDRJ_DDRJ0=0; // 2DDRB_BIT1=0; // 3DDRB_BIT3=0; // 4 /* DDRB_BIT4=0; // 5 //此处拨码暂时无用DDRB_BIT5=0; // 6DDRB_BIT6=0; // 7DDRA_BIT0=0; // 8 */if(PTJ_PTJ1==1) //1号开关接通 {jidianqi_star=1; } else {jidianqi_star=0; //定义继电器开关 }if(PTJ_PTJ0==1) //2号开关接通 {juzhengjianpan_star=1;} else{juzhengjianpan_star=0; //矩阵键盘开关打开 }if(PORTB_BIT1==1) //3号开关接通打开 {paomadeng_star=1; }else{paomadeng_star=0; //跑马灯开关打开 }}//*****************LED初始化*******************// void LED_init() {DDRA=0XFE;//转换为2进制1111 1110 打开7654321DDRB=0X05; //转换为2进制 0101打开30DDRE=0X0C; //转换为2进制 1100打开32DDRK=0X80; //转换为2进制 1000 0000打开7DDRM=0XF0; //转换为2进制 1111 0000打开7654PORTA=0XFE; //转换为2进制 1111 1110 打开7654321PORTB=0X05; //转换为2进制 0101打开30PORTE=0X0C; //转换为2进制 1100打开32PORTK=0X80; //转换为2进制 1000 0000打开7PTM=0XF0; //转换为2进制 1111 0000打开7654 }//*****************LED模块*************// void paomadeng() {times++; //时间累加依次按键switch(times)//一对多选择time作为输入 注意!!!!低电平灯亮 高电平灯灭 {case 1:PORTA_BIT7=0;PORTE_BIT3=1;break;//time=1时,按下case 1按键执行PA7低电平灯亮,PE3高电平灯灭 break执行完后跳出case 2:PORTA_BIT6=0;PORTA_BIT7=1;break; // time=2时,按下case 2按键执行PA6低电平灯亮,PA7高电平灯灭case 3:PORTA_BIT5=0;PORTA_BIT6=1;break;case 4:PORTA_BIT4=0;PORTA_BIT5=1;break;case 5:PORTA_BIT3=0;PORTA_BIT4=1;break;case 6:PORTA_BIT2=0;PORTA_BIT3=1;break;case 7:PTIM=0X7F;PORTA_BIT2=1; break; // 0x7f转换2进制为0111 1111 M端口6543210号高电平,PA2高电平灯灭case 8:PORTB_BIT2=0;PTM=0XFF; break; // PB2低电平灯亮,0xff转换2进制为1111 1111 M端口76543210号高电平灯灭case 9:PORTB_BIT0=0;PORTB_BIT2=1;break;case 10:PORTK_BIT7=0;PORTB_BIT0=1;break;case 11:PORTE_BIT2=0;PORTK_BIT7=1; break;case 12:PORTE_BIT3=0;PORTE_BIT2=1; break;case 13:PTM=0XD0;PORTE_BIT3=1; break; // 0xd0 转换2进制为 0110 1000 M端口653号高电平其余为低,PE3高电平灯灭case 14:PORTA_BIT1=0;PTM=0XFF; break;//PA1低电平灯亮 PTM 0xff 转换2进制为 1111 1111 M端口76543210号高电平case 15:PTM=0XB0;PORTA_BIT1=1; break;//PTM 0xb0 转换2进制为 1011 0000 M端口754高电平其余为低,PA1高电平case 16:PTM=0XE0;PTM=0XFF; break; // 0xe0 转换2进制为 1110 0000 M端口765高电平其余为低,0xff 转换2进制为 1111 1111 M端口76543210高电平case 17:PTM=0XFF; break; // 0xff 转换2进制为 1111 1111 M端口76543210高电平default:break;//跳出按键 } delay(500);//调用延时函数传值 500 if(times==17)//如果 跑马灯依次按键计数变量time=17 times=0;//重新赋值为0 为下次使用 }//**************主函数*****************// void main(void) {LED_init(); //LED灯初始化for(;;){bomakaiguang(); //拨码开关if(jidianqi_star==1) //如果继电器通电 {jidianqi(); //继电器 }if(juzhengjianpan_star==1) {juzhengjianpan(); //矩阵键盘 }if(paomadeng_star==1){paomadeng(); //跑马灯 }} }
转载于:https://www.cnblogs.com/WangYiqiang/p/9690035.html
第十四届智能车队员培训 I/O的使用 数据方向寄存器和数据寄存器的配置 MC9S12D64处理器...相关推荐
- 第十四届智能车竞赛规则浅聊
以下文字摘自于ZNCZZ论坛,目的是用于交流.摘录未做任何删减,文中观点为作者的观点:文中内嵌商业推广信息,请大家自行判断. 这不是魔术,只是看到的是三维世界在二维视网膜上的投影 距离卓老师微信公众号 ...
- 第十六届智能车竞赛参赛队员提问与回答 |2021年7月12
简 介: 针对第十六届智能车竞赛参赛队员的提问进行回复内容汇总. 关键词: 智能车竞赛,提问与回答 §01 基础四轮 ■ 提问: 卓大大您好,我是一名十六届基础四轮组的参赛选手,请问: 我们这辆B车是 ...
- 第十六届智能车竞赛比赛进行中 - 参赛队员提出的问题
简 介: 本文汇总了一些参加第十六届智能车竞赛学生提出的问题以及相应的回答. 关键词: 智能车竞赛,提问与回答 §01 规则缺陷 卓大大,我是今年华北赛区智能视觉组的参赛选手,这次比赛,我们其他任 ...
- 关于第十六届智能车竞赛全国总决赛比赛意见
简 介: 第十六届全国大学生全国大学生智能车竞赛在进行完毕分赛区比赛之后,时间到了2021年8月份,现在全国疫情出现了反复使得全国总决赛的承办出现了困难.为此,参加比赛的队伍在TSINGHUAZHUO ...
- 第十六届智能车竞赛总决赛线上比赛赛道设计
简 介: 根据2021年第十六届全国大学生智能汽车竞赛组委会商议确定使用线上比赛的方式完成比赛的后半程,全国总决赛.这种方式与以前的线上比赛相比具有相同性,也有其特殊性.需要在线上比赛的赛道设计以及比 ...
- 第十六届智能车竞赛广东省线上比赛第二波来袭
简 介: 第十六届智能车竞赛广东赛区第二波比赛信息. 关键词: 智能车竞赛,第二波比赛 §01 如何观看? 第十六届智能车竞赛广东省参赛队伍将 分成四个高校组合比赛点 进行比赛.其中 五邑大学高校组合 ...
- 第十五届智能车竞赛技术报告-成电金秋-AI电磁
01引言 1.1 大赛介绍 全国大学生"恩智浦"杯智能汽车竞赛是以"立足培养.重在参与.鼓励 探索.追求卓越"为宗旨,鼓励创新的一项科技竞赛活动.今年首次新增了 ...
- 第十五届智能车赛比赛 比赛组织参考文档
第十五届全国大学生智能车竞赛 比赛组织参考文档 作者:卓晴博士 全国大学生智能车竞赛秘书处 2020-07-27 Monday 2020年由于全球新冠肺炎大流行的影响,使得第十五届智能车竞赛在组织比赛 ...
- 第十六届智能车竞赛全国总决赛究竟该怎么举办讨论中的“混沌”现象
简 介: 汇总有对全国总决赛比赛意见推文之后,将在推文"三思而后行"之后的留言进行汇总分析.可以看到现在正值参赛同学等待总决赛名单公布百无聊赖之际,大家在利益攸关.意见远离平衡态下 ...
最新文章
- 爱创课堂每日一题第四十天- 说说你对语义化的理解?
- 安卓清理垃圾清理代码_用方面清理代码
- android 地址选择器_48种Android开发的开源库汇总
- 操作系统(4)-进程间通信
- android流量显示插件,[android]仿360状态,种流量监控桌面浮动显示
- 微信跳转浏览器--使用AugPush实现微信跳转手机浏览器
- HTML5应用程序缓存实现离线Web网页或应用
- 11月热门下载资源TOP100强力推荐!
- II.MongoDB CRUD Operations(CRUD操作)
- Audio播放流程(四)---MediaPlayerService流程之AudioTrack的创建
- 通讯工程考研考计算机专业跨度大么,通信工程专业,与自动化专业差别大吗?考研可以跨考吗?...
- Matlab系列教程_数值计算_最值、平均值、中值
- TP5用PHPMailer发送邮件
- canvas实现5张图片合成一张图片
- Cloud Rush—聚是一团火
- Android uiautomatorviewer无法启动
- 实战:使用urllib.request爬取猫眼票房数据
- intent跳转和转场动画
- 连接跟踪TCP序号检查
- 数据模型 LP32 ILP32 LP64 ILP64 LLP64