📄 main.c
字号:
#define _MAIN_
#include <iom16.h>
#include "main.h"
#include "key.h"
#include <string.h>
#include <stdio.h>
//call this routine to initialise all peripherals
void init_devices(void)
{
PORTA = 0xfF;
DDRA = 0x80; //the msb is out & other is input
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0xFD;
DDRC = 0x02;
PORTD = 0xff;
DDRD = 0xFf;
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
MCUCR|=0x02;
GIFR=0xff;
GICR=0x40;
SREG|=0x80;
}
//初始化定时器
void init_tc1_16(void)
{
TCCR1A=0x00;
TCCR1B=0x02; // 8 devide 1.45us
//TCNT1H=0xfd; //1ms foxs == 11.0529,系统时钟2分频
//TCNT1L=0x4e;
TCNT1H=0xfc; //8MHz //`1ms
TCNT1L=0x18; //
//TIMSK|=0x80; //TOIE1;
TIMSK|=0x04; //TOIE1;
}
#pragma vector=TIMER1_OVF_vect
__interrupt void Timer_1(void)
{
TCNT1H=0xfc; //8MHz //`1ms
TCNT1L=0x18; //
Free_Count ++;
DispTime ++;
if(DISP_TIME < DispTime)
{
//DispNmuber(Number);
DispTime = 0;
Number++;
if(Number > 7)
Number = 0;
}
ReadKeyTime++;
if(READ_KEY_TIME <ReadKeyTime)
{
ReadKeyTime = 0;
ReadKey();
//if(key_status == )
}
FreeTimer++;
if(Key.SOSBak == 0)
AlarmTime++;
if(Key.AlarmKeyCounts > 0)
Key.AlarmKeyCounts--;
if(Key.FloorKeySound > 0)
Key.FloorKeySound --;
else
SPEAK_OFF;
}
void init_usart(void)
{
UCSRB=0x00;
UCSRA=0x00;
UBRRH=0x00;
UBRRL=95; //9600
UCSRB=0x0;
UCSRB|=0x08; //TXEN;
UCSRA|=0x20; //UDRE;
}
#pragma vector=USART_UDRE_vect
__interrupt void UART_TX (void)
{
if(Tx_Ptr >= Tx_Len)
Tx_status |= SEND_OK; //发送完毕标志置位
else
UDR = Tx_Buff[Tx_Ptr++];
}
#pragma vector=USART_RXC_vect
__interrupt void UART_RX (void)
{
unsigned char data;
data=UDR;
if(Rx_Count < 50)
Rx_Buff[Rx_Count++] = data;
}
//显示楼层
void DispNmuber(unsigned char Number)
{
switch(Number)
{
case 0: //a
if((Floor != 1) || (Floor != 4))
A_SECT;
break;
case 1: //b
if((Floor != 5) || (Floor != 6))
B_SECT;
break;
case 2: //c
if(Floor != 2)
C_SECT;
break;
case 3: //d
if((Floor != 1) || (Floor != 4) || (Floor != 7))
D_SECT;
break;
case 4: //e
if((Floor == 0) || (Floor == 2) || (Floor == 6) || (Floor == 8))
E_SECT;
break;
case 5: //f
if((Floor != 1) || (Floor != 2) || (Floor != 3) || (Floor != 7))
F_SECT;
break;
case 6: //g
if((Floor != 0) || (Floor != 1) || (Floor != 4) || (Floor != 7))
G_SECT;
break;
case 7: //dp
if(Floor == 10)
DP_SECT;
break;
default:
break;
}
}
void ElevatorAct(void)
{
unsigned char UpSeek;
unsigned char DownSeek;
//在停止状态下,比较向上的需求和向下走的需求
UpSeek = DownSeek = Floor;
if(UpOrDown == STOP)
{
for(; DownSeek > 0; DownSeek --)
{
if((Key.FloorKey & (1 << (DownSeek - 1))) != 0)
break;
}
//如果没有查到最低层,找到与当前楼层最近的楼层
if(DownSeek != 0)
{
DownSeek = Floor - DownSeek;
}
else
{
//如果已经找到最低层,则将他置为最大数
DownSeek = TOPFLOOR;
}
//如果没有查到最高层,找到与当前楼层最近的楼层
for(; UpSeek < TOPFLOOR; UpSeek ++)
{
if((Key.FloorKey & (1 << (UpSeek - 1))) != 0)
break;
}
if(UpSeek != TOPFLOOR)
{
UpSeek -= Floor;
}
else
{
//如果已经找到最高层,则将他置为最大数
UpSeek = TOPFLOOR;
}
//需求路程较短的一个方向位为电梯运动方向
if((UpSeek != TOPFLOOR) || (DownSeek != TOPFLOOR))
{
if(UpSeek > DownSeek )
{
UpOrDown = DOWN;
MOTOR_RIGHT_OFF;
MOTOR_LEFT_ON;
}
else
{
UpOrDown = UP;
MOTOR_RIGHT_ON;
MOTOR_LEFT_OFF;
}
}
}
else//上升
if(UpOrDown == UP)
{
//判断是否在当前楼层之上还有需求
for(; UpSeek < TOPFLOOR; UpSeek ++)
{
if((Key.FloorKey & (1 << (UpSeek - 1))) != 0)
break;
}
if(UpSeek != TOPFLOOR)
{
UpSeek -= Floor;
}
else
{
//如果已经找到最高层,则将他置为最大数
UpSeek = TOPFLOOR;
}
if(UpSeek == TOPFLOOR)
{
MOTOR_RIGHT_OFF;
MOTOR_LEFT_OFF;
UpOrDown = STOP;
}
else
{
UpOrDown = UP;
MOTOR_RIGHT_ON;
MOTOR_LEFT_OFF;
}
}
else //下降
if(UpOrDown == DOWN)
{
for(; DownSeek > 0; DownSeek --)
{
if((Key.FloorKey & (1 << (DownSeek - 1))) != 0)
break;
}
//如果没有查到最低层,找到与当前楼层最近的楼层
if(DownSeek != 0)
{
DownSeek = Floor - DownSeek;
}
else
{
//如果已经找到最低层,则将他置为最大数
DownSeek = TOPFLOOR;
}
if(UpSeek == TOPFLOOR)
{
MOTOR_RIGHT_OFF;
MOTOR_LEFT_OFF;
UpOrDown = STOP;
}
}
}
void main(void)
{
init_devices();
init_tc1_16();
init_usart();
Key_Init();
FloorStore[MAX_FloorStore] = 0;
Floor = 1;
Key.FloorSwtich = 0xff;
FloorSwtichAction();
if((Floor == 1) && (SWITCH1 != 0)) //判断是否真正在一层
{ //不在一层,也就是没有任何楼层接近开关输入
for(FloorStore_Count = 0; FloorStore_Count < MAX_FloorStore; FloorStore_Count ++)
{
if((FloorStore[FloorStore_Count] < TOPFLOOR) && (FloorStore[FloorStore_Count] > 0) && (FloorStore[FloorStore_Count + 1] == 0))
{
Floor = FloorStore[FloorStore_Count];
break;
}
}
}
FreeTimer = 0;
Key.AlarmKeyStatus = KEY_NOTHING;
Key.SOSStatus = KEY_NOTHING;
Key.FloorSwtichStatus = KEY_NOTHING;
Key.FloorKeyStatus = KEY_NOTHING;
FloorToGo = 0;
SPEAK_OFF;
while(1)
{
if((Key.AlarmKeyStatus >= KEY_PRESS) && (FloorToGo == 0))
{
Key.AlarmKeyStatus = KEY_NOTHING;
Key.AlarmKeyBak = 0;
AlarmKeyAction();
}
if(Key.SOSStatus >= KEY_PRESS)
{
Key.SOSStatus = KEY_NOTHING;
//Key.SOSBak = 0;
FloorToGo = 0;
SOSAction();
AlarmTime = 0;
}
if(Key.FloorSwtichStatus >= KEY_PRESS)
{
Key.FloorSwtichStatus = KEY_NOTHING;
FloorSwtichAction();
Key.FloorSwtichBak = 0;
AlarmTime = 0;
ERR_OUT_HIGH;
}
else
if(Key.FloorSwtichStatus == KEY_NOTHING)
{
if(AlarmTime > FloorSwtichTime ) //报警 60S
{
ERR_OUT_LOW;
MOTOR_RIGHT_OFF;
MOTOR_LEFT_OFF;
AlarmTime = FloorSwtichTime + 1;
//FloorStore[FloorStore_Count] = Floor;
FloorToGo = 0;
}
}
/*
if((Key.AlarmKeyCounts <= 1447) && (Key.FloorKeyStatus >= KEY_PRESS))
{
Key.FloorKeyStatus = KEY_NOTHING;
FloorKeyAction();
Key.FloorKeyBak = 0;
}
*/
//if((Key.AlarmKeyCounts <= 1447) && (FloorToGo != 0)) //>3s at 8MHz
if((Key.AlarmKeyCounts <= 2000) && (Key.AlarmKeyCounts != 0)) //>3s at 8MHz
{
if(Key.FloorKeyStatus >= KEY_PRESS)
{
Key.FloorKeyStatus = KEY_NOTHING;
FloorKeyAction();
Key.FloorKeyBak = 0;
}
if(FloorToGo != 0)
{
ALARM_OUT_HIGH;
Key.AlarmKeyCounts = 0;
if((FloorToGo & (1 << (Floor - 1))) != 0)
{
FloorToGo &= ~(1 << (Floor -1));
UpOrDown = STOP;
MOTOR_RIGHT_OFF;
MOTOR_LEFT_OFF;
}
else
{
ElevatorAct();
Key.SOSBak = 0;
}
}
/*
ALARM_OUT_HIGH;
Key.AlarmKeyCounts = 0;
if((FloorToGo & (1 << (Floor - 1))) != 0)
{
FloorToGo &= ~(1 << (Floor -1));
UpOrDown = STOP;
MOTOR_RIGHT_OFF;
MOTOR_LEFT_OFF;
}
else
{
ElevatorAct();
}
*/
}
else
{
if(Key.AlarmKeyCounts == 0)
{
Key.FloorKeyBak = 0;
ALARM_OUT_HIGH;
if(UpOrDown == STOP)
FloorToGo = 0;
}
Key.FloorKeyStatus = KEY_NOTHING;
Key.FloorKeyBak = 0;
}
}
}
void Print_Com(unsigned char *Buff)
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -