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

来源:互联网 发布:淘宝原单店 编辑:程序博客网 时间:2024/04/29 22:18

#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

 

原创粉丝点击