#include "eeprom.h"
#include "timing.h"
const unsigned char s_byte = sizeof(t_byte);
//初始化EEPROM设置引脚
void EE_Init()
{
PeSEL &= ~(eeSCK + eeSI + eeCS + eeSO);
PeSEL2 &= ~(eeSCK + eeSI + eeCS + eeSO);
PeDIR |= eeSCK + eeSI + eeCS;
PeDIR &= ~eeSO;
}
//刷时钟信号一次
void send_SCK()
{
PeOUT &= ~eeSCK; // SCK=0
PeOUT |= eeSCK; // SCK=1
PeOUT &= ~eeSCK; // SCK=0
}
//写字节
void send_SI_byte(unsigned int a)
{
t_byte i,b;
for(i=0;i<8;++i)
{
b=a<<i;
switch(b&0x80){
case 0x80: PeOUT=PeOUT|eeSI; break; // a中第(8-i)位为1,置SI=1.
case 0: PeOUT=PeOUT&(~eeSI); break; // a中第(8-i)位为0,置SI=0.
default:;
}
send_SCK(); // 通过SCK输出一个clock
}
}
//读字节
t_byte read_SO_byte()
{
t_byte i,a=0;
for(i=0;i<8;++i)
{
a=a<<1; // 将a左移一位
if((PeIN&eeSO)==0) a=a&254; // 置a末位为0
else a=a|1; // 置a末位为1
send_SCK(); // 通过SCK输出一个clock
}
return a;
}
//读EEPROM状态
t_byte ReadStatus()
{
t_byte a;
PeOUT=PeOUT&(~eeCS); // CS=0
send_SI_byte(c_RDSR); // 发送读状态命令
a=read_SO_byte(); // 读取状态值
PeOUT=PeOUT|eeCS; // CS=1
return a;
}
//等待直到无写操作进行
void CheckWIP()
{
t_byte k;
while(1){
k=ReadStatus();;
if((k&WIP)==0) break; // 当WIP位为0(不忙时)跳出无限循环
}
}
//允许写操作
void WriteEnable()
{
PeOUT=PeOUT&(~eeCS); // CS=0
send_SI_byte(c_WREN); // 写入写允许命令
PeOUT=PeOUT|eeCS; // CS=1
}
//禁止写操作
void WriteDisable()
{
PeOUT=PeOUT&(~eeCS); // CS=0
send_SI_byte(c_WRDI); // 写入写禁止命令
PeOUT=PeOUT|eeCS; // CS=1
}
//读取指定地址内容
t_byte EE_ReadByte(t_byte address)
{
t_byte a;
CheckWIP(); // 查询状态
PeOUT=PeOUT&(~eeCS); // CS=0
send_SI_byte(c_READ); // 发送读命令
send_SI_byte(address); // 发送读单元地址
a=read_SO_byte(); // 读取指定单元的内容
PeOUT=PeOUT|eeCS; // CS=1
return a;
}
//向指定地址写入数据
void EE_WriteByte(t_byte address,t_byte data)
{
CheckWIP(); // 查询状态
WriteEnable(); // 设置写允许
PeOUT=PeOUT&(~eeCS); // CS=0
send_SI_byte(c_WRITE); // 发送写命令
send_SI_byte(address); // 发送写单元地址
send_SI_byte(data); // 发送写入单元的内容
PeOUT=PeOUT|eeCS; // CS=1
}
//从指定地址开始写入数据数组
void EE_WriteArray(t_byte address,unsigned char* data,t_byte length)
{
t_byte i=0;
for(;i<length;i++)
EE_WriteByte(address+i, *(data+i*s_byte));
}
//从指定地址开始读取数组并存储到data中
void EE_ReadArray(t_byte address,unsigned char* data,t_byte length)
{
t_byte i=0;
for(;i<length;i++)
*(data+i*s_byte) = EE_ReadByte(address+i);
}
//写入状态
void WriteStatus(t_byte data)
{
CheckWIP(); // 查询状态
WriteEnable(); // 设置写允许
PeOUT=PeOUT&(~eeCS); // CS=0
send_SI_byte(c_WRSR); // 写状态寄存器命令
send_SI_byte(data); // 发送要写入的内容
PeOUT=PeOUT|eeCS; // CS=1
}
//保存运行时间、计步器值、秒表值、校验字符
void SaveData()
{
EE_WriteByte(0x80, STdsec);
EE_WriteByte(0x90, STsec);
EE_WriteByte(0x20, sec);
EE_WriteByte(0x21, min);
EE_WriteByte(0x22, hour);
EE_WriteByte(0x30, (steps&0xFF000000)>> 24);
EE_WriteByte(0x31, (steps&0x00FF0000)>> 16);
EE_WriteByte(0x32, (steps&0x0000FF00)>> 8);
EE_WriteByte(0x33, (steps&0x000000FF));
EE_WriteByte(0x10, MTimeSuspFLG);
EE_WriteByte(0x11, STimeSuspFLG);
EE_WriteArray(0xA0, CheckContent,CheckLength);
}
//读取上述数据,校验成功返回0,校验出错返回1
t_byte ReadData()
{
t_byte checkd[CheckLength];
t_byte checkt[CheckLength] = CheckContent;
EE_ReadArray(0xA0, checkd, CheckLength);
t_byte j=0;
for(;j<CheckLength;j++)
if(checkd[j]-checkt[j])
return 1;
STdsec = EE_ReadByte(0x80);
STsec = EE_ReadByte(0x90);
sec = EE_ReadByte(0x20);
min = EE_ReadByte(0x21);
hour = EE_ReadByte(0x22);
steps = (unsigned long)EE_ReadByte(0x30) << 24;
steps += (unsigned long)EE_ReadByte(0x31) << 16;
steps += (unsigned long)EE_ReadByte(0x32) << 8;
steps += (unsigned long)EE_ReadByte(0x33);
MTimeSuspFLG = EE_ReadByte(0x10);
STimeSuspFLG = EE_ReadByte(0x11);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
硬件基础期末大作业-计步器
共12个文件
h:5个
c:5个
gitignore:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 65 浏览量
2023-11-06
19:37:17
上传
评论
收藏 10KB ZIP 举报
温馨提示
<项目介绍> 该资源内项目源码是个人的课程设计作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 -------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
资源推荐
资源详情
资源评论
收起资源包目录
Pedometer-With-MSP430G2553-master.zip (12个子文件)
Pedometer-With-MSP430G2553-master
digitaltube.c 3KB
.gitattributes 378B
digitaltube.h 241B
button.c 4KB
timing.c 2KB
eeprom.h 1KB
timing.h 635B
button.h 417B
eeprom.c 5KB
universal.h 847B
.gitignore 175B
main.c 1KB
共 12 条
- 1
资源评论
机智的程序员zero
- 粉丝: 1951
- 资源: 4199
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 本科毕业设计基于C# wpf人脸识别的考勤系统的设计与实现源码.zip
- 基于Ruoyi+uniapp实现学生考勤系统 学生考勤源码+项目说明.zip
- feae6bc968ca68a099455d8b8a8dea35
- 基于Pytorch训练CIRAR10上分类算法.zip
- Pytorch-pytorch深度学习教程之Tensorboard.zip
- 基于C++和Python开发yolov8-face作为人脸检测器dlib作为人脸识别器的人脸考勤系统源码+项目说明.zip
- Pytorch-pytorch深度学习教程之变分自动编码器.zip
- Pytorch-pytorch深度学习教程之神经风格迁移.zip
- Pytorch-pytorch深度学习教程之深度残差网络.zip
- Pytorch-pytorch深度学习教程之循环神经网络.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功