天天看点

(3)基于51单片机电压表的程序

#ifndef LCD1602_H

#define LCD1602_H

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

#define LCD_DATA  P1

#define LCD_COMM  P2

sbit E1 = LCD_COMM^3;                 

sbit E2 = LCD_COMM^2;                 

sbit RW = LCD_COMM^1; 

sbit DI = LCD_COMM^0;

#define ON         0xAF //开显示指令

#define OFF        0xAE //关显示指令

#define DISP_START 0xC0 //起始显示行

#define PAGE_ADDR  0xB8 //页地址指令

#define COL_ADDR   0x00 //页地址指令

#define MASK_BUSY  0x80 //读忙位掩码

#define RMW        0xE0 //读时地址不变,写时地址增加;用于“读-改-写”

#define END_RMW    0xEE //退出“读-改-写”模式

#define DUTY32     0xA9 //设置为扫描32行

#define DRIVE_MODE 0xA4 //0:打开动态扫描

bit L_R=0;

uchar code ASCII_TAB[][5];//7x5 ASCII 字库

uchar code CN_TAB[][32];//字库

void WriteData(uchar byte)   //向左屏写数据

{

    RW=0;  //write 

    DI=1;  //data

 if(L_R) //  1 时表示写右屏           

    {

  E2=1; 

     LCD_DATA=byte;

     E2=0;

 }

 else

 {

  E1=1; 

     LCD_DATA=byte;

     E1=0;

 } 

}

void WriteCmd(uchar byte)    //向右屏写指令

{

    RW=0;  //write 

    DI=0;  //command

 if(L_R) //  1 时表示写右屏           

    {

  E2=1; 

     LCD_DATA=byte;

     E2=0;

 }

 else

 {

  E1=1; 

     LCD_DATA=byte;

     E1=0;

 }

}

void Init(void)                //初始化

{

 L_R=0;      //左屏初始化

    WriteCmd(OFF);        //关显示

 WriteCmd(DISP_START); //从第0行开始显示

 WriteCmd(DRIVE_MODE); //动态显示

 WriteCmd(DISP_START); //列地址切换到0

    WriteCmd(PAGE_ADDR);  //页地址切换到0

    WriteCmd(DUTY32);     //扫描行数为32

    WriteCmd(END_RMW);    //关闭RMR模式

    WriteCmd(ON);         //开显示

 L_R=1;        //右屏初始化

    WriteCmd(OFF);        //关显示

 WriteCmd(DISP_START); //从第0行开始显示

 WriteCmd(DRIVE_MODE); //动态显示

 WriteCmd(DISP_START); //列地址切换到0

    WriteCmd(PAGE_ADDR);  //页地址切换到0

    WriteCmd(DUTY32);     //扫描行数为32

    WriteCmd(END_RMW);    //关闭RMR模式

    WriteCmd(ON);         //开显示

}

void Clean(void)               //清屏

{

    uchar i; 

    uchar page;

 L_R=0;      //左屏

    for(page=0;page<4;page++)              //0~3页

    { 

        WriteCmd(PAGE_ADDR|page);

        for(i=0;i<61;i++)                  //0~60列

        { 

            WriteCmd(COL_ADDR|i);

            WriteData(0x00);

        } 

   }

   L_R=1;        //右屏

   for(page=0;page<4;page++)              //0~3页

    { 

        WriteCmd(PAGE_ADDR|page);

        for(i=0;i<61;i++)                  //0~60列

        { 

            WriteCmd(COL_ADDR|i);

            WriteData(0x00);

        } 

   }

}

void LocateXY(uchar x,uchar y)

{

 if(x>60)   //左屏从 0 -- 60  列 超出则为右屏

 {

  x%=61;

  L_R=1;//右屏

 }

 else

  L_R=0;//左屏

 WriteCmd(COL_ADDR|x);

    WriteCmd(PAGE_ADDR|y);

}

void PrintEN(uchar x,uchar y,uchar dat)

{

 bit cross=1;

 uchar i;

 uchar  *EN_P= ASCII_TAB[dat-32];

 LocateXY(x,y);

 for(i=0;i<5;i++)

 {   

  if(cross&(x>60)) //跨越左右屏 要从新设地址

  {

   LocateXY(x,y);

   cross=0;   //只能有一次跨越

  }

  WriteData(*EN_P++);

  x++;

 }

 WriteData(0x00);//字模宽度为5,为了美观,在后面加入一个空白列 

}

