📄 rudongbeng.c
字号:
//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 3vuint 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 2vuchar outputAlwaysStep=0;vuchar outputStep=0; //输出的步骤,工作时间和间隔时间#define OUTPUT_STEP_WORK 0#define OUTPUT_STEP_STOP 1vuchar timeSetMode=0;#define TIME_SET_WORK 0#define TIME_SET_STOP 1vuchar 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 peripheralsvoid 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -