新闻  |   论坛  |   博客  |   在线研讨会
89s52&LCM1602通讯模块
110xia | 2011-03-19 01:46:20    阅读:1820   发布文章

/*----------------------------- 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);
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
知其然,知其所以然, 常年潜水 QQ 156534403
最近文章
89s52&LCM1602通讯模块
2011-03-19 01:46:20
按键电路
2011-03-19 01:36:25
按键程序的总结
2011-03-19 01:06:54
推荐文章
最近访客