📄 ir- motor-lcd1602.c
字号:
/*****************************************************************/
/* *
/* ME500单片机开发系统演示程序 - 红外遥控步进电机 *
/* *
/* LCD1602显示 *
/* *
/* 版本: V1.0 (2006/11/20) *
/* 作者: gguoqing (Email: gguoqing@willar.com) *
/* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界)*
/* 邮箱: support@willar.com *
/* *
/*【版权】COPYRIGHT(C)伟纳电子 www.willar.com ALL RIGHTS RESERVED *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
/* *
/*****************************************************************/
#include <reg51.h> //51芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar code FFW[8]= {0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]= {0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
uchar IRCOM[6]=(0x00,0x00,0x00,0x00,0x00,0x00);
sbit BEEP = P3^7; //蜂鸣器
sbit IRIN=P3^2; //红外接收端口
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
bit on_off=0; //运行与停止标志
bit direction=1; //方向标志
bit rate_dr=1; //速率标志
bit snum_dr=1; //圈数标志
bit flag; //红外接收有效标志
bit pause1=0; //暂停标志
//uchar code cdis1[ ] = {" STEPPING MOTOR "};
//uchar code cdis2[ ] = {"CONTROL PROCESS"};
uchar code cdis1[ ] = {" IR CONTROL "};
uchar code cdis2[ ] = {" STEPPING MOTOR "};
uchar code cdis3[ ] = {"IR:--H STOP "};
uchar code cdis4[ ] = {"NUM: RATE: "};
uchar code cdis5[ ] = {" RUN "};
uchar code cdis6[ ] = {" STOP"};
uchar code cdis7[ ] = {"PAUSE"};
uchar m,v=0,q=0;
uchar number=0,number1=0;
uchar snum=10,snum1=10; //预设定圈数
uchar rate=8; //预设定速率
uchar data_temp,data_temp1,data_temp2;
uchar TEMP;
void IR_IN();
/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uchar k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}
/********************************************************/
void beep()
{
uchar j;
for (j=0;j<100;j++)
{
delayB(5);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
/********************************************************/
/*
/*检查LCD忙状态
/*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。
/*
/********************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/********************************************************/
/*
/*写指令数据到LCD
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
/*
/********************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/*写显示数据到LCD
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
/*
/********************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/********************************************************/
/*
/* LCD初始化设定
/*
/********************************************************/
void lcd_init()
{
delay(30);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/********************************************************/
/*
/* 设定显示位置
/*
/********************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/********************************************************/
/*
/* LCD1602初始显示子程序
/*
/********************************************************/
void LCD_init_DIS()
{
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]);
lcd_pos(0x40); //设置显示位置为第二行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);
delay(3000); //延时
lcd_pos(0); //设置显示位置为第一行的第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis3[m]);
lcd_pos(0x40); //设置显示位置为第二行第1个字符
for(m=0;m<16;m++)
lcd_wdat(cdis4[m]);
for(m=0;m<2;m++)
{
lcd_pos(0x0d+m); //显示方向符号
lcd_wdat(0x3e);
}
}
/********************************************************/
/*
/*数据转换子程序
/*
/********************************************************/
void data_conv()
{
data_temp1=data_temp/10; //高位
if(data_temp1==0)
{data_temp1=0x20;} //高位为0不显示
else
{data_temp1=data_temp1+0x30;}
data_temp2=data_temp%10; //低位
data_temp2=data_temp2+0x30;
}
void code_conv()
{
IRCOM[5]=IRCOM[2];
IRCOM[6]=IRCOM[5]&0x0f; //低位
if(IRCOM[6]>0x09)
IRCOM[6]=IRCOM[6]+0x37;
else
IRCOM[6]=IRCOM[6]+0x30;
IRCOM[5]=(IRCOM[5]&0xf0)>>4; //高位
if(IRCOM[5]>0x09)
IRCOM[5]=IRCOM[5]+0x37;
else
IRCOM[5]=IRCOM[5]+0x30;
}
/********************************************************/
/*
/*数据显示子程序
/*
/********************************************************/
void data_dis()
{
code_conv();
lcd_pos(0x03);
lcd_wdat(IRCOM[5]);
// lcd_pos(0x08);
lcd_wdat(IRCOM[6]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -