/*AT89S52测试脉冲输出 2012 5 8PCB四入四出板
L270 CODE 771 PAST 测试步进电机伺服电机旋转位置**/
/*****---------------********/
/*****|手动: XXX |******/
/*****| |******/
/***** ---------------*******/
#include <REG51.H>
#include <intrins.H>
#define uint unsigned int
#define uchar unsigned char
uint aa=0;
#define Lcd_Bus P2 /*MCU P2<---> LCM */
sbit RS=P3^5; //RS PIN4
sbit RW=P3^6; //RW PIN5
sbit E=P3^7; //E PIN6
sbit KEYA=P1^3; /*加按键*/
sbit KEYB=P1^2; /*减按键*/
sbit KEY1=P1^0; /*功能按键*/
sbit KEY2=P1^1; /*功能按键*/
sbit MDIRECT=P3^1; //Direction
sbit MTORCP=P3^0; //
bdata char com_data; /********/
uchar flag;
uint h,l,m,n,k,s,g,x; /****个十百代码缓冲**/
uint i,j; /**半自动按键输入计数器**/
uint t1,t2,t3; /****总数个十百千****/
void delay_iic(int v); /****eeprom读写延时**/
void write_com(unsigned char cmdcode);
void write_data(unsigned char Dispdata);
void delay(uint k); /****延时****/
/*------------------延时1mS子程序------------------------*/
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
}
while (--i);
}
/*------------------延时子程序------------------------*/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
for(j=0;j<121;j++);
}
/*------------------检查忙位--------------------------*/
void chk_busy()
{
RS=0;
RW=1;
E=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
E=0;
}
/*------------------写命令到LCD-----------------------*/
void write_com(unsigned char cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
Lcd_Bus=cmdcode;
delay(5); /*在数据写入的时候加入适当的延时*/
E=0;
delay(5);
}
/*-------------------写数据到LCD----------------------*/
void write_data(unsigned char Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
Lcd_Bus=Dispdata;
delay(5); /*在数据写入的时候加入适当的延时 */
E=0;
delay(5);
}
/*------------------初始化LCD屏-----------------------*/
void lcdreset()
{
delay(300);
RW=0;
delay(10); /*选择基本指令集 */
write_com(0x30); /*选择8bit数据流 */
delay(5);
write_com(0x0F); /*开显示(无游标、不反白) */
delay(10);
write_com(0x01); /*清除显示,并且设定地址指针为00H */
delay(50);
// write_com(0x18); /*游标或显示移位控制 */
delay(50);
write_com(0x04); /*游标的移动方向及指定显示的移位*/
delay(0);
}
/**************顶出**************************/
void xsdc()
{
write_com(0x84); /*---顶---*/
write_data(0xB6);
write_data(0xA5);
write_com(0x85); /*---出---*/
write_data(0xB3);
write_data(0xF6);
}
/**************顶退**************************/
void xsdt()
{
write_com(0x84); /*---顶---*/
write_data(0xB6);
write_data(0xA5);
write_com(0x85); /*---退---*/
write_data(0xCD);
write_data(0xCB);
}
/***************显示 手动 ***************/
void xs0()
{
write_com(0x80); /*---手---*/
write_data(0xCA);
write_data(0xD6);
write_com(0x81); /*---动---*/
write_data(0xB6);
write_data(0xAF);
write_com(0x82); /*---CLEAR---*/
write_data(0xB6);
write_data(0xA0);
}
/*----------电机前进------------*/
void MotorForward( uint m) /*写数据B子函数*/
{
uint i;
EA=0; //关总中断
for(i=0;i<m;i++) //800个脉冲转动一圈。
{
MTORCP=0; /*子函数开始*/
Delay1ms(); //延时1毫秒
MTORCP=1;
Delay1ms();
}
EA=1; //开总中断
}
/*----------电机后退------------*/
void MotorBack(uint m) /*写数据B子函数*/
{ /*子函数开始*/
uint i;
EA=0; //关总中断
for(i=0;i<m;i++) //800个脉冲转动一圈。
{
MTORCP=0; /*子函数开始*/
Delay1ms();
MTORCP=1;
Delay1ms();
}
EA=1; //开总中断
}
/*----------------清除 动作 显示 -----------*/
void xs9()
{
write_com(0x84); /*---CLEAR---*/
write_data(0xB6);
write_data(0xA0);
write_com(0x85); /*---CLEAR---*/
write_data(0xB6);
write_data(0xA0);
}
/*------------------主循环程序----------------*/
void main( ) /*主程序开始*/
{
P0=255;
P1=255;
P2=255;
P3=255;
lcdreset(); /*液晶复位*/
xs0(); /*显示手动 设定波值*/
delay(3000);
while(1) //主程序循环
{
delay(200);
k=0;
i=0;
j=0;
delay(200);
delay(200);
if(!KEY1) //检测自动键 aa=926;
{ //按下自动键进入条件判断语句
for(;k<=5;) /*小于等于5循环*/
{
if(!KEY1) /*检测自动按键为低电平?*/
{ /*循环检测 */
k++;
delay(5);
}
else if(~!KEY1) /*检测自动按键为高电平?*/
{
k=0; /*寄存器复位*/
}
}
xsdc(); //显示顶出
MotorForward(800); //电机前进
xs9(); //清除 动作 显示
k=0; /*抗干扰计数器*/
}
if(!KEY2) //检测自动键 aa=926;
{ //按下自动键进入条件判断语句
for(;k<=5;) /*小于等于5循环*/
{
if(!KEY2) /*检测自动按键为低电平?*/
{ /*循环检测 */
k++;
delay(5);
}
else if(~!KEY2) /*检测自动按键为高电平?*/
{
k=0; /*寄存器复位*/
}
}
xsdt(); //显示顶出
MotorBack(800); //电机前进
xs9(); //清除 动作 显示
k=0; /*抗干扰计数器*/
}
if(!KEYA) //检测自动键 aa=926;
{ //按下自动键进入条件判断语句
for(;k<=5;) /*小于等于5循环*/
{
if(!KEYA) /*检测自动按键为低电平?*/
{ /*循环检测 */
k++;
delay(5);
}
else if(~!KEYA) /*检测自动按键为高电平?*/
{
k=0; /*寄存器复位*/
}
}
xsdc(); //显示顶出
MotorForward(400); //电机前进
xs9(); //清除 动作 显示
k=0; /*抗干扰计数器*/
}
if(!KEYB) //检测自动键 aa=926;
{ //按下自动键进入条件判断语句
for(;k<=5;) /*小于等于5循环*/
{
if(!KEYB) /*检测自动按键为低电平?*/
{ /*循环检测 */
k++;
delay(5);
}
else if(~!KEYB) /*检测自动按键为高电平?*/
{
k=0; /*寄存器复位*/
}
}
xsdt(); //显示顶出
MotorBack(400); //电机前进
xs9(); //清除 动作 显示
k=0; /*抗干扰计数器*/
}
}
} //2015 10 17 16:58