飞思卡尔8位单片机MC9S0813程序LCD编程C语言程序例
飞思卡尔8位单片机MC9S08第5章 HC08 CPU与汇编基础
5.2 寻址方式
(6)八位偏移量变址方式(IX1,Indexed,8-bit offset addressing mode)
8位偏移量变址是双字节指令,CPU把变址寄存器HX的内容和指令 第二个字节内容相加,其和便是操作数地址。下述指令属于IX1寻址方 式。
5.1 HC08 CPU基本构成
(4)程序计数器PC(Program Counter)
程序计数器PC也是16位的,可寻址范围达64KB。PC存放下一 条指令的地址,在执行转移指令时存放转移地址,在执行中断指令时 存放中断子程序入口地址。复位时,程序计数器PC装入地址$FFFE 和$FFFF中的内容。一般地,地址$FFFE和$FFFF中的内容是复位的 入口地址,这样,复位后,程序能够从复位入口地址开始执行程序。 复位入口地址也称复位向量地址或复位矢量地址(Reset vector address),意味着复位状态过后,PC指向该处,从这里执行程序。
(9)存储器:直接地址—直接地址寻址方式(DD, Direct to direct addressing Mode)
在存储器的四种数据直接传送的寻址方式中,欲传送的数据直接从 源存储单元送向目的存储单元,勿需寄存器中转。在本寻址方式中,源 地址与目标地址由指令直接给出。只有一条指令为DD寻址方式:
CBEQ addr8,X+,rel ;若A=(HX+addr8)则转移,HX+1→HX
(2)立即寻址方式(IMM,Immediate addressing mode)
立即寻址,是在指令中直接给出操作数。这种指令是双字节指令, 第一个字节是操作码,第二个字节是参与操作的立即数。立即寻址指令 通常是对立即数和累加器内容或变址寄存器内进行操作。下述指令属于 IMM寻址方式。
飞思卡尔HC(S)08系列单片机开发及C语言编程简介
1.CodeWarrior中建立新项目运行CodeWarrior(CW)集成开发平台,如图1-1所示在File菜单下点击New,弹出建立新项目的模板对话框,见图1-2。
一般的简便做法是在图1-2对话框左面的选择列表中选择“HC(S)08 New Project Wizard”,然后在右面的项目名“Project Name”输入条中,输入你要建立的新项目名字,再在“Location”一栏中用确定项目存放的文件夹路经,完成后按“OK”进入下一步。
你也可以在图1-2对话框左侧列表中选择“Empty Project”,这样生成的项目不包含任何文件,你必须在CodeWarrior中自己添加所有相关的文件内容。
我想除非有特殊理由,实际项目开发过程中很少采用这种麻烦的方式来建立自己的项目。
接下去是选择项目开发所用的编程语言,见图1-3。
最常用的当然是C语言编程。
有时因具体项目要求,除了C编程外还需要编写独立的汇编语言模块,那就再加选汇编工具(Assembly)。
C++编程在免费版和标准版CW下都不支持,只有在专业版下才可以使用。
编程语言选择完毕后按“Next”。
图1-1图1-2图1-3这时将出现如图1-4的对话框,让你选择项目开发对应的MCU 型号。
在CW5.x 版本下支持几乎所有的HC08和大部分HCS08单片机型号。
在最新的CW6.x 中,增加了飞思卡尔最低端的8位机(RS08系列)和低端32位处理器(Coldfire V1系列)的支持,但HC08系列的有些型号没有被包含在内。
由于HC08为比较老的产品系列,已经不推荐在新项目设计中选用,因此影响不会太大。
对于新用户来说,请尽量直接安装CW6.x 或以后推出的更新版本。
以典型的9S08系列为例,当你选择了一个MCU 型号后,在图1-4右侧会显示出所有针对该型号芯片可用的项目调试场景。
其中:∙ “Full Chip Simulator ”是芯片全功能模拟仿真,即无需任何目标系统的硬件资源,直接在你的PC 机上模拟运行单片机的程序,在模拟运行过程中可以观察调试程序的各项控制和运行流程,分析代码运行的时间,观察各种变量,等等。
1飞思卡尔8位单片机MC9S08JM60开发板实践教程-60页word资料
第一章搭建实验环境1、实验电路板及下载器实物图片2、实验电路图本实验图包含两大部分,分别是CPU.SCH和实验资源.SCH。
CPU采用飞思卡尔8位单片机MC9S08JM60CLD,(电路图介绍)图1-3实验资源部分电路图1-4LCD串口1602液晶电路图1-5RS232接口电路图1-6数码管显示电路图1-7发光管、ad转换以及按键电路图1-83、集成开发软件环境的建立1〉运行文件CW_MCU_V6_3_SE.EXE,在电脑C盘安装飞思卡尔8位(及简化32位)单片机集成开发环境codewarrior6.3版本2〉运行USBDM_4_7_0i_Win,这个程序会在c盘的程序文件夹下增加一个目录C:\Program Files\pgo\USBDM 4.7.0,在这个目录下a>C:\Program Files\pgo\USBDM 4.7.0\FlashImages\JMxx下的文件USBDM_JMxxCLD_V4.sx是下载器的固件文件;b>C:\Program Files\pgo\USBDM4.7.0\USBDM_Drivers\Drivers下有下载器的usb驱动.因此在插入usb下载器,电脑提示发现新的usb硬件的时候,选择手动指定驱动安装位置到以上目录即可。
3〉运行USBDM_4_7_0i_Win之后,还会在目录:C:\Program Files\Freescale\CodeWarrior for Microcontrollers V6.3\prog\gdi下增加一些文件,从修改时间上来看,增加了6个文件,这些文件是为了在codewarrior集成开发环境下对usb下载器的调试、下载的支持。
4、C语言编程基础第二章 LED闪烁程序编写过程1、新建工程运行单片机集成开发环境codewarrior IDE出现如下界面●Create New Project :创建一个新项目工程●Load Example Project :加载一个示例工程●Load Previous Project :加载以前创建过的工程●Run Getting started Tutorial:运行CodeWarrior软件帮助文档●Start Using CodeWarrior:立刻使用CodeWarrior点击Create New project按钮,以创建一个新的工程,出现选择CPU的界面如下,请选择HCS08/HCS08JM Family/MC9S08JM60,在右边的Connection窗口可以选择最后一个开源下载器HCS08 Open Source BDM。
飞思卡尔8位单片机—飞思卡尔8位单片机基础知识
2.2、单片机的命名规则及选择
2.2.1、单片机选型需要关心的事项
供电电压、速度及功耗 管脚数量、并口与串口、功能复用、外扩能力 存储器资源:ROM、RAM、是否分页 外设接口 定时器数量、PWM、捕捉、比较 SPI、IIC、UART、CAN、USB、YITAI 中断源 模拟量处理 特殊接口:VGA、LCD、MOTOR 封装
选型要学会查找资源差异表
Freescale的08系列单片机型号有一百多种。在 这些不同型号的单片机中,资源各不相同,即使 是同一种型号的单片机,也有多种封装形式,其 I/O引脚数目也不相同。如MC68HC908JB8就有 20脚的DIP、28脚的SOIC、44脚的QFP和20脚 的SOIC四种封装形式。
7〉 管脚的复用
注意: 0、管脚功能复用时的优先 级见右表,高优先级接管管 脚时,对低优先级模块会产 生杂乱信号,因此切换前应 先停止不使用的功能。 1、PTA5作为只能输入管脚 而言,输入电压不能超过 VDD。 2、IIC使用的端口可以通过 设置SOPT2 寄存器中的 IICPS位重新定位到PTB6和 PTB7,复位时缺省使用 PTA2 and PTA3。 3、如果ACMP和ADC被同 时使能,管脚PTA0和PTA1 可同时使用。
第二章 飞思卡尔8位单片机基础知识
2.1、飞思卡尔8位单片机系列简介 2.2、飞思卡尔单片机命名规则与单片机选型 2.3、 MC9S08QG8硬件结构
8bit 单片机的Core type
HC08系列、HCS08系列、RS08系列。 HC08是1999年开始推出的产品,种类多,针对不同场合 的应用都可以选到合适的型号。 HCS08是2004年左右推出的8位MCU,资源丰富,功耗 低,性价比高,是08系列单片机的发展趋势。HC08与 HCS08的最大区别是调试方法不同与最高频率的变化 。 RS08是HCS08架构的简化版本,2006年推出,其内核体 积比传统的内核小30%,带有精简指令集,满足用户对 体积更小、更加经济高效的解决方案的需求。RAM及 Flash空间大小差异、封装形式不同、温度范围不同、 频率不同、I/O资源差异等形成了不同型号,为嵌入式 应用产品的开发提供了丰富的选型。
飞思卡尔MC9S08及MC9S12 单片机通过SCI口更新程序的一种方法
通过SCI口单片机通过飞思卡尔MC9S08及MC9S12 单片机更新程序的一种方法王佚(Freescale 8/16bit MCU FAE) 飞思卡尔的8/16 Bit 单片机内置FLASH可以通过单片机编程来进行擦除与编程,所以,理论上就可以通过SCI口接口实现软件的自我升级.在实际工作中,我们也遇到不少客户询问相关的实现方法,而我们也给了一些参考代码,但还是有不少工程师不能很好地理解,基于这些原因,我写了点东西来介绍一种比较简单的实现方法,供大家参考,如有不周,敬请批评与谅解.一,飞思卡尔MC9S08单片机内部存储器介绍MC9S08有很多系列单片机,一般程序空间均在64K以下,为了介绍方便,我们以MC9S08AW60一种为例进行介绍.上图为MC9S08AW60的数据空间分布图,对于大于64K空间的MC9S08单片机,其结构与MC9S12单片机类似,故先不做介绍.从图中我们不难看出,由于飞思卡尔单片机的数据存储器(RAM)与程序存储器(FLASH)是统一编址,所以,我们可以将程序引导到RAM里运行.二,飞思卡尔 8位单片机内部中断相量地址介绍飞思卡尔 8位单片机对中断处理是通过判断中断相量表的地址来判断程序的入口地址的.飞思卡尔 8位单片机的中断相量为16位,其放置在从0xFFFF地址向下按照中断号以此排放.三, 飞思卡尔MC9S08单片机FLASH操作简介飞思卡尔MC908及MC9S08系列单片机的FLASH都可以通过软件进行擦除与编程,不同的是MC908有相应的程序内置在单片机的ROM空间,而MC9S08没有,其需要用户自己编写.飞思卡尔的CodeWarrior for MC9(S)08软件在安装后,在\freescale\CodeWarrior for Microcontrollers V6.0\(CodeWarrior_Examples)\HCS08\Device Initialization C Examples\GB60_Modules\Sources\Flash_GB60目录下有响应的参考代码.MC9S08系列单片机的Flash有四种操作模式:Byte program, Byte program (burst), Page erase及Mass erase,其操作时间见下表.需要说明的是,在此操作其间,不可以使能任何中断.下图为操作流程图.需要说明的是,用来实现”Write a data value to an address in the FLASH array”的语句代码,表面上看是将一个数据写到一个Flash数据区去,但实际上是将所需要编程的Flash地址或是擦除的Flash的块地址及数据分别写入到单片机内类似地址积存器及数据寄存器里.CodeWarrior里自带的代码,是用机器码的方式来做的,其也给出了相应的代码,大家可以对应着看看,一般来说,只做Flash模拟EEPROM,该代码即可满足大家使用.在此,本文就不详细描述代码实现的方法.四,实现程序自我更新的两种常见方法及各自特点一般说来,我们有两种方法来,我们有两种常见方法实现程序自我更新.一种是将实现程序更新的部分的程序与应用程序融合在一起,系统在更新程序时甚至可以将整个程序包括更新程序一起更新掉,其优点是可以花费少的程序空间,缺点是数据及主程序空间分配比较麻烦,且在做更新程序时一旦掉电或是其它什么原因,可能无法进行程序的再次更新.另外一种是,将实现程序更新的程序写成是一个独立的程序,其缺点是要浪费部分程序空间,且中断相量无法更新所以要做程序的映射,类似引导(bootload)的概念.其优点是在编写应用程序时不用考虑数据空间地址分配的问题,同时不用担心下载过程出现任何异常情况.本文后面所涉及的内容,均以第二种方法为例,为描述方便,我们定义其为下载程序.五, 下载程序如何实现中断相量的映射由于我们无法预知究竟系统会用多少中断,所以对于应用程序的中断,都必须在更新程序中做映射,即,我们在单片机的某个程序空间建立一个程序跳转表,更新程序的中断相量表做一个固定的表,对应固定地址,我们只需在固定地址放相应的跳转指令,就可以实现中断相量的映射.例题如下:地址A: JMP 地址B. JMP地址B其实是个引导程序.中断相量<1>: 地址A.其中, “中断相量<1>”地址放的”地址A”由更新程序确定,而”地址A” 地址放的” JMP地址B”,JMP由计算机来添加,”地址B”则由应用程序确定.对于复位中断,其处理方法有点不同,其实现方法如下:中断相量<1>: Main.地址A:JMP 地址B.Main:If (a>b){goto地址B }中断相量表的定义参考方法如下:void (* const _vect[])() @0xFFCC = { /* Interrupt vector table */0xf998, /* Int.no. 25 Vrti (at FFCC) Unassigned */0xf99c, /* Int.no. 24 Viic1 (at FFCE) Unassigned */…_Startup /* Int.no. 0 Vreset (at FFFE) Reset vector */};六,单片机程序注意事项1,程序空间分配下载程序的空间应该从0xfff地址向下排放,具体大小需要根据实际的大小及单片机Flash的Block大小来同时决定.空间的安排,一定是Block的倍数.应用程序的空间是从程序的最低段开始排放,除了中断向量外,不可以有任何代码地址与下载程序重叠.在用CodeWarrior来写程序时,我们可以修改PRM文件来控制程序排放地址.下面是下载程序的PRM参考代码.NAMES ENDSEGMENTSROM = READ_ONLY 0xfA00 TO 0xFFAF;Z_RAM = READ_WRITE 0x0070 TO 0x00FF;RAM = READ_WRITE 0x0200 TO 0x086F;ROM2 = READ_ONLY 0xFFC0 TO 0xFFCB;ENDPLACEMENTDEFAULT_RAM INTO RAM;DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;_DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;ENDSTACKSIZE 0x802,程序代码保护为了使下载程序在任何异常情况下不会被改写,其除了放置引导程序的空间外,均要做代码保护.其在C语言种的参考代码如下.const unsigned char NVPROT_INIT @0x0000FFBD = 0xFA;.3,计算机应用程序如何处理单片机应用程序的中断相量表计算机在应用程序处理该中断相量表时,应根据下载程序的映射关系,将两个字节的相量数据自动计算到对应引导地址,并变为JMP+地址(相量)的模式.下面是参考转变模式.单片机应用程序复位相量为0x8000,其变为跳转后的代码则为0xCC8000.如本文参考代码,其对应引导地址为0xf9fc,则计算机应用程序则应通知下载程序在0Xf9fc后写0XCC8000三个字节数据,运行完成后,反编译的代码如下:F9FC: JMP 0x80003,其它建议为保证应用程序的正确性,可以在下载程序里判断程序的校验码,可以用16位CRC码等.七,S19文件格式简介S-记录实际上是由五个部分组成的字符串的集合。
飞思卡尔8位单片机-第3章 单片机最小系统设计
3.2.1 MC9S08QG8内部时钟源
时钟源模块内部结构
31.25kHz 1分频
2分频 16MHz
8MHz
FLL
内部时钟源工作模式
FEI: FLL engaged internal mode; FEE: FLL engaged external mode; FBI: FLL bypassed internal mode; FBILP: FLL bypassed internal low power mode; FBE: FLL bypassed external mode FBELP: FLL bypassed external low power mode stop:
内部参考时钟ICSIRCLK的使能控制 1-ICSIRCLK允许;0-ICSIRCLK停止
控制当ICS进入停止状态时内部参考时钟是否保持使能. 1-如果IRCLKEN设置或者ICS在进入停止前为FEI,FBI或者FBILP模式时,内部参考时钟 保持使能. 0-ICS进入停止状态时,内部参考时钟也禁止。
(1 MHz to 40 MHz for external clock source) 0 Low frequency range selected for the external oscillator of 32 kHz to 100 kHz
(32 kHz to 1 MHz for external clock source)
extern volatile byte NVICSTRM @0x0000FFAF;
if (NVICSTRM != 0xFF) {
ICSTRM = NVICSTRM; // load trim value if location not blank
飞思卡尔8位单片机MC9S08JM60开发板实践教程
第一章搭建实验环境系统时钟设置#include "App\Include\App.h"#ifndef _MCG_C#define _MCG_C//oscillator 12MHZ 倍频为24MHZ()先8分频后16倍频void S_MCGInit(void){/* the MCG is default set to FEI mode, it should be change to FBE mode*//************************************************************************** ***********MCGC2[7:6] BDIV总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00 编码0 –时钟1分频01 编码1 –时钟2分频(复位后默认)10 编码2 –时钟4分频11 编码3 –时钟8分频[5] RANGE频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1 选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围0 选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围[4] HGO高增益振荡器选择–控制外部振荡器操作模式。
1 配置外部振荡器为高增益运行0 配置外部振荡器为低功耗运行[3] LP低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效1 FLL(或PLL)在忽略模式(低功耗)中为无效的。
0 FLL(或PLL)在忽略模式中为无效的。
[2] EREFS外部参考时钟选择–为外部参考选择时钟源1 选择振荡器0 选择外部时钟源[1] ERCLKEN外部参考时钟使能–使能外部参考时钟作为MCGERCLK1 MCGERCLK激活0 MCGERCLK 无效[0] EREFSTEN外部参考时钟停止使能MCGC2 0b0011 0110 激发外部时钟(晶振)(没有使能)*************************************************************************** ***********/MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLK EN_MASK;while(!MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
飞思卡尔8位单片机MC9S08 10 定时接口模块.ppt
10.4 定时器模块的输出比较功能
(3)T1通道1状态和控制寄存器(Timer1 Channel 1 Status and Control Register,T1SC1)
数据位 定义 复位
10.1 计数器/定时器的基本工作原理
10.1.2 MC68HC908GP32 MCU的定时接口的基本 原理的概述
MC68HC08系列的单片机可以提供多个独立的定时器,例如, MC68HC908GP32芯片有两个定时器,分别叫定时器1、定时器2,它们的 工作原理是一致的,下面的说明均以定时器1为例。
(2)输入捕捉的基本含义
输入捕捉功能是用来监测外部的事件和输入信号。当外部事件发 生或信号发生变化时,在指定的输入捕捉引脚上发生一个指定的沿跳 变(可以指定该跳变是上升沿还是下降沿)。定时器捕捉到特定的沿 跳变后,把计数寄存器当前的值锁存到通道寄存器。
10.3 定时器模块的输入捕捉功能
10.3.2 输入捕捉的寄存器
通道寄存器是一个16位的寄存器,分为高字节和低字节,在读取的 时候要分别读取。为了防止两次读取之间该寄存器的内容发生变化而产 生虚假的输入捕捉计数值,系统会在读取高字节时锁存低字节的内容, 这时即使又发生特定的沿跳变,通道寄存器的内容也不会改变。
所以,若要读取整个通道寄存器,必须先读高字节,再读低字节。
1
111
1
1
1
1
D7 :通道标志位,用来标志定时器1通道0发生了输入捕捉。 D6 :通道中断允许位,用来设置是否允许发生输入捕捉中断。 D5~ D4:模式选择位。每一个定时器都可以工作在输入捕捉,输出比较和 PWM输出模式,这两位用来选择这些工作模式。 D3~D2 :跳变沿/ 输出电平选择位。 D1 :溢出翻转控制标志位,定时器通道用做输入 捕捉时,此位无用。 D0 :通道最大占空比设置位 ,定时器通道用作 输入捕捉时,此位无用。
(整理)飞思卡尔8位单片机MC9S08JM60开发板实践教程
第一章搭建实验环境系统时钟设置#include "App\Include\App.h"#ifndef _MCG_C#define _MCG_C//oscillator 12MHZ 倍频为24MHZ()先8分频后16倍频void S_MCGInit(void){/* the MCG is default set to FEI mode, it should be change to FBE mode*//************************************************************************** ***********MCGC2[7:6] BDIV总线频率分频因子–选择由MCGC1寄存器中CLKS位决定的时钟源的分频。
这控制总线频率。
00 编码0 –时钟1分频01 编码1 –时钟2分频(复位后默认)10 编码2 –时钟4分频11 编码3 –时钟8分频[5] RANGE频率范围选择–选择外部振荡器或者外部时钟源的频率范围。
1 选择1MHz到16MHz外部振荡器的频率范围。
(1MHz到40MHz的外部时钟电源)的高频率范围0 选择32kHz到100kHz外部振荡器的频率范围。
(32kHz到1MHz的外部时钟电源)的低频率范围[4] HGO高增益振荡器选择–控制外部振荡器操作模式。
1 配置外部振荡器为高增益运行0 配置外部振荡器为低功耗运行[3] LP低功耗选择–控制在忽略模式中FLL(或者PLL)是否为无效1 FLL(或PLL)在忽略模式(低功耗)中为无效的。
0 FLL(或PLL)在忽略模式中为无效的。
[2] EREFS外部参考时钟选择–为外部参考选择时钟源1 选择振荡器0 选择外部时钟源[1] ERCLKEN外部参考时钟使能–使能外部参考时钟作为MCGERCLK1 MCGERCLK激活0 MCGERCLK 无效[0] EREFSTEN外部参考时钟停止使能MCGC2 0b0011 0110 激发外部时钟(晶振)(没有使能)*************************************************************************** ***********/MCGC2=MCGC2_RANGE_MASK|MCGC2_HGO_MASK|MCGC2_EREFS_MASK|MCGC2_ERCLK EN_MASK;while(!MCGSC_OSCINIT);//MCGSC寄存器中OSCINIT(第1位)为1,表示由EREFS位选择的晶振被初始化。
飞思卡尔8位单片机MC9S0813LCD与LED编程
③ 16×2(每行16个字符,共 2行)
字符位置 1 2 ...... 8 9 10 ...... 16 第一行地址 00 01 ...... 07 08 09 ...... 0F 第二行地址 40 41 ...... 47 48 49 ...... 4F
④ 16×4(每行 16个字符,共 4行)
(10)写数据到DDRAM或CGRAM(Write Data to DDRAM
or CG RAM)
RS、R/=10,DATA= 实际数据。 该指令根据最近设置的地址,将数据写入 DD
RAM 或CG RAM 中。实际上,数据被直接写入 DR,再由内部操作写入地址指针所指的 DD RAM 或CG RAM 。运行时间 (250KHz):40 μs。
E
DB0~ DB3
DB4~ DB7
E1 ~E2
电平
H/L H/L H/L H→L
方向
引脚含义说明
电源地
电源 (+5V)
液晶驱动电源( 0~5V)
输入
寄存器选择; 1-数据寄存器 0- 数据寄存器
输入
读写操作选择: 1-读操作 0- 写操作
输入
使能信号: 效
R/W
=0 ,E 下降沿有效 ,
R/W=1 ,E=1 有
(3)输入方式设置(Entry Mode Set )
RS、R/=00,DATA=0000 00AS。该指令设置光标、画面的移动方 式。下面解释 A 、S位的含义。 A=1: 数据读写操作后, AC 自动增 1; A=0: 数据读写操作后, AC自动减1。S=1:当数据写入 DD RAM显示将 全部左移( A=1)或全部右移 (A=0),此时光标看上去未动,仅仅是显 示内容移动,但从 DD RAM中读取数据时,显示不移动; S=0:显示不 移动,光标左移(A=1)或右移(A=0)。
飞思卡尔8位单片机MC9S08 15 08系列MCU编程器的开发.ppt
命令
格式
功能
READ $4A $4A 高字节 高字节 低字节 低字节 数据
读出指定单元内容(RAM或Flash)
WRITE IREAD
$49 $49 高字节 高字节 低字节 低字节 数据 数据 $1A $1A 数据 数据
向指定单元写数据(RAM)
读取上次访问的地址+1、+2处的 内容(RAM或Flash)
Start Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 Stop
16.1 编程器技术基础
(2)监控模式的工作过程
MCU在进入监控模式时,需要接收8字节的保密字节,如果是空白 芯片,则8字节的保密字节全是$FF,然后就处于等待接收一个命令字节 状态。以GP32为例,进入监控模式的时序如下图所示。
In PC 主机 Out
串 3 In 行 口 2 Out PC
MAX 7 232 9
8
10
1
3
2 MC
5
74HC125 6
特定I/O
目标 MCU
(a)编程器内部器件连接图
7
10
6
VDD
VDD 5 10KΩ
4
8
9
2
3
MAX 232
1 74HC125
(b)编程器原理图
16.2 HC08系列MCU编程器的实现方法
16.1 编程器技术基础
16.1.3 HC08系列MCU在监控模式下的工作过程
(1)与主机通信的数据格式
当MCU上电复位时,如果满足进入监控模式的条件,MCU就会工作 于监控模式。监控模式下MCU主要是通过某个特定的I/O口(如:GP32是 PTA0,JL3是PTB0),以标准不归零(NRZ)的数据格式进行数据通信, 具体为:第一位起始位(0),随后为8个数据位(低位在前,高位在后),最 后一位为停止位(1)。NRZ的数据格式如下图所示。
飞思卡尔8位单片机MC9S08 06 通用IO与第一个汇编程序
主要内容 MC68HC908GP32的普通I/O 汇编程序编程框架 08汇编语言编译过程所涉及的文件 SD-HC08嵌入式MCU在线编程集成开发系统
6.1 MC68HC908GP32的普通 的普通I/O 的普通
所谓普通I/O,即基本的输入 输出 有时也称为并行I/O。 输出, 所谓普通 ,即基本的输入/输出,有时也称为并行 。作为普 通输入引脚, 内部程序可以读取该引脚, 通输入引脚,MCU内部程序可以读取该引脚,知道该引脚是“1”(高 内部程序可以读取该引脚 知道该引脚是“ ( 电平) ),即开关量输入 电平)或“0”(低电平),即开关量输入。作为普通输出引脚,MCU (低电平),即开关量输入。作为普通输出引脚, 内部程序向该引脚输出“ (高电平) ),即开关量 内部程序向该引脚输出“1”(高电平)或“0”(低电平),即开关量 (低电平), 输出。 单片机有5个普通 输出。MC68HC908GP32单片机有 个普通 口,分别是 口、B口、 单片机有 个普通I/O口 分别是A口 口 C口、D口、E口。它们中的大部分具有双功能,本节仅讨论它们作为 口 口 口 它们中的大部分具有双功能, 普通I/O功能时的编程方法。 普通 功能时的编程方法。 功能时的编程方法
6.1 MC68HC908GP32的普通I/O
6.1.1 A口 口
A口的 根引脚与键盘中断模块的引脚复用,这里只讨论 口作为 口的8根引脚与键盘中断模块的引脚复用 这里只讨论A口作为 口的 根引脚与键盘中断模块的引脚复用, 普通I/O口的功能 口的功能。 普通 口的功能。
(1)A口的寄存器 ) 口的寄存器
6.1 MC68HC908GP32的普通I/O
口数据方向寄存器( C,DDRC) ① C口数据方向寄存器(Data Direction Register C,DDRC) C口数据方向寄存器(DDRC)的地址是:$0006,由于对应引脚只 口数据方向寄存器( 口数据方向寄存器 )的地址是: , 的第6~ 位分别记为 位分别记为DDRC6~DDRC0, 有7根,最高位没有意义。DDRC的第 ~0位分别记为 根 最高位没有意义。 的第 ~ , 这些位分别控制着C口引脚 口引脚PTC6~PTC0是输入还是输出,含义参考 口 是输入还是输出, 这些位分别控制着 口引脚 ~ 是输入还是输出 含义参考A口 说明。复位时DDRC为$00。 说明。复位时 为 。 口数据寄存器( Register,PTC) ② C口数据寄存器(Port C Data Register,PTC) C口数据寄存器(PTC)的地址是:$0002,PTC的第 ~0位分别记 口数据寄存器( 的第6~ 位分别记 口数据寄存器 )的地址是: , 的第 口的相应说明。 为PTC6~PTC0。含义请类比 口、B口的相应说明。 ~ 。含义请类比A口 口的相应说明 口上拉电阻允许寄存器( ③ C口上拉电阻允许寄存器(Port C Input Pullup Enable Register,PTCPUE) Register,PTCPUE) C口上拉电阻允许寄存器(PTCPUE)的地址是:$000E。PTCPUE 口上拉电阻允许寄存器( 口上拉电阻允许寄存器 )的地址是: 。 的第6~ 位分别记为 位分别记为PTCPUE6~PTAPUE0。含义请类比 口的相应说明。 口的相应说明。 的第 ~0位分别记为 ~ 。含义请类比A口的相应说明
(整理)飞思卡尔8位单片机MC9S0813程序LCD编程C语言程序例
(2)主函数
实例编号:C07路径:\C\C07_液晶LCD显示(Lcd.prj)
/*-----------------------------------------------------*
*工程名:Lcd.prj *
*硬件连接: 1.LCD的DB0-7与MCU的B口的PTB0-7连接*
* 2.LCD的RS,R/W,E与MCU的PTC0,PTC1,PTC2连接*
//内部调用子程序
void Lcd_Command(unsigned char cmd); //命令执行子程序
void LcdInit(void); //Lcd初始化子程序
/*LcdShow:在HD44780显示屏上显示数据--------------------*
*功能描述:在HD44780显示屏上显示str中的32个数据*
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[头文件]
#include "GP32C.h" //包含头文件
#define LcdData PTB //Lcd显示数据传送口
#define LcdData_D DDRB //数据口方向寄存器
*参数:cmd:待执行的命令*
*返回:无*
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
{
unsigned char i;
for (i=0;i<20;i++); //等待>40us
void main(void)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
void LcdInit(void)
{
unsigned char i;
LcdData_D=0b11111111; //数据口为输出
Lcd_Command(0b00010100); //光标右移一个字符位,AC自动加1
Lcd_Command(0b00001100); //开显示,关光标显示,不闪烁
}
/*Lcd_Command:执行给定的cmd命令------------------------*
*功 能:执行给定的cmd命令,且延时 *
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b10000000); //后7位为DDRAM地址0x00
LcdCtrl|=1<<LcdRS;//RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
LcdData=cmd;//把指令码送到Lcd数据传送口
LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
asm("NOP");
asm("NOP");
asm("NOP");
LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
for (i=0;i<20;i++); //等待>40us
13.3.2 LCD编程C语言程序例
(1)LCD编程C语言子函数
LCD编程汇编子函数(LcdShow.c)
/*文件描述:本文件包含了用HD44780显示相关的3个子程序 *
* 1. LCDShow:在LCD上显示32个字符 *
* 2. LcdInit:初始化Lcd *
* 3. Lcd_Command:执行给定的cmd命令 *
#define LcdCtrl PTC //Lcd控制信号传送口
#define LcdCtrl_D DDRC //控制口方向寄存器
#define LcdRS 0 //Lcd寄存器选择信号PTC0
#define LcdRW 1 //读写信号接PTC1
#define LcdE 2 //Lcd使能信号接PTC2
//内部调用子程序
void Lcd_Command(unsigned chaInit(void); //Lcd初始化子程序
/*LcdShow:在HD44780显示屏上显示数据--------------------*
*功能描述:在HD44780显示屏上显示str中的32个数据 *
*参 数:str:待显示数组 *
*返 回:无 *
*------------------以上为子程序说明-------------------*/
void lcdshow(unsigned char str[])
{
unsigned char i;
LcdInit(); //调用Lcd初始化子程序
//显示第1行16个字符
for (i=0;i<16;i++) //逐个显示
Lcd_Command(str[i]);
//显示第2行16个字符
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
Lcd_Command(0b11000000); //后7位为DDRAM地址0x40
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[头文件]
#include "GP32C.h" //包含头文件
#define LcdData PTB //Lcd显示数据传送口
#define LcdData_D DDRB //数据口方向寄存器
Lcd_Command(0b00111000); //8位数据接口,2行,5*7点阵
Lcd_Command(0b00001000); //关显示,关光标显示,不闪烁
Lcd_Command(0b00000001); //清屏
for(i=0;i<250;i++); //延时>1.6ms
for(i=0;i<250;i++);
LcdCtrl|=1<<LcdRS;//RS、R/W=10,写数据到DDRAM中
LcdCtrl&=~(1<<LcdRW);
for (i=16;i<32;i++) //逐个显示
Lcd_Command(str[i]);
}
/*LcdInit:初始化Lcd------------------------------------*
*参 数:cmd:待执行的命令 *
*返 回:无 *
*-----------------------------------------------------*/
void Lcd_Command(unsigned char cmd)
{
unsigned char i;
for (i=0;i<20;i++); //等待>40us
LcdCtrl_D|=(1<<LcdE); //控制口低三位为输出
LcdCtrl_D|=(1<<LcdRS);
LcdCtrl_D|=(1<<LcdRW);
LcdCtrl|=(1<<LcdE);//E=1
LcdCtrl&=~(1<<LcdRS); //RS、R/W=00,写指令
LcdCtrl&=~(1<<LcdRW);
* 2.LCD的RS,R/W,E与MCU的PTC0,PTC1,PTC2连接 *
*功能:1.初始显示:"Wait Receiving.." "Soochow 2005.08" *
* 2.等待接收字符,当收到32个字符时显示,重复此功能 *
}
(2)主函数
实例编号:C07 路径:\C\C07_ 液晶LCD显示(Lcd.prj)
/*-----------------------------------------------------*
*工 程 名:Lcd.prj *
*硬件连接: 1.LCD的DB0-7与MCU的B口的PTB0-7连接 *