/***************************************************
LCD1602 显示两行字符串
****************************************************/
#include "reg51.h"
#include "intrins.h" //由于在此源程序中用到_nop_();函数,所以必须加此头文件
#include "adc0832.h"
#include "lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit keyq=P2^4; //确定按键
sbit keyd=P2^5; //方向键
sbit keyi=P2^6; //加1按键 lcd_wcmd lcd_wdat
sbit keya=P2^7;
sbit m1=P1^4;
sbit m2=P1^5;
sbit m3=P1^6;
sbit m4=P1^7;
uchar pos; //步进电机
bit motorflag;
bit dir;
void delayms(uint ms)
{
uchar i;
while(ms--)for(i=0;i<120;i++);
}
void keyset()
{
if(keyq==0)
{
delayms(10);
if(keyq==0)
{
while(keyq==0);
motorflag=~motorflag;
}
}
if(keyd==0)
{
delayms(10);
if(keyd==0)
{
while(keyd==0);
dir=~dir;
}
}
}
void t0isr() interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(motorflag)
{
switch(pos)
{
case 0:m1=0;m2=1;m3=1;m4=1;break;
case 1:m2=0;m2=0;m3=1;m4=1;break;
case 2:m1=1;m2=0;m3=1;m4=1;break;
case 3:m1=1;m2=0;m3=0;m4=1;break;
case 4:m1=1;m2=1;m3=0;m4=1;break;
case 5:m1=1;m2=1;m3=0;m4=0;break;
case 6:m1=1;m2=1;m3=1;m4=0;break;
case 7:m1=0;m2=1;m3=1;m4=0;break;
}
if(dir==0)
{
pos++;
pos%=8;
}
else
{
pos--;
if(pos>7)pos=7;
}
}
}
//*********主函数*****************
void main(void)
{
uchar adval;
int gs;
float temp;
uchar dis[5];
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
ET0=1;
EA=1;
lcd_init();// 初始化LCD1602
delay(10);
Print(0,0," Welcom to use ");
Print(0,1,"magnetic: GS");
while(1)
{
keyset();
adval=read0832(); //采集磁场强度
temp=60.0*(float)adval/51.0-150.0+0.5;
gs=(int)temp;
if(gs<0)
{
gs=~gs+1;
dis[0]='-';
}
else dis[0]=' ';
dis[1]=gs%1000/100+0x30;
dis[2]=gs%100/10+0x30;
dis[3]=gs%10+0x30;
dis[4]=0;
Print(9,1,dis);
delayms(50);
}
}