|

楼主 |
发表于 2025-1-8 09:46:15
|
显示全部楼层
我也做个板子解决淘汰共享干衣架实现倒计时(STC15W408AS)
https://www.mydigit.cn/forum.php ... &fromuid=806097
(出处: 数码之家)
看到坛友分享的源码我也分享一下
//Project: GXYJFMD.prj
// Device: FT61FC4X
// Memory: Flash 4KX14b, EEPROM 128X8b, SRAM 512X8b
// Author: bg4rff
//Company: aponjjz
//Version: 0.1
// Date: 2024.11.21
//===========================================================
/* FT61FC43-RB SOP16
* ----------------
* VDD-----------|1(VDD) (GND)16|------------GND
* Led3Out-------|2(PB4) (PB7)15|--------Smg1Out
* Led2Out-------|3(PB3) (PC1)14|--------Smg2Out
* Led1Out-------|4(PB2) (PA7)13|--------Smg3Out
* Key1IN--------|5(PB1) (PA6)12|--------Smg4Out
|-----Key2IN--------|6(PB0) (PA2)11|--------Smg5Out
|Key4-Key3IN--------|7(PA0) (PB6)10|--------Smg6Out
* HeatOut-------|8(PA1) (PA4)09|---------FanOut
* ----------------
*/
//===========================================================
#include "SYSCFG.h"
//===========================================================
//***********************宏定义****************************
#define uint8_t unsigned char
#define uint16_t unsigned int
#define uint32_t unsigned long
#define Led1Out PB2
#define Led2Out PB3
#define Led3Out PB4
#define Key1In PB1
#define Key2In PB0
#define Key3In PA0
#define Key2Out_L() WPUB&=~0x01;TRISB0=0;Key2In=0
#define Key2In_U() TRISB0=1;WPUB|=0x01
#define Key3Out_L() WPUA&=0x01;TRISA0=0;Key3In=0
#define Key3In_U() TRISA0=1;WPUA|=0x01
#define FanOut PA4
#define HeatOut PA1
#define Smg1Out PB7
#define Smg2Out PC1
#define Smg3Out PA7
#define Smg4Out PA6
#define Smg5Out PA2
#define Smg6Out PB6
#define Smg1Out_In() TRISB7=1
#define Smg2Out_In() TRISC1=1
#define Smg3Out_In() TRISA7=1
#define Smg4Out_In() TRISA6=1
#define Smg5Out_In() TRISA2=1
#define Smg6Out_In() TRISB6=1
#define Smg1Out_H() TRISB7=0;Smg1Out=1
#define Smg2Out_H() TRISC1=0;Smg2Out=1
#define Smg3Out_H() TRISA7=0;Smg3Out=1
#define Smg4Out_H() TRISA6=0;Smg4Out=1
#define Smg5Out_H() TRISA2=0;Smg5Out=1
#define Smg6Out_H() TRISB6=0;Smg6Out=1
#define Smg1Out_L() TRISB7=0;Smg1Out=0
#define Smg2Out_L() TRISC1=0;Smg2Out=0
#define Smg3Out_L() TRISA7=0;Smg3Out=0
#define Smg4Out_L() TRISA6=0;Smg4Out=0
#define Smg5Out_L() TRISA2=0;Smg5Out=0
#define Smg6Out_L() TRISB6=0;Smg6Out=0
//Variable definition
volatile char W_TMP @ 0x70 ;//系统占用不可以删除和修改
volatile char BSR_TMP @ 0x71 ;//系统占用不可以删除和修改
void user_isr();//用户中断程序,不可删除
//===========================================================
uint8_t D_t_4ms=0;
uint8_t D_t_1S=0;
uint8_t D_t_1Min=0;
uint8_t D_r_hour=3;//默认3小时
uint8_t D_r_Min=00;
uint8_t D_r_mod=0;//默认不允许
uint32_t Dispbuf=0x00000000;
uint8_t D_Smg[4]={0x0a,0x0a,0x00,0x00};//初始显示nn00
//0123456789n //
//4位数码管对应的码段
uint32_t Segment[4][12]={
//0 1 2 3 4 5 6 7 8 9 n
{0x000F8020,0x00088000,0x000D0028,0x00098028,0x000A8008,0x00038028,0x00078028,0x00098000,0x000F8028,0x000B8028,0x00048008,0x00000000},
{0X00700380,0X00000280,0X006001C0,0X004003C0,0X001002C0,0X00500340,0X00700340,0X00000380,0X007003C0,0X005003C0,0X00200240,0x00000000},
{0X00807C00,0X00800400,0X01006C00,0X01804C00,0X01801400,0X01805800,0X01807800,0X00800C00,0X01807C00,0X01805C00,0X01802000,0x00000000},
{0X3C000014,0X04000004,0X2E000010,0X0E000014,0X16000004,0X1A000014,0X3A000014,0X0C000004,0X3E000014,0X1E000014,0X22000004,0x00000000 }
};
uint32_t Sec_Dot=0X00000000;//秒点对应的码段
bit Tset_idx=0;
bit Runing=0;
//更新显存
void Disp_Scan(void);
void RefleshDispData(void)
{
Dispbuf=0;
Dispbuf=Segment[0][D_Smg[0]]|Segment[1][D_Smg[1]]|Segment[2][D_Smg[2]]|Segment[3][D_Smg[3]]|Sec_Dot;
}
uint8_t machinestep=0;
//===========================================================
//Function name:interrupt ISR
//parameters:无
//returned value:无
//===========================================================
void interrupt ISR(void)
{
#asm;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
NOP;//系统设置不可以删除和修改
#endasm;//系统设置不可以删除和修改
user_isr(); //用户中断函数
}
void user_isr() //用户中断函数
{
if(T2UIE && T2UIF)
{
T2UIF = 1; //写1清零标志位
if(++D_t_4ms>=4)
{
D_t_4ms=0;
if(Runing)
{
if(D_t_1S==0)
{
Sec_Dot=0X00000003;
RefleshDispData();
}
if(D_t_1S==125)
{
Sec_Dot=0X00000000;
RefleshDispData();
}
if(++D_t_1S>250)
{
D_t_1S=0;
if(++D_t_1Min>60)
{
D_t_1Min=0;
if(D_r_Min>0)
{
D_r_Min--;
D_Smg[2]=(D_r_Min/10)%10;
D_Smg[3]=D_r_Min%10;
RefleshDispData();
}
else
{
if(D_r_hour>0)
{
D_r_hour--;
D_r_Min=59;
D_Smg[0]=(D_r_hour/10)%10;
D_Smg[1]=D_r_hour%10;
D_Smg[2]=(D_r_Min/10)%10;
D_Smg[3]=D_r_Min%10;
RefleshDispData();
}
}
if((D_r_hour==0)&&(D_r_Min==0))
{
if(D_r_mod!=3) //非3,延时吹风冷却3分钟
{
D_r_mod=3;
Led2Out=1;
FanOut=1;
Led3Out=0;
HeatOut=0;
D_r_Min=3;
D_Smg[0]=(D_r_hour/10)%10;
D_Smg[1]=D_r_hour%10;
D_Smg[2]=(D_r_Min/10)%10;
D_Smg[3]=D_r_Min%10;
RefleshDispData();
}
else
{
Led2Out=0;
FanOut=0;
Led3Out=0;
HeatOut=0;
machinestep=0;
D_r_mod=0;
D_Smg[0]=10;//n
D_Smg[1]=10;//n
D_Smg[2]=D_r_mod/10;
D_Smg[3]=D_r_mod%10;
Sec_Dot=0X00000000;
Runing=0;
RefleshDispData();
}
}
else
{
if(D_r_mod==2)
{
if((D_r_Min%5)==0)//防止继电器过分频繁,继电器5分钟跳
{
Led3Out=!Led3Out;
HeatOut=!HeatOut;
}
}
}
}
}
}
Disp_Scan();
}
}
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //16MHz 1:1
INTCON = 0B01000000; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B11000101; //PA输入输出 0-输出 1-输入 PA7 PA6 PA2 PA0
PORTB = 0B00000000;
TRISB = 0B11000011; //PB输入输出 0-输出 1-输入 PB7 PB6 PB1 PB0
PORTC = 0B00000000;
TRISC = 0B00000010; //PC输入输出 0-输出 1-输入 PC1
WPUA = 0B00000001; //PA端口上拉控制 1-开上拉 0-关上拉 PA0->上拉
WPUB = 0B00000011; //PB端口上拉控制 1-开上拉 0-关上拉 PB1PB0->上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
WPDA = 0B00000000; //PA端口下拉控制 1-开下拉 0-关下拉
WPDB = 0B00000000; //PB端口下拉控制 1-开下拉 0-关下拉
WPDC = 0B00000000; //PC端口下拉控制 1-开下拉 0-关下拉
PSRC0 = 0B11111111; //PORTA 源电流设置最大 0:最小,1:最大
PSRC1 = 0B11111111; //PORTB 源电流设置最大 0:最小,1:最大
PSRC2 = 0B11111111; //PORTC 源电流设置最大 00:最小 11:最大
PSINK0 = 0B11111111; //PORTA 灌电流设置最大 0:最小,1:最大
PSINK1 = 0B11111111; //PORTB 灌电流设置最大 0:最小,1:最大
PSINK2 = 0B11111111; //PORTC 灌电流设置最大 0:最小,1:最大
ANSELA = 0B00000000; //全为数字管脚
}
/*-------------------------------------------------
* 函数名:TIMER2_INIT
* 功能: TIME2初始化
* 输入: 无
* 输出: 无
-------------------------------------------------*/
void Time2Initial(void)
{
PCKEN |= 0B00000100; //使能timer2时钟模块
CKOCON = 0B00100000;
TCKSRC = 0B00000000; //TIM2时钟系统时钟
//Bit7: 低频内振模式: 1 = 256K 振荡频率模式,0 = 32K 振荡频率模式
//Bit[6:4]:TIM2时钟源选择位
//值 时钟源
//0 系统时钟/主时钟
//1 HIRC
//2 XT时钟/外部时钟
//3 HIRC的2倍频
//4 XT时钟/外部时钟的2倍频
//5 LIRC
//6 LP时钟/外部时钟
//7 LP时钟/外部时钟的2位频
//Bit3: 保留位
//Bit[2:1]:TIM1时钟源选择位
//值 时钟源
//0 系统时钟/主时钟
//1 HIRC
//2 XT时钟/外部时钟
//3 HIRC的2倍频
//4 XT时钟/外部时钟的2倍频
//5 LIRC
//6 LP时钟/外部时钟
//7 LP时钟/外部时钟的2位频
TIM2CR1 =0B10000101; //预载允许,边沿对齐向上计数器,计数器使能
//Bit7:自动预装载允许位
//0: TIM2_ARR寄存器没有缓冲,它可以被直接写入;
//1: TIM2_ARR寄存器由预装载缓冲器缓冲。
//Bit[6:4]:保留位
//Bit3:单脉冲模式
//0: 在发生更新事件时,计数器不停止;
//1: 在发生下一次更新事件(清除CEN位)时,计数器停止。
//Bit2:更新请求源
//0: 如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断:
//寄存器被更新(计数器上溢/下溢)
//1: 如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1:
//寄存器被更新(计数器上溢/下溢)
//Bit1:禁止更新
//0: 一旦下列事件发生,产生更新(UEV)事件:
//计数器溢出/下溢
//产生软件更新事件
//1: 不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。
//Bit0:允许计数器
//0: 禁止计数器;
//1: 使能计数器。
TIM2IER =0B00000001;
//Bit[7:4]: 保留位
//Bit3: 允许捕获/比较3中断
//0: 禁止捕获/比较3中断;
//1: 允许捕获/比较3中断。
//Bit2: 允许捕获/比较2中断
//0: 禁止捕获/比较2中断;
//1: 允许捕获/比较2中断。
//Bit1: 允许捕获/比较1中断
//0: 禁止捕获/比较1中断;
//1: 允许捕获/比较1中断。
//Bit0: 允许更新中断
//0: 禁止更新中断;
//1: 允许更新中断。
TIM2ARRH =0x3e; //自动重载16000,周期1k
TIM2ARRL =0x80;
GIE =1; //开总中断
}
/*-------------------------------------------------
* 函数名称:DelayUs
* 功能: 短延时函数 --16M-2T--大概快1%左右.
* 输入参数:Time延时时间长度 延时时长Time Us
* 返回参数:无
-------------------------------------------------*/
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
/*-------------------------------------------------
* 函数名称:DelayMs
* 功能: 短延时函数
* 输入参数:Time延时时间长度 延时时长Time ms
* 返回参数:无
-------------------------------------------------*/
void DelayMs(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(197); //快1%
}
}
}
/*-------------------------------------------------
* 函数名称:消隐函数
* 功能: 数码管输出脚全部为输入
* 输入参数: 无
* 返回参数:无
-------------------------------------------------*/
void Disp_off(void)
{
Smg1Out_In();
Smg2Out_In();
Smg3Out_In();
Smg4Out_In();
Smg5Out_In();
Smg6Out_In();
}
/*-------------------------------------------------
* 函数名称:显示扫描函数
* 功能: 分节拍扫描
* 输入参数: 无
* 返回参数:无
-------------------------------------------------*/
void Disp_Scan(void)
{
static uint8_t SStep;
Disp_off();
//RefleshDispData();
switch(SStep)
{
case 0:
if(Dispbuf&0x00000001)Smg2Out_H();
if(Dispbuf&0x00000002)Smg3Out_H();
if(Dispbuf&0x00000004)Smg4Out_H();
if(Dispbuf&0x00000008)Smg5Out_H();
if(Dispbuf&0x00000010)Smg6Out_H();
Smg1Out_L();
SStep++;
break;
case 1:
if(Dispbuf&0x00000020)Smg1Out_H();
if(Dispbuf&0x00000040)Smg3Out_H();
if(Dispbuf&0x00000080)Smg4Out_H();
if(Dispbuf&0x00000100)Smg5Out_H();
if(Dispbuf&0x00000200)Smg6Out_H();
Smg2Out_L();
SStep++;
break;
case 2:
if(Dispbuf&0x00000400)Smg1Out_H();
if(Dispbuf&0x00000800)Smg2Out_H();
if(Dispbuf&0x00001000)Smg4Out_H();
if(Dispbuf&0x00002000)Smg5Out_H();
if(Dispbuf&0x00004000)Smg6Out_H();
Smg3Out_L();
SStep++;
break;
case 3:
if(Dispbuf&0x00008000)Smg1Out_H();
if(Dispbuf&0x00010000)Smg2Out_H();
if(Dispbuf&0x00020000)Smg3Out_H();
if(Dispbuf&0x00040000)Smg5Out_H();
if(Dispbuf&0x00080000)Smg6Out_H();
Smg4Out_L();
SStep++;
break;
case 4:
if(Dispbuf&0x00100000)Smg1Out_H();
if(Dispbuf&0x00200000)Smg2Out_H();
if(Dispbuf&0x00400000)Smg3Out_H();
if(Dispbuf&0x00800000)Smg4Out_H();
if(Dispbuf&0x01000000)Smg6Out_H();
Smg5Out_L();
SStep++;
break;
case 5:
if(Dispbuf&0x02000000)Smg1Out_H();
if(Dispbuf&0x04000000)Smg2Out_H();
if(Dispbuf&0x08000000)Smg3Out_H();
if(Dispbuf&0x10000000)Smg4Out_H();
if(Dispbuf&0x20000000)Smg5Out_H();
Smg6Out_L();
SStep=0;
break;
default:
SStep=0;
break;
}
}
//===========================================================
//Function name:main
//parameters:无
//returned value:无
//===========================================================
main()
{
POWER_INITIAL(); //系统初始化
Time2Initial();
RefleshDispData();
while(1)
{
switch(machinestep)
{
case 0://初始模式选择,1全风全暖,2全风半暖,3全风不暖
if(D_r_mod>0)
{
if(Key3In == 1)//K4
{
Key2Out_L();
if(Key3In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key3In == 0)
{
Key2In_U();
Key3Out_L();
if(Key2In==0)
{
while(Key2In==0);//松手检测,松后后执行
machinestep=1;
D_r_hour=3;
D_r_Min=0;
D_Smg[0]=D_r_hour/10;
D_Smg[1]=D_r_hour%10;
D_Smg[2]=D_r_Min/10;
D_Smg[3]=D_r_Min%10;
Sec_Dot=0X00000001;
Runing=0;
Tset_idx=0;
RefleshDispData();
}
Key3In_U();
}
}
Key2In_U();
}
}
if(Key1In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key1In == 0)
{
while(Key1In==0);//松手检测,松后执行
if(++D_r_mod>3) D_r_mod=0;
machinestep=0;
D_Smg[0]=10;//n
D_Smg[1]=10;//n
D_Smg[2]=D_r_mod/10;
D_Smg[3]=D_r_mod%10;
Sec_Dot=0X00000000;
Runing=0;
RefleshDispData();
}
}
break;
case 1://工作时间调节
if(Key1In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key1In == 0)
{
while(Key1In==0);//松手检测,松后后执行
D_r_mod++;
machinestep=0;
D_Smg[0]=10;//n
D_Smg[1]=10;//n
D_Smg[2]=D_r_mod/10;
D_Smg[3]=D_r_mod%10;
Sec_Dot=0X00000000;
Runing=0;
RefleshDispData();
}
}
if(Key2In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key2In == 0)
{
while(Key2In==0);//松手检测,松后后执行
if(Tset_idx)
{
if(++D_r_Min>59) D_r_Min=0;
Sec_Dot=0X00000002;
}
else
{
if(++D_r_hour>7) D_r_hour=0;
Sec_Dot=0X00000001;
}
machinestep=1;
D_Smg[0]=(D_r_hour/10)%10;
D_Smg[1]=D_r_hour%10;
D_Smg[2]=(D_r_Min/10)%10;
D_Smg[3]=D_r_Min%10;
Runing=0;
RefleshDispData();
}
}
if(Key3In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key3In == 0)
{
while(Key3In==0);//松手检测,松后后执行
if(Tset_idx)
{
Sec_Dot=0X00000001;
Tset_idx=0;
}
else
{
Tset_idx=1;
Sec_Dot=0X00000002;
}
RefleshDispData();
}
}
if(D_r_mod>0)
{
if(Key3In == 1)//K4
{
Key2Out_L();
if(Key3In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key3In == 0)
{
Key2In_U();
Key3Out_L();
if(Key2In==0)
{
while(Key2In==0);//松手检测,松后后执行
machinestep=2;
Runing=1;
Led2Out=1;
FanOut=1;
Led3Out=1;
HeatOut=1;
if(D_r_mod==3)
{
Led3Out=0;
HeatOut=0;
}
}
Key3In_U();
}
}
Key2In_U();
}
}
break;
case 2://运行
if(Key1In == 0) //判断输入是否为低电平
{
DelayMs(10); //延时一下 防抖动
if(Key1In == 0)
{
while(Key1In==0);//松手检测,松后后执行
Led2Out=0;
FanOut=0;
Led3Out=0;
HeatOut=0;
D_Smg[0]=10;//n
D_Smg[1]=10;//n
D_Smg[2]=D_r_mod/10;
D_Smg[3]=D_r_mod%10;
Sec_Dot=0X00000000;
Runing=0;
machinestep=0;
RefleshDispData();
}
}
break;
// case 3:
// break;
// case 4:
// break;
// case 5:
// break;
default:
Led2Out=0;
FanOut=0;
Led3Out=0;
HeatOut=0;
machinestep=0;
break;
}
}
}
//=========================================================== |
|