?? lcd.c
字號:
#include <intrins.h>
#include <AT89X51.h>
/*--------------------系統(tǒng)變量定義------------------*/
//LCD模塊
#define LCD_RW P2_6 //讀寫控制端
#define LCD_RS P2_7 //數(shù)據(jù)命令選擇端
#define LCD_E P2_5 //執(zhí)行使能端
#define LCD_Data P1 //P1口
#define Write 0x00 //低電平寫入
#define Read 0x01 //高電平讀出
#define Data 0x01 //高電平選擇數(shù)據(jù)
#define Cmd 0x00 //低電平選擇命令
#define Enable 0x00 //躍變到低電平時執(zhí)行命令
#define Disable 0x01
#define True 0x01
#define False 0x00
#define LCD_Init 0x38 //初始化模式
#define LCD_DispCtr 0x0C //開顯示及光標(biāo)設(shè)置
#define LCD_CloseCtr 0x08 //關(guān)顯示
#define LCD_CLS 0x01 //清屏幕
#define LCD_EnterSet 0x06 //顯示光標(biāo)
#define Busy P1_7 //忙信號
//測速/測距/測時模塊
#define CircleLength 0x0C //小車轉(zhuǎn)一輪的長度為12cm
//控速模塊
#define P00 P0_0
#define LowSpeedHighTime 0x04
#define HighSpeedHighTime 0x08
/*--------------------------------------------------*/
/*--------------------全局函數(shù)----------------------*/
//LCD顯示模塊
void LCDInit(void); //LCD初始化
void SetWriteCmd(void); //設(shè)置寫命令模式
void SetReadCmd(void); //設(shè)置讀命令模式
void SetWriteData(void); //設(shè)置寫數(shù)據(jù)模式
void WriteCmd(char cmd); //寫命令
void WriteData(char ddata); //寫數(shù)據(jù)
void ExecuteCmd(void); //執(zhí)行命令
void SetXY(char x,char y); //定位顯示地址
void DisplaySingleChar(char x,char y,char cchar); //顯示單個字符
void DisplayString(char x,char y,char *str); //顯示一段字符串
void Delay(unsigned int time); //延時主程序
void DelayUs(unsigned int time); //延時子程序
bit IsBusy(void); //判斷忙標(biāo)志函數(shù)
void DisplayTime(void); //顯示時間
void DisplaySpeedANDDistance(void); //顯示速度和時間
void DisplayAverageSpeed(void); //顯示平均速度
//測速/測距/測時模塊
void INTInit(void); //所有中斷初始化
void Clock0_Init(void); //時鐘0中斷初始化
void SpeedINT(void); //測速中斷
void Time0INT(void); //測速單位時間中斷
//控速模塊
void CtrSpeedINT(void); //控速中斷
void Time1INT(void); //控速單位時間中斷
void Clock1_Init(void); //時鐘1中斷初始化
void CtrSpeed(void);
/*--------------------------------------------------*/
/*--------------------全局變量----------------------*/
char SpeedCount = 0; //測速計數(shù)脈沖
char SpeedStr[] = "V:"; //速度提示符
char SpeedUnitStr[] = "cm/s"; //速度單位提示符
int Speed = 0; //速度顯示
char TimeStr[] = "T:"; //小車行走時間提示符
char TimeUnitStr[] = "s"; //時間單位提示符
int Time0INTCount = 0; //T0中斷時間計時
char DistanceStr[] = "S:"; //行走路程提示符
char DistanceUnitStr[] = "cm"; //路程單位提示符
int Distance = 0; //行走路程
char Time; //高電平持續(xù)時間變量
char Period=0x0A; //輸出方波周期
char Area=0; //區(qū)域變量
char HighTime; //高電平持續(xù)時間
char Time1INTCount=0; //T1中斷時間計時
char PassTime=0; //小車行走的時間
char DisplaySwitch=0; //顯示切換變量
bit IsT0INT; //判斷T0是否已經(jīng)響應(yīng)中斷
char Maker[]="106Pro"; //制作單位名稱
int AverageSpeed;
/*---------------------主函數(shù)-----------------------*/
void main()
{
INTInit(); //初始化所有中斷
Clock0_Init(); //初始化時鐘中斷0
Clock1_Init(); //初始化時鐘中斷1
Delay(40); //延時等待LCD啟動
LCDInit(); //初始化LCD
DisplayString(0x0A,0,TimeStr); //顯示時間提示符
DisplayString(0x0F,0,TimeUnitStr);
DisplayString(0,0,SpeedStr); //顯示速度提示符
DisplayString(0x05,0,SpeedUnitStr);
DisplayString(0,1,DistanceStr); //顯示路程提示符
DisplayString(0x06,1,DistanceUnitStr);
DisplayString(0x0A,1,Maker) ; //顯示制作單位
while(1)
{
if (IsT0INT==1 && Area>=1 && Area<6)
DisplayTime();
if (IsT0INT==1 && Area>=6)
{
DisplayAverageSpeed();
EX0=0;
ET0=0;
P00=0;
}
}
while(1); //等待中斷,循環(huán)處理
}
void LCDInit(void)
{
//三次顯示模式設(shè)置
LCD_Data=0;
LCD_E=Disable;
Delay(5);
WriteCmd(LCD_Init);
Delay(5);
WriteCmd(LCD_Init);
Delay(5);
WriteCmd(LCD_Init);
WriteCmd(LCD_Init); //初始化
WriteCmd(LCD_CloseCtr); //關(guān)顯示
WriteCmd(LCD_CLS); //清屏幕
WriteCmd(LCD_EnterSet); //光標(biāo)移動設(shè)置
WriteCmd(LCD_DispCtr); //顯示開以及光標(biāo)設(shè)置
}
void SetWriteCmd(void)
{
LCD_RW=Write;
LCD_RS=Cmd;
}
void SetReadCmd(void)
{
LCD_RW=Read;
LCD_RS=Cmd;
}
void SetWriteData(void)
{
LCD_RW=Write;
LCD_RS=Data;
}
void WriteCmd(char cmd)
{
while(IsBusy());
LCD_Data=cmd;
SetWriteCmd();
ExecuteCmd();
}
void WriteData(char ddata)
{
while(IsBusy());
LCD_Data=ddata;
SetWriteData();
ExecuteCmd();
}
void ExecuteCmd(void)
{
LCD_E=Enable;
LCD_E=Disable;
}
void SetXY(char x,char y)
{
if (y)
x|=0x40;
x|=0x80;
Delay(5);
WriteCmd(x);
}
void DisplaySingleChar(char x,char y,char cchar)
{
SetXY(x,y);
WriteData(cchar);
}
void DisplayString(char x,char y,char *str)
{
while(*str)
{
Delay(5);
DisplaySingleChar(x++,y,*str);
str++;
}
}
void Delay(unsigned int time)
{
unsigned int timeCounter = 0;
for (timeCounter = time;timeCounter > 0 ;timeCounter --)
DelayUs(255);
}
void DelayUs(unsigned int time)
{
unsigned int timeCounter = 0;
for (timeCounter = 0;timeCounter < time;timeCounter ++)
_nop_();
}
bit IsBusy(void)
{
LCD_Data=0xFF;
SetReadCmd();
ExecuteCmd();
return (bit)(P1 & 0x80);
}
void INTInit(void)
{
EA=1; //開總中斷
EX0=1; //開INTO中斷
IT0=1; //INTO邊沿觸發(fā)
PX0=1; //INTO優(yōu)先級為高級
EX1=1; //開INT1中斷
IT1=1; //INT1邊沿觸發(fā)
PX1=1; //INT1優(yōu)先級為高級
TMOD=0x01; //T0定時方式1
ET0=0x01; //開T0中斷
ET1=0x01; //開T1中斷
Time=0;
HighTime=LowSpeedHighTime;
}
/*-----------------中斷處理----------------------*/
void SpeedINT(void) interrupt 0 using 0
{
SpeedCount++;
}
void Time0INT(void) interrupt 1 using 1
{
Clock0_Init();
Time0INTCount++;
if (Time0INTCount == 20) //1S時間到
{
EX0=0x00; //關(guān)INT0中斷
IsT0INT=1;
DisplaySpeedANDDistance();
SpeedCount=0;
Time0INTCount=0; //計數(shù)清0
EX0=0x01; //重開INT0
}
}
void CtrSpeedINT(void) interrupt 2 using 2
{
TR1=0x00; //關(guān)閉T1計時
Area++;
if (Area==2) //區(qū)域1--低速區(qū)
HighTime=LowSpeedHighTime;
else if (Area==3) //區(qū)域2--高速區(qū)
HighTime=HighSpeedHighTime;
else if (Area==4) //區(qū)域3--低速區(qū)
HighTime=LowSpeedHighTime;
else if (Area>4 && Area<6)
HighTime=LowSpeedHighTime;
else
HighTime=0; //經(jīng)過3個區(qū)域后停止
if (Area<6)
TR1=0x01; //重新開啟T1
}
void Time1INT(void) interrupt 3 using 3
{
Clock1_Init();
CtrSpeed();
}
void Clock0_Init(void)
{
TR0=0x01; //啟動T0
TH0=0x3C; //定時初值
TL0=0x0B0;
}
void Clock1_Init(void)
{
TR1=0x01; //啟動T1
TH1=0x3C; //定時初值
TL1=0x0B0;
}
void DisplayTime(void)
{
char PassTime1=0x30;
char PassTime2=0x30;
IsT0INT=0;
PassTime++;
PassTime1+=(PassTime%10);
if (PassTime > 9)
PassTime2+=(PassTime/10);
DisplaySingleChar(0x0D,0,PassTime2);
DisplaySingleChar(0x0E,0,PassTime1);
}
void CtrSpeed(void)
{
//方波控制--速度控制
if (++Time==HighTime)
P00=0;
if (Time==Period)
{
P00=1;
Time=0;
}
}
void DisplaySpeedANDDistance(void)
{
char Speed1=0x30; //初始化為0的ASCII碼
char Speed2=0x30;
char Distance1=0x30;
char Distance2=0x30;
char Distance3=0x30;
char Distance4=0x30;
Speed=SpeedCount*CircleLength; //計算速度
Speed1+=(Speed%10); //取個位數(shù)
Speed2+=(Speed/10); //取十位數(shù)
Distance+=Speed; //路程計算
Distance1+=(Distance%10);
Distance4+=(Distance/1000);
if (Distance > 99)
Distance2+=(Distance/10%10);
else
Distance2+=(Distance/10);
if (Distance > 999)
Distance3+=(Distance/100%10);
else
Distance3+=(Distance/100);
DisplaySingleChar(0x3,0,Speed2); //顯示速度
DisplaySingleChar(0x4,0,Speed1);
DisplaySingleChar(0x02,1,Distance4);
DisplaySingleChar(0x03,1,Distance3); //顯示路程
DisplaySingleChar(0x04,1,Distance2);
DisplaySingleChar(0x05,1,Distance1);
}
void DisplayAverageSpeed(void)
{
char AverageSpeed1=0x30; //初始化為0的ASCII碼
char AverageSpeed2=0x30;
AverageSpeed=Distance/PassTime%100;
AverageSpeed1+=(AverageSpeed%10); //取個位數(shù)
AverageSpeed2+=(AverageSpeed/10);
DisplaySingleChar(0x3,0,AverageSpeed2); //顯示平均速度
DisplaySingleChar(0x4,0,AverageSpeed1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -