- 打卡等级:常住居民III
- 打卡总天数:134
- 最近打卡:2026-04-29 08:42:58
高级会员
- 积分
- 793
|
芯片用STC32G12K128 有更适合更好
#include "STC32G.h"
框架如下:
//==================== 引脚定义 ====================
// 8相激励输出(对应40指动栅)
#define EXC1 P10
#define EXC2 P11
#define EXC3 P12
#define EXC4 P13
#define EXC5 P14
#define EXC6 P15
#define EXC7 P16
#define EXC8 P17
// 2路正交信号输入
#define SIGA P20
#define SIGB P21
// 按键
#define KEY_MM P30 // inch/mm
#define KEY_ON P31 // ON/OFF
#define KEY_ZERO P32 // ZERO
// LCD驱动(示例:4COM + 8SEG)
#define COM1 P00
#define COM2 P01
#define COM3 P02
#define COM4 P03
#define SEG_A P04
#define SEG_B P05
#define SEG_C P06
#define SEG_D P07
//==================== 全局变量 ====================
int32_t position = 0;
uint8_t phase = 0;
bit power_on = 1;
bit inch_mode = 0;
uint16_t idle_timer = 0;
// 段码表(0~9,LCD定义修改)
const uint8_t seg_table[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//==================== 基础函数 ====================
void delay_ms(uint16_t ms)
{
uint16_t i,j;
for(i=0;i<ms;i++)
for(j=0;j<1000;j++);
}
// 8相激励输出
void excite_drive(void)
{
EXC1=EXC2=EXC3=EXC4=EXC5=EXC6=EXC7=EXC8=0;
switch(phase)
{
case 0: EXC1=1; break;
case 1: EXC2=1; break;
case 2: EXC3=1; break;
case 3: EXC4=1; break;
case 4: EXC5=1; break;
case 5: EXC6=1; break;
case 6: EXC7=1; break;
case 7: EXC8=1; break;
}
phase = (phase + 1) % 8;
}
// 正交信号4倍频解码
void read_sensor(void)
{
static uint8_t last_a;
uint8_t a = SIGA;
uint8_t b = SIGB;
if(a != last_a)
{
if(a != b) position++;
else position--;
}
last_a = a;
}
|
|