📄 subroutine.c
字号:
#include <subroutine.h>
#include "x5045.h"
#include "CH451.h"
#include <INCLUDES.h>
void abnormal(void)
{
CF=1;JDQ=1;ET1=0;TR1=0;
timer1s=2;TR0=0;
Set_TL1=0x00;Set_TH1=0xe9;
TL1=0x00;TH1=0xe9;
if(status==zlstart)status=zlprepare;
else if(status==llstart)status=llprepare;
else status=zlprepare;
timenow=timeold;
}
void hextobcd(uchar hexs,uchar aa)
{ //hexs为输入的单字节16进制数,aa为功能
unsigned char temp[2];
unsigned char va;
unsigned char i;
va = 10; //最大数级10位
for(i=1;i;i--) {
temp[i] = 0; //目标数组清零
while ((hexs>=va)&&(va>9)) {
hexs -= va; //减除数
temp[i]++; //商位加1
}
va /= 10; //除数除10,指向低一位
}
temp[0]=hexs; //最后个位数
if(aa==2)
{stg_buff[0]=temp[0];
stg_buff[1]=temp[1];
}
else if(aa==1)
{disp_buff[0]=temp[0];
disp_buff[1]=temp[1];
}
}
void Ini_sys(void)//初始化
{
EA=0; //关中断
ET0=0; //禁止定时器0溢出中断
ET1=0; //允许定时器1溢出中断,溢出延时触发
TR1=0; //定时器1关
TR0=0; //定时器0关
EX0=1; //允许外部中断0
EX1=1; //允许外部中断1
PT1=0; //定时器1溢出中断优先
PT0=0;
PX0=1;
PX1=0;
IT0=1; //边沿触发
IT1=1; //电平触发
//----------uart & timer2 initial
SCON = 0x50; // uart in mode 1 (8 bit), REN=1
T2CON &= 0xF0; // EXEN2=0; TR2=0; C/T2#=0; CP/RL2#=0;
T2CON |= 0x30; // RCLK = 1; TCLK=1;
TH2=0xFF; // init value
TL2=0xFD; // init value
RCAP2H=0xFF; // reload value, 115200 Bds at 11.059MHz
RCAP2L=0xFD; // reload value, 115200 Bds at 11.059MHz
ES = 1; // Enable serial interrupt
TR2 = 0; // Timer 2 run
//-------------------
TMOD=0x15; //T1延时触发器,方式1; T0计数方式
Set_TL1=0x00;
Set_TH1=0xe9;
TL1=0x00;TH1=0xe9; //延时触发器初值
TL0=0x00;TH0=0x00; //脉冲宽度测量
buzzer=0; //关蜂鸣器
CF=1;JDQ=1; //关闭所有输出
status=zlprepare;
write_status(0x00); //wachdog 1.4s
clr_wchdog(); //喂狗
//-------------------
status=0x01; //status machine start status
disp_buff[2],stg_buff[2];
setsection=0; //设置分段0,1,2,3
set_power=0; //功率
timeold=0,timenow=0,sec=59; //时间
timeover=0; //时间到
settime[0]=0xff;settime[1]=0xff;
coef[0]=0x0a;coef[1]=0x0a;coef[2]=0x0a;coef[3]=0x0a;
timer1s=2;
delay=0;
//-------------------
ch451_init(); //调用初始化
ch451_write(0x403); //开键盘显示
ch451_write(0x500); //设置默认显示方式
ch451_write(CH451_DIG0|0x3f);
ch451_write(CH451_DIG1|0x3f);
ch451_write(CH451_DIG2|0x00);
ch451_write(CH451_DIG3|0x3f);
ch451_write(CH451_DIG4|0x3f);
ch451_write(CH451_DIG5|zlprepare);
EA=1; //开中断
}
void disptimpower(void) //显示时间和功率
{
hextobcd(set_power,1);
hextobcd(timenow,2);
// hextobcd(addisp,1);
ch451_write(CH451_DIG0|digit[disp_buff[1]]);
ch451_write(CH451_DIG1|digit[disp_buff[0]]);
// ch451_write(CH451_DIG2|digit[adtimenumber]);
ch451_write(CH451_DIG3|digit[stg_buff[1]]);
ch451_write(CH451_DIG4|digit[stg_buff[0]]);
if(status==llstart){
if(sec%2==0)ch451_write(CH451_DIG5|status|0x01);
else ch451_write(CH451_DIG5|status);
}
else ch451_write(CH451_DIG5|status);
}
void dispset(void) //显示设置值
{
ch451_write(CH451_DIG0|0x71);
ch451_write(CH451_DIG1|digit[setsection]);
hextobcd(coef[setsection],2); //显示系数设置
ch451_write(CH451_DIG3|digit[stg_buff[1]]|0x80);//小数点
ch451_write(CH451_DIG4|digit[stg_buff[0]]);
ch451_write(CH451_DIG5|status);
}
void delayms(uchar ms){ //在12P下延时ms毫秒
uchar i,j,k;
for(i=0;i<ms;i++)
for(j=0;j<10;j++)
for(k=0;k<90;k++);
}
void beep(uchar m,uchar n) //m次n声(0.2s)0.5s,
{
uchar i,j=0;
for(j=0;j<m;j++){ //m次0.5s
for(i=0;i<n;i++){ //n声(0.2s)
delay=40;
buzzer=1;
while(delay);
buzzer=0;
delay=40;
while(delay);
}
delay=80;
while(delay);
}
}
void statusmachin(void) //status machine
{
//status machine start
switch(status){
case zlprepare:
case llprepare:{TR0=0;CF=1;JDQ=1;TL1=0x00;TH1=0xe9;}break; //关计数器,关输出
case zlstart:{
if(timer1s>=1)timer1s--;
else{
timer1s=2;
if(timenow>=1)timenow--;
else {abnormal();timeover=1;}
}
if(set_power==0)status=zlprepare;
}
break;
case llstart:{
if(timer1s>=1)timer1s--;
else{
timer1s=2;
if(timenow>=1){
if(sec==0){sec=59;timenow--;}
else sec--;
}
else {abnormal();timeover=1;} //status change
}
if(set_power==0)status=llprepare;
}
break;
case set:{
// if(settime[0]<0x0b&&settime[0]>0){
// ch451_write(CH451_DIG2|digit[settime[0]]);
// if(settime[1]>=1)settime[1]--;
// else {
// if(settime[0]>=1){settime[0]--;settime[1]=100;}
// else {status=set;settime[0]=0;}
// }
// }
// else{ }
}break;
default:{status=zlprepare;abnormal();}//关闭所有输出
}
//status machine end
}
/*
void read_parameter_flag(void)
{
EA=0;
if(read_byte(0x020)==0xaa)
parameter_already_flag=1;
else
parameter_already_flag=0;
EA=1;
}
void write_parameter_flag(void)
{
EA=0;
write_byte(0x020,0xaa);
EA=1;
}
*/
void read_parameter(void)
{
EA=0;
coef[0]=read_byte(0x000);
coef[1]=read_byte(0x008);
coef[2]=read_byte(0x010);
coef[3]=read_byte(0x018);
EA=1;
}
void save_parameter(void)
{
EA=0;
write_byte(0x000,coef[0]);
write_byte(0x008,coef[1]);
write_byte(0x010,coef[2]);
write_byte(0x018,coef[3]);
EA=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -