📄 gps_ok.c
字号:
cmdh=0xe0;
cmdl=i;
cmdSend();
}
void jianp() //获取按键状态 改变状态值 anjian_z 1 insert; 2 del; 3 sel_next
{
anjian_z=0;
if(insert==0&&insert_flag==1)
{
delay(50); //去抖
if(insert==0&&insert_flag==1)
{
anjian_z=1 ;
insert_flag=0;
}
}
else if(insert==1&&insert_flag==0)
{
insert_flag=1;
}
else if(del==0)
{
delay(50); //去抖
if(del==0&&del_flag==1)
{
anjian_z=2 ;
del_flag=0;
}
}
else if(del==1&&del_flag==0)
{
del_flag=1;
}
else if(sel_nex==0)
{
delay(50); //去抖
if(sel_nex==0&&sel_nex_flag==1)
{
anjian_z=3 ;
sel_nex_flag=0;
}
}
else if(sel_nex_flag==0)
{
sel_nex_flag=1;
}
}
void f_insert()
{
Mcu_init();
LCD12864_string(1,1,"增加站点");
gps_t[0]++;
gps_t[1+zhand_num*4]=gps_x;
gps_t[2+zhand_num*4]=gps_y;
cmdh=0xa0;
cmdl=gps_t[4+ zhand_num*4];
cmdSend();
while(anjian_z!=2)
jianp();
Stop();
//将XY和地址写入24c02
write_iic_data(&gps_t[0],0,8);
delay(20);
write_iic_data(&gps_t[8],8,8);
delay(20);
write_iic_data(&gps_t[16],16,8);
delay(20);
Mcu_init();
LCD12864_picture((unsigned char*)gImage_test);
zhand_num++;
}
void f_del()
{
uchar del_num=0,ai;
uchar tx,ty,th,tl;
//显示:第一个站 语音提示
Mcu_init();
LCD12864_string(1,1,"删站点");
cmdh=gps_t[3];
cmdl=gps_t[4];
cmdSend();
//如果next就更新显示 语音提示;如果insert 就删除
while(del_num<zhand_num)
{
jianp();
if(anjian_z==3)
{
del_num++;
//显示:第del_num个站 语音提示
cmdh=gps_t[3+del_num*4];
cmdl=gps_t[4+del_num*4];
cmdSend();
}
else if(anjian_z==1)
{
//删除信息
//更新24c02
gps_t[0]--;
tx=gps_t[1+del_num*4];
ty=gps_t[2+del_num*4] ;
th=gps_t[3+del_num*4];
tl=gps_t[4+del_num*4] ;
for(ai=del_num;ai<zhand_num-1;ai++)
{
gps_t[1+ai*4]=gps_t[5+ai*4];
gps_t[2+ai*4]=gps_t[6+ai*4];
gps_t[3+ai*4]=gps_t[7+ai*4];
gps_t[4+ai*4]=gps_t[8+ai*4];
}
gps_t[1+ai*4]= tx;
gps_t[2+ai*4]= ty;
gps_t[3+ai*4]= th;
gps_t[4+ai*4]= tl;
zhand_num--;
write_iic_data(&gps_t[0],0,8);
delay(20);
write_iic_data(&gps_t[8],8,8);
delay(20);
write_iic_data(&gps_t[16],16,8);
delay(20);
}
}
Mcu_init();
LCD12864_picture((unsigned char*)gImage_test);
return;
}
void f_select()
{
uchar sel_num=1;
Mcu_init();
LCD12864_string(1,1,"查询站点");
cmdh=gps_t[3];
cmdl=gps_t[4];
cmdSend();
//显示:第一个站 语音提示
while(sel_num<zhand_num)
{
jianp();
if(anjian_z==3)
{
cmdh=gps_t[3+sel_num*4];
cmdl=gps_t[4+sel_num*4];
sel_num++;
cmdSend();
//显示:第del_num个站 语音提示
}
}
Mcu_init();
LCD12864_picture((unsigned char*)gImage_test);
return;
//显示地图;
}
void main(void)
{
uchar i;
bit baozh_flag=1,mos;
// write_iic_data(&gps_t[0],0,8);
// write_iic_data(&gps_t[8],8,8);
//write_iic_data(&gps_t[16],16,8);
mos=1;
jianp();
if(anjian_z==3)
{
mos=0;
}
serial_int();
du24c02();
Mcu_init();
LCD12864_picture((unsigned char*)gImage_test);
powerup();
while(mos)
{
while(RI == 0);
RI =0;
cs_temp[0]= SBUF;
if(SBUF==88)
{
while(RI == 0);
RI =0;
cs_temp[0]=SBUF;
while(RI == 0);
RI =0;
gps_x=SBUF;
while(RI == 0);
RI =0;
gps_y=SBUF;
}
lcd_gps_wei(gps_x,gps_y);
for(i=0;i<zhand_num;i++) //zhand_num 站点数 保存在24c02第一个数据
{
if(gps_x==gps_t[1+i*4] && gps_y==gps_t[2+i*4])
{
//根据 gps_temp[i].ddrl,gps_temp[i].ddrh 改变cmdh,cmdl
if(baozh_flag)
baozhan(gps_t[4+i*4]);
baozh_flag=0;
break;
}
}
if(i==zhand_num )
baozh_flag=1;
jianp();
if(anjian_z==1)
{
f_insert();
}
else if(anjian_z==2)
{
f_del();
}
else if(anjian_z==3)
{
f_select();
}
//gps函数得到真正的 gps_x,gps_y
// gps_x ++ ;
}
while(!mos)
{
Mcu_init();
serial_int();
while(1){
serial();
xssj(); //显示数据 日期时间经度纬度
}
}
}
//*************************************24c02*************************************
/* iic延时 */
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 开启iic总线 */
void iic_start(void)
{
SDA = 1;
SCL = 1;
iic_wait();
SDA = 0;
iic_wait();
SCL = 0;
}
/* 关闭iic总线 */
void iic_stop(void)
{
SDA=0;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
SDA=1;
}
/* 发送ACK信号 */
void iic_ack(void)
{
SDA=0;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/* 发送NOACK信号 */
void iic_no_ack(void)
{
SDA=1;
iic_wait();
SCL=1;
iic_wait();
SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack
功 能:等待ACK信号
说 明:
入口参数:
返 回 值:1-ACK 0-ERROR
设 计:蓝海微芯
***********************************************************************/
bit iic_wait_ack(void)
{
uchar errtime=255;
//uint errtime = 1000;
SDA=1;
iic_wait();
SCL=1;
iic_wait();
while(SDA)
{
errtime--;
if(!errtime)
return 0;
}
SCL=0;
return 1;
}
/********************************************************************
函 数 名:iic_send_byte
功 能:MCU向iic设备发送一个字节
说 明:
入口参数:sbyte 待发送的字节数据
返 回 值:
设 计:蓝海微芯
***********************************************************************/
void iic_send_byte(uchar sbyte)
{
uchar i = 8;
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(sbyte&0x80);
sbyte <<= 1;
iic_wait();
SCL = 1;
iic_wait();
}
SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte
功 能:MCU从iic设备接收一个字节
说 明:
入口参数:
返 回 值:ddata 接收数据
设 计:蓝海微芯
***********************************************************************/
uchar iic_receive_byte(void)
{
uchar i=8;
uchar ddata=0;
SDA=1;
while(i--)
{
ddata <<= 1;
SCL=0;
iic_wait();
SCL=1;
iic_wait();
ddata |= SDA;
}
SCL=0;
return ddata;
}
/********************************************************************
函 数 名:write_iic_data
功 能:向iic设备写入N个字节
说 明:
入口参数:write_data 存放写入字节的数组
address 指定从address处开始写入
num 写入的字节数
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void write_iic_data(uchar write_data[], uchar address, uchar num)
{
uchar n;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
for(n=0; n<num; n++)
{
iic_send_byte(write_data[n]);
iic_wait_ack();
}
iic_stop();
}
/********************************************************************
函 数 名:read_iic_data
功 能:从iic设备读取N个字节
说 明:
入口参数:read_data 存放读取字节的数组
address 指定从address处开始读取
num 读取的字节数
返 回 值:无
设 计:蓝海微芯
***********************************************************************/
void read_iic_data(uchar read_data[], uchar address, uchar num)
{
uchar n;
uchar *pread_data;
pread_data = read_data;
iic_start();
iic_send_byte(0xa0);
iic_wait_ack();
iic_send_byte(address);
iic_wait_ack();
iic_start();
iic_send_byte(0xa1);
iic_wait_ack();
for (n=0; n<num; n++)
{
*pread_data = iic_receive_byte();
pread_data++;
if (n != (num - 1)) //最后一个数据不应答
{
iic_ack();
}
}
iic_no_ack();
iic_stop();
}
//isd4002
void delay(uchar ms)
{ // 延时子程序
uchar i;
while(ms--) {
for(i = 0; i<99; i++){
_nop_();
_nop_();
}
}
}
void spi_send(uchar isdcmd)
{
uchar is;
sclk=0;
for(is=0;is<8;is++)
{
if ((isdcmd&0x01)==1)
mosi =1;
else
mosi =0;
isdcmd=isdcmd>>1;
sclk=1;
_nop_();
_nop_();
sclk=0;
_nop_();
_nop_();
}
}
void cmdSend()
{
int ai;
sclk=0;
ss=0;
_nop_();
_nop_();
_nop_();
spi_send(cmdl);
spi_send(cmdh);
_nop_();
_nop_();
ss=1;
}
void powerup()
{
cmdh=0x20;
cmdl=0x00;
cmdSend();
}
void Stop()
{
cmdh=0x30;
cmdl=0x00;
cmdSend();
delay(90);
}
void Play()
{
cmdh=0xe0;
cmdl=0x40;
cmdSend();
//判断stop停止
}
void Reco()
{
cmdh=0xa0;
cmdl=0x40;
cmdSend();
//判断stop停止
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -