这是个汽车自动报站系统的程序,程序如下:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char BYTE;
typedef bit BOOL;
sbit LCD_RS = P2^5;
sbit LCD_RW = P2^6;
sbit LCD_EP = P2^4;
sbit key1=P2^0; //键盘IO
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit BEEP=P3^1;
unsigned char code dis1[]=("3 LINE ROM ONE TO FOUR STA
tiON 6AM-9PM");
unsigned char code dis2[]=(" ONE STATION ");
unsigned char code dis3[]=(" TWO STATION ");
unsigned char code dis4[]=(" THREE STATION ");
unsigned char code dis5[]=(" FOUR STATION ");
void delay(int ms)
{ // 延时子程序
while(ms--)
{
int A;
for(A = 0; A< 250; A++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_busy()
{ // 测试LCD忙碌状态
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);
LCD_EP = 0;
return (result);
}
void lcd_wcmd(BYTE cmd)
{ // 写入指令数据到LCD
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
lcd_pos(BYTE pos)
{ //设定显示位置
lcd_wcmd(pos | 0x80);
}
void lcd_wdat(BYTE dat)
{ //写入字符显示数据到LCD
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0;
}
void lcd_init()
{ //LCD初始化设定
key1=1;//按键初始化
key2=1;//按键初始化
key3=1;//按键初始化
key4=1;//按键初始化
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标
delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
}
void delay0(int x)
{
unsigned char j ;
while(x--)
{
for(j=0;j<13;j++)
{;}
}
}
void beep()
{
unsigned char I;
for (I=0;I<100;I++)
{
delay0(4);
BEEP=!BEEP;
}
BEEP=1;
delay(250);
}
//闪动子程序
void flash()
{ //控制停留时间
delay(600);
lcd_wcmd(0x08);//关显示
delay(200);
lcd_wcmd(0x0c); //开显示
delay(200);
lcd_wcmd(0x08);
delay(200);
lcd_wcmd(0x0c);
delay(200);
}
void main()
{
BYTE i,j;
lcd_init(); // 初始化LCD
delay(200);
//汽车运行
lcd_pos(0x10); //设置显示位置为第一行第17列
i = 0;
while(dis1
!=' ')
{
lcd_wdat(dis1);
i++;
} //显示车号
for(j=0;j<16;j++) //向左移动16格
{
lcd_wcmd(0x18); //字符同时左移一格
delay(200); //控制移动时间
}
while(1)
{
//站1
if(key1==0)
{
delay(10);
if(key1==0)
{
while(!key1);
beep(); //打开蜂鸣器
delay(100); //延时
beep(); //关闭蜂鸣器
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis2!=' ')
{
lcd_wdat(dis2);
i++;
}
flash();//闪动两次
delay(800); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay(200); //控制两屏转换时间
}
}
//站2
if(key2==0)
{
delay(10);
if(key2==0)
{
while(!key2);
beep(); //打开蜂鸣器
delay(100); //延时
beep(); //关闭蜂鸣器
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis3!=' ')
{
lcd_wdat(dis3);
i++;
}
flash();//闪动两次
delay(800); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay(200); //控制两屏转换时间
}
}
//站3
if(key3==0)
{
delay(10);
if(key3==0)
{
while(!key3);
beep(); //打开蜂鸣器
delay(100); //延时
beep(); //关闭蜂鸣器
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis4!=' ')
{
lcd_wdat(dis4);
i++;
}
flash();//闪动两次
lcd_wcmd(0x01); //清除LCD的显示内容
delay(200); //控制两屏转换时间 }
}
}
//站4
if(key4==0)
{
delay(10);
if(key4==0)
{
while(!key4)
beep(); //打开蜂鸣器
delay(100); //延时
beep(); //关闭蜂鸣器
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis5!=' ')
{
lcd_wdat(dis5);
i++;
}
flash();//闪动两次
lcd_wcmd(0x01); //清除LCD的显示内容
delay(200); //控制两屏转换时间
}
}
}
}
一周热门 更多>