I/O的使用 数据方向寄存器和数据寄存器的配置

I/O输入输出的使用:

数据方向寄存器与数据寄存器

寄存器的概念:

寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成。在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类。内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求。而接口寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一种,作为软硬件的接口,为广泛的通用编程用户所熟知。
在计算机领域,寄存器是CPU内部的元件,包括通用寄存器、专用寄存器和控制寄存器。寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
寄存器内存阶层中的最顶端,也是系统获得操作资料的最快速途径。寄存器通常都是以他们可以保存的位元数量来估量,
 
输入输出的概念:
输入:从cpu芯片的外围电路将信号传入到cpu芯片内部为输入
输出:从cpu芯片内部将信号传出,或传送到pu芯片的外围电路为输出
 
 
数据方向寄存器:数据方向寄存器为他说控制的端口设置数据传输方向,既设置cpu芯片对应引脚的输入与输出
数据寄存器:设置他所控制的端口引脚的数据
 
MC9S12D64处理器的数据方向寄存器(DDRx)

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灯亮。

复杂例程:

  1. //*******************************************//
  2. //*** 演示程序一 ***//
  3. // ******************************************//
  4.  
  5. //*******************************************//
  6. //*描述: *//
  7. //* 此程序包含以下几个模块: *//
  8. //* 交通灯、矩阵键盘、继电器、拨码开关 *//
  9. //* *//
  10. //* 目的: *//
  11. //* 完成简单的I/O控制,熟悉基本C语言编程 *//
  12. //*******************************************//
  13.  
  14. //用拨码开关来控制模块的调用//
  15. #include <hidef.h> /* common defines and macros */
  16. #include "derivative.h" /* derivative-specific definitions */
  17.  
  18. ////////////////////////////////////////////
  19.  
  20. //全局变量的定义
  21. unsigned int waittime=;//定义继电器延时计数变量
  22. unsigned int jidianqi_star=;//定义继电器开关
  23. unsigned int juzhengjianpan_star=; //矩阵键盘开关
  24. unsigned int paomadeng_star=; //跑马灯开关
  25. unsigned int times=;//跑马灯依次按键计数变量
  26.  
  27. //*************延时********************//
  28. void delay(unsigned int num) //接收无符号延时变量 num
  29. {
  30. int i; //定义延时变量 i
  31. //2重循环
  32. for(num;num>;num--) //num循环减1
  33. {
  34. for(i=;i>=;i--); //在num循环减1内依次i循环减1
  35. }
  36. }
  37.  
  38. //****************继电器模块***********//
  39. void jidianqi(void) //无接收值继电器
  40. {
  41. delay();//定义 num=2000并调用延时函数
  42. waittime++; // 继电器延时计数变量waittime+1
  43. if(waittime<=) // 继电器延时计数变量waittime<=1
  44. {
  45.  
  46. DDRK=0X30;//打开继电器两路输出电源 0X30 十六进制转二进制为 0011 0000 ,k端口数据方向寄存器4和5号引脚为输出
  47. PORTK=0X20; // 0x20十六进制转二进制为 0010 0000 k端口数据寄存器第5号引脚高电平 红灯亮
  48. }
  49. else //否则 即 继电器延时计数变量waittime>1
  50. {
  51. DDRK=0X30; //打开继电器输出两路电源 0X30 十六进制转二进制为 0011 0000 k端口数据方向寄存器4和5号引脚为输出
  52. PORTK=0X10; // 0x10十六进制转二进制为 0001 0000 k端口数据寄存器第4号引脚高电平 绿灯亮
  53. }
  54.  
  55. if(waittime==) // 当继电器延时计数变量waittime=2时
  56. {
  57. waittime=;//重新 赋值 继电器延时计数变量为下次使用
  58. }
  59. }
  60.  
  61. //****************矩阵键盘模块*********//
  62. void juzhengjianpan(void)//无接收值的矩阵
  63. {
  64. DDRH_DDRH0=;//接通行扫描线电源 H端口数据方向寄存器0号引脚为输出
  65. while(PTH_PTH4==)//判断数据寄存器PH4引脚接受到按键按下的低电平信号
  66. //默认输入 若加写DDRA=0;此按键屏蔽
  67. PORTA_BIT7=;//PA7引脚低电平通电
  68. PORTA_BIT7=;//PA7引脚高电平断电
  69. while(PTH_PTH5==)//判断数据寄存器PH5引脚接受到按键按下的低电平信号
  70. //默认输入 若加写DDRA=0;此按键屏蔽
  71. PORTA_BIT6=;//PA6引脚低电平通电
  72. PORTA_BIT6=; //PA6 引脚高电平断电
  73. while(PTH_PTH6==)//判断数据寄存器PH6引脚接受到按键按下的低电平信号
  74. //默认输入 若加写DDRA=0;此按键屏蔽
  75. PORTA_BIT5=; //PA5 引脚低电平通电
  76. PORTA_BIT5=; // PA5 引脚高电平断电
  77. while(PTH_PTH7==)//判断数据寄存器PH7引脚接受到按键按下的低电平信号
  78. //默认输入 若加写DDRA=0;此按键屏蔽
  79. PTM_PTM5=;//PM5 引脚低电平通电
  80. PTM_PTM5=; // PM5 引脚高电平断电
  81. DDRH_DDRH0=;
  82.  
  83. DDRH_DDRH1=;
  84. while(PTH_PTH4==)
  85. PORTA_BIT4=;
  86. PORTA_BIT4=;
  87. while(PTH_PTH5==)
  88. PORTA_BIT3=;
  89. PORTA_BIT3=;
  90. while(PTH_PTH6==)
  91. PORTA_BIT2=;
  92. PORTA_BIT2=;
  93. while(PTH_PTH7==)
  94. PORTA_BIT1=;
  95. PORTA_BIT1=;
  96. DDRH_DDRH1=;
  97.  
  98. DDRH_DDRH2=;
  99. while(PTH_PTH4==)
  100. PTM_PTM7=;
  101. PTM_PTM7=;
  102. while(PTH_PTH5==)
  103. PORTB_BIT2=;
  104. PORTB_BIT2=;
  105. while(PTH_PTH6==)
  106. PORTB_BIT0=;
  107. PORTB_BIT0=;
  108. while(PTH_PTH7==)
  109. PTM_PTM6=;
  110. PTM_PTM6=;
  111. DDRH_DDRH2=;
  112.  
  113. DDRH_DDRH3=;
  114. while(PTH_PTH4==)
  115. PORTK_BIT7=;
  116. PORTK_BIT7=;
  117. while(PTH_PTH5==)
  118. PORTE_BIT2=;
  119. PORTE_BIT2=;
  120. while(PTH_PTH6==)
  121. PORTE_BIT3=;
  122. PORTE_BIT3=;
  123. while(PTH_PTH7==)
  124. PTM_PTM4=;
  125. PTM_PTM4=;
  126. DDRH_DDRH3=;
  127. }
  128.  
  129. //*****************拨码开关模块***********//
  130. void bomakaiguang(void)
  131. {
  132. DDRJ_DDRJ1=; //
  133. DDRJ_DDRJ0=; //
  134. DDRB_BIT1=; //
  135. DDRB_BIT3=; //
  136. /* DDRB_BIT4=0; // 5 //此处拨码暂时无用
  137. DDRB_BIT5=0; // 6
  138. DDRB_BIT6=0; // 7
  139. DDRA_BIT0=0; // 8
  140. */
  141.  
  142. if(PTJ_PTJ1==) //1号开关接通
  143. {
  144. jidianqi_star=;
  145. }
  146. else
  147. {
  148. jidianqi_star=; //定义继电器开关
  149. }
  150.  
  151. if(PTJ_PTJ0==) //2号开关接通
  152. {
  153. juzhengjianpan_star=;
  154. }
  155. else
  156. {
  157. juzhengjianpan_star=; //矩阵键盘开关打开
  158. }
  159.  
  160. if(PORTB_BIT1==) //3号开关接通打开
  161. {
  162. paomadeng_star=;
  163. }
  164. else
  165. {
  166. paomadeng_star=; //跑马灯开关打开
  167. }
  168.  
  169. }
  170.  
  171. //*****************LED初始化*******************//
  172. void LED_init()
  173. {
  174. DDRA=0XFE;//转换为2进制1111 1110 打开7654321
  175. DDRB=0X05; //转换为2进制 0101打开30
  176. DDRE=0X0C; //转换为2进制 1100打开32
  177. DDRK=0X80; //转换为2进制 1000 0000打开7
  178. DDRM=0XF0; //转换为2进制 1111 0000打开7654
  179. PORTA=0XFE; //转换为2进制 1111 1110 打开7654321
  180. PORTB=0X05; //转换为2进制 0101打开30
  181. PORTE=0X0C; //转换为2进制 1100打开32
  182. PORTK=0X80; //转换为2进制 1000 0000打开7
  183. PTM=0XF0; //转换为2进制 1111 0000打开7654
  184. }
  185.  
  186. //*****************LED模块*************//
  187. void paomadeng()
  188. {
  189.  
  190. times++; //时间累加依次按键
  191.  
  192. switch(times)//一对多选择time作为输入 注意!!!!低电平灯亮 高电平灯灭
  193. {
  194. case :PORTA_BIT7=;PORTE_BIT3=;break;//time=1时,按下case 1按键执行PA7低电平灯亮,PE3高电平灯灭 break执行完后跳出
  195. case :PORTA_BIT6=;PORTA_BIT7=;break; // time=2时,按下case 2按键执行PA6低电平灯亮,PA7高电平灯灭
  196. case :PORTA_BIT5=;PORTA_BIT6=;break;
  197. case :PORTA_BIT4=;PORTA_BIT5=;break;
  198. case :PORTA_BIT3=;PORTA_BIT4=;break;
  199. case :PORTA_BIT2=;PORTA_BIT3=;break;
  200. case :PTIM=0X7F;PORTA_BIT2=; break; // 0x7f转换2进制为0111 1111 M端口6543210号高电平,PA2高电平灯灭
  201. case :PORTB_BIT2=;PTM=0XFF; break; // PB2低电平灯亮,0xff转换2进制为1111 1111 M端口76543210号高电平灯灭
  202. case :PORTB_BIT0=;PORTB_BIT2=;break;
  203. case :PORTK_BIT7=;PORTB_BIT0=;break;
  204. case :PORTE_BIT2=;PORTK_BIT7=; break;
  205. case :PORTE_BIT3=;PORTE_BIT2=; break;
  206. case :PTM=0XD0;PORTE_BIT3=; break; // 0xd0 转换2进制为 0110 1000 M端口653号高电平其余为低,PE3高电平灯灭
  207. case :PORTA_BIT1=;PTM=0XFF; break;//PA1低电平灯亮 PTM 0xff 转换2进制为 1111 1111 M端口76543210号高电平
  208. case :PTM=0XB0;PORTA_BIT1=; break;//PTM 0xb0 转换2进制为 1011 0000 M端口754高电平其余为低,PA1高电平
  209. case :PTM=0XE0;PTM=0XFF; break; // 0xe0 转换2进制为 1110 0000 M端口765高电平其余为低,0xff 转换2进制为 1111 1111 M端口76543210高电平
  210. case :PTM=0XFF; break; // 0xff 转换2进制为 1111 1111 M端口76543210高电平
  211. default:break;//跳出按键
  212. }
  213. delay();//调用延时函数传值 500
  214. if(times==)//如果 跑马灯依次按键计数变量time=17
  215. times=;//重新赋值为0 为下次使用
  216.  
  217. }
  218.  
  219. //**************主函数*****************//
  220. void main(void)
  221. {
  222.  
  223. LED_init(); //LED灯初始化
  224. for(;;)
  225. {
  226. bomakaiguang(); //拨码开关
  227. if(jidianqi_star==) //如果继电器通电
  228. {
  229. jidianqi(); //继电器
  230. }
  231.  
  232. if(juzhengjianpan_star==)
  233. {
  234. juzhengjianpan(); //矩阵键盘
  235. }
  236.  
  237. if(paomadeng_star==)
  238. {
  239. paomadeng(); //跑马灯
  240. }
  241. }
  242.  
  243. }

 

