📄 d.c
字号:
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/***************** LCD address*********/
#define w_c_add XBYTE[0x2070] /*写命令字地址*/
#define w_d_add XBYTE[0x2071] /*写数据地址*/
#define r_s_add XBYTE[0x2072] /*读状态字地址*/
#define r_d_add XBYTE[0x2073] /*读数据地址*/
/**************keybord address*************/
#define COM XBYTE[0x2021]
#define DAT XBYTE[0x2020]
/******************步进电机******************/
unsigned char code num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uchar idata zheng[10]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x00};
uchar idata fan[10]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x00};
/**************变量声明******************/
static uchar idata ad[8]; /*定义数据存储区 */
uchar bdata status;
sbit busy=status^7;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p14=P1^4;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p30=P3^0;
sbit p31=P3^1;
uint bj; /*电机延时时间*/
uchar key=0;
uchar last_key=0;
char error;
uchar error1;
uchar coutlc;
/****************显示 *******************/
uchar code welcom0[]=" 智能电梯终端 ";
uchar code welcom1[]=" ";
uchar code welcom2[]=" ";
uchar code welcom3[]=" ";
uchar code reach[]="~ ~ ~ ~ ";
uchar code reach0[]=" 楼已到 ";
uchar code reach1[]=" 欢迎下次乘坐 ";
uchar code reach2[]=" ^_^ ";
uchar code space[]=" ";
uchar code ask0[]="^_^ ";
uchar code ask1[]=" 欢迎乘坐电梯 ";
uchar code ask2[]=" 你想去几楼 ";
uchar code ask3[]=" ~ ~ ~ ~";
uchar code change0[]=" * * * * ";
uchar code change1[]="§ 楼 §";
uchar code change2[]=" * * * * ";
/***************函数声明*******************/
void chushi();
void start();
void show();
void show1();
void show2();
void show3();
void delay(uint n);
void lcd_busy(void);
void clear();
void display(uint m,uchar *p);
void display1(uint o);
void display2(uint p);
void dlms(uint n);
void ctrl(bit cf,uint n);
uint getkey(); /*键盘函数*/
uint ifkey(void);
/***************main函数*****************/
void main()
{
chushi(); /*初始化*/
start();
}
/*****************初始化***************/
void chushi()
{
EA=1;
IT0=1;
EX0=1;
p33=1;
p34=1;
p35=1;
show(); /*欢迎界面显示*/
delay(2);
show2();
}
/****************运行******************/
void start()
{
while(1)
{
key=getkey(); /*输入键值*/
error=key-last_key; /*实际键值*/
bj=50;
if(error<0) /*键值为负,下楼倒转*/
{ clear();
error1=0-error;
ctrl(1,error1*10);
p34=0;
p35=0;
show1();
display1(key);
}
else
{ clear(); /*键值为正,上楼正转*/
ctrl(0,error*10);
p34=0;
p35=0;
show1();
display1(key);
}
delay(2);
p33=0;
delay(1);
p33=1;
delay(1);
p33=0;
delay(1);
p33=1;
delay(2);
last_key=key;
}
}
/******************显示******************/
void show() /*欢迎显示*/
{
clear();
display(0x80,welcom0);
display(0x90,welcom1);
display(0x88,welcom2);
display(0x98,welcom3);
}
void show1() /*到达显示*/
{
clear();
display(0x80,reach);
display(0x90,reach0);
display(0x88,reach1);
display(0x98,reach2);
}
void show2() /*询问要到几楼*/
{
clear();
display(0x80,ask0);
display(0x90,ask1);
display(0x88,ask2);
display(0x98,ask3);
}
void show3() /*楼层实时变化*/
{
clear();
display(0x80,change0);
display(0x90,change1);
display(0x88,space);
display(0x98,change2);
}
void lcd_busy(void) /*LCD忙状态检测函数 */
{
do
{
status=r_s_add; /* 读状态字地址的第7位 */
}
while(busy);
}
void display(uint m,uchar *p)
{ uint n;
uint add;
add=m; /* 设置显示坐标,80H对应字符的第一行第一列 */
lcd_busy();
w_c_add=add; /* 写数据 */
for(n=0;n<8;n++)
{
lcd_busy();
w_d_add=p[2*n];
lcd_busy(); /* 写数据 ,上半字节*/
w_d_add=p[2*n+1]; /* 写数据 ,下半字节*/
}
}
void display1(uint o)
{
lcd_busy();
w_c_add=0x91;
lcd_busy();
w_d_add=num[o/10];
lcd_busy();
w_d_add=num[o%10];
lcd_busy();
}
void display2(uint p)
{
lcd_busy();
w_c_add=0x92;
lcd_busy();
w_d_add=num[p/10];
lcd_busy();
w_d_add=num[p%10];
lcd_busy();
}
/********************重置****************/
void clear()
{
lcd_busy();
w_c_add=0x30; /* 功能设置:8位数据 */
lcd_busy();
w_c_add=0x0C; /* 显示状态:整体显示,游标位置无效*/
lcd_busy();
w_c_add=0x01;/* 清除显示:将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00”*/
lcd_busy();
w_c_add=0x02;/* 地址归位:设定DDRAM的地址计数器到“00”,将游标移到开头原点位置 */
display(0x80,space);
display(0x90,space);
display(0x88,space);
display(0x98,space);
}
/****************延时程序**********/
void delay1()
{ int x=100000;
while(x--);
}
void delay(uint n)
{ uint i;
for(i=0;i<n;i++)
{
delay1();
}
}
/**************步进电机************/
void ctrl(bit cf,uint n)
{
unsigned char jac=0;
uint i;
uchar j=0;
uint k;
if(cf==0) /*正转标志*/
{
p34=0;
p35=1;
for(k=0;k<n;k++)
{
for(i=0;i<10;i++)
{
P1=zheng[j];
dlms(bj);
j+=1;
if(zheng[j]==0)
j=0;
}
jac=(jac+1)%10;
if(jac==9)
coutlc++;
show3();
display2(coutlc);
}
}
else /*反转标志*/
{
unsigned char jac1=0;
p35=0;
p34=1;
for(k=0;k<n;k++)
{
for(i=0;i<10;i++)
{
P1=fan[j];
dlms(bj);
j+=1;
if(fan[j]==0)
j=0;
}
jac=(jac+1)%10;
if(jac==9)
coutlc--;
show3();
display2(coutlc);
}
}
}
void dlms(uint speed) /*步进电机节拍控制*/
{
uint i;
uint j;
for(i=0;i<speed;i++)
{
for(j=0;j<10;j++);
}
}
/***************键盘函数****************/
uint getkey()/*取键值函数*/
{ uchar i;
while(ifkey()==0);/*无键按下等待*/
COM=0x40;/*读fifo ram命令*/
i=DAT;
i=i&0x3f;/*取键值低6位*/
return(i);/*返回键值*/
}
uint ifkey(void)/*判断fifo有键按下函数*/
{ uint k;
k=COM;
return(k&0x0f);/*有键按下*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -