首次提交
This commit is contained in:
parent
916d30fdb2
commit
ff51e47fdb
18
.clang-format
Normal file
18
.clang-format
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
BasedOnStyle: Google
|
||||||
|
|
||||||
|
AlignConsecutiveMacros: AcrossEmptyLines
|
||||||
|
AlignConsecutiveAssignments: AcrossEmptyLines
|
||||||
|
AlignConsecutiveBitFields: Consecutive
|
||||||
|
AlignConsecutiveDeclarations: Consecutive
|
||||||
|
AlignEscapedNewlines: Right
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
|
PointerAlignment: Right
|
||||||
|
ColumnLimit: 120
|
||||||
|
IndentExternBlock: Indent
|
||||||
|
IndentPPDirectives: BeforeHash
|
||||||
|
NamespaceIndentation: All
|
||||||
|
TabWidth: 2
|
||||||
|
...
|
57
App/BLTouch.c
Normal file
57
App/BLTouch.c
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* BLTouch.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月17日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BLTouch.h"
|
||||||
|
|
||||||
|
#include "PCA.h"
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
// 初始化配置PCA, 使用PCA0, 即使用P11输出PWM波形
|
||||||
|
static void PCA_config(void) {
|
||||||
|
PCA_InitTypeDef PCA_InitStructure;
|
||||||
|
|
||||||
|
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; // 脉冲输出模式
|
||||||
|
PCA_InitStructure.PCA_PWM_Wide = 0; // 该模式下无意义, 硬件PWM使用
|
||||||
|
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; // 允许PCA中断, 在中断函数中重装比较值
|
||||||
|
PCA_InitStructure.PCA_Value = 0xFFFF; // 初始化比较值为最大
|
||||||
|
PCA_Init(PCA0, &PCA_InitStructure);
|
||||||
|
|
||||||
|
PCA_InitStructure.PCA_Clock = PCA_Clock_8T; // PCA时钟为系统8分频, 即20MHz/8=2.5MHz => 0.4us
|
||||||
|
PCA_InitStructure.PCA_IoUse = PCA_P12_P11_P10_P37; // PCA端口映射
|
||||||
|
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; // 允许PCA中断, 在中断函数中重装比较值
|
||||||
|
PCA_InitStructure.PCA_Polity = PolityHigh; // 优先级
|
||||||
|
PCA_InitStructure.PCA_RUN = ENABLE; // 启动计数
|
||||||
|
PCA_Init(PCA_Counter, &PCA_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BLTouch_Delay() {
|
||||||
|
delay_ms(200);
|
||||||
|
delay_ms(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLTouch_Init() {
|
||||||
|
PCA_config();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLTouch_Reset() {
|
||||||
|
PWMn_Update(PCA0, BLTOUCH_RESET);
|
||||||
|
BLTouch_Delay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLTouch_Test() {
|
||||||
|
PWMn_Update(PCA0, BLTOUCH_SELF_TEST);
|
||||||
|
BLTouch_Delay();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLTouch_Set(u8 upOrDown) {
|
||||||
|
if (upOrDown) {
|
||||||
|
PWMn_Update(PCA0, BLTOUCH_UP);
|
||||||
|
} else {
|
||||||
|
PWMn_Update(PCA0, BLTOUCH_DOWN);
|
||||||
|
}
|
||||||
|
BLTouch_Delay();
|
||||||
|
}
|
23
App/BLTouch.h
Normal file
23
App/BLTouch.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* BLTouch.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月17日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
// 20MHz主频,PCA时钟8分频
|
||||||
|
|
||||||
|
#define BLTOUCH_DUTY 50000 // * 0.4 = 20us
|
||||||
|
|
||||||
|
#define BLTOUCH_DOWN 1625 // * 0.4 = 650us
|
||||||
|
#define BLTOUCH_UP 3700 // * 0.4 = 1480us
|
||||||
|
#define BLTOUCH_RESET 5500 // * 0.4 = 2200us
|
||||||
|
#define BLTOUCH_TEST 2950 // * 0.4 = 1180us
|
||||||
|
#define BLTOUCH_SELF_TEST 4500 // * 0.4 = 1800us
|
||||||
|
|
||||||
|
void BLTouch_Init();
|
||||||
|
void BLTouch_Reset();
|
||||||
|
void BLTouch_Test();
|
||||||
|
void BLTouch_Set(u8 upOrDown);
|
302
App/Core.c
Normal file
302
App/Core.c
Normal file
@ -0,0 +1,302 @@
|
|||||||
|
/*
|
||||||
|
* Core.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月17日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Core.h"
|
||||||
|
|
||||||
|
#include "BLTouch.h"
|
||||||
|
#include "EndStop.h"
|
||||||
|
#include "GPIO.h"
|
||||||
|
#include "Key.h"
|
||||||
|
#include "Stepper.h"
|
||||||
|
#include "TM1650.h"
|
||||||
|
#include "delay.h"
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
static void runIdle(); // 空闲状态
|
||||||
|
static void runHome(); // 执行回零
|
||||||
|
static void runTest(); // 运行测试
|
||||||
|
static void error(u8); // 报警提示
|
||||||
|
|
||||||
|
u8 runMode = MODE_IDLE;
|
||||||
|
u8 runState = STATE_INIT;
|
||||||
|
u8 errorCode = ERROR_NONE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* P30 准双向 RXD
|
||||||
|
* P31 准双向 TXD
|
||||||
|
* P32 准双向 BLTouch零位输入
|
||||||
|
* P33 准双向 机械零位输入
|
||||||
|
* P36 高阻输入 按键
|
||||||
|
* P37 高阻输入 按键
|
||||||
|
* P10 准双向 悬空
|
||||||
|
* P11 推挽 BLTouch信号输出 PWM
|
||||||
|
* P12 推挽 电机方向信号 DIR
|
||||||
|
* P13 推挽 电机步进信号 STEP
|
||||||
|
* P14 推挽 电机使能信号 EN
|
||||||
|
* P15 准双向 SCL
|
||||||
|
* P54 准双向 SDA
|
||||||
|
* P55 准双向 悬空
|
||||||
|
*/
|
||||||
|
static void GPIO_config(void) {
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
|
// 准双向
|
||||||
|
GPIO_InitStructure.Mode = GPIO_PullUp;
|
||||||
|
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
|
||||||
|
GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);
|
||||||
|
GPIO_InitStructure.Pin = GPIO_Pin_5;
|
||||||
|
GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);
|
||||||
|
GPIO_InitStructure.Pin = GPIO_Pin_4;
|
||||||
|
GPIO_Inilize(GPIO_P5, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
// 高阻输入
|
||||||
|
GPIO_InitStructure.Mode = GPIO_HighZ;
|
||||||
|
GPIO_InitStructure.Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
||||||
|
GPIO_Inilize(GPIO_P3, &GPIO_InitStructure);
|
||||||
|
|
||||||
|
// 推挽输出
|
||||||
|
GPIO_InitStructure.Mode = GPIO_OUT_PP;
|
||||||
|
GPIO_InitStructure.Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
|
||||||
|
GPIO_Inilize(GPIO_P1, &GPIO_InitStructure);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init() {
|
||||||
|
GPIO_config(); // 初始化IO口
|
||||||
|
EndStop_Init(); // 初始化零位中断
|
||||||
|
Stepper_Init(); // 初始化电机定时器
|
||||||
|
BLTouch_Init(); // 初始化BLTouch的PWM发生器
|
||||||
|
KEY_Init(); // 初始化按键
|
||||||
|
EA = 1; // 开启全局中断
|
||||||
|
|
||||||
|
// 复位BLTouch
|
||||||
|
BLTouch_Reset();
|
||||||
|
|
||||||
|
// 复位数码管
|
||||||
|
TM1650.Init();
|
||||||
|
TM1650.Display_IDLE(&IIC);
|
||||||
|
|
||||||
|
// 上电自动回零
|
||||||
|
changeMode(MODE_HOME);
|
||||||
|
}
|
||||||
|
|
||||||
|
void core() {
|
||||||
|
switch (runMode) {
|
||||||
|
case MODE_IDLE: runIdle(); break;
|
||||||
|
case MODE_HOME: runHome(); break;
|
||||||
|
case MODE_TEST: runTest(); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用电机
|
||||||
|
*/
|
||||||
|
static void runIdle() {
|
||||||
|
switch (runState) {
|
||||||
|
case STATE_INIT:
|
||||||
|
STOP_STEPPER; // 禁用电机中断
|
||||||
|
BLTouch_Reset(); // BLTouch复位
|
||||||
|
BLTouch_Set(UP); // BLTouch收回探针
|
||||||
|
TM1650.Display_IDLE(&IIC); // 显示----
|
||||||
|
runState = STATE_DONE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_IDLE_SHOW:
|
||||||
|
TM1650.Display_Num(&IIC, Stepper_GetPos()); // 显示数字
|
||||||
|
runState = STATE_DONE;
|
||||||
|
break;
|
||||||
|
case STATE_ERROR:
|
||||||
|
STOP_STEPPER; // 禁用电机中断
|
||||||
|
Stepper_SetEnable(DISABLE); // 失能电机
|
||||||
|
TM1650.Display_Err(&IIC, errorCode); // 显示错误
|
||||||
|
runState = STATE_DONE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_DONE:
|
||||||
|
if (BLTOUCH_TRIGGER && (errorCode != ERROR_BLTOUCH)) {
|
||||||
|
error(ERROR_BLTOUCH);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (KEY_isTrigger(KEY_CODE_HOME)) {
|
||||||
|
changeMode(MODE_HOME);
|
||||||
|
TM1650.Display_Fun(&IIC, FUN_HOME);
|
||||||
|
} else if (KEY_isTrigger(KEY_CODE_TEST)) {
|
||||||
|
changeMode(MODE_TEST);
|
||||||
|
TM1650.Display_Fun(&IIC, FUN_TEST);
|
||||||
|
} else if (KEY_isTrigger(KEY_CODE_IDLE)) {
|
||||||
|
Stepper_SetEnable(DISABLE); // 失能电机
|
||||||
|
TM1650.Display_OFF(&IIC);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. BLTouch置位
|
||||||
|
* 2. 电机回零
|
||||||
|
* 3. 数码管显示
|
||||||
|
*/
|
||||||
|
static void runHome() {
|
||||||
|
switch (runState) {
|
||||||
|
case STATE_INIT:
|
||||||
|
STOP_STEPPER;
|
||||||
|
BLTouch_Reset(); // BLTouch复位
|
||||||
|
BLTouch_Set(UP); // BLTouch收回探针
|
||||||
|
Stepper_SetEnable(ENABLE); // 使能电机
|
||||||
|
changeState(STATE_HOME_FIRST_INIT); // 切换状态
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_FIRST_INIT: // 首次回零
|
||||||
|
Stepper_SetHz(STEPPER_FAST_HZ);
|
||||||
|
if (ENDSTOP_NORMAL) // 正常状态
|
||||||
|
{
|
||||||
|
Stepper_SetDir(DOWN);
|
||||||
|
Stepper_SetPos(HOME_PRESET_POS);
|
||||||
|
changeState(STATE_HOME_FIRST_WAIT);
|
||||||
|
} else // 回零时零位已经触发
|
||||||
|
{
|
||||||
|
Stepper_SetDir(UP);
|
||||||
|
Stepper_SetPos(0);
|
||||||
|
changeState(STATE_HOME_LEAVE_WAIT);
|
||||||
|
}
|
||||||
|
RUN_STEPPER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_LEAVE_INIT: // 离开一点
|
||||||
|
Stepper_SetHz(STEPPER_FAST_HZ);
|
||||||
|
Stepper_SetDir(UP);
|
||||||
|
Stepper_SetPos(0);
|
||||||
|
changeState(STATE_HOME_LEAVE_WAIT);
|
||||||
|
RUN_STEPPER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_AGAIN_INIT: // 再次回零
|
||||||
|
Stepper_SetHz(STEPPER_SLOW_HZ);
|
||||||
|
Stepper_SetDir(DOWN);
|
||||||
|
Stepper_SetPos(HOME_LEAVE_POS * 2);
|
||||||
|
changeState(STATE_HOME_AGAIN_WAIT);
|
||||||
|
RUN_STEPPER;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_FIRST_WAIT: // 等待首次回零
|
||||||
|
// 当前坐标已经过零
|
||||||
|
if (Stepper_ComparePos(HOME_PRESET_POS)) {
|
||||||
|
error(ERROR_HOME_FIRST);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_LEAVE_WAIT: // 等待离开
|
||||||
|
// 当前坐标已经完成
|
||||||
|
if (Stepper_ComparePos(HOME_LEAVE_POS)) {
|
||||||
|
if (ENDSTOP_TRIGGER) {
|
||||||
|
error(ERROR_HOME_LEAVE);
|
||||||
|
} else {
|
||||||
|
STOP_STEPPER;
|
||||||
|
changeState(STATE_HOME_AGAIN_INIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_AGAIN_WAIT: // 等待再次回零
|
||||||
|
// 当前坐标已经过零
|
||||||
|
if (Stepper_ComparePos(HOME_LEAVE_POS * 2)) {
|
||||||
|
error(ERROR_HOME_AGAIN);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_DONE:
|
||||||
|
Stepper_SetPos(0);
|
||||||
|
changeMode(MODE_IDLE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. 电机上升
|
||||||
|
* 2. BLTouch触发检测
|
||||||
|
* 3. 数码管显示
|
||||||
|
*/
|
||||||
|
static void runTest() {
|
||||||
|
switch (runState) {
|
||||||
|
case STATE_INIT:
|
||||||
|
BLTouch_Reset(); // BLTouch复位
|
||||||
|
BLTouch_Set(UP); // BLTouch收回探针
|
||||||
|
delay_ms(250);
|
||||||
|
delay_ms(250);
|
||||||
|
if (BLTOUCH_TRIGGER) { // BLTouch异常
|
||||||
|
error(ERROR_BLTOUCH);
|
||||||
|
} else if (!Stepper_IsEnable()) { // 电机已经解锁
|
||||||
|
error(ERROR_TEST_INIT);
|
||||||
|
} else {
|
||||||
|
changeState(STATE_TEST_INIT); // 准备测试
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_TEST_INIT:
|
||||||
|
Stepper_SetHz(STEPPER_FAST_HZ);
|
||||||
|
if (Stepper_ComparePos(TEST_INIT_POS)) { // 当当前位置高于测试初始位置
|
||||||
|
Stepper_SetDir(DOWN);
|
||||||
|
changeState(STATE_TEST_FAST_DOWN_WAIT);
|
||||||
|
} else { // 当前位置低于测试初始位置
|
||||||
|
BLTouch_Set(DOWN);
|
||||||
|
Stepper_SetDir(UP);
|
||||||
|
changeState(STATE_TEST_FAST_UP_WAIT);
|
||||||
|
}
|
||||||
|
RUN_STEPPER;
|
||||||
|
break;
|
||||||
|
case STATE_TEST_FAST_DOWN_WAIT:
|
||||||
|
if (!Stepper_ComparePos(TEST_INIT_POS)) { // 已经降低到测试位置
|
||||||
|
STOP_STEPPER;
|
||||||
|
BLTouch_Set(DOWN); // BLTouch放下探针
|
||||||
|
Stepper_SetHz(STEPPER_SLOW_HZ); // 调整到测试速度
|
||||||
|
Stepper_SetDir(UP); // 上升去测试
|
||||||
|
changeState(STATE_TEST_SLOW_WAIT); // 等待测试
|
||||||
|
RUN_STEPPER;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_TEST_FAST_UP_WAIT:
|
||||||
|
if (Stepper_ComparePos(TEST_INIT_POS)) { // 已经上升到测试位置
|
||||||
|
Stepper_SetHz(STEPPER_SLOW_HZ); // 调整到测试速度
|
||||||
|
changeState(STATE_TEST_SLOW_WAIT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_TEST_SLOW_WAIT:
|
||||||
|
if (Stepper_ComparePos(TEST_MAX_POS)) {
|
||||||
|
error(ERROR_TEST_MAX);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case STATE_DONE:
|
||||||
|
BLTouch_Set(UP);
|
||||||
|
changeMode(MODE_IDLE); // 切换空闲模式
|
||||||
|
changeState(STATE_IDLE_SHOW); // 切换到显示状态
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 回零距离过长报警
|
||||||
|
* BLTouch异常报警
|
||||||
|
*/
|
||||||
|
static void error(u8 errorNum) {
|
||||||
|
changeMode(MODE_IDLE); // 切换空闲模式
|
||||||
|
changeState(STATE_ERROR); // 切换错误状态
|
||||||
|
errorCode = errorNum; // 设置错误代码
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeMode(u8 mode) {
|
||||||
|
runMode = mode;
|
||||||
|
runState = STATE_INIT;
|
||||||
|
errorCode = ERROR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeState(u8 state) {
|
||||||
|
runState = state;
|
||||||
|
}
|
58
App/Core.h
Normal file
58
App/Core.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Core.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月17日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
/****************** 任务模式和任务状态 *******************/
|
||||||
|
#define MODE_IDLE 0 // 空闲模式
|
||||||
|
#define MODE_HOME 1 // 回零模式
|
||||||
|
#define MODE_TEST 2 // 测试模式
|
||||||
|
|
||||||
|
#define STATE_INIT 0x00 // 任务开始
|
||||||
|
#define STATE_ERROR 0xFE // 状态异常
|
||||||
|
#define STATE_DONE 0xFF // 任务完成
|
||||||
|
|
||||||
|
#define STATE_IDLE_SHOW 0x01
|
||||||
|
|
||||||
|
#define STATE_HOME_FIRST_INIT 0x01
|
||||||
|
#define STATE_HOME_FIRST_WAIT 0x02
|
||||||
|
#define STATE_HOME_LEAVE_INIT 0x03
|
||||||
|
#define STATE_HOME_LEAVE_WAIT 0x04
|
||||||
|
#define STATE_HOME_AGAIN_INIT 0x05
|
||||||
|
#define STATE_HOME_AGAIN_WAIT 0x06
|
||||||
|
|
||||||
|
#define STATE_TEST_INIT 0x01
|
||||||
|
#define STATE_TEST_FAST_UP_WAIT 0x02
|
||||||
|
#define STATE_TEST_FAST_DOWN_WAIT 0x03
|
||||||
|
#define STATE_TEST_SLOW_WAIT 0x04
|
||||||
|
|
||||||
|
#define FUN_HOME 0
|
||||||
|
#define FUN_TEST 1
|
||||||
|
|
||||||
|
/****************** 错误代码 *******************/
|
||||||
|
#define ERROR_NONE 0xFF // 无错误
|
||||||
|
#define ERROR_BLTOUCH 0 // BLTouch报警
|
||||||
|
#define ERROR_HOME_FIRST 1 // 首次回零距离过长
|
||||||
|
#define ERROR_HOME_LEAVE 2 // 回零时零位持续闭合
|
||||||
|
#define ERROR_HOME_AGAIN 3 // 再次回零距离过长
|
||||||
|
#define ERROR_TEST_INIT 4 // 测试开始时电机解锁,需要重新回零
|
||||||
|
#define ERROR_TEST_MAX 5 // 测试距离过长
|
||||||
|
|
||||||
|
/****************** 功能参数配置 *******************/
|
||||||
|
#define STEP_PER_CIRCLE 3200 // Step/圈 => 4mm
|
||||||
|
|
||||||
|
#define HOME_PRESET_POS (STEP_PER_CIRCLE * 4) // 4圈 => 16mm
|
||||||
|
#define HOME_LEAVE_POS (STEP_PER_CIRCLE * 0.5) // 0.5圈 => 2mm
|
||||||
|
#define TEST_INIT_POS (STEP_PER_CIRCLE * 1) // 1圈 => 4mm
|
||||||
|
#define TEST_MAX_POS (STEP_PER_CIRCLE * 2.5) // 2.5圈 => 10mm
|
||||||
|
|
||||||
|
/****************** 公用变量和函数 *******************/
|
||||||
|
extern u8 runMode;
|
||||||
|
extern u8 runState;
|
||||||
|
|
||||||
|
void changeMode(u8 mode);
|
||||||
|
void changeState(u8 state);
|
74
App/EndStop.c
Normal file
74
App/EndStop.c
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* EndStop.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月18日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "EndStop.h"
|
||||||
|
|
||||||
|
#include "Core.h"
|
||||||
|
#include "Exti.h"
|
||||||
|
#include "Stepper.h"
|
||||||
|
|
||||||
|
static void EXTI_config(void) {
|
||||||
|
EXTI_InitTypeDef EXTI_InitStructure; // 结构定义
|
||||||
|
|
||||||
|
EXTI_InitStructure.EXTI_Mode = EXT_MODE_RiseFall; // 中断模式
|
||||||
|
EXTI_InitStructure.EXTI_Polity = PolityHigh; // 中断优先级
|
||||||
|
EXTI_InitStructure.EXTI_Interrupt = ENABLE; // 中断允许
|
||||||
|
Ext_Inilize(EXT_INT0, &EXTI_InitStructure); // 初始化INT0
|
||||||
|
Ext_Inilize(EXT_INT1, &EXTI_InitStructure); // 初始化INT1
|
||||||
|
|
||||||
|
// Ext_Inilize(EXT_INT2, &EXTI_InitStructure); // 初始化INT2
|
||||||
|
// Ext_Inilize(EXT_INT3, &EXTI_InitStructure); // 初始化INT3
|
||||||
|
}
|
||||||
|
|
||||||
|
void EndStop_Init() {
|
||||||
|
EXTI_config();
|
||||||
|
}
|
||||||
|
|
||||||
|
bit EndStop_isTrigger() {
|
||||||
|
ENDSTOP_PIN = HIGH; // 准双向口读之前要先写HIGH
|
||||||
|
NOP2();
|
||||||
|
return (ENDSTOP_PIN == LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
bit BLTouch_isTrigger() {
|
||||||
|
BLTOUCH_PIN = HIGH; // 准双向口读之前要先写HIGH
|
||||||
|
NOP2();
|
||||||
|
return (BLTOUCH_PIN == HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EndStop_ISR() {
|
||||||
|
if (runMode == MODE_HOME) {
|
||||||
|
switch (runState) {
|
||||||
|
case STATE_HOME_FIRST_WAIT:
|
||||||
|
if (ENDSTOP_TRIGGER) {
|
||||||
|
STOP_STEPPER;
|
||||||
|
changeState(STATE_HOME_LEAVE_INIT);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case STATE_HOME_AGAIN_WAIT:
|
||||||
|
if (ENDSTOP_TRIGGER) {
|
||||||
|
STOP_STEPPER;
|
||||||
|
changeState(STATE_DONE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLTouch_ISR() {
|
||||||
|
if (runMode == MODE_TEST) {
|
||||||
|
if (runState == STATE_TEST_SLOW_WAIT) {
|
||||||
|
if (BLTOUCH_TRIGGER) {
|
||||||
|
STOP_STEPPER;
|
||||||
|
changeState(STATE_DONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
25
App/EndStop.h
Normal file
25
App/EndStop.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* EndStop.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月18日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define ENDSTOP_PIN P33 // INT1 机械零位输入
|
||||||
|
#define BLTOUCH_PIN P32 // INT0 BLTouch零位输入
|
||||||
|
|
||||||
|
#define ENDSTOP_NORMAL (!EndStop_isTrigger())
|
||||||
|
#define ENDSTOP_TRIGGER (EndStop_isTrigger())
|
||||||
|
|
||||||
|
#define BLTOUCH_NORMAL (!BLTouch_isTrigger())
|
||||||
|
#define BLTOUCH_TRIGGER (BLTouch_isTrigger())
|
||||||
|
|
||||||
|
void EndStop_Init();
|
||||||
|
|
||||||
|
bit EndStop_isTrigger();
|
||||||
|
bit BLTouch_isTrigger();
|
||||||
|
|
||||||
|
void EndStop_ISR();
|
||||||
|
void BLTouch_ISR();
|
97
App/Exti.c
Normal file
97
App/Exti.c
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
|
||||||
|
/************* 功能说明 **************
|
||||||
|
|
||||||
|
本文件为STC15xxx系列的外中断初始化和中断程序,用户可以在这个文件中修改自己需要的中断程序.
|
||||||
|
|
||||||
|
******************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "Exti.h"
|
||||||
|
#include "EndStop.h"
|
||||||
|
|
||||||
|
/********************* INT0中断函数 *************************/
|
||||||
|
void Ext_INT0(void) interrupt INT0_VECTOR // 进中断时已经清除标志
|
||||||
|
{
|
||||||
|
BLTouch_ISR();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************* INT1中断函数 *************************/
|
||||||
|
void Ext_INT1(void) interrupt INT1_VECTOR // 进中断时已经清除标志
|
||||||
|
{
|
||||||
|
EndStop_ISR();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************* INT2中断函数 *************************/
|
||||||
|
void Ext_INT2(void) interrupt INT2_VECTOR //
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************* INT3中断函数 *************************/
|
||||||
|
void Ext_INT3(void) interrupt INT3_VECTOR
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************* INT4中断函数 *************************/
|
||||||
|
void Ext_INT4(void) interrupt INT4_VECTOR
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: u8 Ext_Inilize(u8 EXT, EXTI_InitTypeDef *INTx)
|
||||||
|
// 描述: 外部中断初始化程序.
|
||||||
|
// 参数: INTx: 结构参数,请参考Exti.h里的定义.
|
||||||
|
// 返回: 成功返回0, 空操作返回1,错误返回2.
|
||||||
|
// 版本: V1.0, 2012-10-22
|
||||||
|
//========================================================================
|
||||||
|
u8 Ext_Inilize(u8 EXT, EXTI_InitTypeDef *INTx)
|
||||||
|
{
|
||||||
|
if(EXT > EXT_INT4) return 1; //空操作
|
||||||
|
|
||||||
|
if(EXT == EXT_INT0) //外中断0
|
||||||
|
{
|
||||||
|
if(INTx->EXTI_Interrupt == ENABLE) EX0 = 1; //允许中断
|
||||||
|
else EX0 = 0; //禁止中断
|
||||||
|
if(INTx->EXTI_Polity == PolityHigh) PX0 = 1; //高优先级中断
|
||||||
|
else PX0 = 0; //低优先级中断
|
||||||
|
if(INTx->EXTI_Mode == EXT_MODE_Fall) IT0 = 1; //下降沿中断
|
||||||
|
else IT0 = 0; //上升,下降沿中断
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
|
||||||
|
if(EXT == EXT_INT1) //外中断1
|
||||||
|
{
|
||||||
|
if(INTx->EXTI_Interrupt == ENABLE) EX1 = 1; //允许中断
|
||||||
|
else EX1 = 0; //禁止中断
|
||||||
|
if(INTx->EXTI_Polity == PolityHigh) PX1 = 1; //高优先级中断
|
||||||
|
else PX1 = 0; //低优先级中断
|
||||||
|
if(INTx->EXTI_Mode == EXT_MODE_Fall) IT1 = 1; //下降沿中断
|
||||||
|
else IT1 = 0; //上升,下降沿中断
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
|
||||||
|
if(EXT == EXT_INT2) //外中断2, 固定为下降沿低优先级中断
|
||||||
|
{
|
||||||
|
if(INTx->EXTI_Interrupt == ENABLE) INT_CLKO |= (1 << 4); //允许中断
|
||||||
|
else INT_CLKO &= ~(1 << 4); //禁止中断
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
|
||||||
|
if(EXT == EXT_INT3) //外中断3, 固定为下降沿低优先级中断
|
||||||
|
{
|
||||||
|
if(INTx->EXTI_Interrupt == ENABLE) INT_CLKO |= (1 << 5); //允许中断
|
||||||
|
else INT_CLKO &= ~(1 << 5); //禁止中断
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
|
||||||
|
if(EXT == EXT_INT4) //外中断4, 固定为下降沿低优先级中断
|
||||||
|
{
|
||||||
|
if(INTx->EXTI_Interrupt == ENABLE) INT_CLKO |= (1 << 6); //允许中断
|
||||||
|
else INT_CLKO &= ~(1 << 6); //禁止中断
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
return 2; //失败
|
||||||
|
}
|
25
App/Exti.h
Normal file
25
App/Exti.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
#ifndef __EXTI_H
|
||||||
|
#define __EXTI_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define EXT_INT0 0 //初始化外中断0
|
||||||
|
#define EXT_INT1 1 //初始化外中断1
|
||||||
|
#define EXT_INT2 2 //初始化外中断2
|
||||||
|
#define EXT_INT3 3 //初始化外中断3
|
||||||
|
#define EXT_INT4 4 //初始化外中断4
|
||||||
|
|
||||||
|
#define EXT_MODE_RiseFall 0 //上升沿/下降沿中断
|
||||||
|
#define EXT_MODE_Fall 1 //下降沿中断
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 EXTI_Mode; //中断模式, EXT_MODE_RiseFall, EXT_MODE_Fall
|
||||||
|
u8 EXTI_Polity; //优先级设置 PolityHigh,PolityLow
|
||||||
|
u8 EXTI_Interrupt; //中断允许 ENABLE,DISABLE
|
||||||
|
} EXTI_InitTypeDef;
|
||||||
|
|
||||||
|
u8 Ext_Inilize(u8 EXT, EXTI_InitTypeDef *INTx);
|
||||||
|
|
||||||
|
#endif
|
66
App/GPIO.c
Normal file
66
App/GPIO.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
|
||||||
|
/************* 功能说明 **************
|
||||||
|
|
||||||
|
本文件为STC15xxx系列的端口初始化程序,用户几乎可以不修改这个程序.
|
||||||
|
|
||||||
|
|
||||||
|
******************************************/
|
||||||
|
|
||||||
|
#include "GPIO.h"
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
|
||||||
|
// 描述: 初始化IO口.
|
||||||
|
// 参数: GPIOx: 结构参数,请参考timer.h里的定义.
|
||||||
|
// 返回: 成功返回0, 空操作返回1,错误返回2.
|
||||||
|
// 版本: V1.0, 2012-10-22
|
||||||
|
//========================================================================
|
||||||
|
u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx)
|
||||||
|
{
|
||||||
|
if(GPIO > GPIO_P5) return 1; //空操作
|
||||||
|
if(GPIOx->Mode > GPIO_OUT_PP) return 2; //错误
|
||||||
|
if(GPIO == GPIO_P0)
|
||||||
|
{
|
||||||
|
if(GPIOx->Mode == GPIO_PullUp) P0M1 &= ~GPIOx->Pin, P0M0 &= ~GPIOx->Pin; //上拉准双向口
|
||||||
|
if(GPIOx->Mode == GPIO_HighZ) P0M1 |= GPIOx->Pin, P0M0 &= ~GPIOx->Pin; //浮空输入
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_OD) P0M1 |= GPIOx->Pin, P0M0 |= GPIOx->Pin; //开漏输出
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_PP) P0M1 &= ~GPIOx->Pin, P0M0 |= GPIOx->Pin; //推挽输出
|
||||||
|
}
|
||||||
|
if(GPIO == GPIO_P1)
|
||||||
|
{
|
||||||
|
if(GPIOx->Mode == GPIO_PullUp) P1M1 &= ~GPIOx->Pin, P1M0 &= ~GPIOx->Pin; //上拉准双向口
|
||||||
|
if(GPIOx->Mode == GPIO_HighZ) P1M1 |= GPIOx->Pin, P1M0 &= ~GPIOx->Pin; //浮空输入
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_OD) P1M1 |= GPIOx->Pin, P1M0 |= GPIOx->Pin; //开漏输出
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_PP) P1M1 &= ~GPIOx->Pin, P1M0 |= GPIOx->Pin; //推挽输出
|
||||||
|
}
|
||||||
|
if(GPIO == GPIO_P2)
|
||||||
|
{
|
||||||
|
if(GPIOx->Mode == GPIO_PullUp) P2M1 &= ~GPIOx->Pin, P2M0 &= ~GPIOx->Pin; //上拉准双向口
|
||||||
|
if(GPIOx->Mode == GPIO_HighZ) P2M1 |= GPIOx->Pin, P2M0 &= ~GPIOx->Pin; //浮空输入
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_OD) P2M1 |= GPIOx->Pin, P2M0 |= GPIOx->Pin; //开漏输出
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_PP) P2M1 &= ~GPIOx->Pin, P2M0 |= GPIOx->Pin; //推挽输出
|
||||||
|
}
|
||||||
|
if(GPIO == GPIO_P3)
|
||||||
|
{
|
||||||
|
if(GPIOx->Mode == GPIO_PullUp) P3M1 &= ~GPIOx->Pin, P3M0 &= ~GPIOx->Pin; //上拉准双向口
|
||||||
|
if(GPIOx->Mode == GPIO_HighZ) P3M1 |= GPIOx->Pin, P3M0 &= ~GPIOx->Pin; //浮空输入
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_OD) P3M1 |= GPIOx->Pin, P3M0 |= GPIOx->Pin; //开漏输出
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_PP) P3M1 &= ~GPIOx->Pin, P3M0 |= GPIOx->Pin; //推挽输出
|
||||||
|
}
|
||||||
|
if(GPIO == GPIO_P4)
|
||||||
|
{
|
||||||
|
if(GPIOx->Mode == GPIO_PullUp) P4M1 &= ~GPIOx->Pin, P4M0 &= ~GPIOx->Pin; //上拉准双向口
|
||||||
|
if(GPIOx->Mode == GPIO_HighZ) P4M1 |= GPIOx->Pin, P4M0 &= ~GPIOx->Pin; //浮空输入
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_OD) P4M1 |= GPIOx->Pin, P4M0 |= GPIOx->Pin; //开漏输出
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_PP) P4M1 &= ~GPIOx->Pin, P4M0 |= GPIOx->Pin; //推挽输出
|
||||||
|
}
|
||||||
|
if(GPIO == GPIO_P5)
|
||||||
|
{
|
||||||
|
if(GPIOx->Mode == GPIO_PullUp) P5M1 &= ~GPIOx->Pin, P5M0 &= ~GPIOx->Pin; //上拉准双向口
|
||||||
|
if(GPIOx->Mode == GPIO_HighZ) P5M1 |= GPIOx->Pin, P5M0 &= ~GPIOx->Pin; //浮空输入
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_OD) P5M1 |= GPIOx->Pin, P5M0 |= GPIOx->Pin; //开漏输出
|
||||||
|
if(GPIOx->Mode == GPIO_OUT_PP) P5M1 &= ~GPIOx->Pin, P5M0 |= GPIOx->Pin; //推挽输出
|
||||||
|
}
|
||||||
|
return 0; //成功
|
||||||
|
}
|
38
App/GPIO.h
Normal file
38
App/GPIO.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
|
||||||
|
#ifndef __GPIO_H
|
||||||
|
#define __GPIO_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define GPIO_PullUp 0 //上拉准双向口
|
||||||
|
#define GPIO_HighZ 1 //浮空输入
|
||||||
|
#define GPIO_OUT_OD 2 //开漏输出
|
||||||
|
#define GPIO_OUT_PP 3 //推挽输出
|
||||||
|
|
||||||
|
#define GPIO_Pin_0 0x01 //IO引脚 Px.0
|
||||||
|
#define GPIO_Pin_1 0x02 //IO引脚 Px.1
|
||||||
|
#define GPIO_Pin_2 0x04 //IO引脚 Px.2
|
||||||
|
#define GPIO_Pin_3 0x08 //IO引脚 Px.3
|
||||||
|
#define GPIO_Pin_4 0x10 //IO引脚 Px.4
|
||||||
|
#define GPIO_Pin_5 0x20 //IO引脚 Px.5
|
||||||
|
#define GPIO_Pin_6 0x40 //IO引脚 Px.6
|
||||||
|
#define GPIO_Pin_7 0x80 //IO引脚 Px.7
|
||||||
|
#define GPIO_Pin_All 0xFF //IO所有引脚
|
||||||
|
|
||||||
|
#define GPIO_P0 0 //
|
||||||
|
#define GPIO_P1 1
|
||||||
|
#define GPIO_P2 2
|
||||||
|
#define GPIO_P3 3
|
||||||
|
#define GPIO_P4 4
|
||||||
|
#define GPIO_P5 5
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 Mode; //IO模式, GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
|
||||||
|
u8 Pin; //要设置的端口
|
||||||
|
} GPIO_InitTypeDef;
|
||||||
|
|
||||||
|
u8 GPIO_Inilize(u8 GPIO, GPIO_InitTypeDef *GPIOx);
|
||||||
|
|
||||||
|
#endif
|
82
App/IIC.c
Normal file
82
App/IIC.c
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/*
|
||||||
|
* IIC.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月16日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "IIC.h"
|
||||||
|
|
||||||
|
static void Start(void);
|
||||||
|
|
||||||
|
static void Write(u8 Data);
|
||||||
|
|
||||||
|
static void ACK(void);
|
||||||
|
|
||||||
|
static void Stop(void);
|
||||||
|
|
||||||
|
static void Delay1us();
|
||||||
|
|
||||||
|
#define DELAY Delay1us()
|
||||||
|
|
||||||
|
IIC_t IIC = {Start, Write, ACK, Stop};
|
||||||
|
|
||||||
|
static void Start(void) {
|
||||||
|
SCL = HIGH;
|
||||||
|
SDA = HIGH;
|
||||||
|
DELAY; //@20.000MHz // 1微秒延时
|
||||||
|
SDA = LOW; // 时钟线高电平 拉低数据线以为传输开始
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Write(u8 Data) {
|
||||||
|
u8 i;
|
||||||
|
|
||||||
|
SCL = LOW; // 拉低时钟线 数据可以变化
|
||||||
|
DELAY; // 1微秒延时
|
||||||
|
for (i = 0; i < 8; i++) {
|
||||||
|
if (Data & 0x80)
|
||||||
|
SDA = HIGH;
|
||||||
|
else
|
||||||
|
SDA = LOW;
|
||||||
|
|
||||||
|
DELAY; // 1微秒延时
|
||||||
|
SCL = LOW;
|
||||||
|
DELAY; // 1微秒延时
|
||||||
|
SCL = HIGH;
|
||||||
|
DELAY; // 1微秒延时
|
||||||
|
SCL = LOW;
|
||||||
|
Data <<= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ACK(void) {
|
||||||
|
// static uint8_t timeout = 0;
|
||||||
|
SCL = HIGH;
|
||||||
|
DELAY;
|
||||||
|
SCL = LOW;
|
||||||
|
// while ((SDA_1) || (timeout <= 10))
|
||||||
|
// {
|
||||||
|
|
||||||
|
// timeout++;
|
||||||
|
// }
|
||||||
|
DELAY;
|
||||||
|
DELAY;
|
||||||
|
SCL = LOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Stop(void) {
|
||||||
|
SCL = HIGH;
|
||||||
|
SDA = LOW;
|
||||||
|
DELAY;
|
||||||
|
SDA = HIGH; // 时钟线高电平时 拉高数据线为停止信号
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Delay1us() { //@20.000MHz
|
||||||
|
unsigned char i;
|
||||||
|
|
||||||
|
_nop_();
|
||||||
|
_nop_();
|
||||||
|
i = 2;
|
||||||
|
while (--i)
|
||||||
|
;
|
||||||
|
}
|
24
App/IIC.h
Normal file
24
App/IIC.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* IIC.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月16日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
#ifndef __IIC_H
|
||||||
|
#define __IIC_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define SCL P15
|
||||||
|
#define SDA P54
|
||||||
|
|
||||||
|
typedef struct { // IIC 结构体
|
||||||
|
void (*start)(void);
|
||||||
|
void (*write)(uint8_t);
|
||||||
|
void (*ACK)(void);
|
||||||
|
void (*stop)(void);
|
||||||
|
} IIC_t;
|
||||||
|
|
||||||
|
extern IIC_t IIC;
|
||||||
|
|
||||||
|
#endif
|
66
App/Key.c
Normal file
66
App/Key.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include "Key.h"
|
||||||
|
|
||||||
|
#include "Core.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
u8 keyCode = 0;
|
||||||
|
static u8 lastKeyCode = 0;
|
||||||
|
static u8 lastKeyValue = 0;
|
||||||
|
static u16 sysMs = 0;
|
||||||
|
|
||||||
|
static void Timer_config(void) {
|
||||||
|
TIM_InitTypeDef TIM_InitStructure; // 结构定义
|
||||||
|
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; // 指定工作模式
|
||||||
|
TIM_InitStructure.TIM_Polity = PolityLow; // 指定中断优先级
|
||||||
|
TIM_InitStructure.TIM_Interrupt = ENABLE; // 中断是否允许
|
||||||
|
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; // 指定时钟源
|
||||||
|
TIM_InitStructure.TIM_ClkOut = DISABLE; // 是否输出高速脉冲
|
||||||
|
TIM_InitStructure.TIM_Value = 0xB1E0; // 初值, 1000us = 1ms
|
||||||
|
TIM_InitStructure.TIM_Run = ENABLE; // 是否初始化后启动定时器
|
||||||
|
Timer_Inilize(Timer2, &TIM_InitStructure); // 初始化Timer2
|
||||||
|
}
|
||||||
|
|
||||||
|
static void scanKey() {
|
||||||
|
u8 keyValue;
|
||||||
|
KEY_Port |= KEY_Mask; // 所有按键端口置1
|
||||||
|
NOP2();
|
||||||
|
keyValue = KEY_Port; // 取值
|
||||||
|
keyValue = ~keyValue; // 取反
|
||||||
|
keyValue &= KEY_Mask; // 取有效位
|
||||||
|
keyValue >>= 6; // 右移六位
|
||||||
|
|
||||||
|
if (lastKeyValue == keyValue) { // 防抖
|
||||||
|
if (keyValue == 0 && lastKeyCode != 0) { // 有按键释放
|
||||||
|
keyCode = lastKeyCode;
|
||||||
|
lastKeyCode = 0;
|
||||||
|
} else { // 有按键按下
|
||||||
|
switch (keyValue) {
|
||||||
|
case KEY_CODE_HOME: lastKeyCode = KEY_CODE_HOME; break;
|
||||||
|
case KEY_CODE_TEST: lastKeyCode = KEY_CODE_TEST; break;
|
||||||
|
case KEY_CODE_IDLE: lastKeyCode = KEY_CODE_IDLE; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastKeyValue = keyValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void KEY_Init() {
|
||||||
|
Timer_config();
|
||||||
|
}
|
||||||
|
|
||||||
|
bit KEY_isTrigger(u8 key) {
|
||||||
|
if (keyCode == key) {
|
||||||
|
keyCode = 0;
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KEY_ISR() {
|
||||||
|
sysMs = (sysMs + 1) % 1000;
|
||||||
|
if ((sysMs % 50) == 0) { // 每50ms
|
||||||
|
if (runMode == MODE_IDLE) scanKey();
|
||||||
|
}
|
||||||
|
}
|
16
App/Key.h
Normal file
16
App/Key.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define KEY_HOME P36 // 回零按键
|
||||||
|
#define KEY_TEST P37 // 测试按键
|
||||||
|
|
||||||
|
#define KEY_Port P3 // 按键端口
|
||||||
|
#define KEY_Mask 0xC0 // 按键端口掩码
|
||||||
|
|
||||||
|
#define KEY_CODE_HOME 0x01 // 回零
|
||||||
|
#define KEY_CODE_TEST 0x02 // 测试
|
||||||
|
#define KEY_CODE_IDLE 0x03 // 电机解锁
|
||||||
|
|
||||||
|
void KEY_Init();
|
||||||
|
bit KEY_isTrigger(u8 key);
|
||||||
|
|
||||||
|
void KEY_ISR();
|
201
App/PCA.c
Normal file
201
App/PCA.c
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
/* --- STC MCU International Limited -------------------------------*/
|
||||||
|
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
|
||||||
|
/* --- Mobile: (86)13922805190 -------------------------------------*/
|
||||||
|
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
|
||||||
|
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
|
||||||
|
/* --- Web: www.GXWMCU.com -----------------------------------------*/
|
||||||
|
/* --- QQ: 800003751 ----------------------------------------------*/
|
||||||
|
/* If you want to use the program or the program referenced in the */
|
||||||
|
/* article, please specify in which data and procedures from STC */
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "PCA.h"
|
||||||
|
|
||||||
|
bit B_Capture0,B_Capture1,B_Capture2;
|
||||||
|
u8 PCA0_mode,PCA1_mode,PCA2_mode;
|
||||||
|
u16 CCAP0_tmp,PCA_Timer0;
|
||||||
|
u16 CCAP1_tmp,PCA_Timer1;
|
||||||
|
u16 CCAP2_tmp,PCA_Timer2;
|
||||||
|
|
||||||
|
/************* 功能说明 **************
|
||||||
|
|
||||||
|
|
||||||
|
******************************************/
|
||||||
|
|
||||||
|
u16 PWM0_low; //PWM输出低电平的PCA时钟脉冲个数, 用户层不可见。
|
||||||
|
u16 PWM1_low; //PWM输出低电平的PCA时钟脉冲个数, 用户层不可见。
|
||||||
|
u16 PWM2_low; //PWM输出低电平的PCA时钟脉冲个数, 用户层不可见。
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: void PWMn_Update(u8 PCA_id, u16 high)
|
||||||
|
// 描述: 更新占空比数据。
|
||||||
|
// 参数: high: 占空比数据,即PWM输出高电平的PCA时钟脉冲个数。
|
||||||
|
// 返回: 无
|
||||||
|
// 版本: VER1.0
|
||||||
|
// 日期: 2013-5-15
|
||||||
|
// 备注:
|
||||||
|
//========================================================================
|
||||||
|
void PWMn_Update(u8 PCA_id, u16 high)
|
||||||
|
{
|
||||||
|
if(PCA_id == PCA0)
|
||||||
|
{
|
||||||
|
if(high > PWM0_HIGH_MAX) high = PWM0_HIGH_MAX; //如果写入大于最大占空比数据,强制为最大占空比。
|
||||||
|
if(high < PWM0_HIGH_MIN) high = PWM0_HIGH_MIN; //如果写入小于最小占空比数据,强制为最小占空比。
|
||||||
|
CR = 0; //停止PCA。
|
||||||
|
PCA_Timer0 = high; //数据在正确范围,则装入占空比寄存器。
|
||||||
|
PWM0_low = PWM0_DUTY - high; //计算并保存PWM输出低电平的PCA时钟脉冲个数。
|
||||||
|
CR = 1; //启动PCA。
|
||||||
|
}
|
||||||
|
else if(PCA_id == PCA1)
|
||||||
|
{
|
||||||
|
if(high > PWM1_HIGH_MAX) high = PWM1_HIGH_MAX; //如果写入大于最大占空比数据,强制为最大占空比。
|
||||||
|
if(high < PWM1_HIGH_MIN) high = PWM1_HIGH_MIN; //如果写入小于最小占空比数据,强制为最小占空比。
|
||||||
|
CR = 0; //停止PCA。
|
||||||
|
PCA_Timer1 = high; //数据在正确范围,则装入占空比寄存器。
|
||||||
|
PWM1_low = PWM1_DUTY - high; //计算并保存PWM输出低电平的PCA时钟脉冲个数。
|
||||||
|
CR = 1; //启动PCA。
|
||||||
|
}
|
||||||
|
else if(PCA_id == PCA2)
|
||||||
|
{
|
||||||
|
if(high > PWM2_HIGH_MAX) high = PWM2_HIGH_MAX; //如果写入大于最大占空比数据,强制为最大占空比。
|
||||||
|
if(high < PWM2_HIGH_MIN) high = PWM2_HIGH_MIN; //如果写入小于最小占空比数据,强制为最小占空比。
|
||||||
|
CR = 0; //停止PCA。
|
||||||
|
PCA_Timer2 = high; //数据在正确范围,则装入占空比寄存器。
|
||||||
|
PWM2_low = PWM2_DUTY - high; //计算并保存PWM输出低电平的PCA时钟脉冲个数。
|
||||||
|
CR = 1; //启动PCA。
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: void UpdatePwm(u8 PCA_id, u8 pwm_value)
|
||||||
|
// 描述: 更新PWM值.
|
||||||
|
// 参数: PCA_id: PCA序号. 取值 PCA0,PCA1,PCA2,PCA_Counter
|
||||||
|
// pwm_value: pwm值, 这个值是输出低电平的时间.
|
||||||
|
// 返回: none.
|
||||||
|
// 版本: V1.0, 2012-11-22
|
||||||
|
//========================================================================
|
||||||
|
/*
|
||||||
|
void UpdatePwm(u8 PCA_id, u8 pwm_value)
|
||||||
|
{
|
||||||
|
if(PCA_id == PCA0) CCAP0H = pwm_value;
|
||||||
|
else if(PCA_id == PCA1) CCAP1H = pwm_value;
|
||||||
|
else if(PCA_id == PCA2) CCAP2H = pwm_value;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: void PCA_Init(PCA_id, PCA_InitTypeDef *PCAx)
|
||||||
|
// 描述: PCA初始化程序.
|
||||||
|
// 参数: PCA_id: PCA序号. 取值 PCA0,PCA1,PCA2,PCA_Counter
|
||||||
|
// PCAx: 结构参数,请参考PCA.h里的定义.
|
||||||
|
// 返回: none.
|
||||||
|
// 版本: V1.0, 2012-11-22
|
||||||
|
//========================================================================
|
||||||
|
void PCA_Init(u8 PCA_id, PCA_InitTypeDef *PCAx)
|
||||||
|
{
|
||||||
|
if(PCA_id > PCA_Counter) return; //id错误
|
||||||
|
|
||||||
|
if(PCA_id == PCA_Counter) //设置公用Counter
|
||||||
|
{
|
||||||
|
CR = 0;
|
||||||
|
CH = 0;
|
||||||
|
CL = 0;
|
||||||
|
AUXR1 = (AUXR1 & ~(3<<4)) | PCAx->PCA_IoUse; //切换IO口
|
||||||
|
CMOD = (CMOD & ~(7<<1)) | PCAx->PCA_Clock; //选择时钟源
|
||||||
|
CMOD = (CMOD & ~1) | (PCAx->PCA_Interrupt_Mode & 1); //ECF
|
||||||
|
if(PCAx->PCA_Polity == PolityHigh) PPCA = 1; //高优先级中断
|
||||||
|
else PPCA = 0; //低优先级中断
|
||||||
|
if(PCAx->PCA_RUN == ENABLE) CR = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PCAx->PCA_Interrupt_Mode &= (3<<4) + 1;
|
||||||
|
if(PCAx->PCA_Mode >= PCA_Mode_SoftTimer) PCAx->PCA_Interrupt_Mode &= ~(3<<4);
|
||||||
|
|
||||||
|
if(PCA_id == PCA0)
|
||||||
|
{
|
||||||
|
CCAPM0 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; //工作模式, 中断模式
|
||||||
|
PCA_PWM0 = (PCA_PWM0 & ~(3<<6)) | PCAx->PCA_PWM_Wide; //PWM宽度
|
||||||
|
|
||||||
|
PCA_Timer0 = PCAx->PCA_Value;
|
||||||
|
B_Capture0 = 0;
|
||||||
|
PCA0_mode = PCAx->PCA_Mode;
|
||||||
|
CCAP0_tmp = PCA_Timer0;
|
||||||
|
CCAP0L = (u8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
|
||||||
|
CCAP0H = (u8)(CCAP0_tmp >> 8); //后写CCAP0H
|
||||||
|
}
|
||||||
|
if(PCA_id == PCA1)
|
||||||
|
{
|
||||||
|
CCAPM1 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;
|
||||||
|
PCA_PWM1 = (PCA_PWM1 & ~(3<<6)) | PCAx->PCA_PWM_Wide;
|
||||||
|
|
||||||
|
PCA_Timer1 = PCAx->PCA_Value;
|
||||||
|
B_Capture1 = 0;
|
||||||
|
PCA1_mode = PCAx->PCA_Mode;
|
||||||
|
CCAP1_tmp = PCA_Timer1;
|
||||||
|
CCAP1L = (u8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
|
||||||
|
CCAP1H = (u8)(CCAP1_tmp >> 8); //后写CCAP0H
|
||||||
|
}
|
||||||
|
if(PCA_id == PCA2)
|
||||||
|
{
|
||||||
|
CCAPM2 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;
|
||||||
|
PCA_PWM2 = (PCA_PWM2 & ~(3<<6)) | PCAx->PCA_PWM_Wide;
|
||||||
|
|
||||||
|
PCA_Timer2 = PCAx->PCA_Value;
|
||||||
|
B_Capture2 = 0;
|
||||||
|
PCA2_mode = PCAx->PCA_Mode;
|
||||||
|
CCAP2_tmp = PCA_Timer2;
|
||||||
|
CCAP2L = (u8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
|
||||||
|
CCAP2H = (u8)(CCAP2_tmp >> 8); //后写CCAP0H
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: void PCA_Handler (void) interrupt PCA_VECTOR
|
||||||
|
// 描述: PCA中断处理程序.
|
||||||
|
// 参数: None
|
||||||
|
// 返回: none.
|
||||||
|
// 版本: V1.0, 2012-11-22
|
||||||
|
//========================================================================
|
||||||
|
void PCA_Handler (void) interrupt PCA_VECTOR
|
||||||
|
{
|
||||||
|
if(CCF0) //PCA模块0中断
|
||||||
|
{
|
||||||
|
CCF0 = 0; //清PCA模块0中断标志
|
||||||
|
if(P11) CCAP0_tmp += PCA_Timer0; //输出为高电平,则给影射寄存器装载高电平时间长度
|
||||||
|
else CCAP0_tmp += PWM0_low; //输出为低电平,则给影射寄存器装载低电平时间长度
|
||||||
|
CCAP0L = (u8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
|
||||||
|
CCAP0H = (u8)(CCAP0_tmp >> 8); //后写CCAP0H
|
||||||
|
}
|
||||||
|
|
||||||
|
if(CCF1) //PCA模块1中断
|
||||||
|
{
|
||||||
|
CCF1 = 0; //清PCA模块1中断标志
|
||||||
|
if(P10) CCAP1_tmp += PCA_Timer1; //输出为高电平,则给影射寄存器装载高电平时间长度
|
||||||
|
else CCAP1_tmp += PWM1_low; //输出为低电平,则给影射寄存器装载低电平时间长度
|
||||||
|
CCAP1L = (u8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
|
||||||
|
CCAP1H = (u8)(CCAP1_tmp >> 8); //后写CCAP0H
|
||||||
|
}
|
||||||
|
|
||||||
|
if(CCF2) //PCA模块2中断
|
||||||
|
{
|
||||||
|
CCF2 = 0; //清PCA模块1中断标志
|
||||||
|
if(P37) CCAP2_tmp += PCA_Timer2; //输出为高电平,则给影射寄存器装载高电平时间长度
|
||||||
|
else CCAP2_tmp += PWM2_low; //输出为低电平,则给影射寄存器装载低电平时间长度
|
||||||
|
CCAP2L = (u8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L
|
||||||
|
CCAP2H = (u8)(CCAP2_tmp >> 8); //后写CCAP0H
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if(CF) //PCA溢出中断
|
||||||
|
{
|
||||||
|
CF = 0; //清PCA溢出中断标志
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
85
App/PCA.h
Normal file
85
App/PCA.h
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
/* --- STC MCU International Limited -------------------------------*/
|
||||||
|
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
|
||||||
|
/* --- Mobile: (86)13922805190 -------------------------------------*/
|
||||||
|
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
|
||||||
|
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
|
||||||
|
/* --- Web: www.GXWMCU.com -----------------------------------------*/
|
||||||
|
/* --- QQ: 800003751 ----------------------------------------------*/
|
||||||
|
/* If you want to use the program or the program referenced in the */
|
||||||
|
/* article, please specify in which data and procedures from STC */
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __PCA_H
|
||||||
|
#define __PCA_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "BLTouch.h"
|
||||||
|
|
||||||
|
/***************************用户宏定义*******************************************************/
|
||||||
|
#define PWM0_DUTY BLTOUCH_DUTY//定义PWM的周期,数值为PCA所选择的时钟脉冲个数。
|
||||||
|
#define PWM0_HIGH_MIN 80 //限制PWM输出的最小占空比。
|
||||||
|
#define PWM0_HIGH_MAX (PWM0_DUTY - PWM0_HIGH_MIN) //限制PWM输出的最大占空比。
|
||||||
|
|
||||||
|
#define PWM1_DUTY 3000 //定义PWM的周期,数值为PCA所选择的时钟脉冲个数。
|
||||||
|
#define PWM1_HIGH_MIN 80 //限制PWM输出的最小占空比。
|
||||||
|
#define PWM1_HIGH_MAX (PWM1_DUTY - PWM1_HIGH_MIN) //限制PWM输出的最大占空比。
|
||||||
|
|
||||||
|
#define PWM2_DUTY 2000 //定义PWM的周期,数值为PCA所选择的时钟脉冲个数。
|
||||||
|
#define PWM2_HIGH_MIN 80 //限制PWM输出的最小占空比。
|
||||||
|
#define PWM2_HIGH_MAX (PWM2_DUTY - PWM2_HIGH_MIN) //限制PWM输出的最大占空比。
|
||||||
|
|
||||||
|
/********************************************************************************************/
|
||||||
|
|
||||||
|
#define PCA0 0
|
||||||
|
#define PCA1 1
|
||||||
|
#define PCA2 2
|
||||||
|
#define PCA_Counter 3
|
||||||
|
#define PCA_P12_P11_P10_P37 (0<<4)
|
||||||
|
#define PCA_P34_P35_P36_P37 (1<<4)
|
||||||
|
#define PCA_P24_P25_P26_P27 (2<<4)
|
||||||
|
#define PCA_Mode_PWM 0x42 //B0100_0010
|
||||||
|
#define PCA_Mode_Capture 0
|
||||||
|
#define PCA_Mode_SoftTimer 0x48 //B0100_1000
|
||||||
|
#define PCA_Mode_HighPulseOutput 0x4c //B0100_1100
|
||||||
|
#define PCA_Clock_1T (4<<1)
|
||||||
|
#define PCA_Clock_2T (1<<1)
|
||||||
|
#define PCA_Clock_4T (5<<1)
|
||||||
|
#define PCA_Clock_6T (6<<1)
|
||||||
|
#define PCA_Clock_8T (7<<1)
|
||||||
|
#define PCA_Clock_12T (0<<1)
|
||||||
|
#define PCA_Clock_Timer0_OF (2<<1)
|
||||||
|
#define PCA_Clock_ECI (3<<1)
|
||||||
|
#define PCA_Rise_Active (1<<5)
|
||||||
|
#define PCA_Fall_Active (1<<4)
|
||||||
|
#define PCA_PWM_8bit (0<<6)
|
||||||
|
#define PCA_PWM_7bit (1<<6)
|
||||||
|
#define PCA_PWM_6bit (2<<6)
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 PCA_IoUse; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
|
||||||
|
u8 PCA_Clock; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
|
||||||
|
u8 PCA_Mode; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
|
||||||
|
u8 PCA_PWM_Wide; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
|
||||||
|
u8 PCA_Interrupt_Mode; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
|
||||||
|
u8 PCA_Polity; //优先级设置 PolityHigh,PolityLow
|
||||||
|
u16 PCA_Value;
|
||||||
|
u8 PCA_RUN; //ENABLE, DISABLE
|
||||||
|
} PCA_InitTypeDef;
|
||||||
|
|
||||||
|
extern bit B_Capture0,B_Capture1,B_Capture2;
|
||||||
|
extern u8 PCA0_mode,PCA1_mode,PCA2_mode;
|
||||||
|
extern u16 CCAP0_tmp,PCA_Timer0;
|
||||||
|
extern u16 CCAP1_tmp,PCA_Timer1;
|
||||||
|
extern u16 CCAP2_tmp,PCA_Timer2;
|
||||||
|
void PCA_Init(u8 PCA_id, PCA_InitTypeDef *PCAx);
|
||||||
|
void UpdatePwm(u8 PCA_id, u8 pwm_value);
|
||||||
|
void PWMn_Update(u8 PCA_id, u16 high);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
860
App/STC15Fxxxx.H
Normal file
860
App/STC15Fxxxx.H
Normal file
@ -0,0 +1,860 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#ifndef _STC15Fxxxx_H
|
||||||
|
#define _STC15Fxxxx_H
|
||||||
|
|
||||||
|
#include <intrins.h>
|
||||||
|
|
||||||
|
/* BYTE Registers */
|
||||||
|
sfr P0 = 0x80;
|
||||||
|
sfr SP = 0x81;
|
||||||
|
sfr DPL = 0x82;
|
||||||
|
sfr DPH = 0x83;
|
||||||
|
sfr S4CON = 0x84;
|
||||||
|
sfr S4BUF = 0x85;
|
||||||
|
sfr PCON = 0x87;
|
||||||
|
|
||||||
|
sfr TCON = 0x88;
|
||||||
|
sfr TMOD = 0x89;
|
||||||
|
sfr TL0 = 0x8A;
|
||||||
|
sfr TL1 = 0x8B;
|
||||||
|
sfr TH0 = 0x8C;
|
||||||
|
sfr TH1 = 0x8D;
|
||||||
|
sfr AUXR = 0x8E;
|
||||||
|
sfr WAKE_CLKO = 0x8F;
|
||||||
|
sfr INT_CLKO = 0x8F;
|
||||||
|
sfr AUXR2 = 0x8F;
|
||||||
|
|
||||||
|
sfr RL_TL0 = 0x8A;
|
||||||
|
sfr RL_TL1 = 0x8B;
|
||||||
|
sfr RL_TH0 = 0x8C;
|
||||||
|
sfr RL_TH1 = 0x8D;
|
||||||
|
|
||||||
|
|
||||||
|
sfr P1 = 0x90;
|
||||||
|
sfr P1M1 = 0x91; //P1M1.n,P1M0.n =00--->Standard, 01--->push-pull 实际上1T的都一样
|
||||||
|
sfr P1M0 = 0x92; // =10--->pure input, 11--->open drain
|
||||||
|
sfr P0M1 = 0x93; //P0M1.n,P0M0.n =00--->Standard, 01--->push-pull
|
||||||
|
sfr P0M0 = 0x94; // =10--->pure input, 11--->open drain
|
||||||
|
sfr P2M1 = 0x95; //P2M1.n,P2M0.n =00--->Standard, 01--->push-pull
|
||||||
|
sfr P2M0 = 0x96; // =10--->pure input, 11--->open drain
|
||||||
|
sfr CLK_DIV = 0x97;
|
||||||
|
sfr PCON2 = 0x97;
|
||||||
|
|
||||||
|
sfr SCON = 0x98;
|
||||||
|
sfr SBUF = 0x99;
|
||||||
|
sfr S2CON = 0x9A; //
|
||||||
|
sfr S2BUF = 0x9B; //
|
||||||
|
sfr P1ASF = 0x9D; //只写,模拟输入(AD或LVD)选择
|
||||||
|
|
||||||
|
sfr P2 = 0xA0;
|
||||||
|
sfr BUS_SPEED = 0xA1;
|
||||||
|
sfr AUXR1 = 0xA2;
|
||||||
|
sfr P_SW1 = 0xA2;
|
||||||
|
|
||||||
|
sfr IE = 0xA8;
|
||||||
|
sfr SADDR = 0xA9;
|
||||||
|
sfr WKTCL = 0xAA; //唤醒定时器低字节
|
||||||
|
sfr WKTCH = 0xAB; //唤醒定时器高字节
|
||||||
|
sfr S3CON = 0xAC;
|
||||||
|
sfr S3BUF = 0xAD;
|
||||||
|
sfr IE2 = 0xAF; //STC12C5A60S2系列
|
||||||
|
|
||||||
|
sfr P3 = 0xB0;
|
||||||
|
sfr P3M1 = 0xB1; //P3M1.n,P3M0.n =00--->Standard, 01--->push-pull
|
||||||
|
sfr P3M0 = 0xB2; // =10--->pure input, 11--->open drain
|
||||||
|
sfr P4M1 = 0xB3; //P4M1.n,P4M0.n =00--->Standard, 01--->push-pull
|
||||||
|
sfr P4M0 = 0xB4; // =10--->pure input, 11--->open drain
|
||||||
|
sfr IP2 = 0xB5; //STC12C5A60S2系列
|
||||||
|
sfr IPH2 = 0xB6; //STC12C5A60S2系列
|
||||||
|
sfr IPH = 0xB7;
|
||||||
|
|
||||||
|
sfr IP = 0xB8;
|
||||||
|
sfr SADEN = 0xB9;
|
||||||
|
sfr P_SW2 = 0xBA;
|
||||||
|
sfr ADC_CONTR = 0xBC; //带AD系列
|
||||||
|
sfr ADC_RES = 0xBD; //带AD系列
|
||||||
|
sfr ADC_RESL = 0xBE; //带AD系列
|
||||||
|
|
||||||
|
sfr P4 = 0xC0;
|
||||||
|
sfr WDT_CONTR = 0xC1;
|
||||||
|
sfr IAP_DATA = 0xC2;
|
||||||
|
sfr IAP_ADDRH = 0xC3;
|
||||||
|
sfr IAP_ADDRL = 0xC4;
|
||||||
|
sfr IAP_CMD = 0xC5;
|
||||||
|
sfr IAP_TRIG = 0xC6;
|
||||||
|
sfr IAP_CONTR = 0xC7;
|
||||||
|
|
||||||
|
sfr ISP_DATA = 0xC2;
|
||||||
|
sfr ISP_ADDRH = 0xC3;
|
||||||
|
sfr ISP_ADDRL = 0xC4;
|
||||||
|
sfr ISP_CMD = 0xC5;
|
||||||
|
sfr ISP_TRIG = 0xC6;
|
||||||
|
sfr ISP_CONTR = 0xC7;
|
||||||
|
|
||||||
|
sfr P5 = 0xC8; //
|
||||||
|
sfr P5M1 = 0xC9; // P5M1.n,P5M0.n =00--->Standard, 01--->push-pull
|
||||||
|
sfr P5M0 = 0xCA; // =10--->pure input, 11--->open drain
|
||||||
|
sfr P6M1 = 0xCB; // P5M1.n,P5M0.n =00--->Standard, 01--->push-pull
|
||||||
|
sfr P6M0 = 0xCC; // =10--->pure input, 11--->open drain
|
||||||
|
sfr SPSTAT = 0xCD; //
|
||||||
|
sfr SPCTL = 0xCE; //
|
||||||
|
sfr SPDAT = 0xCF; //
|
||||||
|
|
||||||
|
sfr PSW = 0xD0;
|
||||||
|
sfr T4T3M = 0xD1;
|
||||||
|
sfr T4H = 0xD2;
|
||||||
|
sfr T4L = 0xD3;
|
||||||
|
sfr T3H = 0xD4;
|
||||||
|
sfr T3L = 0xD5;
|
||||||
|
sfr T2H = 0xD6;
|
||||||
|
sfr T2L = 0xD7;
|
||||||
|
|
||||||
|
sfr TH4 = 0xD2;
|
||||||
|
sfr TL4 = 0xD3;
|
||||||
|
sfr TH3 = 0xD4;
|
||||||
|
sfr TL3 = 0xD5;
|
||||||
|
sfr TH2 = 0xD6;
|
||||||
|
sfr TL2 = 0xD7;
|
||||||
|
|
||||||
|
sfr RL_T4H = 0xD2;
|
||||||
|
sfr RL_T4L = 0xD3;
|
||||||
|
sfr RL_T3H = 0xD4;
|
||||||
|
sfr RL_T3L = 0xD5;
|
||||||
|
sfr RL_T2H = 0xD6;
|
||||||
|
sfr RL_T2L = 0xD7;
|
||||||
|
|
||||||
|
sfr CCON = 0xD8; //
|
||||||
|
sfr CMOD = 0xD9; //
|
||||||
|
sfr CCAPM0 = 0xDA; //PCA模块0的工作模式寄存器。
|
||||||
|
sfr CCAPM1 = 0xDB; //PCA模块1的工作模式寄存器。
|
||||||
|
sfr CCAPM2 = 0xDC; //PCA模块2的工作模式寄存器。
|
||||||
|
|
||||||
|
sfr ACC = 0xE0;
|
||||||
|
sfr P7M1 = 0xE1;
|
||||||
|
sfr P7M0 = 0xE2;
|
||||||
|
|
||||||
|
sfr P6 = 0xE8;
|
||||||
|
sfr CL = 0xE9; //
|
||||||
|
sfr CCAP0L = 0xEA; //PCA模块0的捕捉/比较寄存器低8位。
|
||||||
|
sfr CCAP1L = 0xEB; //PCA模块1的捕捉/比较寄存器低8位。
|
||||||
|
sfr CCAP2L = 0xEC; //PCA模块2的捕捉/比较寄存器低8位。
|
||||||
|
|
||||||
|
sfr B = 0xF0;
|
||||||
|
sfr PCA_PWM0 = 0xF2; //PCA模块0 PWM寄存器。
|
||||||
|
sfr PCA_PWM1 = 0xF3; //PCA模块1 PWM寄存器。
|
||||||
|
sfr PCA_PWM2 = 0xF4; //PCA模块2 PWM寄存器。
|
||||||
|
|
||||||
|
sfr P7 = 0xF8;
|
||||||
|
sfr CH = 0xF9;
|
||||||
|
sfr CCAP0H = 0xFA; //PCA模块0的捕捉/比较寄存器高8位。
|
||||||
|
sfr CCAP1H = 0xFB; //PCA模块1的捕捉/比较寄存器高8位。
|
||||||
|
sfr CCAP2H = 0xFC; //PCA模块2的捕捉/比较寄存器高8位。
|
||||||
|
|
||||||
|
|
||||||
|
/* BIT Registers */
|
||||||
|
/* PSW */
|
||||||
|
sbit CY = PSW^7;
|
||||||
|
sbit AC = PSW^6;
|
||||||
|
sbit F0 = PSW^5;
|
||||||
|
sbit RS1 = PSW^4;
|
||||||
|
sbit RS0 = PSW^3;
|
||||||
|
sbit OV = PSW^2;
|
||||||
|
sbit F1 = PSW^1;
|
||||||
|
sbit P = PSW^0;
|
||||||
|
|
||||||
|
/* TCON */
|
||||||
|
sbit TF1 = TCON^7; //定时器1溢出中断标志位
|
||||||
|
sbit TR1 = TCON^6; //定时器1运行控制位
|
||||||
|
sbit TF0 = TCON^5; //定时器0溢出中断标志位
|
||||||
|
sbit TR0 = TCON^4; //定时器0运行控制位
|
||||||
|
sbit IE1 = TCON^3; //外中断1标志位
|
||||||
|
sbit IT1 = TCON^2; //外中断1信号方式控制位,1:下降沿中断,0:上升下降均中断。
|
||||||
|
sbit IE0 = TCON^1; //外中断0标志位
|
||||||
|
sbit IT0 = TCON^0; //外中断0信号方式控制位,1:下降沿中断,0:上升下降均中断。
|
||||||
|
|
||||||
|
/* P0 */
|
||||||
|
sbit P00 = P0^0;
|
||||||
|
sbit P01 = P0^1;
|
||||||
|
sbit P02 = P0^2;
|
||||||
|
sbit P03 = P0^3;
|
||||||
|
sbit P04 = P0^4;
|
||||||
|
sbit P05 = P0^5;
|
||||||
|
sbit P06 = P0^6;
|
||||||
|
sbit P07 = P0^7;
|
||||||
|
|
||||||
|
/* P1 */
|
||||||
|
sbit P10 = P1^0;
|
||||||
|
sbit P11 = P1^1;
|
||||||
|
sbit P12 = P1^2;
|
||||||
|
sbit P13 = P1^3;
|
||||||
|
sbit P14 = P1^4;
|
||||||
|
sbit P15 = P1^5;
|
||||||
|
sbit P16 = P1^6;
|
||||||
|
sbit P17 = P1^7;
|
||||||
|
|
||||||
|
sbit RXD2 = P1^0;
|
||||||
|
sbit TXD2 = P1^1;
|
||||||
|
sbit CCP1 = P1^0;
|
||||||
|
sbit CCP0 = P1^1;
|
||||||
|
sbit SPI_SS = P1^2;
|
||||||
|
sbit SPI_MOSI = P1^3;
|
||||||
|
sbit SPI_MISO = P1^4;
|
||||||
|
sbit SPI_SCLK = P1^5;
|
||||||
|
|
||||||
|
sbit SPI_SS_2 = P2^4;
|
||||||
|
sbit SPI_MOSI_2 = P2^3;
|
||||||
|
sbit SPI_MISO_2 = P2^2;
|
||||||
|
sbit SPI_SCLK_2 = P2^1;
|
||||||
|
|
||||||
|
sbit SPI_SS_3 = P5^4;
|
||||||
|
sbit SPI_MOSI_3 = P4^0;
|
||||||
|
sbit SPI_MISO_3 = P4^1;
|
||||||
|
sbit SPI_SCLK_3 = P4^3;
|
||||||
|
|
||||||
|
/* P2 */
|
||||||
|
sbit P20 = P2^0;
|
||||||
|
sbit P21 = P2^1;
|
||||||
|
sbit P22 = P2^2;
|
||||||
|
sbit P23 = P2^3;
|
||||||
|
sbit P24 = P2^4;
|
||||||
|
sbit P25 = P2^5;
|
||||||
|
sbit P26 = P2^6;
|
||||||
|
sbit P27 = P2^7;
|
||||||
|
|
||||||
|
/* P3 */
|
||||||
|
sbit P30 = P3^0;
|
||||||
|
sbit P31 = P3^1;
|
||||||
|
sbit P32 = P3^2;
|
||||||
|
sbit P33 = P3^3;
|
||||||
|
sbit P34 = P3^4;
|
||||||
|
sbit P35 = P3^5;
|
||||||
|
sbit P36 = P3^6;
|
||||||
|
sbit P37 = P3^7;
|
||||||
|
|
||||||
|
sbit RXD = P3^0;
|
||||||
|
sbit TXD = P3^1;
|
||||||
|
sbit INT0 = P3^2;
|
||||||
|
sbit INT1 = P3^3;
|
||||||
|
sbit T0 = P3^4;
|
||||||
|
sbit T1 = P3^5;
|
||||||
|
sbit WR = P3^6;
|
||||||
|
sbit RD = P3^7;
|
||||||
|
sbit CCP2 = P3^7;
|
||||||
|
|
||||||
|
sbit CLKOUT0 = P3^5;
|
||||||
|
sbit CLKOUT1 = P3^4;
|
||||||
|
|
||||||
|
/* P4 */
|
||||||
|
sbit P40 = P4^0;
|
||||||
|
sbit P41 = P4^1;
|
||||||
|
sbit P42 = P4^2;
|
||||||
|
sbit P43 = P4^3;
|
||||||
|
sbit P44 = P4^4;
|
||||||
|
sbit P45 = P4^5;
|
||||||
|
sbit P46 = P4^6;
|
||||||
|
sbit P47 = P4^7;
|
||||||
|
|
||||||
|
/* P5 */
|
||||||
|
sbit P50 = P5^0;
|
||||||
|
sbit P51 = P5^1;
|
||||||
|
sbit P52 = P5^2;
|
||||||
|
sbit P53 = P5^3;
|
||||||
|
sbit P54 = P5^4;
|
||||||
|
sbit P55 = P5^5;
|
||||||
|
sbit P56 = P5^6;
|
||||||
|
sbit P57 = P5^7;
|
||||||
|
|
||||||
|
/* SCON */
|
||||||
|
sbit SM0 = SCON^7; //SM0/FE SM0 SM1 = 00 ~ 11: 方式0~3
|
||||||
|
sbit SM1 = SCON^6; //
|
||||||
|
sbit SM2 = SCON^5; //多机通讯
|
||||||
|
sbit REN = SCON^4; //接收允许
|
||||||
|
sbit TB8 = SCON^3; //发送数据第8位
|
||||||
|
sbit RB8 = SCON^2; //接收数据第8位
|
||||||
|
sbit TI = SCON^1; //发送中断标志位
|
||||||
|
sbit RI = SCON^0; //接收中断标志位
|
||||||
|
|
||||||
|
/* IE */
|
||||||
|
sbit EA = IE^7; //中断允许总控制位
|
||||||
|
sbit ELVD = IE^6; //低压监测中断允许位
|
||||||
|
sbit EADC = IE^5; //ADC 中断 允许位
|
||||||
|
sbit ES = IE^4; //串行中断 允许控制位
|
||||||
|
sbit ET1 = IE^3; //定时中断1允许控制位
|
||||||
|
sbit EX1 = IE^2; //外部中断1允许控制位
|
||||||
|
sbit ET0 = IE^1; //定时中断0允许控制位
|
||||||
|
sbit EX0 = IE^0; //外部中断0允许控制位
|
||||||
|
|
||||||
|
|
||||||
|
/* IP */
|
||||||
|
/*
|
||||||
|
sbit PPCA = IP^7; //PCA 中断 优先级设定位
|
||||||
|
sbit PLVD = IP^6; //低压中断 优先级设定位
|
||||||
|
sbit PADC = IP^5; //ADC 中断 优先级设定位
|
||||||
|
sbit PS = IP^4; //串行中断0优先级设定位
|
||||||
|
sbit PT1 = IP^3; //定时中断1优先级设定位
|
||||||
|
sbit PX1 = IP^2; //外部中断1优先级设定位
|
||||||
|
sbit PT0 = IP^1; //定时中断0优先级设定位
|
||||||
|
sbit PX0 = IP^0; //外部中断0优先级设定位
|
||||||
|
*/
|
||||||
|
|
||||||
|
sbit ACC0 = ACC^0;
|
||||||
|
sbit ACC1 = ACC^1;
|
||||||
|
sbit ACC2 = ACC^2;
|
||||||
|
sbit ACC3 = ACC^3;
|
||||||
|
sbit ACC4 = ACC^4;
|
||||||
|
sbit ACC5 = ACC^5;
|
||||||
|
sbit ACC6 = ACC^6;
|
||||||
|
sbit ACC7 = ACC^7;
|
||||||
|
|
||||||
|
sbit B0 = B^0;
|
||||||
|
sbit B1 = B^1;
|
||||||
|
sbit B2 = B^2;
|
||||||
|
sbit B3 = B^3;
|
||||||
|
sbit B4 = B^4;
|
||||||
|
sbit B5 = B^5;
|
||||||
|
sbit B6 = B^6;
|
||||||
|
sbit B7 = B^7;
|
||||||
|
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr IE2 = 0xAF; - - - - - - ESPI ES2 0000,0000B //Auxiliary Interrupt
|
||||||
|
#define SPI_INT_ENABLE() IE2 |= 2 //允许SPI中断
|
||||||
|
#define SPI_INT_DISABLE() IE2 &= ~2 //允许SPI中断
|
||||||
|
#define UART2_INT_ENABLE() IE2 |= 1 //允许串口2中断
|
||||||
|
#define UART2_INT_DISABLE() IE2 &= ~1 //允许串口2中断
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr IP = 0xB8; //中断优先级低位 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 0000,0000
|
||||||
|
//--------
|
||||||
|
sbit PPCA = IP^7; //PCA 模块中断优先级
|
||||||
|
sbit PLVD = IP^6; //低压监测中断优先级
|
||||||
|
sbit PADC = IP^5; //ADC 中断优先级
|
||||||
|
sbit PS = IP^4; //串行中断0优先级设定位
|
||||||
|
sbit PT1 = IP^3; //定时中断1优先级设定位
|
||||||
|
sbit PX1 = IP^2; //外部中断1优先级设定位
|
||||||
|
sbit PT0 = IP^1; //定时中断0优先级设定位
|
||||||
|
sbit PX0 = IP^0; //外部中断0优先级设定位
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr IPH = 0xB7; //中断优先级高位 PPCAH PLVDH PADCH PSH PT1H PX1H PT0H PX0H 0000,0000
|
||||||
|
//sfr IP2 = 0xB5; // - - - - - - PSPI PS2 xxxx,xx00
|
||||||
|
//sfr IPH2 = 0xB6; // - - - - - - PSPIH PS2H xxxx,xx00
|
||||||
|
#define PPCAH 0x80
|
||||||
|
#define PLVDH 0x40
|
||||||
|
#define PADCH 0x20
|
||||||
|
#define PSH 0x10
|
||||||
|
#define PT1H 0x08
|
||||||
|
#define PX1H 0x04
|
||||||
|
#define PT0H 0x02
|
||||||
|
#define PX0H 0x01
|
||||||
|
|
||||||
|
#define PCA_InterruptFirst() PPCA = 1
|
||||||
|
#define LVD_InterruptFirst() PLVD = 1
|
||||||
|
#define ADC_InterruptFirst() PADC = 1
|
||||||
|
#define UART1_InterruptFirst() PS = 1
|
||||||
|
#define Timer1_InterruptFirst() PT1 = 1
|
||||||
|
#define INT1_InterruptFirst() PX1 = 1
|
||||||
|
#define Timer0_InterruptFirst() PT0 = 1
|
||||||
|
#define INT0_InterruptFirst() PX0 = 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************************************************/
|
||||||
|
#define S1_DoubleRate() PCON |= 0x80
|
||||||
|
#define S1_SHIFT() SCON &= 0x3f
|
||||||
|
#define S1_8bit() SCON |= 0x40
|
||||||
|
#define S1_9bit() SCON |= 0xc0
|
||||||
|
#define S1_RX_Enable() SCON |= 0x10
|
||||||
|
#define S1_USE_P30P31() P_SW1 &= ~0xc0 //UART1 使用P30 P31口 默认
|
||||||
|
#define S1_USE_P36P37() P_SW1 = (P_SW1 & ~0xc0) | 0x40 //UART1 使用P36 P37口
|
||||||
|
#define S1_USE_P16P17() P_SW1 = (P_SW1 & ~0xc0) | 0x80 //UART1 使用P16 P17口
|
||||||
|
#define S1_TXD_RXD_SHORT() PCON2 |= (1<<4) //将TXD与RXD连接中继输出
|
||||||
|
#define S1_TXD_RXD_OPEN() PCON2 |= (1<<4) //将TXD与RXD连接中继断开 默认
|
||||||
|
#define S1_BRT_UseTimer2() AUXR |= 1;
|
||||||
|
#define S1_BRT_UseTimer1() AUXR &= ~1;
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr S2CON = 0x9A; S2SM0 - S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI 00000000B //S2 Control
|
||||||
|
|
||||||
|
#define S2_8bit() S2CON &= ~(1<<7) //串口2模式0,8位UART,波特率 = 定时器2的溢出率 / 4
|
||||||
|
#define S2_9bit() S2CON |= (1<<7) //串口2模式1,9位UART,波特率 = 定时器2的溢出率 / 4
|
||||||
|
#define S2_RX_Enable() S2CON |= (1<<4) //允许串2接收
|
||||||
|
|
||||||
|
#define S2_MODE0() S2CON &= ~(1<<7) //串口2模式0,8位UART,波特率 = 定时器2的溢出率 / 4
|
||||||
|
#define S2_MODE1() S2CON |= (1<<7) //串口2模式1,9位UART,波特率 = 定时器2的溢出率 / 4
|
||||||
|
#define S2_RX_EN() S2CON |= (1<<4) //允许串2接收
|
||||||
|
#define S2_RX_Disable() S2CON &= ~(1<<4) //禁止串2接收
|
||||||
|
#define TI2 (S2CON & 2) != 0
|
||||||
|
#define RI2 (S2CON & 1) != 0
|
||||||
|
#define SET_TI2() S2CON |= 2
|
||||||
|
#define CLR_TI2() S2CON &= ~2
|
||||||
|
#define CLR_RI2() S2CON &= ~1
|
||||||
|
#define S2TB8_SET() S2CON |= 8
|
||||||
|
#define S2TB8_CLR() S2CON &= ~8
|
||||||
|
#define S2_Int_en() IE2 |= 1 //串口2允许中断
|
||||||
|
#define S2_USE_P10P11() P_SW2 &= ~1 //UART2 使用P1口 默认
|
||||||
|
#define S2_USE_P46P47() P_SW2 |= 1 //UART2 使用P4口
|
||||||
|
|
||||||
|
#define S3_USE_P00P01() P_SW2 &= ~2 //UART3 使用P0口 默认
|
||||||
|
#define S3_USE_P50P51() P_SW2 |= 2 //UART3 使用P5口
|
||||||
|
#define S4_USE_P02P03() P_SW2 &= ~4 //UART4 使用P0口 默认
|
||||||
|
#define S4_USE_P52P53() P_SW2 |= 4 //UART4 使用P5口
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
|
||||||
|
#define Timer0_16bitAutoReload() TMOD &= ~0x03 //16位自动重装
|
||||||
|
#define Timer0_16bit() TMOD = (TMOD & ~0x03) | 0x01 //16位
|
||||||
|
#define Timer0_8bitAutoReload() TMOD = (TMOD & ~0x03) | 0x02 //8位自动重装
|
||||||
|
#define Timer0_16bitAutoRL_NoMask() TMOD |= 0x03 //16位自动重装不可屏蔽中断
|
||||||
|
#define Timer0_AsCounterP32() TMOD |= 4 //时器0用做计数器
|
||||||
|
#define Timer0_AsTimer() TMOD &= ~4 //时器0用做定时器
|
||||||
|
#define Timer0_ExtControlP34() TMOD |= 4 //时器0由外部INT0高电平允许定时计数
|
||||||
|
#define Timer0_Run() TR0 = 1 //允许定时器0计数
|
||||||
|
#define Timer0_Stop() TR0 = 0 //禁止定时器0计数
|
||||||
|
#define Timer0_InterruptEnable() ET0 = 1 //允许Timer1中断.
|
||||||
|
#define Timer0_InterruptDisable() ET0 = 0 //禁止Timer1中断.
|
||||||
|
|
||||||
|
#define Timer1_16bitAutoReload() TMOD &= ~0x30 //16位自动重装
|
||||||
|
#define Timer1_16bit() TMOD = (TMOD & ~0x30) | 0x10 //16位
|
||||||
|
#define Timer1_8bitAutoReload() TMOD = (TMOD & ~0x30) | 0x20 //8位自动重装
|
||||||
|
#define Timer1_16bitAutoRL_NoMask() TMOD |= 0x30 //16位自动重装不可屏蔽中断
|
||||||
|
#define Timer1_AsCounterP33() TMOD |= (1<<6) //时器1用做计数器
|
||||||
|
#define Timer1_AsTimer() TMOD &= ~(1<<6) //时器1用做定时器
|
||||||
|
#define Timer1_ExtControlP35() TMOD |= (1<<7) //时器1由外部INT1高电平允许定时计数
|
||||||
|
#define Timer1_Run() TR1 = 1 //允许定时器1计数
|
||||||
|
#define Timer1_Stop() TR1 = 0 //禁止定时器1计数
|
||||||
|
#define Timer1_InterruptEnable() ET1 = 1 //允许Timer1中断.
|
||||||
|
#define Timer1_InterruptDisable() ET1 = 0 //禁止Timer1中断.
|
||||||
|
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr AUXR = 0x8E; T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000 //Auxiliary Register
|
||||||
|
|
||||||
|
#define Timer0_1T() AUXR |= (1<<7) //Timer0 clodk = fo
|
||||||
|
#define Timer0_12T() AUXR &= ~(1<<7) //Timer0 clodk = fo/12 12分频, default
|
||||||
|
#define Timer1_1T() AUXR |= (1<<6) //Timer1 clodk = fo
|
||||||
|
#define Timer1_12T() AUXR &= ~(1<<6) //Timer1 clodk = fo/12 12分频, default
|
||||||
|
#define S1_M0x6() AUXR |= (1<<5) //UART Mode0 Speed is 6x Standard
|
||||||
|
#define S1_M0x1() AUXR &= ~(1<<5) //default, UART Mode0 Speed is Standard
|
||||||
|
#define Timer2_Run() AUXR |= (1<<4) //允许定时器2计数
|
||||||
|
#define Timer2_Stop() AUXR &= ~(1<<4) //禁止定时器2计数
|
||||||
|
#define Timer2_AsCounterP31() AUXR |= (1<<3) //时器2用做计数器
|
||||||
|
#define Timer2_AsTimer() AUXR &= ~(1<<3) //时器2用做定时器
|
||||||
|
#define Timer2_1T() AUXR |= (1<<2) //Timer0 clodk = fo
|
||||||
|
#define Timer2_12T() AUXR &= ~(1<<2) //Timer0 clodk = fo/12 12分频, default
|
||||||
|
#define Timer2_InterruptEnable() IE2 |= (1<<2) //允许Timer2中断.
|
||||||
|
#define Timer2_InterruptDisable() IE2 &= ~(1<<2) //禁止Timer2中断.
|
||||||
|
|
||||||
|
#define ExternalRAM_enable() AUXR |= 2 //允许外部XRAM,禁止使用内部1024RAM
|
||||||
|
#define InternalRAM_enable() AUXR &= ~2 //禁止外部XRAM,允许使用内部1024RAM
|
||||||
|
|
||||||
|
#define T0_pulseP34_enable() AUXR2 |= 1 //允许 T0 溢出脉冲在T0(P3.5)脚输出,Fck0 = 1/2 T0 溢出率,T0可以1T或12T。
|
||||||
|
#define T0_pulseP34_disable() AUXR2 &= ~1
|
||||||
|
#define T1_pulseP35_enable() AUXR2 |= 2 //允许 T1 溢出脉冲在T1(P3.4)脚输出,Fck1 = 1/2 T1 溢出率,T1可以1T或12T。
|
||||||
|
#define T1_pulseP35_disable() AUXR2 &= ~2
|
||||||
|
#define T2_pulseP30_enable() AUXR2 |= 4 //允许 T2 溢出脉冲在T1(P3.0)脚输出,Fck2 = 1/2 T2 溢出率,T2可以1T或12T。
|
||||||
|
#define T2_pulseP30_disable() AUXR2 &= ~4
|
||||||
|
|
||||||
|
#define T0_pulseP35(n) ET0=0,Timer0_AsTimer(),Timer0_1T(),Timer0_16bitAutoReload(),TH0=(65536-(n/2+MAIN_Fosc/2)/(n))/256,TL0=(65536-(n/2+MAIN_Fosc/2)/(n))%256,AUXR2 |= bit0,TR0=1 //fx=fosc/(2*M)/n, M=1 or M=12
|
||||||
|
#define T1_pulseP34(n) ET1=0,Timer1_AsTimer(),Timer1_1T(),Timer1_16bitAutoReload(),TH1=(65536-(n/2+MAIN_Fosc/2)/(n))/256,TL1=(65536-(n/2+MAIN_Fosc/2)/(n))%256,AUXR2 |= bit1,TR1=1 //fx=fosc/(2*M)/n, M=1 or M=12
|
||||||
|
#define T2_pulseP30(n) Timer2_InterruptDisable(),Timer2_AsTimer(),Timer2_1T(),TH2=(65536-(n/2+MAIN_Fosc/2)/(n))/256,TL2=(65536-(n/2+MAIN_Fosc/2)/(n))%256,AUXR2 |= bit2,Timer2_Run() //fx=fosc/(2*M)/n, M=1 or M=12
|
||||||
|
|
||||||
|
#define Timer0_Load(n) TH0 = (n) / 256, TL0 = (n) % 256
|
||||||
|
#define Timer1_Load(n) TH1 = (n) / 256, TL1 = (n) % 256
|
||||||
|
#define Timer2_Load(n) TH2 = (n) / 256, TL2 = (n) % 256
|
||||||
|
|
||||||
|
#define Timer0_Load_us(n) TH0=(65536-MainFosc_KHZ*(n)/1000)/256,TL0=(65536-MainFosc_KHZ*(n)/1000)%256
|
||||||
|
#define Timer1_Load_us(n) TH1=(65536-MainFosc_KHZ*(n)/1000)/256,TL1=(65536-MainFosc_KHZ*(n)/1000)%256
|
||||||
|
#define Timer2_Load_us(n) TH2=(65536-MainFosc_KHZ*(n)/1000)/256,TL2=(65536-MainFosc_KHZ*(n)/1000)%256
|
||||||
|
|
||||||
|
|
||||||
|
//sfr WDT_CONTR = 0xC1; //Watch-Dog-Timer Control register
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
// WDT_FLAG - EN_WDT CLR_WDT IDLE_WDT PS2 PS1 PS0 xx00,0000
|
||||||
|
#define D_WDT_FLAG (1<<7)
|
||||||
|
#define D_EN_WDT (1<<5)
|
||||||
|
#define D_CLR_WDT (1<<4) //auto clear
|
||||||
|
#define D_IDLE_WDT (1<<3) //WDT counter when Idle
|
||||||
|
#define D_WDT_SCALE_2 0
|
||||||
|
#define D_WDT_SCALE_4 1
|
||||||
|
#define D_WDT_SCALE_8 2 //T=393216*N/fo
|
||||||
|
#define D_WDT_SCALE_16 3
|
||||||
|
#define D_WDT_SCALE_32 4
|
||||||
|
#define D_WDT_SCALE_64 5
|
||||||
|
#define D_WDT_SCALE_128 6
|
||||||
|
#define D_WDT_SCALE_256 7
|
||||||
|
|
||||||
|
#define WDT_reset(n) WDT_CONTR = D_EN_WDT + D_CLR_WDT + D_IDLE_WDT + (n) //初始化WDT,喂狗
|
||||||
|
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr PCON = 0x87; SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000 //Power Control
|
||||||
|
//SMOD //串口双倍速
|
||||||
|
//SMOD0
|
||||||
|
#define LVDF (1<<5) //P4.6低压检测标志
|
||||||
|
//POF
|
||||||
|
//GF1
|
||||||
|
//GF0
|
||||||
|
//#define D_PD 2 //set 1, power down mode
|
||||||
|
//#define D_IDLE 1 //set 1, idle mode
|
||||||
|
#define MCU_IDLE() PCON |= 1 //MCU 进入 IDLE 模式
|
||||||
|
#define MCU_POWER_DOWN() PCON |= 2 //MCU 进入 睡眠 模式
|
||||||
|
|
||||||
|
|
||||||
|
//sfr ISP_CMD = 0xC5;
|
||||||
|
#define ISP_STANDBY() ISP_CMD = 0 //ISP空闲命令(禁止)
|
||||||
|
#define ISP_READ() ISP_CMD = 1 //ISP读出命令
|
||||||
|
#define ISP_WRITE() ISP_CMD = 2 //ISP写入命令
|
||||||
|
#define ISP_ERASE() ISP_CMD = 3 //ISP擦除命令
|
||||||
|
|
||||||
|
//sfr ISP_TRIG = 0xC6;
|
||||||
|
#define ISP_TRIG() ISP_TRIG = 0x5A, ISP_TRIG = 0xA5 //ISP触发命令
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr IAP_CONTR = 0xC7; IAPEN SWBS SWRST CFAIL - WT2 WT1 WT0 0000,x000 //IAP Control Register
|
||||||
|
#define ISP_EN (1<<7)
|
||||||
|
#define ISP_SWBS (1<<6)
|
||||||
|
#define ISP_SWRST (1<<5)
|
||||||
|
#define ISP_CMD_FAIL (1<<4)
|
||||||
|
#define ISP_WAIT_1MHZ 7
|
||||||
|
#define ISP_WAIT_2MHZ 6
|
||||||
|
#define ISP_WAIT_3MHZ 5
|
||||||
|
#define ISP_WAIT_6MHZ 4
|
||||||
|
#define ISP_WAIT_12MHZ 3
|
||||||
|
#define ISP_WAIT_20MHZ 2
|
||||||
|
#define ISP_WAIT_24MHZ 1
|
||||||
|
#define ISP_WAIT_30MHZ 0
|
||||||
|
|
||||||
|
#if (MAIN_Fosc >= 24000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_30MHZ
|
||||||
|
#elif (MAIN_Fosc >= 20000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_24MHZ
|
||||||
|
#elif (MAIN_Fosc >= 12000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_20MHZ
|
||||||
|
#elif (MAIN_Fosc >= 6000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_12MHZ
|
||||||
|
#elif (MAIN_Fosc >= 3000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_6MHZ
|
||||||
|
#elif (MAIN_Fosc >= 2000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_3MHZ
|
||||||
|
#elif (MAIN_Fosc >= 1000000L)
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_2MHZ
|
||||||
|
#else
|
||||||
|
#define ISP_WAIT_FREQUENCY ISP_WAIT_1MHZ
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ADC Register */
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr ADC_CONTR = 0xBC; ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000 //AD 转换控制寄存器
|
||||||
|
//sfr ADC_RES = 0xBD; ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2 0000,0000 //A/D 转换结果高8位
|
||||||
|
//sfr ADC_RESL = 0xBE; ADCV.1 ADCV.0 0000,0000 //A/D 转换结果低2位
|
||||||
|
//sfr ADC_CONTR = 0xBC; //直接用MOV操作,不要用与或
|
||||||
|
|
||||||
|
|
||||||
|
//sfr SPCTL = 0xCE; SPI控制寄存器
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
// SSIG SPEN DORD MSTR CPOL CPHA SPR1 SPR0 0x00
|
||||||
|
|
||||||
|
#define SPI_SSIG_None() SPCTL |= (1<<7) //1: 忽略SS脚
|
||||||
|
#define SPI_SSIG_Enable() SPCTL &= ~(1<<7) //0: SS脚用于决定主从机
|
||||||
|
#define SPI_Enable() SPCTL |= (1<<6) //1: 允许SPI
|
||||||
|
#define SPI_Disable() SPCTL &= ~(1<<6) //0: 禁止SPI
|
||||||
|
#define SPI_LSB_First() SPCTL |= (1<<5) //1: LSB先发
|
||||||
|
#define SPI_MSB_First() SPCTL &= ~(1<<5) //0: MSB先发
|
||||||
|
#define SPI_Master() SPCTL |= (1<<4) //1: 设为主机
|
||||||
|
#define SPI_Slave() SPCTL &= ~(1<<4) //0: 设为从机
|
||||||
|
#define SPI_SCLK_NormalH() SPCTL |= (1<<3) //1: 空闲时SCLK为高电平
|
||||||
|
#define SPI_SCLK_NormalL() SPCTL &= ~(1<<3) //0: 空闲时SCLK为低电平
|
||||||
|
#define SPI_PhaseH() SPCTL |= (1<<2) //1:
|
||||||
|
#define SPI_PhaseL() SPCTL &= ~(1<<2) //0:
|
||||||
|
#define SPI_Speed(n) SPCTL = (SPCTL & ~3) | (n) //设置速度, 0 -- fosc/4, 1 -- fosc/16, 2 -- fosc/64, 3 -- fosc/128
|
||||||
|
|
||||||
|
//sfr SPDAT = 0xCF; //SPI Data Register 0000,0000
|
||||||
|
//sfr SPSTAT = 0xCD; //SPI状态寄存器
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
// SPIF WCOL - - - - - -
|
||||||
|
#define SPIF 0x80 //SPI传输完成标志。写入1清0。
|
||||||
|
#define WCOL 0x40 //SPI写冲突标志。写入1清0。
|
||||||
|
|
||||||
|
#define SPI_USE_P12P13P14P15() AUXR1 &= 0x0c //将SPI切换到P12(SS) P13(MOSI) P14(MISO) P15(SCLK)(上电默认)。
|
||||||
|
#define SPI_USE_P24P23P22P21() AUXR1 = (AUXR1 & ~0x0c) | 0x04 //将SPI切换到P24(SS) P23(MOSI) P22(MISO) P21(SCLK)。
|
||||||
|
#define SPI_USE_P54P40P41P43() AUXR1 = (AUXR1 & ~0x0c) | 0x08 //将SPI切换到P54(SS) P40(MOSI) P41(MISO) P43(SCLK)。
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
;PCA_PWMn: 7 6 5 4 3 2 1 0
|
||||||
|
; EBSn_1 EBSn_0 - - - - EPCnH EPCnL
|
||||||
|
;B5-B2: 保留
|
||||||
|
;B1(EPCnH): 在PWM模式下,与CCAPnH组成9位数。
|
||||||
|
;B0(EPCnL): 在PWM模式下,与CCAPnL组成9位数。
|
||||||
|
*/
|
||||||
|
#define PWM0_NORMAL() PCA_PWM0 &= ~3 //PWM0正常输出(默认)
|
||||||
|
#define PWM0_OUT_0() PCA_PWM0 |= 3 //PWM0一直输出0
|
||||||
|
#define PWM0_OUT_1() PCA_PWM0 &= ~3, CCAP0H = 0; //PWM0一直输出1
|
||||||
|
|
||||||
|
#define PWM1_NORMAL() PCA_PWM1 &= ~3 //PWM0正常输出(默认)
|
||||||
|
#define PWM1_OUT_0() PCA_PWM1 |= 3 //PWM0一直输出0
|
||||||
|
#define PWM1_OUT_1() PCA_PWM1 &= ~3, CCAP1H = 0; //PWM1一直输出1
|
||||||
|
|
||||||
|
#define PWM2_NORMAL() PCA_PWM2 &= ~3 //PWM1正常输出(默认)
|
||||||
|
#define PWM2_OUT_0() PCA_PWM2 |= 3 //PWM2一直输出0
|
||||||
|
#define PWM2_OUT_1() PCA_PWM2 &= ~3, CCAP2H = 0; //PWM2一直输出1
|
||||||
|
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr CCON = 0xD8; CF CR - - - CCF2 CCF1 CCF0 00xx,xx00 //PCA 控制寄存器。
|
||||||
|
sbit CCF0 = CCON^0; //PCA 模块0中断标志,由硬件置位,必须由软件清0。
|
||||||
|
sbit CCF1 = CCON^1; //PCA 模块1中断标志,由硬件置位,必须由软件清0。
|
||||||
|
sbit CCF2 = CCON^2; //PCA 模块2中断标志,由硬件置位,必须由软件清0。
|
||||||
|
sbit CR = CCON^6; //1: 允许PCA计数器计数,必须由软件清0。
|
||||||
|
sbit CF = CCON^7; //PCA计数器溢出(CH,CL由FFFFH变为0000H)标志。PCA计数器溢出后由硬件置位,必须由软件清0。
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr CMOD = 0xD9; CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,0000 //PCA 工作模式寄存器。
|
||||||
|
#define PCA_IDLE_OFF() CMOD |= (1<<7) //IDLE状态PCA停止计数。
|
||||||
|
#define PCA_IDLE_ON() CMOD &= ~(1<<7) //IDLE状态PCA继续计数。
|
||||||
|
#define PCA_CLK_12T() CMOD &= ~0x0E //PCA计数脉冲选择外部晶振/12。 fosc/12
|
||||||
|
#define PCA_CLK_2T() CMOD = (CMOD & ~0x0E) + 2 //PCA计数脉冲选择外部晶振/2。 fosc/2
|
||||||
|
#define PCA_CLK_T0() CMOD = (CMOD & ~0x0E) + 4 //PCA计数脉冲选择Timer0中断,Timer0可通过AUXR寄存器设置成工作在12T或1T模式。
|
||||||
|
#define PCA_CLK_ECI() CMOD = (CMOD & ~0x0E) + 6 //PCA计数脉冲选择从ECI/P3.4脚输入的外部时钟,最大 fosc/2。
|
||||||
|
#define PCA_CLK_1T() CMOD = (CMOD & ~0x0E) + 8 //PCA计数脉冲选择外部晶振。 Fosc/1
|
||||||
|
#define PCA_CLK_4T() CMOD = (CMOD & ~0x0E) + 10 //PCA计数脉冲选择外部晶振/4。 Fosc/4
|
||||||
|
#define PCA_CLK_6T() CMOD = (CMOD & ~0x0E) + 12 //PCA计数脉冲选择外部晶振/6。 Fosc/6
|
||||||
|
#define PCA_CLK_8T() CMOD = (CMOD & ~0x0E) + 14 //PCA计数脉冲选择外部晶振/8。 Fosc/8
|
||||||
|
#define PCA_INT_ENABLE() CMOD |= 1 //PCA计数器溢出中断允许位,1---允许CF(CCON.7)产生中断。
|
||||||
|
#define PCA_INT_DISABLE() CMOD &= ~1 //PCA计数器溢出中断禁止。
|
||||||
|
|
||||||
|
// 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr AUXR1 = 0xA2; S1_S1 S1_S0 CCP_S1 CCP_S0 SPI_S1 SPI_S0 - DPS 0100,0000 //Auxiliary Register 1
|
||||||
|
|
||||||
|
#define PCA_USE_P12P11P10P37() AUXR1 &= ~0x30 //将PCA/PWM切换到P12(ECI) P11(CCP0) P10(CCP1) P37(CCP2)(上电默认)。
|
||||||
|
#define PCA_USE_P34P35P36P37() AUXR1 = (AUXR1 & ~0x30) | 0x10 //将PCA/PWM切换到P34(ECI) P35(CCP0) P36(CCP1) P37(CCP2)。
|
||||||
|
#define PCA_USE_P24P25P26P27() AUXR1 = (AUXR1 & ~0x30) | 0x20 //将PCA/PWM切换到P24(ECI) P25(CCP0) P26(CCP1) P27(CCP2)。
|
||||||
|
|
||||||
|
#define DPS_SEL1() AUXR1 |= 1 //1:选择DPTR1。
|
||||||
|
#define DPS_SEL0() AUXR1 &= ~1 //0:选择DPTR0(上电默认)。
|
||||||
|
|
||||||
|
|
||||||
|
/* 7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
//sfr CCAPM0 = 0xDA; PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000 //PCA 模块0
|
||||||
|
//sfr CCAPM1 = 0xDB; PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000 //PCA 模块1
|
||||||
|
//sfr CCAPM2 = 0xDC; PWM 寄存器 - ECOM2 CAPP2 CAPN2 MAT2 TOG2 PWM2 ECCF2 x000,0000 //PCA 模块2
|
||||||
|
;ECOMn = 1: 允许比较功能。
|
||||||
|
;CAPPn = 1: 允许上升沿触发捕捉功能。
|
||||||
|
;CAPNn = 1: 允许下降沿触发捕捉功能。
|
||||||
|
;MATn = 1: 当匹配情况发生时,允许CCON中的CCFn置位。
|
||||||
|
;TOGn = 1: 当匹配情况发生时,CEXn将翻转。(CEX0/PCA0/PWM0/P3.7,CEX1/PCA1/PWM1/P3.5)
|
||||||
|
;PWMn = 1: 将CEXn设置为PWM输出。
|
||||||
|
;ECCFn = 1: 允许CCON中的CCFn触发中断。
|
||||||
|
;ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
|
||||||
|
; 0 0 0 0 0 0 0 00H 未启用任何功能。
|
||||||
|
; x 1 0 0 0 0 x 20H 16位CEXn上升沿触发捕捉功能。
|
||||||
|
; x 0 1 0 0 0 x 10H 16位CEXn下降沿触发捕捉功能。
|
||||||
|
; x 1 1 0 0 0 x 30H 16位CEXn/PCAn边沿(上、下沿)触发捕捉功能。
|
||||||
|
; 1 0 0 1 0 0 x 48H 16位软件定时器。
|
||||||
|
; 1 0 0 1 1 0 x 4CH 16位高速脉冲输出。
|
||||||
|
; 1 0 0 0 0 1 0 42H 8位PWM。无中断
|
||||||
|
; 1 1 0 0 0 1 1 63H 8位PWM。低变高可产生中断
|
||||||
|
; 1 0 1 0 0 1 1 53H 8位PWM。高变低可产生中断
|
||||||
|
; 1 1 1 0 0 1 1 73H 8位PWM。低变高或高变低均可产生中断
|
||||||
|
;*******************************************************************
|
||||||
|
;*******************************************************************/
|
||||||
|
#define PCA0_none() CCAPM0 = 0
|
||||||
|
#define PCA0_PWM(nbit) CCAPM0 = 0x42,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA0_PWM_rise_int(nbit) CCAPM0 = 0x63,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA0_PWM_fall_int(nbit) CCAPM0 = 0x53,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA0_PWM_edge_int(nbit) CCAPM0 = 0x73,PCA_PWM0 = (PCA_PWM0 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA0_capture_rise() CCAPM0 = (0x20 + 1)
|
||||||
|
#define PCA0_capture_fall() CCAPM0 = (0x10 + 1)
|
||||||
|
#define PCA0_capture_edge() CCAPM0 = (0x30 + 1)
|
||||||
|
#define PCA0_16bit_Timer() CCAPM0 = (0x48 + 1)
|
||||||
|
#define PCA0_High_Pulse() CCAPM0 = (0x4C + 1)
|
||||||
|
|
||||||
|
#define PCA1_none() CCAPM1 = 0
|
||||||
|
#define PCA1_PWM(nbit) CCAPM1 = 0x42,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA1_PWM_rise_int(nbit) CCAPM1 = 0x63,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA1_PWM_fall_int(nbit) CCAPM1 = 0x53,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA1_PWM_edge_int(nbit) CCAPM1 = 0x73,PCA_PWM1 = (PCA_PWM1 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA1_capture_rise() CCAPM1 = (0x20 + 1)
|
||||||
|
#define PCA1_capture_fall() CCAPM1 = (0x10 + 1)
|
||||||
|
#define PCA1_capture_edge() CCAPM1 = (0x30 + 1)
|
||||||
|
#define PCA1_16bit_Timer() CCAPM1 = (0x48 + 1)
|
||||||
|
#define PCA1_High_Pulse() CCAPM1 = (0x4C + 1)
|
||||||
|
|
||||||
|
#define PCA2_none() CCAPM2 = 0
|
||||||
|
#define PCA2_PWM(nbit) CCAPM2 = 0x42,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA2_PWM_rise_int(nbit) CCAPM2 = 0x63,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA2_PWM_fall_int(nbit) CCAPM2 = 0x53,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA2_PWM_edge_int(nbit) CCAPM2 = 0x73,PCA_PWM2 = (PCA_PWM2 & 0x0c) | ((8-nbit)<<6)
|
||||||
|
#define PCA2_capture_rise() CCAPM2 = (0x20 + 1)
|
||||||
|
#define PCA2_capture_fall() CCAPM2 = (0x10 + 1)
|
||||||
|
#define PCA2_capture_edge() CCAPM2 = (0x30 + 1)
|
||||||
|
#define PCA2_16bit_Timer() CCAPM2 = (0x48 + 1)
|
||||||
|
#define PCA2_High_Pulse() CCAPM2 = (0x4C + 1)
|
||||||
|
|
||||||
|
/* Above is STC additional SFR or change */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
typedef unsigned char u8;
|
||||||
|
typedef unsigned int u16;
|
||||||
|
typedef unsigned long u32;
|
||||||
|
|
||||||
|
/**********************************************************/
|
||||||
|
#define NOP1() _nop_()
|
||||||
|
#define NOP2() NOP1(),NOP1()
|
||||||
|
#define NOP3() NOP2(),NOP1()
|
||||||
|
#define NOP4() NOP3(),NOP1()
|
||||||
|
#define NOP5() NOP4(),NOP1()
|
||||||
|
#define NOP6() NOP5(),NOP1()
|
||||||
|
#define NOP7() NOP6(),NOP1()
|
||||||
|
#define NOP8() NOP7(),NOP1()
|
||||||
|
#define NOP9() NOP8(),NOP1()
|
||||||
|
#define NOP10() NOP9(),NOP1()
|
||||||
|
#define NOP11() NOP10(),NOP1()
|
||||||
|
#define NOP12() NOP11(),NOP1()
|
||||||
|
#define NOP13() NOP12(),NOP1()
|
||||||
|
#define NOP14() NOP13(),NOP1()
|
||||||
|
#define NOP15() NOP14(),NOP1()
|
||||||
|
#define NOP16() NOP15(),NOP1()
|
||||||
|
#define NOP17() NOP16(),NOP1()
|
||||||
|
#define NOP18() NOP17(),NOP1()
|
||||||
|
#define NOP19() NOP18(),NOP1()
|
||||||
|
#define NOP20() NOP19(),NOP1()
|
||||||
|
#define NOP21() NOP20(),NOP1()
|
||||||
|
#define NOP22() NOP21(),NOP1()
|
||||||
|
#define NOP23() NOP22(),NOP1()
|
||||||
|
#define NOP24() NOP23(),NOP1()
|
||||||
|
#define NOP25() NOP24(),NOP1()
|
||||||
|
#define NOP26() NOP25(),NOP1()
|
||||||
|
#define NOP27() NOP26(),NOP1()
|
||||||
|
#define NOP28() NOP27(),NOP1()
|
||||||
|
#define NOP29() NOP28(),NOP1()
|
||||||
|
#define NOP30() NOP29(),NOP1()
|
||||||
|
#define NOP31() NOP30(),NOP1()
|
||||||
|
#define NOP32() NOP31(),NOP1()
|
||||||
|
#define NOP33() NOP32(),NOP1()
|
||||||
|
#define NOP34() NOP33(),NOP1()
|
||||||
|
#define NOP35() NOP34(),NOP1()
|
||||||
|
#define NOP36() NOP35(),NOP1()
|
||||||
|
#define NOP37() NOP36(),NOP1()
|
||||||
|
#define NOP38() NOP37(),NOP1()
|
||||||
|
#define NOP39() NOP38(),NOP1()
|
||||||
|
#define NOP40() NOP39(),NOP1()
|
||||||
|
#define NOP(N) NOP##N()
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
//sfr INT_CLKO = 0x8F; //附加的 SFR WAKE_CLKO (地址:0x8F)
|
||||||
|
/*
|
||||||
|
7 6 5 4 3 2 1 0 Reset Value
|
||||||
|
- EX4 EX3 EX2 - T2CLKO T1CLKO T0CLKO 0000,0000B
|
||||||
|
b6 - EX4 : 外中断INT4允许
|
||||||
|
b5 - EX3 : 外中断INT3允许
|
||||||
|
b4 - EX2 : 外中断INT2允许
|
||||||
|
b2 - T1CLKO : 允许 T2 溢出脉冲在P3.0脚输出,Fck1 = 1/2 T1 溢出率
|
||||||
|
b1 - T1CLKO : 允许 T1 溢出脉冲在P3.4脚输出,Fck1 = 1/2 T1 溢出率
|
||||||
|
b0 - T0CLKO : 允许 T0 溢出脉冲在P3.5脚输出,Fck0 = 1/2 T0 溢出率
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LVD_InterruptEnable() ELVD = 1
|
||||||
|
#define LVD_InterruptDisable() ELVD = 0
|
||||||
|
|
||||||
|
|
||||||
|
//sfr WKTCL = 0xAA; //STC11F\10和STC15系列 唤醒定时器低字节
|
||||||
|
//sfr WKTCH = 0xAB; //STC11F\10和STC15系列 唤醒定时器高字节
|
||||||
|
// B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0
|
||||||
|
// WKTEN S11 S10 S9 S8 S7 S6 S5 S4 S3 S2 S1 S0 n * 560us
|
||||||
|
#define WakeTimerDisable() WKTCH &= 0x7f //WKTEN = 0 禁止睡眠唤醒定时器
|
||||||
|
#define WakeTimerSet(scale) WKTCL = (scale) % 256,WKTCH = (scale) / 256 | 0x80 //WKTEN = 1 允许睡眠唤醒定时器
|
||||||
|
|
||||||
|
|
||||||
|
//sfr CLK_DIV = 0x97; //Clock Divder 系统时钟分频 - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000
|
||||||
|
#define SYSTEM_CLK_1T() CLK_DIV &= ~0x07 //default
|
||||||
|
#define SYSTEM_CLK_2T() CLK_DIV = (CLK_DIV & ~0x07) | 1
|
||||||
|
#define SYSTEM_CLK_4T() CLK_DIV = (CLK_DIV & ~0x07) | 2
|
||||||
|
#define SYSTEM_CLK_8T() CLK_DIV = (CLK_DIV & ~0x07) | 3
|
||||||
|
#define SYSTEM_CLK_16T() CLK_DIV = (CLK_DIV & ~0x07) | 4
|
||||||
|
#define SYSTEM_CLK_32T() CLK_DIV = (CLK_DIV & ~0x07) | 5
|
||||||
|
#define SYSTEM_CLK_64T() CLK_DIV = (CLK_DIV & ~0x07) | 6
|
||||||
|
#define SYSTEM_CLK_128T() CLK_DIV = CLK_DIV | 7
|
||||||
|
|
||||||
|
#define MCLKO_P54_None() CLK_DIV &= ~0xc0 //主时钟不输出
|
||||||
|
#define MCLKO_P54_DIV1() CLK_DIV = (CLK_DIV & ~0xc0) | 0x40 //主时钟不分频输出
|
||||||
|
#define MCLKO_P54_DIV2() CLK_DIV = (CLK_DIV & ~0xc0) | 0x80 //主时钟2分频输出
|
||||||
|
#define MCLKO_P54_DIV4() CLK_DIV = CLK_DIV | 0xc0 //主时钟4分频输出
|
||||||
|
|
||||||
|
#define MCLKO_P34_None() CLK_DIV &= ~0xc0 //主时钟不输出
|
||||||
|
#define MCLKO_P34_DIV1() CLK_DIV = (CLK_DIV & ~0xc0) | 0x40 //主时钟不分频输出
|
||||||
|
#define MCLKO_P34_DIV2() CLK_DIV = (CLK_DIV & ~0xc0) | 0x80 //主时钟2分频输出
|
||||||
|
#define MCLKO_P34_DIV4() CLK_DIV = CLK_DIV | 0xc0 //主时钟4分频输出
|
||||||
|
|
||||||
|
//sfr BUS_SPEED = 0xA1; //Stretch register - - - - - - EXRTS1 EXRTSS0 xxxx,xx10
|
||||||
|
#define BUS_SPEED_1T() BUS_SPEED = 0
|
||||||
|
#define BUS_SPEED_2T() BUS_SPEED = 1
|
||||||
|
#define BUS_SPEED_4T() BUS_SPEED = 2
|
||||||
|
#define BUS_SPEED_8T() BUS_SPEED = 3
|
||||||
|
|
||||||
|
/* interrupt vector */
|
||||||
|
#define INT0_VECTOR 0
|
||||||
|
#define TIMER0_VECTOR 1
|
||||||
|
#define INT1_VECTOR 2
|
||||||
|
#define TIMER1_VECTOR 3
|
||||||
|
#define UART1_VECTOR 4
|
||||||
|
#define ADC_VECTOR 5
|
||||||
|
#define LVD_VECTOR 6
|
||||||
|
#define PCA_VECTOR 7
|
||||||
|
#define UART2_VECTOR 8
|
||||||
|
#define SPI_VECTOR 9
|
||||||
|
#define INT2_VECTOR 10
|
||||||
|
#define INT3_VECTOR 11
|
||||||
|
#define TIMER2_VECTOR 12
|
||||||
|
#define INT4_VECTOR 16
|
||||||
|
#define UART3_VECTOR 17
|
||||||
|
#define UART4_VECTOR 18
|
||||||
|
#define TIMER3_VECTOR 19
|
||||||
|
#define TIMER4_VECTOR 20
|
||||||
|
|
||||||
|
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
|
//=============================================================
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
|
||||||
|
#define PolityLow 0 //低优先级中断
|
||||||
|
#define PolityHigh 1 //高优先级中断
|
||||||
|
|
||||||
|
//========================================
|
||||||
|
|
||||||
|
#define MCLKO_None 0
|
||||||
|
#define MCLKO_DIV1 1
|
||||||
|
#define MCLKO_DIV2 2
|
||||||
|
#define MCLKO_DIV4 3
|
||||||
|
|
||||||
|
#define ENABLE 1
|
||||||
|
#define DISABLE 0
|
||||||
|
|
||||||
|
#define STC15F_L2K08S2 8
|
||||||
|
#define STC15F_L2K16S2 16
|
||||||
|
#define STC15F_L2K24S2 24
|
||||||
|
#define STC15F_L2K32S2 32
|
||||||
|
#define STC15F_L2K40S2 40
|
||||||
|
#define STC15F_L2K48S2 48
|
||||||
|
#define STC15F_L2K56S2 56
|
||||||
|
#define STC15F_L2K60S2 60
|
||||||
|
#define IAP15F_L2K61S2 61
|
||||||
|
|
||||||
|
#endif
|
73
App/Stepper.c
Normal file
73
App/Stepper.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Stepper.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月17日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Stepper.h"
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
|
static u16 curPos = 0;
|
||||||
|
|
||||||
|
static void Timer_config(void) {
|
||||||
|
TIM_InitTypeDef TIM_InitStructure; // 结构定义
|
||||||
|
TIM_InitStructure.TIM_Mode = TIM_16BitAutoReload; // 指定工作模式
|
||||||
|
TIM_InitStructure.TIM_Polity = PolityHigh; // 指定中断优先级
|
||||||
|
TIM_InitStructure.TIM_Interrupt = DISABLE; // 中断是否允许
|
||||||
|
TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_1T; // 指定时钟源
|
||||||
|
TIM_InitStructure.TIM_ClkOut = DISABLE; // 是否输出高速脉冲
|
||||||
|
TIM_InitStructure.TIM_Value = 0; // 初值
|
||||||
|
TIM_InitStructure.TIM_Run = ENABLE; // 是否初始化后启动定时器
|
||||||
|
Timer_Inilize(Timer0, &TIM_InitStructure); // 初始化Timer0
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stepper_Init() {
|
||||||
|
STEPPER_EN = HIGH; // 初始化禁用电机
|
||||||
|
STEPPER_STEP = LOW; // 初始化步进
|
||||||
|
STEPPER_DIR = LOW; // 初始化方向
|
||||||
|
Timer_config();
|
||||||
|
Stepper_SetHz(STEPPER_FAST_HZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stepper_SetHz(u16 hz) {
|
||||||
|
// stepperStepReloadValue = (500000L / hz);
|
||||||
|
Timer0_Load_us(500000L / hz);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stepper_SetDir(u8 upOrDown) {
|
||||||
|
STEPPER_DIR = upOrDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stepper_SetEnable(u8 enable) {
|
||||||
|
STEPPER_EN = !enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stepper_SetPos(u16 pos) {
|
||||||
|
curPos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
bit Stepper_IsEnable() {
|
||||||
|
return (STEPPER_EN == LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
bit Stepper_ComparePos(u16 pos) {
|
||||||
|
if (curPos > pos)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 Stepper_GetPos() {
|
||||||
|
return curPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Stepper_ISR() {
|
||||||
|
STEPPER_STEP = !STEPPER_STEP;
|
||||||
|
if (STEPPER_STEP)
|
||||||
|
if (STEPPER_DIR)
|
||||||
|
curPos++;
|
||||||
|
else
|
||||||
|
curPos--;
|
||||||
|
}
|
34
App/Stepper.h
Normal file
34
App/Stepper.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Stepper.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月17日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define STEPPER_DIR P12 // 电机方向信号
|
||||||
|
#define STEPPER_STEP P13 // 电机步进信号
|
||||||
|
#define STEPPER_EN P14 // 电机使能信号
|
||||||
|
|
||||||
|
#define MainFosc_KHZ (MAIN_Fosc / 1000)
|
||||||
|
|
||||||
|
#define STOP_STEPPER Timer0_InterruptDisable()
|
||||||
|
#define RUN_STEPPER Timer0_InterruptEnable()
|
||||||
|
|
||||||
|
#define STEPPER_FAST_HZ 2000 // Hz
|
||||||
|
#define STEPPER_SLOW_HZ 500 // Hz
|
||||||
|
|
||||||
|
extern u16 stepperStepReloadValue;
|
||||||
|
|
||||||
|
void Stepper_Init();
|
||||||
|
void Stepper_SetHz(u16 hz);
|
||||||
|
void Stepper_SetDir(u8 upOrDown);
|
||||||
|
void Stepper_SetEnable(u8 enable);
|
||||||
|
void Stepper_SetPos(u16 pos);
|
||||||
|
|
||||||
|
bit Stepper_IsEnable();
|
||||||
|
bit Stepper_ComparePos(u16 pos);
|
||||||
|
u16 Stepper_GetPos();
|
||||||
|
|
||||||
|
void Stepper_ISR();
|
100
App/TM1650.c
Normal file
100
App/TM1650.c
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* TM1650.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月16日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "TM1650.h"
|
||||||
|
|
||||||
|
// 数码管显示数组
|
||||||
|
static u8 tab[] = {
|
||||||
|
0x3F, // 0
|
||||||
|
0x06, // 1
|
||||||
|
0x5B, // 2
|
||||||
|
0x4F, // 3
|
||||||
|
0x66, // 4
|
||||||
|
0x6D, // 5
|
||||||
|
0x7D, // 6
|
||||||
|
0x07, // 7
|
||||||
|
0x7F, // 8
|
||||||
|
0x6F, // 9
|
||||||
|
0x00, // 10 = Null
|
||||||
|
0x40, // 11 = -
|
||||||
|
0x71, // 12 = F
|
||||||
|
0x79, // 13 = E
|
||||||
|
0x50, // 14 = r
|
||||||
|
0x1C, // 15 = u
|
||||||
|
0x54, // 16 = n
|
||||||
|
};
|
||||||
|
|
||||||
|
static void Init(void); // tm1650初始化
|
||||||
|
static void TM1650_Set(IIC_t *Channel, u8 Add, u8 Value); // 设置tm1650寄存器的值
|
||||||
|
|
||||||
|
static void Display_Err(IIC_t *Channel, u8 errCode); // 显示Err
|
||||||
|
static void Display_Fun(IIC_t *Channel, u8 funCode); // 显示Fun
|
||||||
|
static void Display_Num(IIC_t *Channel, u16 num); // 显示数字
|
||||||
|
static void Display_IDLE(IIC_t *Channel); // 显示----
|
||||||
|
static void Display_OFF(IIC_t *Channel); // 显示OFF
|
||||||
|
static void Display_Close(IIC_t *Channel); // 显示关闭
|
||||||
|
|
||||||
|
void TM1650_Display(IIC_t *Channel, u16 Value, u16 dot); // 显示使能
|
||||||
|
|
||||||
|
TM1650_t TM1650 = {1, Init, Display_Err, Display_Fun, Display_Num, Display_OFF, Display_IDLE, Display_Close};
|
||||||
|
|
||||||
|
static void Init(void) {
|
||||||
|
TM1650_Set(&IIC, 0x48, 0x31); // 打开通道1 设置亮度3级 开显示
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Display_Err(IIC_t *Channel, u8 errCode) {
|
||||||
|
TM1650_Set(Channel, DIG1, tab[13]); // 第一位显示E
|
||||||
|
TM1650_Set(Channel, DIG2, tab[14]); // 第二位显示r
|
||||||
|
TM1650_Set(Channel, DIG3, tab[14]); // 第三位显示r
|
||||||
|
TM1650_Set(Channel, DIG4, tab[errCode % 10]); // 第四位显示数字
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Display_Fun(IIC_t *Channel, u8 funCode) {
|
||||||
|
TM1650_Set(Channel, DIG1, tab[12]); // 第一位显示F
|
||||||
|
TM1650_Set(Channel, DIG2, tab[15]); // 第二位显示u
|
||||||
|
TM1650_Set(Channel, DIG3, tab[16]); // 第三位显示n
|
||||||
|
TM1650_Set(Channel, DIG4, tab[funCode % 10]); // 第四位显示数字
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Display_Num(IIC_t *Channel, u16 num) {
|
||||||
|
TM1650_Set(Channel, DIG1, tab[(num % 10000) / 1000]); // 第一位数字
|
||||||
|
TM1650_Set(Channel, DIG2, tab[(num % 1000) / 100]); // 第二位数字
|
||||||
|
TM1650_Set(Channel, DIG3, tab[(num % 100) / 10]); // 第三位数字
|
||||||
|
TM1650_Set(Channel, DIG4, tab[(num % 10)]); // 第四位数字
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Display_IDLE(IIC_t *Channel) {
|
||||||
|
TM1650_Set(Channel, DIG1, tab[11]); // 第一位显示-
|
||||||
|
TM1650_Set(Channel, DIG2, tab[11]); // 第二位显示-
|
||||||
|
TM1650_Set(Channel, DIG3, tab[11]); // 第三位显示-
|
||||||
|
TM1650_Set(Channel, DIG4, tab[11]); // 第四位显示-
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Display_OFF(IIC_t *Channel) {
|
||||||
|
TM1650_Set(Channel, DIG1, tab[10]); // 第一位显示关闭
|
||||||
|
TM1650_Set(Channel, DIG2, tab[0]); // 第二位显示O
|
||||||
|
TM1650_Set(Channel, DIG3, tab[12]); // 第三位显示F
|
||||||
|
TM1650_Set(Channel, DIG4, tab[12]); // 第四位显示F
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Display_Close(IIC_t *Channel) {
|
||||||
|
TM1650_Set(Channel, DIG1, tab[10]); // 关闭显示
|
||||||
|
TM1650_Set(Channel, DIG2, tab[10]); // 关闭显示
|
||||||
|
TM1650_Set(Channel, DIG3, tab[10]); // 关闭显示
|
||||||
|
TM1650_Set(Channel, DIG4, tab[10]); // 关闭显示
|
||||||
|
}
|
||||||
|
|
||||||
|
static void TM1650_Set(IIC_t *Channel, u8 Add, u8 Value) {
|
||||||
|
IIC_t *const COM = Channel;
|
||||||
|
|
||||||
|
COM->start(); // iic开始
|
||||||
|
COM->write(Add); // iic写功能或者地址
|
||||||
|
COM->ACK(); // 等待应答信号
|
||||||
|
COM->write(Value); // iic写设置数据或显示数据
|
||||||
|
COM->ACK(); // 等待应答信号
|
||||||
|
COM->stop(); // iic停止
|
||||||
|
}
|
34
App/TM1650.h
Normal file
34
App/TM1650.h
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* TM1650.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月16日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __TM1650_H
|
||||||
|
#define __TM1650_H
|
||||||
|
|
||||||
|
#include "IIC.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define DIG1 0x68
|
||||||
|
#define DIG2 0x6A
|
||||||
|
#define DIG3 0x6C
|
||||||
|
#define DIG4 0x6E
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u8 Flicker_Flag;
|
||||||
|
void (*Init)(void);
|
||||||
|
|
||||||
|
void (*Display_Err)(IIC_t *, u8);
|
||||||
|
void (*Display_Fun)(IIC_t *, u8);
|
||||||
|
void (*Display_Num)(IIC_t *, u16);
|
||||||
|
|
||||||
|
void (*Display_OFF)(IIC_t *);
|
||||||
|
void (*Display_IDLE)(IIC_t *);
|
||||||
|
void (*Display_Close)(IIC_t *);
|
||||||
|
} TM1650_t;
|
||||||
|
|
||||||
|
extern TM1650_t TM1650;
|
||||||
|
|
||||||
|
#endif
|
32
App/config.h
Normal file
32
App/config.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
#ifndef __CONFIG_H
|
||||||
|
#define __CONFIG_H
|
||||||
|
|
||||||
|
/*********************************************************/
|
||||||
|
|
||||||
|
// #define MAIN_Fosc 22118400L // 定义主时钟
|
||||||
|
// #define MAIN_Fosc 12000000L // 定义主时钟
|
||||||
|
// #define MAIN_Fosc 11059200L // 定义主时钟
|
||||||
|
// #define MAIN_Fosc 5529600L // 定义主时钟
|
||||||
|
// #define MAIN_Fosc 24000000L // 定义主时钟
|
||||||
|
#define MAIN_Fosc 20000000L // 定义主时钟
|
||||||
|
|
||||||
|
/*********************************************************/
|
||||||
|
|
||||||
|
#include "STC15Fxxxx.H"
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
|
||||||
|
#define Main_Fosc_KHZ (MAIN_Fosc / 1000)
|
||||||
|
|
||||||
|
/***********************************************************/
|
||||||
|
|
||||||
|
// 数据类型重定义
|
||||||
|
|
||||||
|
#define HIGH 1
|
||||||
|
#define LOW 0
|
||||||
|
|
||||||
|
#define UP 1
|
||||||
|
#define DOWN 0
|
||||||
|
|
||||||
|
#endif
|
40
App/delay.c
Normal file
40
App/delay.c
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
/* --- STC MCU International Limited ----------------------------------*/
|
||||||
|
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
|
||||||
|
/* --- Mobile: (86)13922805190 ----------------------------------------*/
|
||||||
|
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
|
||||||
|
/* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/
|
||||||
|
/* --- Web: www.GXWMCU.com --------------------------------------------*/
|
||||||
|
/* --- QQ: 800003751 -------------------------------------------------*/
|
||||||
|
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */
|
||||||
|
/*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
/************* 功能说明 **************
|
||||||
|
|
||||||
|
本文件为STC15xxx系列的延时程序,用户几乎可以不修改这个程序.
|
||||||
|
|
||||||
|
******************************************/
|
||||||
|
|
||||||
|
#include "delay.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: void delay_ms(unsigned char ms)
|
||||||
|
// 描述: 延时函数。
|
||||||
|
// 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
|
||||||
|
// 返回: none.
|
||||||
|
// 版本: VER1.0
|
||||||
|
// 日期: 2013-4-1
|
||||||
|
// 备注:
|
||||||
|
//========================================================================
|
||||||
|
void delay_ms(unsigned char ms)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
do{
|
||||||
|
i = MAIN_Fosc / 13000;
|
||||||
|
while(--i) ; //14T per loop
|
||||||
|
}while(--ms);
|
||||||
|
}
|
9
App/delay.h
Normal file
9
App/delay.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
#ifndef __DELAY_H
|
||||||
|
#define __DELAY_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
void delay_ms(unsigned char ms);
|
||||||
|
|
||||||
|
#endif
|
17
App/main.c
Normal file
17
App/main.c
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* main.c
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月16日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主函数
|
||||||
|
*/
|
||||||
|
void main() {
|
||||||
|
init();
|
||||||
|
|
||||||
|
while (1) core();
|
||||||
|
}
|
16
App/main.h
Normal file
16
App/main.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* main.h
|
||||||
|
*
|
||||||
|
* Created on: 2023年5月16日
|
||||||
|
* Author: User
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _MAIN_H_
|
||||||
|
#define _MAIN_H_
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
void init();
|
||||||
|
void core();
|
||||||
|
|
||||||
|
#endif
|
108
App/timer.c
Normal file
108
App/timer.c
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
|
||||||
|
/************* 功能说明 **************
|
||||||
|
|
||||||
|
本文件为STC15xxx系列的定时器初始化和中断程序,用户可以在这个文件中修改自己需要的中断程序.
|
||||||
|
|
||||||
|
|
||||||
|
******************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
#include "Stepper.h"
|
||||||
|
#include "Key.h"
|
||||||
|
|
||||||
|
/********************* Timer0中断函数************************/
|
||||||
|
void timer0_int (void) interrupt TIMER0_VECTOR
|
||||||
|
{
|
||||||
|
Stepper_ISR();
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************* Timer1中断函数************************/
|
||||||
|
void timer1_int (void) interrupt TIMER1_VECTOR
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************* Timer2中断函数************************/
|
||||||
|
void timer2_int (void) interrupt TIMER2_VECTOR
|
||||||
|
{
|
||||||
|
KEY_ISR();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//========================================================================
|
||||||
|
// 函数: u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
|
||||||
|
// 描述: 定时器初始化程序.
|
||||||
|
// 参数: TIMx: 结构参数,请参考timer.h里的定义.
|
||||||
|
// 返回: 成功返回0, 空操作返回1,错误返回2.
|
||||||
|
// 版本: V1.0, 2012-10-22
|
||||||
|
//========================================================================
|
||||||
|
u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx)
|
||||||
|
{
|
||||||
|
if(TIM > Timer2) return 1; //空操作
|
||||||
|
|
||||||
|
if(TIM == Timer0)
|
||||||
|
{
|
||||||
|
TR0 = 0; //停止计数
|
||||||
|
if(TIMx->TIM_Interrupt == ENABLE) ET0 = 1; //允许中断
|
||||||
|
else ET0 = 0; //禁止中断
|
||||||
|
if(TIMx->TIM_Polity == PolityHigh) PT0 = 1; //高优先级中断
|
||||||
|
else PT0 = 0; //低优先级中断
|
||||||
|
if(TIMx->TIM_Mode > TIM_16BitAutoReloadNoMask) return 2; //错误
|
||||||
|
TMOD = (TMOD & ~0x03) | TIMx->TIM_Mode; //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装, 3: 16位自动重装, 不可屏蔽中断
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_12T) AUXR &= ~0x80; //12T
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_1T) AUXR |= 0x80; //1T
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_Ext) TMOD |= 0x04; //对外计数或分频
|
||||||
|
else TMOD &= ~0x04; //定时
|
||||||
|
if(TIMx->TIM_ClkOut == ENABLE) INT_CLKO |= 0x01; //输出时钟
|
||||||
|
else INT_CLKO &= ~0x01; //不输出时钟
|
||||||
|
|
||||||
|
TH0 = (u8)(TIMx->TIM_Value >> 8);
|
||||||
|
TL0 = (u8)TIMx->TIM_Value;
|
||||||
|
if(TIMx->TIM_Run == ENABLE) TR0 = 1; //开始运行
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
|
||||||
|
if(TIM == Timer1)
|
||||||
|
{
|
||||||
|
TR1 = 0; //停止计数
|
||||||
|
if(TIMx->TIM_Interrupt == ENABLE) ET1 = 1; //允许中断
|
||||||
|
else ET1 = 0; //禁止中断
|
||||||
|
if(TIMx->TIM_Polity == PolityHigh) PT1 = 1; //高优先级中断
|
||||||
|
else PT1 = 0; //低优先级中断
|
||||||
|
if(TIMx->TIM_Mode >= TIM_16BitAutoReloadNoMask) return 2; //错误
|
||||||
|
TMOD = (TMOD & ~0x30) | TIMx->TIM_Mode; //工作模式,0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_12T) AUXR &= ~0x40; //12T
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_1T) AUXR |= 0x40; //1T
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_Ext) TMOD |= 0x40; //对外计数或分频
|
||||||
|
else TMOD &= ~0x40; //定时
|
||||||
|
if(TIMx->TIM_ClkOut == ENABLE) INT_CLKO |= 0x02; //输出时钟
|
||||||
|
else INT_CLKO &= ~0x02; //不输出时钟
|
||||||
|
|
||||||
|
TH1 = (u8)(TIMx->TIM_Value >> 8);
|
||||||
|
TL1 = (u8)TIMx->TIM_Value;
|
||||||
|
if(TIMx->TIM_Run == ENABLE) TR1 = 1; //开始运行
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
|
||||||
|
if(TIM == Timer2) //Timer2,固定为16位自动重装, 中断无优先级
|
||||||
|
{
|
||||||
|
AUXR &= ~(1<<4); //停止计数
|
||||||
|
if(TIMx->TIM_Interrupt == ENABLE) IE2 |= (1<<2); //允许中断
|
||||||
|
else IE2 &= ~(1<<2); //禁止中断
|
||||||
|
if(TIMx->TIM_ClkSource > TIM_CLOCK_Ext) return 2;
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_12T) AUXR &= ~(1<<2); //12T
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_1T) AUXR |= (1<<2); //1T
|
||||||
|
if(TIMx->TIM_ClkSource == TIM_CLOCK_Ext) AUXR |= (1<<3); //对外计数或分频
|
||||||
|
else AUXR &= ~(1<<3); //定时
|
||||||
|
if(TIMx->TIM_ClkOut == ENABLE) INT_CLKO |= 0x04; //输出时钟
|
||||||
|
else INT_CLKO &= ~0x04; //不输出时钟
|
||||||
|
|
||||||
|
TH2 = (u8)(TIMx->TIM_Value >> 8);
|
||||||
|
TL2 = (u8)TIMx->TIM_Value;
|
||||||
|
if(TIMx->TIM_Run == ENABLE) AUXR |= (1<<4); //开始运行
|
||||||
|
return 0; //成功
|
||||||
|
}
|
||||||
|
return 2; //错误
|
||||||
|
}
|
35
App/timer.h
Normal file
35
App/timer.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
|
||||||
|
#ifndef __TIMER_H
|
||||||
|
#define __TIMER_H
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#define Timer0 0
|
||||||
|
#define Timer1 1
|
||||||
|
#define Timer2 2
|
||||||
|
#define Timer3 3
|
||||||
|
#define Timer4 4
|
||||||
|
|
||||||
|
#define TIM_16BitAutoReload 0
|
||||||
|
#define TIM_16Bit 1
|
||||||
|
#define TIM_8BitAutoReload 2
|
||||||
|
#define TIM_16BitAutoReloadNoMask 3
|
||||||
|
|
||||||
|
#define TIM_CLOCK_1T 0
|
||||||
|
#define TIM_CLOCK_12T 1
|
||||||
|
#define TIM_CLOCK_Ext 2
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u8 TIM_Mode; //工作模式, TIM_16BitAutoReload,TIM_16Bit,TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
|
||||||
|
u8 TIM_Polity; //优先级设置 PolityHigh,PolityLow
|
||||||
|
u8 TIM_Interrupt; //中断允许 ENABLE,DISABLE
|
||||||
|
u8 TIM_ClkSource; //时钟源 TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
|
||||||
|
u8 TIM_ClkOut; //可编程时钟输出, ENABLE,DISABLE
|
||||||
|
u16 TIM_Value; //装载初值
|
||||||
|
u8 TIM_Run; //是否运行 ENABLE,DISABLE
|
||||||
|
} TIM_InitTypeDef;
|
||||||
|
|
||||||
|
u8 Timer_Inilize(u8 TIM, TIM_InitTypeDef *TIMx);
|
||||||
|
|
||||||
|
#endif
|
@ -49,7 +49,7 @@
|
|||||||
<OutputName>BLTouchTest</OutputName>
|
<OutputName>BLTouchTest</OutputName>
|
||||||
<CreateExecutable>1</CreateExecutable>
|
<CreateExecutable>1</CreateExecutable>
|
||||||
<CreateLib>0</CreateLib>
|
<CreateLib>0</CreateLib>
|
||||||
<CreateHexFile>0</CreateHexFile>
|
<CreateHexFile>1</CreateHexFile>
|
||||||
<DebugInformation>1</DebugInformation>
|
<DebugInformation>1</DebugInformation>
|
||||||
<BrowseInformation>1</BrowseInformation>
|
<BrowseInformation>1</BrowseInformation>
|
||||||
<ListingPath>.\Listings\</ListingPath>
|
<ListingPath>.\Listings\</ListingPath>
|
||||||
@ -383,6 +383,76 @@
|
|||||||
</File>
|
</File>
|
||||||
</Files>
|
</Files>
|
||||||
</Group>
|
</Group>
|
||||||
|
<Group>
|
||||||
|
<GroupName>App</GroupName>
|
||||||
|
<Files>
|
||||||
|
<File>
|
||||||
|
<FileName>delay.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\delay.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>timer.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\timer.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>GPIO.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\GPIO.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Exti.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\Exti.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>PCA.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\PCA.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>main.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\main.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Core.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\Core.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>IIC.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\IIC.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>TM1650.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\TM1650.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>BLTouch.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\BLTouch.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Stepper.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\Stepper.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>EndStop.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\EndStop.c</FilePath>
|
||||||
|
</File>
|
||||||
|
<File>
|
||||||
|
<FileName>Key.c</FileName>
|
||||||
|
<FileType>1</FileType>
|
||||||
|
<FilePath>.\App\Key.c</FilePath>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
|
</Group>
|
||||||
</Groups>
|
</Groups>
|
||||||
</Target>
|
</Target>
|
||||||
</Targets>
|
</Targets>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user