📄 finsh.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar SAVE;
uchar code FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
uchar code REV[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};
uchar code LIG[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#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 IRIN = P3^2; //红外遥控
sbit BEEP = P3^0; //蜂鸣器
uchar code dis1[] = {" 楼层显示器 "};
uchar code dis2[] = {"-----------------"};
uchar code dis3[] = {"当前楼层: 层 "};
uchar code dis4[] = {"当前状态: 暂停 "};
uchar code dis5[] = {"当前状态:上行 "};
uchar code dis6[] = {"当前状态:下行 "};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
char code SST516[3] _at_ 0x003b;
uchar NOW;
uchar IRDIS[2];
uchar IRCOM[4];
/*********************************************************/
/* */
/* 延迟程序 */
/* */
/*********************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay0(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void delay1(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/*******************************************************************/
/* */
/*检查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;
}
/*********************************************************/
/* */
/* 主程序 */
/* */
/*********************************************************/
main()
{
uchar i,p,m,n,up,now=0;
char r,s;
uchar l[12]={0,0,0,0,1,0,0,0,0,0,0,0};
uint j;
P1=0;
IE = 0x81;
TCON = 0x01;
BEEP=1;
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(dis3[i] != '\0')
{
lcd_wdat(dis3[i]);
i++;
}
lcd_pos(3,0);
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
do
{
n=now;
up=3;
for (j=0; j<2; j++)
{
for (i=0; i<8; i++)
{
P1 = LIG[i];
delay1(90);
}
}
for(i=0;i<7;i++)
{
r=n+i;
s=n-i;
if(l[r]==1&&r<9)
{up=1;
break;}
else if(l[s]==1&&s>0)
{up=0;
break;}
}
//判断数组中是否没有数
if(up==1) //上一层 并提示
{ uchar i;
uint j;
l[n]=0;
EX0=0;
p=P3;
if(now==0)
now=now+1;
else
{
lcd_pos(3,0);
i = 0;
while(dis5[i] != '\0')
{
lcd_wdat(dis5[i]);
i++;
}
for (j=0; j<12*1; j++)
{
for (i=0; i<8; i++)
{
P3 = FFW[i];
delay1(15);
}
}
for (i=0;i<100;i++)
{P3=0x00;
delay0(4);
P3=0x01;
delay0(4);
}
P3=0x01;
P3=p;
now=now+1;}
lcd_pos(3,0);
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
EX0=1;
}
else if(up==0) //下一层 并提示
{ uchar i;
uint j;
l[n-2]=0;
EX0=0;
p=P3;
lcd_pos(3,0);
i = 0;
while(dis6[i] != '\0')
{
lcd_wdat(dis6[i]);
i++;
}
for (j=0; j<12*2; j++)
{
for (i=0; i<8; i++)
{
P3 = REV[i];
delay1(15);
}
}
for (i=0;i<100;i++)
{P3=0x00;
delay0(4);
P3=0x01;
delay0(4);
}
P3=0x01;
now=now-1;
P3=p;
lcd_pos(3,0);
i = 0;
while(dis4[i] != '\0')
{
lcd_wdat(dis4[i]);
i++;
}
EX0=1;
}
if (IRCOM[2] == 0x10)
l[0]=1;
else if(IRCOM[2] == 0x03)
l[1]=1;
else if(IRCOM[2] == 0x01)
l[2]=1;
else if(IRCOM[2] == 0x06)
l[3]=1;
else if(IRCOM[2] == 0x09)
l[4]=1;
else if(IRCOM[2] == 0x1D)
l[5]=1;
else if(IRCOM[2] == 0x1F)
l[6]=1;
else if(IRCOM[2] == 0x0D)
l[7]=1;
IRCOM[2]=0x00;
m=now;
if(m==1)
{lcd_pos(2,5);
lcd_wdat('1');}
else if(m==2)
{lcd_pos(2,5);
lcd_wdat('2');}
else if(m==3)
{lcd_pos(2,5);
lcd_wdat('3');}
else if(m==4)
{lcd_pos(2,5);
lcd_wdat('4');}
else if(m==5)
{lcd_pos(2,5);
lcd_wdat('5');}
else if(m==6)
{lcd_pos(2,5);
lcd_wdat('6');}
else if(m==7)
{lcd_pos(2,5);
lcd_wdat('7');}
else if(m==8)
{lcd_pos(2,5);
lcd_wdat('8');}
else
{lcd_pos(2,5);
lcd_wdat('E');}
}
while(1);
}
/*********************************************************/
/* */
/* INT0外部中断子程序 */
/* */
/*********************************************************/
void IR_IN() interrupt 0 using 0
{
uchar j,k,p=0,N=0;
EX0 = 0;
delay0(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay0(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN); //等IR变为低电平,跳过4.5ms的前导高电平信号。
while (!IRIN); //等IR变为高电平
while (IRIN) //计算IR高电平时长
{
delay0(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
{ EX0=1;
return; }
EX0=1;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -