📄 no1.c
字号:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
uchar code REV[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};
#define LCD_data P0; //数据口
sbit LCD_RS = P2^0; //寄存器选择输入
sbit LCD_RW = P2^1; //液晶读/写控制
sbit LCD_EN = P2^2; //液晶使能控制
sbit LCD_PSB = P2^3; //串/并方式控制
sbit LCD_RST = P2^5; //液晶复位端口
sbit ON = P3^0;
sbit OP = P3^1;
sbit RUN = P2^7;
sbit B0 = P3^7;
sbit B1 = P3^6;
sbit B2 = P3^5;
sbit B3 = P3^4;
sbit B4 = P3^3;
uchar code dis1[] = {"32级步进速度控制 "};
uchar code dis2[] = {"当前状态 OFF "};
uchar code dis3[] = {"当前状态 FFW "};
uchar code dis4[] = {"当前状态 REV "};
uchar code dis5[] = {"转速 0 X "};
uchar code dis6[] = {" ROUND 00000 "};
uchar S;
uchar R;
uchar IRDIS[2];
uchar IRCOM[4];
void ffwr();
void revr();
void showspd();
void showr();
/*******************************************************************/
/* */
/*延迟类程序 */
/* */
/* */
/*******************************************************************/
void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay1(int n)
{
while(n--)
{
int i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为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()
{
LCD_RST = 0; //液晶复位
delay(30);
LCD_RST = 1;
delay(5);
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos);
}
/*********************************************************/
/* */
/* 转换为ASCII */
/* */
/*********************************************************/
void dataconv()
{
uchar t;
for (t=0;t<2;t++)
if(IRDIS[t]>9)
IRDIS[t]=IRDIS[t]+0x37;
else
IRDIS[t]=IRDIS[t]+0x30;
}
/*********************************************************/
/* */
/* 主程序 */
/* */
/*********************************************************/
void main()
{uchar i,s=1;
int r=0;
IE = 0x81;
TCON = 0x01;
EX0 = 0;
R=0;
delay(10);
lcd_init();
lcd_pos(0,0);
i = 0;
while(dis1[i] != '\0')
{
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(1,0);
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);
i++;
}
lcd_pos(2,0);
i = 0;
while(dis5[i] != '\0')
{
lcd_wdat(dis5[i]);
i++;
}
lcd_pos(3,0);
i = 0;
while(dis6[i] != '\0')
{
lcd_wdat(dis6[i]);
i++;
}
while(1)
{ RUN=1;
lcd_pos(1,0);
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]);
i++;
}
if(ON==0)
{RUN=0;
if(OP==0)
{
lcd_pos(1,0);
i = 0;
while(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);
i++;
}
ffwr();
r++;
R=r;
showr();
}
else
{
lcd_pos(1,0);
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
revr();
r++;
R=r;
showr();
}
}
}
}
/*********************************************************/
/* */
/* 正转 */
/* */
/*********************************************************/
void ffwr()
{
uchar i,j,s=32;
if(B0==1)
s=s-1;
if(B1==1)
s=s-2;
if(B2==1)
s=s-4;
if(B3==1)
s=s-8;
if(B4==1)
s=s-16;
S=s;
showspd();
for(i=0;i<12;i++)
{for (j=0; j<8; j++)
{
P1 = FFW[j];
delay1(s);
}
}
}
/*********************************************************/
/* */
/* 反转 */
/* */
/*********************************************************/
void revr()
{
uchar i,j,s=32;
if(B0==1)
s=s-1;
if(B1==1)
s=s-2;
if(B2==1)
s=s-4;
if(B3==1)
s=s-8;
if(B4==1)
s=s-16;
S=s;
showspd();
for(i=0;i<12;i++)
{for (j=0; j<8; j++)
{
P1 = REV[j];
delay1(s);
}
}
}
/*********************************************************/
/* */
/* 显示 */
/* */
/*********************************************************/
void showspd()
{ uchar i,j,c,play[3],p,s;
s=S;
c=32-s;
if(c<10)
{j=48;
i=c+49;
}
else if(c<19)
{j=49;
i=c+39;
}
else if(c<29)
{j=50;
i=c+29;
}
else
{j=51;
i=c+19;
}
play[0]=j;
play[1]=i;
play[2]='\0';
lcd_pos(2,3);
p = 0;
while(play[p] != '\0')
{
lcd_wdat(play[p]);
p++;
}
}
void showr()
{
uint r;
uchar p[7],g,s,b,q,w,l;
r=R;
g=r%10;
r=r-g;
r=r/10;
s=r%10;
r=r-s;
r=r/10;
b=r%10;
r=r-b;
r=r/10;
q=r%10;
r=r-q;
r=r/10;
w=r%10;
p[0]=w+48;
p[1]=q+48;
p[2]=b+48;
p[3]=s+48;
p[4]=g+48;
p[5]=0;
lcd_pos(3,4);
l = 0;
while(p[l] != '\0')
{
lcd_wdat(p[l]);
l++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -