"); //-->
/*----------------------------- Program Overview ------------------------
Device Name: AT89S52
ROM: 8 K bytes
RAM: 512 bytes
Chip Basic Functions: 40pin, 32I/O, 16 bit Timer *3, 8 bit UART *1, Eight Interrupt Sources
4.0V to 5.5V Operating Range, OSC 11.0592 MHz (0.9216 us)
Complier: keil C 750
Simulator: keil C 750
Programmer:
File Name: lcm.c
File Functtion: lcm display function
Copyright: XIAZHAOJUN
First Version Finished Date: 2007.11.6
Others:
------------------------------- Modified Note ---------------------------
Old Version:
New Version:
New CheckSum:
Modifier:
Modified Date:
Modified Causation:
Modified Mean:
-----------------------------------------------------------------------*/
//----------------------------- Include --------------------------------
#include <reg52.h>
//----------------------------- SFR Definition -------------------------
/*----------------------------------------------
LCM1602
|DB0-----P1.0 | DB4-----P1.4 | RW-------P3.3 |
|DB1-----P1.1 | DB5-----P1.5 | RS-------P3.2 |
|DB2-----P1.2 | DB6-----P1.6 | E--------P3.4 |
|DB3-----P1.3 | DB7-----P1.7 |
VSS--GND
VDD--VCC
BLA--VCC
BLK--GND
VLCD接1K电阻到GND
----------------------------------------------*/
sbit LCM_RW = P3^6;
sbit LCM_RS = P3^7;
sbit LCM_E = P3^4;
//----------------------------- Macro Definition ----------------------
#define LCM_Data P1
#define uchar unsigned char
#define uint unsigned int
//----------------------------- Constant Definition --------------------
//----------------------------- Variable Definition --------------------
//----------------------------- Bit Definition -------------------------
//----------------------------- Program Code ---------------------------
/*----------------------------- Subroutine -----------------------------
Name: lcm table
Function:
Entry:
Exit:
Caution:
--------------------------------------------------------------------*/
uchar code dsiptaba[14]={" XIA ZHAO JUN "};
uchar code dsiptabb[14]={"copyright 2007"};
uchar code dsiptabwait[9]={"wait... "};
uchar code dsp_tab_line[10][9]=
{
{"OFF Stop "}, //0
{"OFF Up "}, //1
{"OFF Down "}, //2
{"OFF Left "}, //3
{"OFF Right"}, //4
{"ON Stop "}, //5
{"ON Up "}, //6
{"ON Down "}, //7
{"ON Left "}, //8
{"ON Right"} //9
};
/*----------------------------- Subroutine ---------------------------
Name: delay
Function:
Entry:
Exit:
Caution:
--------------------------------------------------------------------*/
void del_100us(void){
uchar j;
for(j=100;j>0;j--);
}
void del_1ms(void){
uchar j;
for(j=10;j>0;j--){
del_100us();
}
}
void del_10ms(void){
uchar i;
for(i=100;i>0;i--){
del_100us();
}
}
void del_100ms(void){
uchar i;
for(i=10;i>0;i--){
del_10ms();
}
}
static void short_delay(unsigned int i){
while (i>0) i--;
}
/*----------------------------- Subroutine ----------------------------
Name: 1602 LCM busy
Function:
Entry:
Exit:
Caution:
---------------------------------------------------------------------*/
void ReadBusyLCM(void){
bit result;
do{
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 1;
LCM_Data=0xff;
result = (bit)(LCM_Data&0x80);
LCM_E = 0;
}while (result == 1);
del_1ms();
}
/*----------------------------- Subroutine --------------------------
Name: lcm command
Function:
Entry:
Exit:
Caution:
--------------------------------------------------------------------*/
void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC){
//BusyC为0时忽略忙检测
if (BusyC)
{
ReadBusyLCM(); //根据需要检测忙
}
LCM_E=0;
LCM_RS=0;
LCM_RW=0;
LCM_E=1;
LCM_Data=WCLCM;
LCM_E=0;
}
/*----------------------------- Subroutine ----------------------------
Name: lcm write data
Function:
Entry:
Exit:
Caution:
---------------------------------------------------------------------*/
void WritedataLCM(unsigned char WCLM,unsigned char BuyC){
if (BuyC)
{
ReadBusyLCM(); //根据需要检测忙
}
LCM_E=0;
LCM_RS=1;
LCM_RW=0;
LCM_E=1;
LCM_Data=WCLM;
LCM_E=0;
}
/*----------------------------- Subroutine -----------------------------
Name: lcm init
Function:
Entry:
Exit:
Caution:
----------------------------------------------------------------------*/
void LCMInit(void){ //LCM初始化
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x0C,1); // 显示开及光标设置
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x01,1); //显示清屏
short_delay(250);
}
/*----------------------------- Subroutine -----------------------------
Name: lcm write tab data
Function:
Entry:
Exit:
Caution:
----------------------------------------------------------------------*/
void LCMwritetab_rst(void)
{
unsigned char i;
WriteCommandLCM(0x01,1);
del_100ms();
for(i=0;i<9;i++)
{
WritedataLCM(dsp_tab_line[0][i],1);
}
WriteCommandLCM(0xc0,1);
for(i=0;i<9;i++)
{
WritedataLCM(dsiptabwait[i],1);
}
}
void LCMwritetab(void)
{
unsigned char i;
WriteCommandLCM(0x01,1);
for(i=0;i<14;i++)
{
WritedataLCM(dsiptabb[i],1);
}
short_delay(250);
WriteCommandLCM(0xc0,1);
for(i=0;i<14;i++)
{
WritedataLCM(dsiptaba[i],1);
}
del_100ms();
LCMwritetab_rst();
}
/*----------------------------- Subroutine ---------------------------
Name: lcm write receive motor stats data
Function:
Entry:
Exit:
Caution:
----------------------------------------------------------------------*/
void LCMwritetrece_stasdat(unsigned char DData){
unsigned char i;
WriteCommandLCM(0x01,1);
del_100ms();
for(i=0;i<9;i++)
{
WritedataLCM(dsp_tab_line[DData][i],1);
}
WriteCommandLCM(0xc0,1);
for(i=0;i<9;i++)
{
WritedataLCM(dsiptabwait[i],1);
}
}
/*----------------------------- Subroutine -----------------------------
Name: lcm_initial
Function:
Entry:
Exit:
Caution:
----------------------------------------------------------------------*/
void lcm_initial(void)
{
LCMInit();
LCMwritetab();
}
/*----------------------------- Subroutine ----------------------------
Name: lcm
Function:
Entry:
Exit:
Caution:
-----------------------------------------------------------------------*/
void lcm(void){
unsigned char lcdt;
LCMwritetrece_stasdat(lcdt);
}
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。