从代码看,PORTK_PK4和DDRK_DDRK4是两个变量,似乎可以控制CPU的某些功能(这是按代码中的语句猜的)。在你的代码中被#define LEDCPU PORTK_PK4和#define LEDCPU_dir DDRK_DDRK4两句分别定义成了LEDCPU和LEDCPU_dir。就是说你的代码中凡是写LEDCPU和LEDCPU_dir的地方,编译时都会被编译器对应换成PORTK_PK4和DDRK_DDRK4。这叫宏定义,在你这段代码中看不出多大意义,但如果把一个常数宏定义成一个符号,那以后改这个数字就十分方便了……
代码注释如下:
void main(void) {
DisableInterrupts//关闭中断
LEDCPU_dir = 1//给LEDCPU_dir赋值1,实际就是给DDRK_DDRK4赋值1
LEDCPU = 1 //给LEDCPU赋值1,实际就是给PORTK_PK4赋值1
EnableInterrupts//打开中断
for(k=0k<5k++) {
delay()//调用延时程序delay()延时一段时间
LEDCPU = 0//给LEDCPU重新赋值0即给PORTK_PK4赋值0
delay()//再调用延时程序delay()延时一段时间
LEDCPU = 1//给LEDCPU重新赋值1即给PORTK_PK4赋值1
}
for()//无休止循环
}
从代码看可能是一个单片机控制显示之类的程序段。
只是从代码猜到的情况,可能会使你失望……
有一定差别,xs128引脚名称不是p1.1这一类给你个i/o口程序的例子
Void PORTB_Init(void){
DDRB=0xff
//PB口作输出使用,1为输出,0为输入
PORTB=0x00
//PB口数据寄存器值
}
注意:IO口要注意以下几点:(1)每个IO口的数据寄存器名可能不同(2)AN口只能作输入用(3)PH,PJ(高两位,低两位),PP可用输入中断功能使用(4)IO口作输入与输出时有不同的寄存器对应(5)IO口作复用时不能作IO口用,相反也不行
IO口可用作:调试接口(接数码管、液晶、拨码开关等等)所以必须掌握
使用拨码开关要注意这样用
DDRB=0XFF
//输出
PORTB=0XFF
DDRB=0X00
//输入
···············································
xs128单片机和51单片机在格式上有一些差别,功能更为强大,估计你是学生的话就是要参加智能车比赛的,建议买一本专讲xs128嵌入式系统的书,各大文库里也有许多资料,新浪文库、百度文库都有,可以看下。
有相关资料可以参考的,你搜一下flash to epprom相关资料:用Flash模拟EEPROM
本程序利用S08系列单片机的片内Flash模拟EEPROM。解决部分8位机没有EEPROM导致在运用上的局限。本程序提供一个初始化函数和三个功能函数。用户必须在调用功能函数前调用调用初始化函数。三个功能函数分别是字节写入、字节读取、EEPROM全擦除。用户必须保证调用功能函数前有至少30Bate的栈空间。
本程序参考飞思卡尔公司提供的《在 HCS08 微控制器上使用 FLASH 存储器模拟 EEPROM》。并在源程序的基础上精简了部分功能,减少了RAM使用量。并尝试使用分页机制确定EEPROM地址。
接口函数的EEPROM地址寻址由页地址和页内偏移量组成。即把用户定义的EEPROM分为若干个大小为256字节的页。其地址与FLASH地址的换算关系为:
FLASH真实地址=EEPROM空间起始地址+页地址×256+页内偏移地址
用户在使用EEPROM是只用确定数据保存在EEPROM的相对地址即可。接口函数原型为:
EEPROM_WRITE_DATA(数据,页地址, 页内偏移地址)
Char EEPROM_READ_DATA(页地址, 页内偏移地址)
1. 程序流程分析与设计。
由于S08系列单片机在Flash写入时序中不能进行任何的Flash读 *** 作,Flash写入指令必须放到RAM中执行并关闭所有可屏蔽中断。程序流程如图13-1-?。
字节写入/.全擦除程序流程 字节读取程序流程
图13-1-?
2.程序源代码。此程序在CodeWarrior 6.0继承编译环境中编译通过
/*****************************************************/
//河南工业大学Freescale MCU&DSP联合实验室
// 文件名:flash_program.h
// CPU :MC9S08AW60
// 版 本:v1.0
// 日 期:2008年8月12日
// 调试环境:CodeWarrior 6.0
// 作 者:曾 滔
// 描 述: 头文件,用于保存初始化EEPROM设定、用户定制参数、编译器参数等信息。
/*****************************************************/
#include <hidef.h>
#include "derivative.h"
#include <stdio.h>
/*************flash编程指令(请勿改动)*****************/
#define BLACK_CHECK 0x05 //查空指令
#define BITE_PROGRAM 0x20 //字节编程指令
#define BURST_PROGRAM 0x25 //快速编程指令
#define PAGE_ERASE0x40 //页擦除指令(1页=512字节)
#define MASS_ERASE0x41 //全擦除指令
/******用户定制参数(根据单片机型号和用户flash使用情况定制)**********/
#define EEPROM_START_ADDRESS0xE000 //EEPROM区起始地址。512B的倍数
#define EEPROM_PAGE_NUM 8 //EEPROM页数。1page=256B
#define BUS_FREQUENCY 2000 //总线频率。单位(KHz)
/********************编译器相关参数**************************/
#define INT8U unsigned char //无符号字节变量。根据编译器更改。默认CodeWarrior 6.0
#define INT16U unsigned short int //无符号字变量。根据编译器更改。默认CodeWarrior 6.0
/***********EEPROM API函数原型***********/
//初始化程序。此函数必须在使用EEPROM前调用。建议用户在系统初始化是调用。
void INIT_EEPROM(void)
//EEPROM擦除函数。擦除所有EEPROM数据。
void EEPROM_ERASE(void)
//EEPROM字节写入函数。写入一个字节到EEPROM指定区域。
void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)
//EEPROM读出函数。读出一个指定的区域所保存的字节的到函数返回值。
char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address)
/****************************END************************************/
/*****************************************************/
//河南工业大学Freescale MCU&DSP联合实验室
// 文件名:flash_program.c
// C P U :MC9S08AW60
// 版 本:v1.0
// 日 期:2008年8月12日
// 调试环境:CodeWarrior 6.0
// 作 者:曾 滔
// 描 述:提供了一个初始化函数和三个功能函数供用户调用,没有可更改参数。
/*****************************************************/
#include "flash_program.h"
const INT8U FLASH_CODE[]={ // flash *** 作代码
0x45, 0x18, 0x26, // LDHX #$1826 FCMD地址写入H:X
0xA6, 0x00, // LDA #$00 0x00为命令占位符
0xF7, // STA ,X 将命令写入FCMD命令缓存器
0x5A, // DECX 指针指向 FSTAT
0xF6, // LDA ,X
0xAA, 0x80,// ORA #$80
0xF7, // STA ,X 置位FSTAT_FCBEF。启动flash写入命令
0xF6, // LDA ,X 等待3个时钟周期(请勿删除此代码)
0xF6, // LDA ,X 读取FSTAT
0xA5, 0x30, // BIT #$30
0x26, 0x05, // BNE *+6 错误则返回
//LOOP
0xF6, // LDA ,X 等待写 *** 作结束
0xA5, 0x40, // BIT #$40
0x27, 0xFB, // BEQ *-3 跳转到LOOP
//EXIT:
0X81 //RTS 返回
}
/*********************初始化函数**********************************/
#if BUS_FREQUENCY >= 12000
void INIT_EEPROM(void){FCDIV=(((BUS_FREQUENCY/(8*175)))|0x40)-1}
#endif
#if BUS_FREQUENCY <12000
void INIT_EEPROM(void){FCDIV=(BUS_FREQUENCY/175)-1}
#endif
/***********************EEPROM字节写入函数****************************/
void EEPROM_WRITE_DATA(INT8U data,INT8U EEPROM_page,INT8U offset_address)
{
INT16U address //存放写入地址
INT8U code_space[23] //初始化代码空间
if(EEPROM_page>=EEPROM_PAGE_NUM)return //地址错误返回,保护用户代码
address=offset_address+EEPROM_page*256+EEPROM_START_ADDRESS //地址转化
(void)memcpy(code_space,FLASH_CODE,23) //复制flash *** 作代码到RAM
code_space[4] = BITE_PROGRAM//修改命令占位符为写入命令
DisableInterrupts //关中断
if (FSTAT&0x10){ //清错误标志
FSTAT = FSTAT|0x10
}
_asm
{ //写入初始化
LDHX address
LDA data
STA ,X //写入缓存
TSX
JSR 2,x //跳入RAM执行
}
EnableInterrupts //开中断
__RESET_WATCHDOG()
}
/********************EEPROM字读取入函数********************************/
char EEPROM_READ_DATA(INT8U EEPROM_page,INT8U offset_address){
unsigned short int address //地址变量
char rusult //数据变量
address=offset_address+EEPROM_page*0x100+EEPROM_START_ADDRESS//地址转换
asm{
LDHX address
LDA ,X //读取地址到数据变量
STA rusult
}
__RESET_WATCHDOG()
return(rusult) //返回
}
/**********************EEPROM擦除函数********************************/
void EEPROM_ERASE(void)
{
INT16U address
INT8U i //循环变量
INT8U code_space[23]
for(i=0i<(EEPROM_PAGE_NUM/2)i++){ //分页擦除
address=i*0x200+EEPROM_START_ADDRESS
(void)memcpy(code_space,FLASH_CODE,23)//复制flash *** 作代码到RAM
code_space[4] = PAGE_ERASE //修改命令占位符为擦除命令
DisableInterrupts //关中断
if (FSTAT&0x10){ //清错误标志
FSTAT = FSTAT | 0x10
}
_asm
{
LDHX address //擦除地址写入缓存
STA ,X
TSX
JSR 3,x //跳入RAM执行
}
EnableInterrupts //开中断
__RESET_WATCHDOG()
}
}
/****************************END************************************/
/*****************************************************/
// 版权所有(c)河南工业大学
// 文件名:mian.c
// C P U :MC9S08AW60
// 版 本:v1.0
// 日 期:2008年8月12日
// 调试环境:CodeWarrior 6.0
// 作 者:曾 滔
// 描 述: 测试Flash模拟EEPROM程序。
/*****************************************************/
#include <hidef.h>
#include "derivative.h"
#include "flash_program.h"
void main(void){
char temp
PTADD=0XFF
INIT_EEPROM()//初始化Flash控制寄存器。
do{
EEPROM_WRITE_DATA(88,0,0) //写入一个字节。
temp=EEPROM_READ_DATA(0,0) //读取一个字节
}while(temp!=88) //若写入失败则再次写入
PTAD_PTAD0=1
do{
EEPROM_ERASE()
}while(EEPROM_READ_DATA(0,0)!=0xff)//擦除Flash
PTAD_PTAD1=1
for()__RESET_WATCHDOG() //死循环
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)