void PrintString(uchar x,uchar y,uchar *str)

{

 while(*str!='/0')

 {

  if(x>117)  //每行122列 一般英文占6列  最后一个允许只占5列

  {     //剩余不足一个英文 则换行(122-117=5)

   x=0;

   y++;

   if(y>3)

   y=0;

  }

  PrintEN(x,y,*str++);

  x+=6; 

 }

}

void PrintInt(uchar x,uchar y,long num)

{

 uchar temp[10];

 char i=0;

 long numt;

 if(num<0)

 {

  PrintEN(x,y,'-');

  x+=6;

  numt=-num; 

 }

 else

  numt=num;

 do

 {

  temp[i]=numt%10;

  numt/=10;

  i++; 

 }while(numt); 

 i--;

 while(i>=0)

 {

  if(x>117)  //每行122列 一般英文占6列  最后一个允许只占5列

  {     //剩余不足一个英文 则换行(122-117=5)

   x=0;

   y++;

   if(y>3)

   y=0;

  }

  PrintEN(x,y,(temp[i--]+48)); //32 +16

  x+=6;

 }

}

uchar code ASCII_TAB[][5]=  //5*7 逐列

{   

    { 0x00, 0x00, 0x00, 0x00, 0x00 },   // sp  

    { 0x00, 0x00, 0x2f, 0x00, 0x00 },   // !  

    { 0x00, 0x07, 0x00, 0x07, 0x00 },   // "  

    { 0x14, 0x7f, 0x14, 0x7f, 0x14 },   // #  

    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   // $  

    { 0xc4, 0xc8, 0x10, 0x26, 0x46 },   // %  

    { 0x36, 0x49, 0x55, 0x22, 0x50 },   // &  

    { 0x00, 0x05, 0x03, 0x00, 0x00 },   // '  

    { 0x00, 0x1c, 0x22, 0x41, 0x00 },   // (  

    { 0x00, 0x41, 0x22, 0x1c, 0x00 },   // )  

    { 0x14, 0x08, 0x3E, 0x08, 0x14 },   // *  

    { 0x08, 0x08, 0x3E, 0x08, 0x08 },   // +  

    { 0x00, 0x00, 0x50, 0x30, 0x00 },   // ,  

    { 0x10, 0x10, 0x10, 0x10, 0x10 },   // -  

    { 0x00, 0x60, 0x60, 0x00, 0x00 },   // .  

    { 0x20, 0x10, 0x08, 0x04, 0x02 },   // /   

    { 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0  

    { 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1  

    { 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2  

    { 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3  

    { 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4  

    { 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5  

    { 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6  

    { 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7  

    { 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8  

    { 0x06, 0x49, 0x49, 0x29, 0x1E },   // 9

    { 0x00, 0x36, 0x36, 0x00, 0x00 },   // :  

    { 0x00, 0x56, 0x36, 0x00, 0x00 },   // ;  

    { 0x08, 0x14, 0x22, 0x41, 0x00 },   // <  

    { 0x14, 0x14, 0x14, 0x14, 0x14 },   // =  

    { 0x00, 0x41, 0x22, 0x14, 0x08 },   // >  

    { 0x02, 0x01, 0x51, 0x09, 0x06 },   // ?  

    { 0x32, 0x49, 0x59, 0x51, 0x3E },   // @

    { 0x7E, 0x11, 0x11, 0x11, 0x7E },   // A

    { 0x7F, 0x49, 0x49, 0x49, 0x36 },   // B  

    { 0x3E, 0x41, 0x41, 0x41, 0x22 },   // C  

    { 0x7F, 0x41, 0x41, 0x22, 0x1C },   // D  

    { 0x7F, 0x49, 0x49, 0x49, 0x41 },   // E  

    { 0x7F, 0x09, 0x09, 0x09, 0x01 },   // F  

    { 0x3E, 0x41, 0x49, 0x49, 0x7A },   // G  

    { 0x7F, 0x08, 0x08, 0x08, 0x7F },   // H  

    { 0x00, 0x41, 0x7F, 0x41, 0x00 },   // I  

    { 0x20, 0x40, 0x41, 0x3F, 0x01 },   // J  

    { 0x7F, 0x08, 0x14, 0x22, 0x41 },   // K  

    { 0x7F, 0x40, 0x40, 0x40, 0x40 },   // L  

    { 0x7F, 0x02, 0x0C, 0x02, 0x7F },   // M  

    { 0x7F, 0x04, 0x08, 0x10, 0x7F },   // N  

    { 0x3E, 0x41, 0x41, 0x41, 0x3E },   // O  

    { 0x7F, 0x09, 0x09, 0x09, 0x06 },   // P  

    { 0x3E, 0x41, 0x51, 0x21, 0x5E },   // Q  

    { 0x7F, 0x09, 0x19, 0x29, 0x46 },   // R  

    { 0x46, 0x49, 0x49, 0x49, 0x31 },   // S  

    { 0x01, 0x01, 0x7F, 0x01, 0x01 },   // T  

    { 0x3F, 0x40, 0x40, 0x40, 0x3F },   // U  

    { 0x1F, 0x20, 0x40, 0x20, 0x1F },   // V  

    { 0x3F, 0x40, 0x38, 0x40, 0x3F },   // W  

    { 0x63, 0x14, 0x08, 0x14, 0x63 },   // X  

    { 0x07, 0x08, 0x70, 0x08, 0x07 },   // Y  

    { 0x61, 0x51, 0x49, 0x45, 0x43 },   // Z

    { 0x00, 0x7F, 0x41, 0x41, 0x00 },   // [  

    { 0x55, 0x2A, 0x55, 0x2A, 0x55 },   // '/'  

    { 0x00, 0x41, 0x41, 0x7F, 0x00 },   // ]  

    { 0x04, 0x02, 0x01, 0x02, 0x04 },   // ^  

    { 0x40, 0x40, 0x40, 0x40, 0x40 },   // _  

    { 0x00, 0x01, 0x02, 0x04, 0x00 },   // '

    { 0x20, 0x54, 0x54, 0x54, 0x78 },   // a  

    { 0x7F, 0x48, 0x44, 0x44, 0x38 },   // b  

    { 0x38, 0x44, 0x44, 0x44, 0x20 },   // c  

    { 0x38, 0x44, 0x44, 0x48, 0x7F },   // d  

    { 0x38, 0x54, 0x54, 0x54, 0x18 },   // e  

    { 0x08, 0x7E, 0x09, 0x01, 0x02 },   // f  

    { 0x0C, 0x52, 0x52, 0x52, 0x3E },   // g  

    { 0x7F, 0x08, 0x04, 0x04, 0x78 },   // h  

    { 0x00, 0x44, 0x7D, 0x40, 0x00 },   // i  

    { 0x20, 0x40, 0x44, 0x3D, 0x00 },   // j  

    { 0x7F, 0x10, 0x28, 0x44, 0x00 },   // k  

    { 0x00, 0x41, 0x7F, 0x40, 0x00 },   // l  

    { 0x7C, 0x04, 0x18, 0x04, 0x78 },   // m  

    { 0x7C, 0x08, 0x04, 0x04, 0x78 },   // n  

    { 0x38, 0x44, 0x44, 0x44, 0x38 },   // o  

    { 0x7C, 0x14, 0x14, 0x14, 0x08 },   // p  

    { 0x08, 0x14, 0x14, 0x18, 0x7C },   // q  

    { 0x7C, 0x08, 0x04, 0x04, 0x08 },   // r  

    { 0x48, 0x54, 0x54, 0x54, 0x20 },   // s  

    { 0x04, 0x3F, 0x44, 0x40, 0x20 },   // t  

    { 0x3C, 0x40, 0x40, 0x20, 0x7C },   // u  

    { 0x1C, 0x20, 0x40, 0x20, 0x1C },   // v  

    { 0x3C, 0x40, 0x30, 0x40, 0x3C },   // w  

    { 0x44, 0x28, 0x10, 0x28, 0x44 },   // x  

    { 0x0C, 0x50, 0x50, 0x50, 0x3C },   // y  

    { 0x44, 0x64, 0x54, 0x4C, 0x44 }    // z  

};

#endif