大大们帮忙改改这个程序。
数码之家看到的帖子xingyuewang的帖子定时预约程序,
先解释一下这个题目,这个开关只是智能家居系统的基础部分,联网部分还在调试中,协议使用的伪Modbus(说白了就是为了适合51精简的Modbus)。等其他东西调试好了稳定了我会陆续发上来。争取会DIY各位朋友家里都能用上智能系统。
这个开关是上个月做的一直用着比较稳定,程序是吸收了前辈的精华,再加上我拙劣的编程。有好的地方大家就借鉴借鉴,不好的地方大家就当看热闹了。
硬件软件简要: 1. stc15F204 20PIN
2. 4位共阳数码管
3.剩下的硬件大家还是看图吧 没多少东西
4.程序要点段码使用不同IO的转换
5.程序要点 按键扫描使用中断实现,可以点击连按 长按这个是移植的前辈的 很好用
6.3按键用了一个ADC引脚
7.剩下的自己研究程序去吧.
我复制了一个,单片机换成stc12c5a60s2 不知道程序怎么改写!大大们帮帮忙吧,看看有没有错误
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU Programme Demo ----------------------------*/
/* --- Fax: 86-755-82944243 ----------------------------------------*/
/* --- Tel: 86-755-82948412 ----------------------------------------*/
/* --- Web: url] -----------------------------------------*/
/* If you want to use the program or the program referenced in the*/
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
/* 本程序经过测试完全正常, 不提供电话技术支持, 如不能理解, 请自行补充相关基础.*/
/************* 本程序功能说明 **************
P1.0做ADC输入,从串口输出结果(ASCII),9600,8,N,1.
用户只需要更改 MAIN_Fosc 来适应自己的系统。
******************************************/
/************* 用户系统配置 **************/
#define MAIN_Fosc 12059200L //定义主时钟, 模拟串口和和延时会自动适应。5~35MHZ
//#define T1MS (65536-MAIN_Fosc/1000) //1T模式
//#define T1MS (65536-MAIN_Fosc/12/1000) //12T模式
#define T20MS (65536-MAIN_Fosc/50) //1T模式
//#define T20MS (65536-MAIN_Fosc/12/50) //12T模式
/************* 以下宏定义用户请勿修改 **************/
#include "reg51.H"
#define uchar unsigned char
#define uint unsigned int
/******************************************/
sfr P1ASF = 0x9D; //12C5A60AD/S2系列模拟输入(AD或LVD)选择
sfr ADC_CONTR = 0xBC; //带AD系列
sfr ADC_RES = 0xBD; //带AD系列
sfr ADC_RESL= 0xBE; //带AD系列
sfr AUXR = 0x8E; //0000,0000 辅助寄存器
sfr P0M0 = 0x94; //0000,0000 端口0模式寄存器0
sfr P0M1 = 0x93; //0000,0000 端口0模式寄存器1
sfr P1M0 = 0x92; //0000,0000 端口1模式寄存器0
sfr P1M1 = 0x91; //0000,0000 端口1模式寄存器1
sfr P2M0 = 0x96; //0000,0000 端口2模式寄存器0
sfr P2M1 = 0x95; //0000,0000 端口2模式寄存器1
sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
sfr P4M0 = 0xB4; //0000,0000 端口4模式寄存器0
sfr P4M1 = 0xB3; //0000,0000 端口4模式寄存器1
sfr P5M0 = 0xCA; //0000,0000 端口5模式寄存器0
sfr P5M1 = 0xC9; //0000,0000 端口5模式寄存器1
sfr P6M0 = 0xCC; //0000,0000 端口6模式寄存器0
sfr P6M1 = 0xCB; //0000,0000 端口6模式寄存器1
sfr P7M0 = 0xE2; //0000,0000 端口7模式寄存器0
sfr P7M1 = 0xE1; //0000,0000 端口7模式寄存器1
// 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 转换控制寄存器
#define ADC_OFF() ADC_CONTR = 0
#define ADC_ON (1 << 7)
#define ADC_90T (3 << 5)
#define ADC_180T (2 << 5)
#define ADC_360T (1 << 5)
#define ADC_540T 0
#define ADC_FLAG (1 << 4) //软件清0
#define ADC_START (1 << 3) //自动清0
#define ADC_CH0 0
#define ADC_CH1 1
#define ADC_CH2 2
#define ADC_CH3 3
#define ADC_CH4 4
#define ADC_CH5 5
#define ADC_CH6 6
#define ADC_CH7 7
/************* ADC通道选择 **************/
uint adc10_start(uchar channel); //channel = 0~7
uint j; //ADC值临时存储
/******************************************************************/
/* 函数声明2 */
/******************************************************************/
voidKeyInit(void);
voidGetKey(uint *pKeyValue);
voidDisp_Out(uchar wei,uchar shu);
voidLedOnOff(void);
voidTimerInit(void);
voidKeyChuli(void);
voidFunChuli(void); //功能处理
voidDisplay(void); //显示函数
voiddelay_ms(unsigned char ms);
/******************************************************************/
/* 按键判断相关变量定义 */
/******************************************************************/
/* 按键键值宏定义 */
#define KEY_VALUE1 0x0E //按键1按下
#define KEY_VALUE2 0x0D
#define KEY_VALUE3 0x0B
#define KEY_VALUE4 0x07
#define KEY_NULL 0xFF //无按键按下
uint KeyValue = KEY_NULL ;
/* 按键状态宏定义 */
#define INIT_STATE 0 //初始化状态
#define SHAKE_STATE 1 //按键抖动状态
#define PRESS_STATE 2 //按键按下状态
#define LONG_STATE 3 //按键长按状态
#define CONTINUE_STATE 4 //按键连续状态
#define RELEASE_STATE 5 //按键释放状态
/* 按键返回值状态宏定义 */
#define KEY_DOWN 0x80 //按下
#define KEY_LONG 0x40 //长按
#define KEY_CONTINUE 0x20 //连按
#define KEY_UP 0x10 //释放
/* 定义长按键的TICK数,以及连按间隔的TICK数*/
#define KEY_LONG_PERIOD 100 //长按时间基数
#define KEY_CONTINUE_PERIOD 25 //连按时间基数
uint KeyDelay=0;// key 按下延时
/******************************************************************/
/* 变量定义开始 */
/******************************************************************/
/* 定义定时中断变量*/
bitbTime20mS = 0; //20ms中断标志位
bitfTime1S = 0; //2s中断标志位
bit Flag_5s_Start=0;
bit Flag_5s_End=0;
uint cnt_5s=0;
bit Flag_1s_Start=0;
uint cnt_1s=0;
uint cnt_Beepshort=0;
bit Beepshort=0;
bit Beeplong=0;
uint cnt_Beeplong=0;
uint flash_1s=0;
uchar FlagFunc=0; //定义功能标识
uchar FlagTimeOn=0; //定义预约标识
uchar FlagTimeOff=0; //定义定时标识
bit FuncStart=0; //功能启动标识
bit TimeOnStart=0; //预约启动标识
bit TimeOffStart=0; //定时启动标识
uchar h,m,s;
uint x=0 ;
int ii=0;
/* 定义数据传输存储数组*/
uchar DataBuf={0x02,0x00,0x00,0x00,0x00,00,00,10,03,30,30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //0站址1命令2功能 3状态 4预约 5预约时 6预约分 7定时 8定时时 9定时分 10取消
// 0 1 2 3 4 5 67 8 9 10 11 12 13 14 15 16 17 18 19
/* 定义数码管显示变量*/
uchar code disp[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0x8c,0xc1,0xff,0xbf,0x9c};
// 0 ,1 , 2 3 4 5 6 7 8 9 A b C d E F(16)H P U 空 - °C
//以下为7段共阴LED数码管段码表
// 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, /*共阴7段LED段码表*/
// 0x77,0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00};
uint disp_count;
/******************************************************************/
/* I/O定义 */
/******************************************************************/
sbitFunc_Led1=P3^3; //功能1指示
sbitFunc_Led2=P3^4; //功能2指示
sbitFunc_Led3=P3^5; //功能3指示
sbitTimeOn_Led=P3^0; //预约指示
sbitTimeOff_Led=P3^1; //定时指示
sbitRelay=P1^3;//定时继电器输出
sbitBeep=P1^1; //蜂鸣器
//sbittest=P1^2;
/******************************************************************/
/*定义不同的显示数码,解决不同的数数码用不同的单片机的端口 */
/******************************************************************/
uchar bdata dport,dport2;//定义不同的显示数码,解决不同的数数码用不同的单片机的端口
sbit dp0=P0^4;
sbit dp1=P0^5;
sbit dp2=P2^3;
sbit dp3=P2^6;
sbit dp4=P2^4;
sbit dp5=P0^2;
sbit dp6=P0^7;
sbit dp7=P2^5;
sbit bit4=P0^3;
sbit bit3=P0^6;
sbit bit2=P2^7;
sbit bit1=P2^2;
sbit d0=dport^0;
sbit d1=dport^1;
sbit d2=dport^2;
sbit d3=dport^3;
sbit d4=dport^4;
sbit d5=dport^5;
sbit d6=dport^6;
sbit d7=dport^7;
#define wei1 0x01
#define wei2 0x02
#define wei3 0x03
#define wei4 0x04
#define wei_all 0x00
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void YS14520us(void)
{
uint a,b,c;
for(c=2;c>0;c--)
for(b=238;b>0;b--)
for(a=90;a>0;a--);
}
void YS660us(void)
{
uint a,b,c;
for(c=2;c>0;c--)
for(b=94;b>0;b--)
for(a=9;a>0;a--);
}
void YS30us(void)
{
uint a;
for(a=87;a>0;a--);
}
void YSms(uint n)
{
uint a,b;
while(n)
{
for(b=222;b>0;b--)
for(a=12;a>0;a--);
n--;
}
}
/******************************************************************/
/* 段码使用不同IO的转换 */
/******************************************************************/
void disp_data()
{
if(d0==1) dp0=1;
if(d1==1) dp1=1;
if(d2==1) dp2=1;
if(d3==1) dp3=1;
if(d4==1) dp4=1;
if(d5==1) dp5=1;
if(d6==1) dp6=1;
if(d7==1) dp7=1;
if(d0==0) dp0=0;
if(d1==0) dp1=0;
if(d2==0) dp2=0;
if(d3==0) dp3=0;
if(d4==0) dp4=0;
if(d5==0) dp5=0;
if(d6==0) dp6=0;
if(d7==0) dp7=0;
}
/******************************************************************/
/* 显示函数 */
/******************************************************************/
void Disp_Out(uchar wei,uchar shu) //显示数据函数
{
P3M0 |= 0xfc; //推挽输出
P0M0 |= 0xfc; //推挽输出
P2M0 |= 0xfc; //推挽输出
bit1=0;// 初始化位
bit2=0;// 初始化位
bit3=0;// 初始化位
bit4=0;// 初始化位
dport=disp; //将要显示的数的编码赋值给 自定义端口
disp_data(); // 将自定义端口的值(段码)转换为实际IO
//选择显示的位
switch(wei)
{
case 0:
{
bit1=1;
bit2=1;
bit3=1;
bit4=1;
YSms(2);
}
break;
case 1:
{
bit1=1;
YSms(2);
}
break;
case 2:
{
bit2=1;
YSms(2);
}
break;
case 3:
{
bit3=1;
YSms(2);
}
break;
case 4:
{
bit4=1;
YSms(2);
}
break;
}
}
/******************************************************************/
/* 定时器初始化函数 */
/******************************************************************/
void TimerInit(void) //20毫秒@22.1184MHz
{
AUXR |= 0x80; //定时器0为1T模式
//AUXR &= 0x7f; //定时器0为12T模式
TMOD |= 0x00; //设置定时器为模式0(16位自动重装载)
TL0 = T20MS; //初始化计时值
TH0 = T20MS >> 8;
// TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
//EA = 1; //开总中断
}
/******************************************************************/
/* 定时中断函数 */
/******************************************************************/
//void tm0_isr() interrupt 1 using 1
voidTimer0(void) interrupt 1 // 定时器中断处理函数
{
// TH0 = 0x70;
// TL0 = 0x00;
bTime20mS = 1;
flash_1s ++;
//test = !test ;
//******led闪烁开始*****
if(flash_1s>=25) //功能选择时相应led闪烁
{
flash_1s=0;
LedOnOff(); //指示灯亮灭函数
}
//******5s倒计时开始*****
if( Flag_5s_Start && ( ~Flag_5s_End ) ) //5秒倒计时
{
cnt_5s++;
if(cnt_5s>=250) //5s
{
cnt_5s = 0;
Flag_5s_End=1;
}
}
else
{
cnt_5s=0;
}
//******1s定时开始*****
if(Flag_1s_Start)
{
cnt_1s++;
if(cnt_1s==100) //1s
{
cnt_1s=0;
Flag_1s_Start=0;
}
}
else
{
cnt_1s=0;
}
//******蜂鸣器短响开始*****
if( Beepshort==1 )
{
cnt_Beepshort++;
if(cnt_Beepshort==10) Beep=0;
if(cnt_Beepshort==20) //1s
{
cnt_Beepshort=0;
Beep=1;
Beepshort=0;
}
}
else
{
cnt_Beepshort=0;
}
//******蜂鸣器长响开始*****
if( Beeplong==1 )
{
cnt_Beeplong++;
//Beep=0;
if(cnt_Beeplong%10==0) //1s
{
Beep=~Beep;
}
if(cnt_Beeplong%30==0) //1s
{
Beep=~Beep;
}
if(cnt_Beeplong==1260) //1s
{
cnt_Beeplong=0;
Beep=1;
Beeplong=0;
}
}
else
{
cnt_Beeplong=0;
}
//*预约倒计时减及s基数定义处理
if( TimeOnStart==1 ) //预约
{
if( DataBuf>0 || DataBuf>0 || DataBuf>0 ) // 判断是否需要减位
{
x++; //x=50 , 50*20ms=1s来实现计时单位为1s
if(x==50) //x=50 , 50*20ms=1s来实现计时单位为1s
{
x=0 ;
if(DataBuf==0)
{
DataBuf=59;
if(DataBuf==0)
{
DataBuf=59 ;
if(DataBuf>0)
{
DataBuf-- ;
}
}
else
{
DataBuf--;
}
}
else
{
DataBuf-- ;
}
}
}
}
//*定时倒计时减及s基数定义处理 *
if( TimeOffStart==1 ) //定时
{
if( DataBuf>0 || DataBuf>0 || DataBuf>0 ) // 判断是否需要减位
{
x++; //x=50 , 50*20ms=1s来实现计时单位为1s
if(x==50) //x=50 , 50*20ms=1s来实现计时单位为1s
{
x=0 ;
if(DataBuf==0)
{
DataBuf=59;
if(DataBuf==0)
{
DataBuf=59 ;
if(DataBuf>0)
{
DataBuf-- ;
}
}
else
{
DataBuf--;
}
}
else
{
DataBuf-- ;
}
}
}
}
}
/******************************************************************/
/* 底层按键扫描函数 */
/******************************************************************/
uintKeyScan(void)
{
P1M0 |= 0xfc; //推挽输出
if(j>500&j<1000)
{
return KEY_VALUE2; //0x0e
}
else if(j>200&j<400)
{
return KEY_VALUE3;
}
else if(j>=0&j<199)
{
return KEY_VALUE4;
}
else
{
return KEY_NULL;
}
}
/******************************************************************/
/* 获取按键值函数 */
/******************************************************************/
voidGetKey(uint *pKeyValue)
{
staticuintsKeyState = INIT_STATE; //设按键状态为 初始化状态 0
staticuintsTimeCount = 0;
staticuintsLastKey = KEY_NULL; //保存按键释放时候的键值
uintKeyTemp = KEY_NULL;
if(bTime20mS) //20mS扫描一次 中断一次
{
bTime20mS = 0;
KeyTemp = KeyScan(); // 底层按键扫描函数返回时哪个按键按下
switch(sKeyState) //根据按键状态选择
{
caseINIT_STATE: //如果为初始状态 0
{
if(KeyTemp != KEY_NULL) // 如果有按键按下
{
sKeyState = SHAKE_STATE;//消抖返回1
}
}
break;
caseSHAKE_STATE: //消抖 1
{
if(KeyTemp != KEY_NULL) // 如果有按键按下
{
sKeyState = PRESS_STATE; //返回2 按键为按下状态
}
}
break;
casePRESS_STATE: //如果为按下状态 2
{
if(KeyTemp != KEY_NULL)
{
sLastKey = KeyTemp ;//保存键值,以便在释放按键状态返回键值
KeyTemp |= KEY_DOWN ; //按键按下
sKeyState = LONG_STATE; //赋值为长按状态
}
else
{
sKeyState = INIT_STATE;
}
}
break;
caseLONG_STATE: //如果为长按状态
{
if(KeyTemp != KEY_NULL)
{
if(++sTimeCount > KEY_LONG_PERIOD) //长按时间计数
{
sTimeCount = 0;
KeyTemp |= KEY_LONG ; //长按键事件发生
sKeyState = CONTINUE_STATE; //4连续按下
}
}
else
{
sKeyState = RELEASE_STATE;
}
}
break;
caseCONTINUE_STATE: //连续按下状态
{
if(KeyTemp != KEY_NULL)
{
if(++sTimeCount > KEY_CONTINUE_PERIOD) //连按时间计数
{
sTimeCount = 0;
KeyTemp |= KEY_CONTINUE ; //赋值为连续按下
}
}
else
{
sKeyState = RELEASE_STATE; //5
}
}
break;
caseRELEASE_STATE: //释放状态 5
{
sLastKey |= KEY_UP ;
KeyTemp = sLastKey ;
sKeyState = INIT_STATE;
}
break;
}
}
*pKeyValue = KeyTemp ; //返回按键值和按键状态
}
/******************************************************************/
/* 按键处理函数 */
/******************************************************************/
voidKeyChuli(void)
{
KeyDelay ++;
/****** 按键1 ********/
if( KeyValue == (KEY_VALUE1 | KEY_DOWN) ) //按键1按下0x0e|0x80 = 0x8e
{
if(KeyDelay>300)
{
if( FuncStart != 1 )
{
if( FlagFunc>2 )
{
FlagFunc=0;
}
FlagFunc ++;
KeyDelay=0;
if( FlagFunc==1 )
{
DataBuf=0;
DataBuf=0;
DataBuf=0;
DataBuf=2;
DataBuf=0;
DataBuf=0;
//自动输出1
}
if( FlagFunc==2 )
{
DataBuf=8;
DataBuf=30;
DataBuf=0;
DataBuf=0;
DataBuf=30;
DataBuf=3;
//煮粥输出1
}
if( FlagFunc==3 )
{
DataBuf=0;
DataBuf=0;
DataBuf=0;
DataBuf=5;
DataBuf=1;
DataBuf=0;
//猪排骨汤输出1
}
}
}
}
else if( KeyValue == (KEY_VALUE1 | KEY_LONG) ) //按键1长按
{
}
else if( KeyValue == (KEY_VALUE1 |KEY_CONTINUE) ) //按键1连续
{
}
else if( KeyValue == (KEY_VALUE1 | KEY_UP) ) //按键1释放
{
}
/******* 按键2 *******/
if( KeyValue == (KEY_VALUE2 | KEY_DOWN) ) //按键2按下0x0e|0x80 = 0x8e
{
if(KeyDelay>300)
{
if( FlagFunc!=0 && FuncStart==0 && TimeOffStart==0 )
{
Flag_1s_Start=0;
if( FlagTimeOn==1 )
{
DataBuf+=10 ;
}
FlagTimeOn=1;
}
}
}
else if( KeyValue == (KEY_VALUE2 | KEY_LONG) ) //按键2长按
{
}
else if( KeyValue == (KEY_VALUE2 |KEY_CONTINUE) ) //按键2连续
{
DataBuf++ ;
}
else if( KeyValue == (KEY_VALUE2 | KEY_UP) ) //按键2释放
{
}
/******* 按键3 *******/
if( KeyValue == (KEY_VALUE3 | KEY_DOWN) ) //按键3按下
{
if(KeyDelay>300)
{
if( FlagFunc!=0 )
{
Flag_1s_Start=1;
if( FlagTimeOff==1 )
{
DataBuf+=10 ;
}
FlagTimeOff=1;
}
}
}
else if( KeyValue == (KEY_VALUE3 | KEY_LONG) ) //按键3长按
{
//DataBuf++ ;
}
else if( KeyValue == (KEY_VALUE3 |KEY_CONTINUE) ) //按键3连续
{
DataBuf++ ;
}
else if( KeyValue == (KEY_VALUE3 | KEY_UP) ) //按键3释放
{
}
/******** 按键4 ********/
if( KeyValue == (KEY_VALUE4 | KEY_DOWN) ) //按键4按下
{
FlagFunc=0;
FuncStart=0;
FlagTimeOn=0;
TimeOnStart=0;
FlagTimeOff=0;
TimeOffStart=0;
Disp_Out(wei_all,0) ;
Beeplong=0;
}
else if( KeyValue == (KEY_VALUE4 | KEY_LONG) ) //按键4长按
{
}
else if( KeyValue == (KEY_VALUE4 |KEY_CONTINUE) ) //按键4连续
{
if( FuncStart != 1 )
{
FlagFunc=1;
if( FlagFunc==1 )
{
DataBuf=8;
DataBuf=30;
DataBuf=5;
DataBuf=0;
DataBuf=10;
DataBuf=0;
}
FlagTimeOff=1;
}
}
else if( KeyValue == (KEY_VALUE4 | KEY_UP) ) //按键4释放
{
}
/*******按键加预约时间处理部分*******/
if( DataBuf>=60 )
{
DataBuf=DataBuf-60;
DataBuf++;
}
if( DataBuf>=60 ) //如果
{
DataBuf=DataBuf-60;
DataBuf++;
}
if( DataBuf>=12 )
{
DataBuf=0;
}
/*******按键加定时时间处理部分*******/
if( DataBuf>=60 )
{
DataBuf=DataBuf-60;
DataBuf++;
}
if( DataBuf>=60 ) //如果
{
DataBuf=DataBuf-60;
DataBuf++;
}
if( DataBuf>=2 )
{
DataBuf=0;
}
/*****按键蜂鸣程序*****/
if( KeyValue != KEY_NULL ) //只要有按键按下
{
Beepshort=1;
}
}
/******************************************************************/
/* 指示灯亮灭闪烁函数 */
/******************************************************************/
void LedOnOff(void)
{
/*
//******功能指示灯开始*****
if(FlagFunc==0)
{
Func_Led1 = 1 ;
Func_Led2 = 1 ;
Func_Led3 = 1 ;
}
if(FlagFunc==1&&FuncStart==0)
{
Func_Led1 = ~Func_Led1 ;
Func_Led2 = 1 ;
Func_Led3 = 1 ;
}
else if(FlagFunc==1&&FuncStart==1)
{
Func_Led1 = 0 ;
Func_Led2 = 1 ;
Func_Led3 = 1 ;
}
if(FlagFunc==2&&FuncStart==0)
{
Func_Led1 = 1 ;
Func_Led2 =~Func_Led2 ;
Func_Led3 = 1 ;
}
else if(FlagFunc==2&&FuncStart==1)
{
Func_Led1 = 1 ;
Func_Led2 = 0 ;
Func_Led3 = 1 ;
}
if(FlagFunc==3&&FuncStart==0)
{
Func_Led1 = 1 ;
Func_Led2 = 1 ;
Func_Led3 = ~Func_Led3 ;
}
else if(FlagFunc==3&&FuncStart==1)
{
Func_Led1 = 1 ;
Func_Led2 = 1 ;
Func_Led3 = 0 ;
}
*/
//******预约指示灯开始*****
if( FlagTimeOn==0 ) // 预约指示灯灭初始化
{
TimeOn_Led = 1 ;
}
if( FlagTimeOn==1 && TimeOnStart==0 ) //预约指示灯闪烁
{
TimeOn_Led = ~TimeOn_Led ;
}
else if( FlagTimeOn==1 && TimeOnStart==1 ) //预约指示灯常亮
{
TimeOn_Led = 0 ;
}
//******定时指示灯开始*****
if( FlagTimeOff==0 ) // 指示灯灭初始化
{
TimeOff_Led = 1 ;
}
if( FlagTimeOff==1 && TimeOffStart==0 && FlagTimeOn==0 ) //指示灯闪烁
{
TimeOff_Led = ~TimeOff_Led ;
}
else if( FlagTimeOff==1 && TimeOffStart==1 ) //指示灯常亮
{
TimeOff_Led = 0 ;
}
}
/******************************************************************/
/* 功能处理函数 */
/******************************************************************/
voidFunChuli(void)
{
if( FlagFunc!=0 ) //功能1时间赋初值
{
if( FlagTimeOn==1 && Flag_1s_Start==0 ) //预约功能选择且无定时键按下显示预约
{
h=DataBuf;
m=DataBuf;
s=DataBuf;
}
if( FlagTimeOn==0 || Flag_1s_Start==1 ) //无预约或定时间按下 则显示定时
{
h=DataBuf;
m=DataBuf;
s=DataBuf;
}
}
// 预约5s倒计时
if( FlagFunc!=0 )
{
Flag_5s_Start=1;
}
else
{
Flag_5s_Start=0;
}
if( KeyValue != KEY_NULL ) //只要有按键按下5s倒计时就重新计时
{
cnt_5s=0;
cnt_1s=0;
}
/*****当只按下功能键5s后启动定时*****/
// if( FlagFunc!=0 && Flag_5s_End==1 && FlagTimeOn==0 )// 在直选功能模式中 当5秒倒计时结束时 启用
// {
// FlagTimeOff=1; //启用定时倒计时
// if( TimeOffStart==0 )Beepshort=1;
// }
/*****预约倒计时5s后启动*****/
if( FlagTimeOn==1 && Flag_5s_End==1 )// 在预约模式中 当5秒倒计时结束时 启用预约模式
{
if( TimeOnStart==0 )Beepshort=1;
TimeOnStart=1;
Flag_5s_End=0;
}
/*****定时倒计时5s后启动*****/
if( FlagTimeOff==1 && Flag_5s_End==1 )// 在定时模式中 当5秒倒计时结束时 启用模式
{
TimeOffStart=1;
FuncStart=1; //倒计时启动的同时 功能启动
Flag_5s_End=0;
}
/*****预约倒计时完成后启用定时倒计时*****/
if( FlagFunc!=0 && FlagTimeOn==1 && TimeOnStart==1 ) //如果选择了功能,且选择了预约 而且预约已启动
{
if( h==0 && m==0 && s==0 ) //如果预约倒计时完成,则启用功能
{
FlagTimeOn=0; //预约标识复位
TimeOnStart=0; //预约启动复位
FlagTimeOff=1; //启用定时倒计时
}
}
/*****定时倒计时完成后关闭功能*****/
if( FlagFunc!=0 && FlagTimeOff==1 && TimeOffStart==1 ) //如果选择了功能,且选择了定时
{
if( h==0 && m==0 && s==0 ) //如果定时倒计时完成,则启用功能
{
FlagFunc=0; //功能标识复位
FuncStart=0; //功能复位
FlagTimeOff=0; //定时倒计时标识复位
TimeOffStart=0; //定时倒计时停止
Disp_Out(wei_all,20) ;
Beeplong=1;
}
}
/*****根据功能启动相应继电器*****/
if( FuncStart==1 )
{
switch(FlagFunc) //根据功能状态选择
{
case0: //无功能 继电器无输出
{
Relay=1;
}
break;
case1: //功能1 高温
{
Relay=0;
}
break;
}
}
else
{
Relay=1;
}
}
/******************************************************************/
/* 显示函数 */
/******************************************************************/
voidDisplay(void)
{
/*****显示输出*****/
if( FlagFunc!=0 ) //选择相应功能后才显示预约定时时间
{
/*
Disp_Out(wei1,j%10) ; //用于显示ADC检测值 方便按键判断
Disp_Out(wei2,j%100/10) ;
Disp_Out(wei3,j%1000/100) ;
Disp_Out(wei4,j/1000) ;
*/
Disp_Out(wei4,h/10) ;
Disp_Out(wei3,h%10) ;
Disp_Out(wei2,m/10) ;
Disp_Out(wei1,m%10) ;
//Disp_Out(wei4,s/10) ;
//Disp_Out(wei3,s%10) ;
//Disp_Out(wei4,DataBuf/10) ;
//Disp_Out(wei3,DataBuf%10) ;
//Disp_Out(wei2,DataBuf/10) ;
//Disp_Out(wei1,DataBuf%10) ;
//Disp_Out(0xbf,DataBuf/10) ;
//Disp_Out(0x7f,DataBuf%10) ;
}
}
/********************* 主函数 *************************/
void main(void)
{
TimerInit(); /* 定时器初始化函数 */
EA = 1; //开总中断
P1ASF = (1 << ADC_CH0); //12C5A60AD/S2系列模拟输入(AD)选择
ADC_CONTR = ADC_540T | ADC_ON;
Disp_Out(wei_all,0) ;
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
while(1)
{
j = adc10_start(0);
GetKey(&KeyValue); //按键判断函数
KeyChuli(); //按键处理函数
FunChuli(); //功能处理函数
Display(); //显示函数
}
}
/********************* 做一次ADC转换 *******************/
uint adc10_start(uchar channel) //channel = 0~7
{
uint adc;
uchar i;
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xe0) | ADC_START | channel;
//for(i=0; i<250; i++) //13T/loop, 40*13=520T=23.5us @ 22.1184M
i = 250;
do{
if(ADC_CONTR & ADC_FLAG)
{
ADC_CONTR &= ~ADC_FLAG;
// adc = 0;
// adc = (ADC_RES << 8) | ADC_RESL; //ADRJ_enable()
adc = (uint)ADC_RES;
adc = (adc << 2) | (ADC_RESL & 3);
return adc;
}
}while(--i);
return 1024;
}
//========================================================================
// 函数: voiddelay_ms(unsigned char ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数.
// 返回: none.
// 版本: VER1.0
// 日期: 2010-12-15
// 备注:
//========================================================================
voiddelay_ms(unsigned char ms)
{
unsigned int i;
do{
i = MAIN_Fosc / 14000;
while(--i) ; //14T per loop
}while(--ms);
}
楼主这么问问题,估计能帮到你的比较少,最好可以把问题具体某一方面
页:
[1]