第十四届智能车队员培训 I/O的使用 数据方向寄存器和数据寄存器的配置 MC9S12D64处理器的更多相关文章

  1. 第十四届智能车培训 PLL锁相环

    什么是锁相环? PLL(Phase Locked Loop): 为锁相回路或锁相环,用来统一整合时脉讯号,使高频器件正常工作,如内存的存取资料等.PLL用于振荡器中的反馈技术. 许多电子设备要正常工作 ...

  2. HDU 6467 简单数学题 【递推公式 && O(1)优化乘法】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6467 简单数学题 Time Limit: 4000/2000 MS (Java/Others)    M ...

  3. HDU 6464 免费送气球 【权值线段树】(广东工业大学第十四届程序设计竞赛)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6464 免费送气球 Time Limit: 2000/1000 MS (Java/Others)    M ...

  4. HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6470 Count Time Limit: 6000/3000 MS (Java/Others)    ...

  5. HDU 6467.简单数学题-数学题 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    简单数学题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  6. HDU 6464.免费送气球-动态开点-权值线段树(序列中第first小至第second小的数值之和)(感觉就是只有一个状态的主席树) (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    免费送气球 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  7. HDU 6463.超级无敌简单题-卡边界的暴力 (“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛)

    超级无敌简单题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  8. 第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题

    第二十四届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 1.原题呈现 2.试题答案 3.题目解析 因博客园无法打出公式等,所以给你们几个小编推荐的链接去看看,在这里小编深感抱歉! https ...

  9. EOS基础全家桶(十四)智能合约进阶

    简介 通过上一期的学习,大家应该能写一些简单的功能了,但是在实际生产中的功能需求往往要复杂很多,今天我就继续和大家分享下智能合约中的一些高级用法和功能. 使用docker编译 如果你需要使用不同版本的 ...

随机推荐

  1. [转]Javascript中几种较为流行的继承方式

    出处:http://www.jianshu.com/p/a6c005228a75 开篇 从'严格'意义上说,javascript并不是一门真正的面向对象语言.这种说法原因一般都是觉得javascrip ...

  2. Java设计模式之《构建者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6553374.html 构建者模式,又称建造者模式,将一部负责对象的构建分为许多小对象的构建 ...

  3. QT 完美实现圆形按钮

    QT 版本:5.6.0 官方的按钮有些普通,如果我们想要换成自己喜欢的按钮而却无从下手,那么请继续往下阅读(皮一下). 首先,可以在网络上搜索一下自己喜欢的按钮图形(或者可以自行绘制),我以下面的图形 ...

  4. Spring Cloud Config采用数据库存储配置内容

    在之前的<Spring Cloud构建微服务架构:分布式配置中心>一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储.这一设计巧妙的利用Gi ...

  5. TCP三次握手与Tcpdump抓包分析过程

    一.TCP连接建立(三次握手) 过程 客户端A,服务器B,初始序号seq,确认号ack 初始状态:B处于监听状态,A处于打开状态 A -> B : seq = x (A向B发送连接请求报文段,A ...

  6. 第一册:lesson sixty seven。

    原文: The weekend. A:Hello , were you an tht butcher's? B:Yes I was. A:Were you at the butcher's too? ...

  7. C# 插入条码到Excel指定单元格

    .NET中Barcode Library的应用二 介绍 在上一篇中我已经简单介绍了这个函数库(条形码应用之一------------函数库的简介).在这一篇中我将使用这个库提供更多的操作,希望对大家有 ...

  8. Java_冒泡排序_原理及优化

    冒泡排序及其优化 一.原理及优化原理 1.原理讲解 冒泡排序即:第一个数与第二个数进行比较,如果满足条件位置不变,再把第二个数与第三个数进行比较.不满足条件则替换位置,再把第二个数与第三个数进行比较, ...

  9. Eclipse中提示svn: is already locked的解决办法

    eclipse的svn提交不了,报错.提示 svn: is already locked   解决办法:右键项目-------Team------Refresh/Cleanup

  10. 【Mysql】常用命令

    登录mysql -uroot -p 查看有哪些数据库show databases; 创建一个普通用户 sa ,密码是 some_passCREATE USER 'sa'@'%' IDENTIFIED ...