#include <reg51.h>
#include <intrins.h> //包含_nop_( )空函数指令的头文件
#define uchar unsigned char
#define uint unsigned int
#define out P3
sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
sbit S5=P1^4;
sbit RS=P2^0; //位变量
sbit RW=P2^1; //位变量
sbit E=P2^2; //位变量
void key_scan(void);
void run(void);
void back(void);
void left(void);
void right(void);
void stop(void);
void lcd_initial(void); //LCD初始化函数
void check_busy(void); //检查忙标志函数
void write_command(uchar com); //写命令函数
void write_data(uchar dat); //写数据函数
void string(uchar ad ,uchar *s);
void lcd_test(void);
void delay(uint); //延时函数
unsigned char keyval;
void main(void) //主函数
{
keyval=0;
lcd_initial( ); //调用对LCD初始化函数
while(1)
{
key_scan();
switch(keyval)
{
case 1:run();
break;
case 2:back();
break;
case 3:left();
break;
case 4:right();
break;
case 5:stop();
break;
}
string(0x85,"51 car"); //显示的第1行字符串
string(0xC2," NYNU WDXY"); //显示的第2行字符串
}
}
void key_scan(void)
{
P0=0xff;
if((P1&0x0f)!=0x0f)
{
if(S1==0) //按键k1被按下
keyval=1;
if(S2==0) //按键k2被按下
keyval=2;
if(S3==0) //按键k3被按下
keyval=3;
if(S4==0) //按键k4被按下
keyval=4;
if(S5==0);
keyval=5;
}
}
void run(void)
{
P0=0x35;
}
void bcak(void)
{
P0=0x3a;
}
void left(void)
{
P0=0x34;
}
void right(void)
{
P0=0x31;
}
void stop(void)
{
P0=0x30;
}
void check_busy(void) //检查忙标志函数
{
uchar dt;
do
{
dt=0xff;
E=0;
RS=0;
RW=1;
E=1;
dt=out;
}while(dt&0x80);
E=0;
}
void delay(uint j) //1ms延时子程序
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
void write_command(uchar com) //写命令函数
{
check_busy();
E=0;
RS=0;
RW=0;
out=com;
E=1;
_nop_( );
E=0;
delay(1);
}
void write_data(uchar dat) //写数据函数
{
check_busy();
E=0;
RS=1;
RW=0;
out=dat;
E=1;
_nop_();
E=0;
delay(1);
}
void LCD_initial(void) //液晶显示器初始化函数
{
write_command(0x38); //写入命令0x38:8位两行显示,5×7点阵字符
write_command(0x0C); //写入命令0x0C:开整体显示,光标关,无黑块
write_command(0x06); //写入命令0x06:光标右移
write_command(0x01); //写入命令0x01:清屏
delay(1);
}
void string(uchar ad,uchar *s) //输出显示字符串的函数
{
write_command(ad);
while(*s>0)
{
write_data(*s++); //输出字符串,且指针增1
delay(100);
}
}
|