#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);
}
}
|