📄 app._c
字号:
hand_whe[0]=0;
hand_whe[1]=0;
hand_whe[2]=0;
hand_whe[3]=0;
while (1) {
if(time_left>0) //如果时间还未到
{
time_left =180-(OSTimeGet()-time_count_start)/50; //剩余时间值 秒
time_led_100 =(time_left/60)|0x0200; //分位
time_led_10 =(time_left%60/10)|0x0300; //秒10位
time_led_1 =(time_left%60%10)|0x0400; //秒个位
LED_send_16b(time_led_100);
LED_send_16b(time_led_10);
LED_send_16b(time_led_1);
}
OSTimeDly(OS_TICKS_PER_SEC/10);
}
}
/*
*********************************************************************************************************
* SETUP THE I/Os T/Cs
*********************************************************************************************************
*/
static void IO_Init (void)
{
DDRA =0x3f; //PA6 PA7 行程开关输入
PORTA =0xff;
DDRB =0xff; //B端口输出
PORTB =0x00; //B端口输出0
DDRC =0x3f; //PC6 PC7 行程开关输入
PORTC =0x00;
DDRD =0X71; //D 0 1 输出 0111 0001
PORTD =0x00;
DDRE =0xff; //0100 0000
PORTE =0x00;
DDRF =0xff;
PORTF =0x00;
DDRG =0xff;
PORTG =0xff;
}
void Init_TC(void)
{
TIMSK =0x01; //01000000 T/c2 溢出中断开 Enable TIMER0 overflow interrupt
//T/C0 控制系统时钟---------------------------
TCCR0 = 0x02; // Set TIMER0 prescaler to CLK/1024
//提升电机调速 T/C1 OC1A B C -----------------
TCCR1A =0x0b; //1010 1011 10位快速pwm 向上置位?
TCCR1B =0x01; //0000 0010 8分频
TCCR1C =0x00;
OCR1A =0x0000;
OCR1B =0x0000;
OCR1C =0x0000;
//控制舵机 T/C2 计数 ----------------------------------------
/*
TCCR2 =0x02; //00000010
TCNT2 =0x06;
*/
//中右左电机调速 T/C3 OC1A B C 分别用于地盘-----------------
TCCR3A =0xab; //1010 1011 10位快速pwm 向上置位?
TCCR3B =0x01; //0000 0010 8分频
TCCR3C =0x00;
OCR3A =0x0000;
OCR3B =0x0000;
OCR3C =0x0000;
}
/*
*********************************************************************************************************
* SETUP THE TICK RATE
*********************************************************************************************************
*/
void OSTickISR_Handler (void)
{
time_count++;
if(time_count==hand_cy[0]) PORTC&=~(1<<0); //矩形波变化 手抓1
if(time_count==hand_cy[1]) PORTC&=~(1<<1); //手抓2
if(time_count==hand_cy[2]) PORTC&=~(1<<2); //手抓3
if(time_count==hand_cy[3]) PORTC&=~(1<<3); //手抓4
if(time_count==80) // 1=0.23ms 86=20ms 9=2ms 2右患 10左极
{
PORTC|=0x0f;
OSTimeTick();
time_count=0;
}
}
/*
*********************************************************************************************************
* EEPROM 操作部分
*********************************************************************************************************
*/
void data_save()
{
if(data_ptr<0x0ffe)
{
EEPROMwrite(data_ptr,rx_chr_b[1][1]); //存储第2个字
data_ptr++;
}
if(data_ptr<0x0ffe)
{
EEPROMwrite(data_ptr,rx_chr_b[2][1]); //存储第3个字
data_ptr++;
}
}
void data_read()
{
INT8U i; //上次键值
if(data_ptr<0x0ffe)
{
rx_chr_b[1][0]=rx_chr_b[1][1];
rx_chr_b[1][1]=EEPROMread(data_ptr);
if(rx_chr_b[1][1]==0xff) rx_chr_b[1][1]=0x00; //EPPROM ff填充值 不可用
data_ptr++;
}
else rx_chr_b[1][1]=0x00;
if(data_ptr<0x0ffe)
{
rx_chr_b[2][0]=rx_chr_b[2][1]; //上次键值
rx_chr_b[2][1]=EEPROMread(data_ptr);
if(rx_chr_b[2][1]==0xff) rx_chr_b[2][1]=0x00; //EPPROM ff填充值 不可用
data_ptr++;
}
else rx_chr_b[2][1]=0x00;
for(i=0;i<8;i++)
{
if((i!=0)&&(i!=5)) //第0 第5为控制键 保护
{
rx_chr[1][i][0]=rx_chr[1][i][1]; //第二个字节的第i个字 存储上次值,1 5为控制位 保护
if(rx_chr_b[1][1]&(1<<i)) rx_chr[1][i][1]=1;
else rx_chr[1][i][1]=0;
}
rx_chr[2][i][0]=rx_chr[2][i][1]; //第三个字节的第i个字存储上次值
if(rx_chr_b[2][1]&(1<<i)) rx_chr[2][i][1]=1;
else rx_chr[2][i][1]=0;
}
}
/*
*********************************************************************************************************
* LED 显示部分
*********************************************************************************************************
*/
void LED_send_16b(INT16U LED_message) //向LED发送一个16bit数据,高位开始
{
INT8U clear;
PORTB&=0xfe; //使能开
SPDR=(LED_message>>8)&0x00ff; //传输高8位
while(!(SPSR&0x80)){;} //等待
clear=SPSR; //清除标志
clear=SPDR;
SPDR=LED_message&0x00ff; //传输低8位
while(!(SPSR&0x80)){;} //等待
clear=SPSR; //清除标志
clear=SPDR;
PORTB|=0x01; //使能关
}
void intit_LED() //LED初始化
{
SPCR=0x50; //0101 0000 SPI使能 高位先行 00模式 主机模式 4分频
LED_send_16b(0x0c01); //1 1 0 0 0000 0001 掉电控制 正常模式
LED_send_16b(0x09ff); //1 0 0 1 0000 1 1 1 1 译码方式 1-4位译码
LED_send_16b(0x0a0f); //1 0 1 0 0000 1 1 1 1 亮度 31/32
LED_send_16b(0x0b07); //1 0 1 1 000000 1 1 扫描界限 1-4位 //2s
LED_send_16b(0x0f00); //1 1 1 1 0000 0001 正常模式
}
/*
*********************************************************************************************************
* 手柄通讯段
*********************************************************************************************************
*/
void delay_hd(INT8U t) //延时函数
{
for(;t!=0;t--);
}
void psin() //ps接收数据
{
unsigned char send_chr; //发送的数据
int i;
send_chr=tx_chr; //数据提取
for(i=0;i<8;i++)
{
if(send_chr&0x01) PORTD |=(1<<5); //发送cmd1
else PORTD &=~(1<<5); //发送cmd0
PORTD |=(1<<6); //拉高 clk
delay_hd(30);
PORTD &=~(1<<6); //拉底clk
delay_hd(30);
PORTD |=(1<<6); //拉高clk
send_chr=send_chr>>1; //下一位
}
}
void psout(int j) //收ps的数据,存在第j个rx_chr
{
int i;
rx_chr_b[j][0]=rx_chr_b[j][1]; //存储上次键值 8bit
for(i=0;i<=7;i++)
{
PORTD |=(1<<6); //拉高clk
delay_hd(30);
PORTD &=~(1<<6); //拉底clk
delay_hd(30);
PORTD |=(1<<6); //拉高clk
rx_chr[j][i][0]=rx_chr[j][i][1]; //存储上次键值 1bit
if((PIND&0x02)==0)
{
rx_chr[j][i][1]=1; //收到的data 1 正逻辑 低电平收到信号
rx_chr_b[j][1]|=1<<i; //收到的data 1
}
else
{
rx_chr[j][i][1]=0; //收到的data 0
rx_chr_b[j][1]&=~(1<<i);
}
}
}
void scan() //手柄扫描函数
{
PORTD &=~(1<<4); //att
tx_chr=0x01;
psin(); //发 0x01
tx_chr=0x42;
psin(); //发 0x42
psout(0); //收 存于 rx_chr[0]
delay_hd(30);
psout(1); //收 存于 rx_chr[1]
delay_hd(30);
psout(2); //收 存于 rx_chr[2]
PORTD |=(1<<4); //ATT 拉高
//行程开关扫描----
contact_t[0][0]= contact_t[0][1]; //保存上次行程开关1
contact_t[1][0]= contact_t[1][1]; //保存上次行程开关2
contact_t[2][0]= contact_t[2][1]; //保存上次行程开关3
contact_t[3][0]= contact_t[3][1]; //保存上次行程开关4
contact_t[0][1]=(PINA&0x40)>>6; //行程开关1
contact_t[1][1]=(PINA&0x80)>>7; //行程开关2
contact_t[2][1]=(PINC&0x40)>>6; //行程开关3
contact_t[3][1]=(PINC&0x80)>>7; //行程开关4
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -