飞思卡尔单片机编程
飞思卡尔8位单片机MC9S0813程序LCD编程C语言程序例
*参 数:无 *
*返 回:无 *
*-----------------------------------------------------*/
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结束接收数据
飞思卡尔智能车dg128单片机控制程序代码
void AD_Init(void)
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x44; //每次转换8个序列, FIFO, Freeze模式下继续转
ATD0CTL4=0x02; //10位精度, 采样时间为2个AD时钟周期,ATDClock=4MHz
//设置舵机
PWMCTL_CON01=1; //使得通道0,1成为16位pwm
PWMPER0 =0x75;
PWMPER1 =0x30; //舵机的频率是: 24M/8/30000=100Hz,T=10ms
PWMDTY01=4500; // 对应为4500/30000的占空比,待调整
Infrared_detect();
data_handle();
motor_ctl();
steer_ctl();
}
}
void interrupt 26 MDC_ISR(void)
{
static unsigned int number_count=0; static unsigned int start=0; static
go=2;
if(begin>=150)
go=3;
}
}
}
//-----系统初始化-----------------------
void system_init(void) //system initiat
void speed_ctl(void); //速度控制
void motor_ctl(void); //电机控制
void PACBInit(void);
飞思卡尔8位单片机实用教程课程设计
飞思卡尔8位单片机实用教程课程设计一、课程设计概述本次课程设计旨在让学生深入了解飞思卡尔8位单片机的基本原理和使用方法,掌握其应用开发技能,为自主研发嵌入式系统打下基础。
在设计过程中,学生可以自由选择项目主题,包括但不限于:•智能家居控制系统•电子秤设计•数码钟表设计•电子琴•LED矩阵显示屏•红外遥控器除了项目主题选择自由,学生也需要在设计过程中独立完成软硬件开发,并能够撰写设计报告并进行实验现场讲解。
二、课程设计要求1. 硬件要求•飞思卡尔8位单片机开发板•液晶显示屏•七段数码管或LED矩阵显示屏•简易电路板•相关电子元器件:电阻、电容、LED、按键等2. 软件要求学生需要下载并安装相关软件进行开发,包括:•CodeWarrior软件•P&E Micro的USB Multilink接口3. 设计报告要求学生需要撰写完整的课程设计报告,报告内容包括:•选题背景及意义•设计思路及实现步骤•软硬件设计图及接口说明•代码编写及调试过程•实验现场演示三、课程设计流程1. 硬件连接将飞思卡尔8位单片机开发板与液晶显示屏、七段数码管或LED矩阵显示屏、简易电路板以及相应的电子元器件进行连接,并将P&E Micro的USB Multilink接口插入电脑上的USB接口。
2. 编写程序使用CodeWarrior软件编写程序,并进行调试。
需要注意的是,程序中需要包括板子上所有的设备,比如液晶显示屏、七段数码管或LED矩阵显示屏、按键等的驱动程序。
程序编写完成后,可以将程序烧录到单片机中。
3. 实验现场演示学生在课程设计报告演示时,需要准备好实验现场演示。
在演示过程中,需要详细讲解所设计的主题、实现效果以及编写程序的过程等,并针对现场观众的问题进行回答。
学生还需将实验现场演示过程录制下来,并与课程设计报告一起提交。
四、注意事项•编写程序时,需要注意代码规范,确保代码的可读性和维护性。
•在连接硬件时,需仔细核对电路板上的元器件及连接方式,避免出现电路连接错误。
飞思卡尔系列中DZ60单片机SPI应用程序
//接受 1 个 8 字节数据函数
char STAT,CHR; STAT=SPIS; if(STAT&0x10) renturn 0x10; else CHR=SPID; return CHR;
}
/* */
//读 SPIS 状态寄存器 //00100000 进行位与,SPIS_MODF 为 1 说明模式错误 //返回错误信息
//若使 TLE7231G 工作在休眠模式,则 RESET 引脚送
*/
/*
初始化 TLE7231
*/
/*
TLE7231G 输入输出数据协议:
SI--输入寄存器
SI_DATA:BIT7BIT6 BIT5BIT4 BIT3BIT2 BIT1BIT0 //输入数据字节
IN3
IN2
IN1
IN0 -----INn 指第 n 通道的模式
0 1 1--------------------------------4
1 0 0--------------------------------5
1 0 1--------------------------------6
1 1 0--------------------------------7
| | |--------------------------------SPI 发送中断使能
||
0:禁止从 SPTEF 中中断(使用
轮询)
||
1:当 SPTEF 为 1 时,请求硬件
中断
| |-------------------------------------SPI 系统使能
|
0:SPI 系统禁止
0:在等待模式中,SPI 时钟继
飞思卡尔MC9S12单片机实验程序
PORTB=0xff; //led灯全暗
TIOS=0x00; //设置定时器通道0为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x01; //设置自由计数器2分频,且禁止定时器溢出中断
TCTL4=0x02; //捕捉器仅下降沿捕捉
TIE=0x01; //允许定时器通道0的中断
}
}
void main(void) {
DDRB=0xff;
PORTB=0x00;
for(;;)
{
fun();
}
}
SCI
#include <hidef.h>
#include <mc9s12db128.h>
#pragma LINK_INFO DERIVATIVE "mc9s12db128b"
unsigned char pp=0xf0; //欲发送的数字
/*********串口初始化*********/
void init() {
DDRB=0xff;
PORTB=0xff; //开始led灯暗,即数据尚未接收
SCI0BD=52; //初始化波特率为9600
SCI0CR1=0x00; //八位无奇偶校验模式
SCI0CR2=0x2c; //接收中断允许
}
/**************写数据***********/
void interrupt 20 funck() {
unsigned char k;
k=read();
PORTB=~k;
}
SPI
不会,以后补充。
LED
#include <hidef.h> /* common defines and macros */
飞思卡尔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 机上模拟运行单片机的程序,在模拟运行过程中可以观察调试程序的各项控制和运行流程,分析代码运行的时间,观察各种变量,等等。
飞思卡尔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位选择的晶振被初始化。
飞思卡尔单片机编程
关于Codewarrior 中的 .prm 文件网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。
有什么错误请指正。
来源:(/s/blog_60281b700100gbp6.html) - 关于Codewarrior 中的 .prm 文件_LiangXiangTai_新浪博客正文:关于Codewarrior 中的.prm 文件要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于Codewarrior 5.0 编译器,单片机采用MC9S12XS128。
通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于Project Settings->Linker Files文件夹下。
一个标准的基于XS128的.prm文件起始内容如下:.prm文件范例:NAMESENDSEGMENTSRAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;PAGE_F9 = READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;PAGE_FA = READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;PAGE_FB = READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;PAGE_FC = READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;PAGE_FE = READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF;ENDPLACEMENT_PRESTART,STARTUP,ROM_VAR,STRINGS,VIRTUAL_TABLE_SEGMENT,//.ostext,DEFAULT_ROM, NON_BANKED,COPYINTO ROM_C000 ;OTHER_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;//.stackstart,SSTACK,//.stackend,PAGED_RAM,DEFAULT_RAMINTO RAM;DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;CONST_DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;DATA_DISTRIBUTE DISTRIBUTE_INTORAM;//.vectors INTO OSVECTORS;ENDENTRIES//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStartENDSTACKSIZE 0x100VECTOR 0 _Startup//VECTOR 0 Entry//INIT Entry1 .prm 文件组成结构按所含的信息的不同.prm文件有六个组成部分构成,这里仅讨论和内存空间映射关系紧密的三个部分,其他的不做讨论。
飞思卡尔单片机的程序
#include "derivative.h"//-----------------------------------------------------static void SCI_Init(void){SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enableSCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1aSCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)//busclk 8MHz, 9600bps,SCI0BDL=0x34//busclk 8MHz, 9600bps,SCI0BDL=0x68//busclk 24MHz, 9600bps,SCI0BDL=0x9C} //busclk 32MHz, 9600bps,SCI0BDL=0xD0//busclk 40MHz, 9600bps,SCI0BD =0x104//-----------------------------------------------------static void Port_Init(void){DDRA = 0xff; //LCD1100,PA0--4,PA67 D1D2PORTA= 0x00;DDRB = 0xff; //LED PTB0--7,PORTB= 0xff; //LEDs onDDRE = 0xFF; //MOTOR CONTROLPORTE= 0x00; //PDDRH = 0x00; // PORTH inputPTIH = 0X00; // KEY,PH0--5PERH = 0xff; // PORTH pull upPPSH = 0x00; // Port H Polarity Select Register-falling edgePIEH = 0x02; // PORTH interrut disable but 1,DDRJ = 0X01; // PJ0判断行同步脉冲到达//PPSJ = 0x01; // Port J Polarity Select Register-rising EDGEPPSJ = 0x00; // Port J Polarity Select Register-falling EDGEPIEJ = 0X00; // VIDEO SYNC INTERRUPT DISABLED,BUT NOT IN MAIN() PERJ = 0xff;DDRP = 0xff;PERP = 0xff;PTP_PTP0 = 0;}//-----------------------------------------------------static void PWM_Init(void){//SB,B for ch2367//SA,A for ch0145PWMPRCLK = 0X55; //clockA,CLK B 32分频:500khzPWMSCLA = 0x02; //对clock SA 进行2*PWMSCLA=4分频;pwm clock=clockA/4=125KHz;PWMSCLB = 0X02; //clk SB=clk B/(2*pwmsclb)=125KHZ//pwm1PWMCNT1 = 0;PWMCAE_CAE1=0;PWMPOL_PPOL1=0;PWMPER1 =125;PWMDTY1 =100;PWMCLK_PCLK1 = 1;PWME_PWME1 = 0;}void AD_Init(void){A TD0CTL1=0x00; //7:1-外部触发,65:00-8位精度,4:放电,3210:chA TD0CTL2=0x40; //禁止外部触发, 中断禁止A TD0CTL3=0xa0; //右对齐无符号,每次转换4个序列, No FIFO, Freeze模式下继续转A TD0CTL4=0x01; //765:采样时间为4个AD时钟周期,ATDClock=[BusClock*0.5]/[PRS+1]A TD0CTL5=0x30; //6:0特殊通道禁止,5:1连续转换,4:1多通道轮流采样A TD0DIEN=0x00; //禁止数字输入}//-----------------------------------------------------//IOC7/PT7用于计算CS3144产生的脉冲数static void IOC_Init(void){TCTL3=0xc0;//c-输入捕捉7任何沿有效,TCTL4=0xc0;//40表示ICx禁止, 1表示上升沿, 2表示下降沿, 3表示任何沿TIE =0x00;//每一位对应相应通道中断允许,0表示禁止中断TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较TCTL3_EDG7x=1;//c-输入捕捉7任何沿有效,}//产生40ms的定式中断,读取IOC7的计数值static void Timer_Init(void){//TSCR1=0X80;//TIMER INT ENABLED//TSCR1=0x90;//计数器使能TEN|快速清零TFFCATSCR1=0X00; //禁止TIM//TSCR2=0X80;//DIV 1->2.5ms,enable time overflow interrrupt//TSCR2=0X82;//DIV 4->10ms//TSCR2=0X83;//DIV 8->20ms//TSCR2=0X84;//DIV 16->40msTSCR2=0X85;//DIV 32->80ms//TSCR2=0X86;//DIV 64->160ms//TSCR2=0X87;//DIV 128->320ms,enable time overflow interrruptTCNT =0; //PACTL=0X50; //PT7 PIN,PACN32 16BIT,FALLing edge,NOT INTERRUPT //PBCTL=0X40;//PBCN10 16BIT,INT DISABLED//ICPAR=0; //8BIT DISABLED}//-----------------------------------------------------// setup of the RTI interrupt frequencystatic void RTI_Init(void){//RTICTL=0x10; //2^10x40ms=4.96s//RTICTL=0X74; //SET PRESCALER,div rate=(m+1)x2^(n+9),(m=1-7,n=0-15)//tick=16Mhz/((4+1)x2^(7+9))=48.83,(/sec)//16000000/64k=244.140625 ,与晶振频率相关,与分频无关RTICTL=0x77; //8x2^16 =>32,75ms,30.5175Hz//RTICTL=0x7f; //16x2^16 =>,65.536ms,15.26Hz//RTICTL=0x1F; //16x2^10--1ms//CRGINT=0X80; //enable RTI InterruptCRGINT=0X00; //disable RTI Interrupt}static void Time_Start(void){RTI_Init();CRGINT=0X80; //enable RTI Interrupt}//-----------------------------------------------------// PLL初始化子程序BUS Clock=16Mvoid setbusclock(void){CLKSEL=0X00; // disengage PLL to systemPLLCTL_PLLON=1; // turn on PLLSYNR=0x00 | 0x01; // VCOFRQ[7:6];SYNDIV[5:0]// fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)// fPLL= fVCO/(2 × POSTDIV)// fBUS= fPLL/2// VCOCLK Frequency Ranges VCOFRQ[7:6]// 32MHz <= fVCO <= 48MHz 00// 48MHz < fVCO <= 80MHz 01// Reserved 10// 80MHz < fVCO <= 120MHz 11REFDV=0x80 | 0x01; // REFFRQ[7:6];REFDIV[5:0]// fREF=fOSC/(REFDIV + 1)// REFCLK Frequency Ranges REFFRQ[7:6]// 1MHz <= fREF <= 2MHz 00// 2MHz < fREF <= 6MHz 01// 6MHz < fREF <= 12MHz 10// fREF > 12MHz 11// pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz;POSTDIV=0x00; // 4:0, fPLL= fVCO/(2xPOSTDIV)// If POSTDIV = $00 then fPLL is identical to fVCO (divide by one)._asm(nop); // BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;CLKSEL_PLLSEL =1; //engage PLL to system;}//-----------------------------------------------------#pragma CODE_SEG DEFAULTvoid Init_Dev(void){setbusclock();Port_Init();SCI_Init();PWM_Init();AD_Init();Timer_Init();Time_Start();IOC_Init();}//-----------------------------------------------------。
飞思卡尔8位单片机MC9S08第03章 高级语言的串行通信编程
3.4 Visual Basic的串行通信控件MSComm
3.4.3 MSComm控件的主要属性
(1)CommPort属性 (3)PortOpen属性 (5)InputMode属性 (7)OutPut属性 (9)SThreshold属性 (11)DTREnable属性 (13)HandShaking属性 (2)Settings属性 (4)Input属性 (6)InputLen属性 (8)RThreshold 属性 (10)CommEvent属性 (12)RTSEnable属性
3.1 Visual Basic 6.0 编程简介
3.1.2 面向对象的程序设计概念
(1)对象及其相关概念
对象:一个整体看待的数据和代码的集合。 属性:每一个对象所具备的特性。 事件:对象所能识别的动作。 方法:对象所能执行的动作。
(2)面向对象的程序设计
面向对象的程序设计方法与编程技术不同于标准的过程化程序设 计。面向对象程序设计基本上是一种包装代码,代码可以重用而且维 护起来很容易。
3.4 Visual Basic的串行通信控件MSComm
3.4.2 MSComm控件的引用
由于Visual Basic的串行通信控件并不主动出现在工具箱中,当 我们需要MSComm控件时,可把它添加到工具箱中,步骤如下:图 3-5 加载的MSComm控件。 ① 单击【工程】菜单。 ② 在【工程】菜单中选择【部件】命令。 ③ 打开【部件】对话对话框,选中 “Microsoft Comm Control ”复选框。 6.0 6.0” ④ 单击【应用】或【确定】按钮,即可在工具箱中看到 “MSComm控件”图标,如图3-5所示,我们就可以象使用标准控件一 样使用MSComm控件。
3.5.1 实例概述
飞思卡尔8位单片机-第6章- 指令系统与汇编程序设计
存储器 OP
低地址
45 0A
高地址
直接寻址模式 (DIR)
• 地址:指令中给出的8位操作数 地址:指令中给出的 位操作数 • 寻址空间:$0000~$00FF 寻址空间: • 如:LDA $08; ;
A 0A
存储器 OP
低地址
45 0A
08H
高地址
扩展寻址模式 (EXT)
• 地址:指令中给出16位操作数 地址:指令中给出 位操作数 • 大多数扩展寻址指令为 字节 大多数扩展寻址指令为3字节 • 寻址空间:$0000~$FFFF,64KB 寻址空间: , 注意:在某些编译器中,在单字节地址前加符号“<”表示直 接寻址,否则,编译时会在该地址前加上一个$00字节,这样 就成了扩展寻址。例如: LDA <$50 ;属于直接寻址 LDA $50 ;汇编时将自动生成两字节操作数$0050,就成了 扩展寻址 而有的编译器遇到地址高8位为0的情况会自动按直接寻址处 理,不需要直接寻址符号“<”
7 V
二进制补码溢出标志—当发生一个二进制补码溢出, 二进制补码溢出标志 当发生一个二进制补码溢出, 当发生一个二进制补码溢出 CPU置这位为 。符号分支指令 置这位为1。符号分支指令BGT,BGE, BLE 置这位为 , , 将会用到溢出标志位。 和BLT将会用到溢出标志位。 将会用到溢出标志位 0 没有溢出 1 有溢出
(1). 无偏移量变址寻址 无偏移量变址寻址(IX) 地址:变址寄存器 中的值。 地址:变址寄存器(H:X)中的值。 中的值 单字节指令。 单字节指令。
例如: 例如: (H:X)=$0089, ($0089)=$A0 CLR X ;把以变址寄存器(H:X)为地址的存储单元的 把以变址寄存器( : ) 内容清零, 内容清零 即($0089)=$0, (H:X)不变 : )
飞思卡尔单片机各种功能程序
流水灯四种效果:#include <hidef.h> /* common defines and macros */ #include <stdlib.h>#include <mc9s12xdp512.h> /* derivative information */ #pragma LINK_INFO DERIV ATIVE "mc9s12xdp512"#include "main_asm.h" /* interface to the assembly module */ unsigned char temp;//unsigned char pa @0x200;//unsigned char pb @0x202;unsigned char key;static void delay(void) {volatile unsigned long i;for(i=0;i<100000;i++);}static unsigned char random;static void Random(void) {random = (unsigned char)rand();}void effect1() {unsigned char c;for(c=0;c<=6;c++) {delay();PORTB = ~(1<<c);}for(c=7;c>=1;c--) {delay();PORTB = ~(1<<c);}}void effect2() {unsigned char c;for(c=0;c<=6;c++) {delay();PORTB = ~(3<<c);}for(c=7;c>=1;c--) {delay();PORTB = ~(3<<c);}}void effect3() {unsigned char c,t=0xfe;for(c=0;c<=7;c++) {PORTB = t;delay();t<<=1;}}void effect4() {unsigned char c,t=0;for(c=0;c<=7;c++) {PORTB=t;delay();t = (t<<1)+1;;}}void main(void) {unsigned char x;DDRA=0xf0;DDRB=0xff;for(;;) {x=PORTA&0x03;switch(x) {case 0:effect1(); break;case 1:effect2(); break;case 2:effect3(); break;case 3:effect4(); break;}}/* wait forever *//* please make sure that you never leave this function */ }//行列反转法unsigned char key_scan() //键盘扫描函数{ unsigned char x,row=4,col=4,key=16;PUCR|=0x01; //等同于PUCR=PUCR|0x01,PUCR寄存器的第0位设置为1,即允许PORTA端口的上拉电阻。
飞思卡尔8位单片机MC9S0813程序LCD编程C语言程序例
*参数:无*
*返回:无*
*-----------------------------------------------------*/
void LcdInit(void)
{
unsigned char i;
LcdData_D=0b11111111; //数据口为输出
LcdData=cmd;//把指令码送到Lcd数据传送口
LcdCtrl|=(1<<LcdE); //Lcd开始接收数据
asm("NOP");
asm("NOP");
asm("NOP");
LcdCtrl&=~(1<<LcdE); //Lcd结束接收数据
for (i=0;i<20;i++); //等待>40us
#include "GP32C.h" //包含头文件
/*[函数声明]*/
extern void lcdshow(unsigned char *str);
extern void SCIInit(void);
/*[主程序]*/
const unsigned char DispalyInit[]="Wait Receiving.. Soochow 2005.08";
*-------------《嵌入式应用技术基础教程》--------------*/
//[以下为子程序源代码]
//[头文件]
#include "GP32C.h" //包含头文件
#define LcdData PTB //Lcd显示数据传送口
飞思卡尔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口的相应说明
飞思卡尔单片机电子时钟代码(含计算器功能)
unsigned char rc,t;
rc = SCI0SR1; // dummy read to clear flags
rc = SCI0DRL; // data read
/*
if((rc!=0x0d)&&(rc!='='))
{ cmd_buf[pos++]=rc;
//功能:电子时钟+计算器
//知识点1:串口初始化、串口数据收发及数据处理
// 2:定时器如何实现指定的定时时间
// 3:如何实现操作数和操作符的分离及提取
#include <hidef.h>
#include <string.h>
#include <mc9s12xs128.h> /* derivative information */
}
else //如果是操作符
{
pp[j]=cmd_buf[i];
j++;
}
}
for(t=0;t<j;t++)
{
if((pp[t]!='*')&&(pp[t]!='/'))//判断字符是否为乘除
{
res2[k]=op[t]; //把运算符加或减存储到数组res2中
if(pp[t+1]==0)
res2[k+1]=op[t+1];
SCI0DRL=a[i]+'0'; //数字变字符后发送
}
res=res%t; //为下一次循环做准备
飞思卡尔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行)
AC具有自动加 1或自动减1功能。当数据从 DR送到DD RAM(或CG RAM),AC自动加1。当数据从DD RAM(或CG RAM)送到DR,AC自动 减1。当RS=0、R/W=1时,在 E信号高电平的作用下, AC 的内容送到 DB7~DB0。
13.2 点阵字符型LCD的接口特性
(5)显示数据寄存器(DD RAM)
DD RAM用于存储显示数据,共有80个字符码。对于不同的显示行 数及每行字符个数,所使用的地址不同,例如:
① 8×1(8个字符, 1行)
字符位置 1 2 3 4 5 6 7 8 地 址 00 01 02 03 04 05 06 07
② 16×1(16个字符, 1行)
字符位置 1 2 ...... 8 9 10 ...... 16 地 址 00 01 ...... 07 40 41 ...... 47
点阵图形型:除了可显示字符外,还可以显示各种图形信息、汉 字等,显示自由度大。
13.1 LCD概述
(3)按LCD的采光方式分类
带背光源:在弱光或黑暗条件下使用 不带背光源:靠背面的反射膜将射入的自然光从下面反射出来完 成的 。例如,计数、计时、仪表、计算器等计量显示部件都可以选择 使用不带背光的LCD器件 。
13.2 点阵字符型LCD的接口特性
(1)指令寄存器(IR)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于Codewarrior 中的 .prm 文件网上广泛流传的一篇文章讲述的是8位飞思卡尔单片机的内存映射,这几天,研究了一下Codewarrior 5.0 prm文件,基于16位单片机MC9S12XS128,一点心得,和大家分享。
有什么错误请指正。
正文:关于Codewarrior 中的.prm 文件要讨论单片机的地址映射,就必须要接触.prm文件,本篇的讨论基于Codewarrior 5.0 编译器,单片机采用MC9S12XS128。
通过项目模板建立的新项目中都有一个名字为“project.prm”的文件,位于Project Settings->Linker Files文件夹下。
一个标准的基于XS128的.prm文件起始内容如下:.prm文件范例:NAMESENDSEGMENTSRAM =READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;ROM_C000 =READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;EEPROM_00 =READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;EEPROM_01 =READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;EEPROM_02 =READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;EEPROM_03 =READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;EEPROM_04 =READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;EEPROM_05 =READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;EEPROM_06 =READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;EEPROM_07 =READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;PAGE_F8 =READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;PAGE_FA =READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;PAGE_FB =READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;PAGE_FC =READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;PAGE_FE =READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF; ENDPLACEMENT_PRESTART,STARTUP,ROM_VAR,STRINGS,VIRTUAL_TABLE_SEGMENT,//.ostext,DEFAULT_ROM, NON_BANKED,COPYINTO ROM_C000 ;OTHER_ROM INTO PAGE_FE, PAGE_FC, PAGE_FB, PAGE_FA, PAGE_F9, PAGE_F8;//.stackstart,SSTACK,//.stackend,PAGED_RAM,DEFAULT_RAMINTO RAM;DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB,PAGE_FA, PAGE_F9, PAGE_F8;CONST_DISTRIBUTE DISTRIBUTE_INTOROM_4000, PAGE_FE, PAGE_FC, PAGE_FB,PAGE_FA, PAGE_F9, PAGE_F8;DATA_DISTRIBUTE DISTRIBUTE_INTORAM;//.vectors INTO OSVECTORS;ENDENTRIES//_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStartENDSTACKSIZE 0x100VECTOR 0 _Startup//VECTOR 0 Entry//INIT Entry1 .prm文件组成结构按所含的信息的不同.prm文件有六个组成部分构成,这里仅讨论和内存空间映射关系紧密的三个部分,其他的不做讨论。
·SEGMENTS… END定义和划分芯片所有可用的内存资源,包括程序空间和数据空间。
一般我们将程序空间定义成ROM,把数据空间定义成RAM,但这些名字都不是系统保留的关键词,可以由用户随意修改。
用户也可以把内存空间按地址和属性随意分割成大小不同的块,每块可以自由命名。
例如同样是RAM,可以使用不同的属性,使其有复位后变量清零和不清零之分。
关于内存划分的具体方法在后面详解。
·PLACEMENT… END将指派源程序中所定义的各种段,如数据段DATA_SEG、CONST_SEG和代码段CODE_SEG 被具体放置到哪一个内存块中。
它是将源程序中的定义描述和实际物理内存挂钩的桥梁。
·STACKSIZE定义系统堆栈长度,其后给出的长度字节数可以根据实际应用需要进行修改。
堆栈的实际定位取决于RAM内存的划分和使用情况。
默认的情况下,堆栈放在RAM区域的起始部分。
当然,堆栈的定义不只有这种方式,还可以使用STACKTOP关键字。
后面将详细讨论。
2内存划分的具体方式由SEGMENTS开始到END为止,中间可以添加任意多行内存划分的定义,每一行用分号结尾。
定义行的语法型式为:[块名] = [属性1] [属性2] ,… ,[属性n] [起始地址] TO [结束地址];其中,· “块名”的定义和C语言变量定义相同,是以英文字母开头的一个字符串,用户可以自己任意定义块名。
· “属性”用户是不能自己定义的,因为属性名指定了上面所说的“块名”所对应的不同的内存类型和访问方式,而不同物理内存的类型和访问方式是一定的。
对于“属性1”,Codewarrior 5.0中可以有三种不同的类型,对于只读的Flash-ROM 区属性一定是READ_ONLY,对于可读写的RAM区属性可以是READ_WRITE,也可以是NO_INIT。
它们两者的关键区别是ANSI-C的初始化代码会把定位在READ_WRITE块中的所有全局和静态变量自动清零,而NO_INIT块中的变量将不会被自动清零。
当然只是复位时不清零,掉电时还是清零的,但是对于单片机系统,变量在复位时不被自动清零这一特性有时是很关键的,在某些应用中有特殊的用途。
对于“属性2 …属性n”,根据上面给出的.prm的范例文件可以看出来,可能的形式有“DATA_FAR”、“DATA_NEAR”、“IBCC_FAR”、“IBCC_NEAR”四种类型。
其中,“DATA_FAR”和“DATA_NEAR”相对应,当内存区域包含变量或者是常量时(通常是RAM、Flash和EEPROM),必须指明上面两种属性中的一种,由于涉及到内存的分页,可以这样理解:“DATA_FAR”属性指定的内存块为可以保存数据的非固定页,而“DATA_NEAR”属性指定的内存块为可以保存数据的固定页;同理“IBCC_FAR”和“IBCC_NEAR”相对应,当内存区域包含代码时(Flash 和EEPROM),必须指明上面两种属性中的一种,“IBCC_FAR”属性指定的内存块为可以保存代码的非固定页,而“IBCC_NEAR”属性指定的内存块为可以保存代码的固定页讨论到这里,细心的读者已经发现,在上面的.prm文件范例中,RAM的属性有“DATA_FAR”和“DATA_NEAR”两种,Flash的属性中也是四种都有,但是EEPROM中却只有“DATA_FAR”和“IBCC_FAR”两种,这正好验证了上一篇文章(飞思卡尔16位单片机的资源配置)中所提到的,RAM、Flash中都有固定页,但是EEPROM中全部是非固定页。
·起始地址和结束地址决定了一内存块的物理位置,对于固定页,用4位16进制数表示,而对于非固定页,则用6位16进制表示,多出来的两位其实是寄存器EPAGE、RPAGE或PPAGE的值,可见,对于分页的资源,是通过寄存器(EPAGE、RPAGE或PPAGE)和16位的地址总线的组合来进行寻址的。
“TO”是系统保留的关键字,必须大写。
下面,根据上面范例提供的内容,举几个例子:例1RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;上面这句话的意思是:分配0x2000-0x3FFF的区域的块名为“RAM”(当然可以定义别的名称),由上一篇文章而知,这一区域的物理内存的性质为RAM,属性应该为“READ_WRITE”,并且这一区域中的两页都为固定页,所以为“DATA_NEAR”。
例2将8K字节RAM的后面4K字节定义成非自动清零的数据保留区,则应如下定义:SEGMENTS……RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x2FFF;RAM_NO_INIT = NO_INIT DATA_NEAR 0x3000 TO 0x3FFF;……END注意,各部分RAM的分配地址不应该存在重叠的部分,否则会发生错误。
例3EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO0x000BFF;XS128单片机中的EEPROM由Data-Flash模拟,所以属性为READ_ONLY。
EEPROM全部为非固定页,所以用“DATA_FAR”、“IBCC_FAR”。
后面的起始地址和结束地址分别为6位的16进制数,前两位的“00”实质指的是EEPROM分页寄存器EPAGE的值为0x00。
用SEGMENTS只是从单片机的物理内存这一角度对其进行空间划分。
源程序本身并不知道物理内存被分割和属性定义的这些细节。
它们两者之间必须通过下面的PLACEMENT建立联系。
3程序段和数据段的放置PLACEMENT-END内所描述的信息是告诉连接器源程序中所定义的各类段应该被具体放置到哪一个内存块中去。