📄 rudongbeng.c.bak
字号:
//ICC-AVR application builder : 2007-2-27 22:13:08
// Target : M16
// Crystal: 12.0000Mhz
/*=============================================================================================================================================================================================================
完善通讯功能,
20090513_1CNL 设计一个蠕动泵的控制程序,保证几个按钮能够正常使用。
=================================================================================================================================================================================================*/
#define vuchar volatile unsigned char
#define vuint volatile unsigned int
#define uchar unsigned char
#define uint unsigned int
#include <avr/io.h>
#include <avr/interrupt.h>
#define clear_interrupt() cli(); //禁止所有中断b
#define set_interrupt() sei(); //开全局中断
vuchar outputCounter=0; //执行外部程序的时间累加器
vuchar keyProcessCounter=0; //执行外部键盘程序的累加器
vuchar dataSaveBuffer[12];
#define WORK_TIME_HIGH 0
#define WORK_TIME_LOW 1
#define STOP_TIME_HIGH 2
#define STOP_TIME_LOW 3
vuint dataSaveTemp=0;
vuint delay1=0;
vuint delay2=0;
union
{
volatile uint intData;
volatile uchar charData[2];
}unionData;
//////////////////////////////////////
//键盘扫描程序设定
/////////////////////////////////////
//微调增加按键端口
#define KEY_TINY_ADD_SET ((PINA&(1<<3))==0x00)
//#define KEY_TINY_ADD_CLR
//微调减少按键端口
#define KEY_TINY_SUB_SET ((PINA&(1<<4))==0x00)
//#define KEY_TINY_SUB_CLR
//粗调增加按键端口
#define KEY_LARGE_ADD_SET ((PINA&(1<<5))==0x00)
//#define KEY_LARGE_ADD_CLR
//粗调减少按键端口
#define KEY_LARGE_SUB_SET ((PINA&(1<<6))==0x00)
//#define KEY_LARGE_SUB_CLR
//手动控制按键端口
#define KEY_HAND_CONTROL_SET ((PINB&(1<<0))==0x00)
//#define KEY_HAND_CONTROL_CLR
//手动自动切换按钮
#define KEY_HAND_AUTO_SET ((PINB&(1<<1))==0x00)
//#define KEY_HAND_AUTO_CLR
//运行时间切换按钮
#define KEY_TIME_SWITCH_SET ((PINB&(1<<2))==0x00)
//#define KEY_TIME_SWITCH_CLR
//复位按钮
#define KEY_DORESET_SET ((PINB&(1<<3))==0x00)
//#define KEY_RESET_CLR
//键盘对应寄存器
vuchar keyTinyAddStatus=0;
vuchar keyTinyAddCounter=0;
vuchar keyTinySubStatus=0;
vuchar keyTinySubCounter=0;
vuchar keyLargeAddStatus=0;
vuchar keyLargeAddCounter=0;
vuchar keyLargeSubStatus=0;
vuchar keyLargeSubCounter=0;
vuchar keyHandControlStatus=0;
vuchar keyHandControlCounter=0;
vuchar keyHandAutoStatus=0;
vuchar keyHandAutoCounter=0;
vuchar keyTimeSwitchStatus=0;
vuchar keyTimeSwitchCounter=0;
vuchar keyResetStatus=0;
vuint keyResetCounter=0;
#define KEY_RESET_SHORT 200
#define KEY_RESET_LONG 800
#define KEY_WAITING 0 //按键没有出发
#define KEY_PRESS 1 //按键被按下了
#define KEY_OPEN 2 //按键由按下状态转到松开状态
#define KEY_TIME_SHORT 3 //短按反应
#define KEY_TIME_LONG 4 //长按反应
#define KEY_PRESS_OK 3 //保证按钮按下的最小单位时间量
//LED指示灯
#define LED1_ON() (PORTD&=~(1<<2))
#define LED1_OFF() (PORTD|=(1<<2))
#define LED2_ON() (PORTD&=~(1<<3))
#define LED2_OFF() (PORTD|=(1<<3))
vuchar ledFlag=0;
#define LED3_OFF() (PORTD&=~(1<<7))
#define LED3_ON() (PORTD|=(1<<7))
//输出口信号控制
#define OUTPUT1_ON() (PORTC &=~(1<<0))
#define OUTPUT2_ON() (PORTC |=(1<<1))
#define OUTPUT1_OFF() (PORTC &=~(1<<0))
#define OUTPUT2_OFF() (PORTC &=~(1<<1))
vuint outputWorkTimeCounter=0; //运行时间计数器
vuint outputWorkTimeSetting=0; //运行时间设定值
vuint outputStopTimeCounter=0; //间隔时间计数器
vuint outputStopTimeSetting=0; //间隔时间设定值
vuchar outPutEnable=0; //输出使能位,1,在输出状态,0,不在输出状态
vuchar outPutMode=0; //需要输出的方式状态
#define OUTPUT_HAND 0
#define OUTPUT_AUTO 1
#define OUTPUT_WAIT 2
vuchar outputAlwaysStep=0;
vuchar outputStep=0; //输出的步骤,工作时间和间隔时间
#define OUTPUT_STEP_WORK 0
#define OUTPUT_STEP_STOP 1
vuchar timeSetMode=0;
#define TIME_SET_WORK 0
#define TIME_SET_STOP 1
vuchar settingTimeCounter=0;
vuint unitTimeCounter=0;
vuchar timeSwitchTimeCounter=0;
//==========================================================
//从临时寄存器*eepromPtr里面读出数据,
//根据设定行地址,把连续的12bytes动作表写入到EEPROM中
//==========================================================
void writeEEPROM(vuchar *eepromWPtr,uchar lineNumber)
{
uchar j;
uint byteNumber;
uint eepromAddress=0;
eepromAddress=12*lineNumber;
while(EECR&0x02); //确认已经没有写动作
j = SREG;//save the status
clear_interrupt();
for(byteNumber=0;byteNumber<12;byteNumber++)
{
while(EECR&0x02); //确认已经没有写动作
EEAR =eepromAddress++;
EEDR =*(eepromWPtr+byteNumber);
EECR |= 0x04;
EECR |= 0x02;
}
while(EECR&0x02);//确认已经没有写动作
SREG = j; //restore the status
}
//================================================================
//根据设定行地址,把连续的12bytes的动作表从EEPROM中读出来,
//然后写入到指定的临时寄存器*eepromPtr里面
//================================================================
void readEEPROM(vuchar *eepromPtr,uchar lineNumber)
{
uchar j;
uchar byteNumber;
uint eepromAddress;
eepromAddress=12*lineNumber;
while(EECR&0x02); //确认已经没有写动作
j = SREG;//save the register
clear_interrupt();
for(byteNumber=0;byteNumber<12;byteNumber++)
{
EEAR =eepromAddress++;
EECR |=0x01;
while(EECR&0x01);//确认已经完成读动作
*(eepromPtr++)= EEDR;
while(EECR&0x02);//确认已经没有写动作
}
SREG = j;//restore the status
}
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
clear_interrupt(); //disable all interrupts
//port_init();
PORTA=0xFF;
DDRA =0x00;
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0xFF;
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0xFF;
//timer0_init();
//TIMER0 initialize - prescale:8
// desired value: 50uSec
// actual value: 50.000uSec (0.0%)
TCCR0 = 0x00; //stop
TCNT0 = 0x8b; //set count
TCCR0 = 0x05; //start timer
MCUCR = 0x08;
GICR = 0x00;
//TIMSK = 0x45; //timer interrupt sources
TIMSK = 0x01; //timer interrupt sources
//set_interrupt(); //re-enable interrupts
//all peripherals are now initialised
}
/*********************************************************
//按键扫描程序
//假定运行时间单位是10ms
*********************************************************/
void keyScanProgram(void)
{
//TINY ADD按钮按下
if(KEY_TINY_ADD_SET)
{
keyTinyAddStatus=KEY_PRESS;
if(keyTinyAddCounter<200)keyTinyAddCounter++;
}
//TINY ADD按键松开
else
{
//按键是曾经是按过的
if(keyTinyAddStatus==KEY_PRESS)
{
//按键有效触发
if(keyTinyAddCounter>KEY_PRESS_OK)
{
keyTinyAddCounter=0;
keyTinyAddStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyTinyAddCounter=0;
keyTinyAddStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//TINY SUB按钮按下
if(KEY_TINY_SUB_SET)
{
keyTinySubStatus=KEY_PRESS;
if(keyTinySubCounter<200)keyTinySubCounter++;
}
//TINY SUB按键松开
else
{
//按键是曾经是按过的
if(keyTinySubStatus==KEY_PRESS)
{
//按键有效触发
if(keyTinySubCounter>KEY_PRESS_OK)
{
keyTinySubCounter=0;
keyTinySubStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyTinySubCounter=0;
keyTinySubStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//LARGE ADD按钮按下
if(KEY_LARGE_ADD_SET)
{
keyLargeAddStatus=KEY_PRESS;
if(keyLargeAddCounter<200)keyLargeAddCounter++;
}
//LARGE ADD按键松开
else
{
//按键是曾经是按过的
if(keyLargeAddStatus==KEY_PRESS)
{
//按键有效触发
if(keyLargeAddCounter>KEY_PRESS_OK)
{
keyLargeAddCounter=0;
keyLargeAddStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyLargeAddCounter=0;
keyLargeAddStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//LARGE SUB按钮按下
if(KEY_LARGE_SUB_SET)
{
keyLargeSubStatus=KEY_PRESS;
if(keyLargeSubCounter<200)keyLargeSubCounter++;
}
//LARGE SUB按键松开
else
{
//按键是曾经是按过的
if(keyLargeSubStatus==KEY_PRESS)
{
//按键有效触发
if(keyLargeSubCounter>KEY_PRESS_OK)
{
keyLargeSubCounter=0;
keyLargeSubStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyLargeSubCounter=0;
keyLargeSubStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//HAND CONTROL按钮按下
if(KEY_HAND_CONTROL_SET)
{
keyHandControlStatus=KEY_PRESS;
if(keyHandControlCounter<200)keyHandControlCounter++;
}
//HAND CONTROL按键松开
else
{
//按键是曾经是按过的
if(keyHandControlStatus==KEY_PRESS)
{
//按键有效触发
if(keyHandControlCounter>KEY_PRESS_OK)
{
keyHandControlCounter=0;
keyHandControlStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyHandControlCounter=0;
keyHandControlStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//HAND AUTO SET按钮按下
if(KEY_HAND_AUTO_SET)
{
keyHandAutoStatus=KEY_PRESS;
if(keyHandAutoCounter<200)keyHandAutoCounter++;
}
//HAND CONTROL按键松开
else
{
//按键是曾经是按过的
if(keyHandAutoStatus==KEY_PRESS)
{
//按键有效触发
if(keyHandAutoCounter>KEY_PRESS_OK)
{
keyHandAutoCounter=0;
keyHandAutoStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyHandAutoCounter=0;
keyHandAutoStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//TIME SWITCH按钮按下
if(KEY_TIME_SWITCH_SET)
{
keyTimeSwitchStatus=KEY_PRESS;
if(keyTimeSwitchCounter<200)keyTimeSwitchCounter++;
}
//TIME SWITCH按键松开
else
{
//按键是曾经是按过的
if(keyTimeSwitchStatus==KEY_PRESS)
{
//按键有效触发
if(keyTimeSwitchCounter>KEY_PRESS_OK)
{
keyTimeSwitchCounter=0;
keyTimeSwitchStatus=KEY_OPEN;
}
//无法有效触发
else
{
keyTimeSwitchCounter=0;
keyTimeSwitchStatus=KEY_WAITING;
}
}
}
/////////////////////////////////////////
//RESET按钮按下
if(KEY_DORESET_SET)
{
keyResetStatus=KEY_PRESS;
if(keyResetCounter<65500)keyResetCounter++;
}
//TIME SWITCH按键松开
else
{
//按键是曾经是按过的
if(keyResetStatus==KEY_PRESS)
{
//reset按键长按触发
if(keyResetCounter>KEY_RESET_LONG)
{
keyResetCounter=0;
keyResetStatus=KEY_TIME_LONG;
LED3_ON();
}
//reset按键短按触发
else if(keyResetCounter>KEY_RESET_SHORT)
//else if(keyResetCounter>KEY_PRESS_OK)
{
keyResetCounter=0;
keyResetStatus=KEY_TIME_SHORT;
LED3_OFF();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -