⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 19264.c

📁 19264 LCD 自己加入了头文件(汉字字模)
💻 C
字号:
/*************************************************************
功能:        液晶(LCD)显示程序;
LCD:         TRULY M19264-5A1  192*64点阵
驱动器:    S6B0108/S6B0107或HD61202及相兼容驱动器
MPU:        AT89S51
开发环境:    KEIL C51
作者:        纪长城
日期:        2005年10月
************************************************************/
#include <REGX52.H>
#include <ZKDot.h>


#define DISP_OFF 0X3E    //关闭显示
#define DISP_ON 0X3F    //打开显示
#define START_ROW 0xC0    //设置起始行  C0H-FFH 对应显示存储器的 0-64行
#define FIRST_PAGE 0xB8    //设置页		B8-BF将DDRAM分为8个页面0-7
#define START_YADD 0x40    //设置列		40H-7FH 对应0-63个 列单元地址

/*----------------------------------------
MPU端口定义
----------------------------------------*/
#define LCD_PORT   P0
#define LCD_RESET  P2_2
#define LCD_CSA    P2_3
#define LCD_CSB    P2_4
#define LCD_RS     P2_5
#define LCD_RW     P2_6
#define LCD_E      P2_7

/*------------------------------------------
LCD的区选择程序:F为要选通的区,取值为0,1,2,
对应选中三个区,取其它值选中第三个区
--------------------------------------------*/
void LCD_CSAB_SET(unsigned char block)
{
    if(0==block)        //0 选择第一区
    {
        LCD_CSA=0;
        LCD_CSB=0;
    }
    else if(1==block)    //1 选择第二区
    {
        LCD_CSA=0;
        LCD_CSB=1;
    }
    else                //2 选择第三区
    {
        LCD_CSA=1;
        LCD_CSB=0;
    }
}


/*---------------------------------------
//延时子程序  
----------------------------------------*/
void Delay_xMs(unsigned int xMs)
{
    unsigned int i,j;
    for(i=0;i<xMs;i++)
        for(j=0;j<500;j++);
}


/*---------------------------------------
向LCD中写入指令或指令,F=0 是指令,F=1是数据,bkock是选择写入哪个区
 ---------------------------------------*/
void LCD_Write( unsigned char Com,bit F)
{
    LCD_PORT     = Com;    //把数据输出
    LCD_RS        = F;    //确定是数据还是指令
    LCD_RW         = 0;

    LCD_E          = 1;
    LCD_E          = 0;    //电平下降沿数据写入控制器
}

/*----------------------------------------------
坐标定位程序
参数XPage  定位页    取值0--7    共8页
    Y       横向定位    取值0-191    共192列
-----------------------------------------------*/
void LCD_XY_SET(unsigned char X,unsigned char YPage)
{
    if(X<64)        //在第一个区中
    {
        LCD_CSAB_SET(0);
        LCD_Write(FIRST_PAGE|YPage,0);
         LCD_Write(START_YADD|X,0);
    }
    else if(X<128)    //在第二个区中
    {
        LCD_CSAB_SET(1);
        LCD_Write(FIRST_PAGE|YPage,0);
        LCD_Write(START_YADD|X-64,0);
    }
    else if(X<192)    //在第三个区中
    {
        LCD_CSAB_SET(2);
        LCD_Write(FIRST_PAGE|YPage,0);
        LCD_Write(START_YADD|X-128,0);
    }
}


/*--------------------------------------------
清除一行的子程序  H是要清的页,取值0-3
--------------------------------------------*/
void LCD_Clear_H(unsigned char H)
{
    unsigned char i,j,k;
    for (k=0;k<2;k++)
        for (i=0;i<3;i++)
        {
            LCD_XY_SET(i*64,H*2+k);
            for(j=0;j<64;j++) LCD_Write(0x00,1);
        }
}

/*----------------------------------------
LCD初始化程序
----------------------------------------*/
void LCD_Init(void)
{
    unsigned char i;
    LCD_E    = 0;
    LCD_RW   = 1;
    LCD_RS   = 0;

    LCD_RESET= 0;    //液晶模块复位
    Delay_xMs(10);    //等待10mS
    LCD_RESET= 1;    //液晶结束复位电平

    LCD_CSAB_SET(0);
    LCD_Write(DISP_ON,0);    //模块1显示开
    LCD_CSAB_SET(1);
    LCD_Write(DISP_ON,0);    //模块2显示开
    LCD_CSAB_SET(2);
    LCD_Write(DISP_ON,0);    //模块3显示开
    for (i=0;i<4;i++) LCD_Clear_H(i);    //清屏
}

/*----------------------------------------
读display RAM 
---------------------------------------* 
unsigned char LCD_READ_RAM(unsigned char x,unsigned char y)
{
    unsigned char temp;
    LCD_XY_SET(x,y);
    LCD_RW   = 1;    //设置为读数据
    LCD_RS   = 1;
    LCD_PORT =0XFF;    //设置总线为高电平(空)
    LCD_E    = 0;
    LCD_E    = 1;    
    temp     =LCD_PORT;    
    LCD_E     =0;
    return temp;
}


/*------------------------------------------
设制起始行,参数line为要起始的行,取值范围0--63,block 为要设置的块
-----------------------------------------*/    
void LCD_LINE_SET(unsigned char line)
{
    unsigned char i;
    for (i=0;i<3;i++)
    {
        LCD_CSAB_SET(i);
        LCD_Write(START_ROW|line,0);
    }
}

/*----------------------------------------------
显示一个16*8的ASCII的程序  ,参数是ascii码值,x取值0-191,y取值0-3  只能显示四行
------------------------------------------------*
bit LCD_PRINT_ASCII_1608(unsigned char ascii,unsigned char x,unsigned char y)
{
    unsigned char i,j;
    if((x+8)>191)return 1;
    for(j=0;j<2;j++)
        for(i=j;i<16;i+=2)
        {
            LCD_XY_SET(x+(i>>1),y*2+j);   
            LCD_Write(AsciiDotBig[(ascii-0x20)*16+i],1);
        }
    return 0;
}

/*-------------------------------------------------
查找汉字程序 参数是内码的高8位与低8位
 ---------------------------------------------------*/
unsigned char  LCD_SEARCH_HZ16(unsigned char h,unsigned char l)
     {    
        unsigned char i;
        for(i=0;i<17;i++)
            if(HZ[i].Index[0]==h&&HZ[i].Index[1]==l) return i;
    }

/*----------------------------------------------------
16点阵的汉字显示程序
----------------------------------------------------*/
bit LCD_PRINT_HZ16(unsigned char wz,unsigned char x,unsigned char y)
    {
    unsigned char i,j;

    if((x+16)>192) return 1;
    for(j=0;j<2;j++)
          for(i=0;i<16;i++)
        {
            LCD_XY_SET(x+i,y*2+j);
            LCD_Write(HZ[wz].Msk[i+(16*j)],1);
        }
    return 0;
}

/*--------------------------------------------
点操作函数,参数,X/Y,取值为192/64   F  0-1,0是画点,1是取消点
---------------------------------------*
void LCD_POINT(unsigned char X,unsigned char Y,bit F)
{
    unsigned char i,j,k;
    i=Y&&0xF8;//i是X/8的余数
    Y>>=3;    //x是X/8的商
    j=LCD_READ_RAM(X,Y);//空读操作
    j=LCD_READ_RAM(X,Y);//读出8位数据
    LCD_XY_SET(X,Y);
    k=1<<i;
    if(F)
        {
        k=~k;
        LCD_Write(j&k,1);
         }
     else
         LCD_Write(j|k,1);
}
/*-----------------------------------------------
显示图像的一个例子
---------------------------------------------*
void LCD_TU(void)
{
unsigned char i,j;
for(i=0;i<6;i++)
    for(j=0;j<100;j++)
        {
        LCD_XY_SET(j,i);
        LCD_Write(TP[i*100+j],1);
          }
 }


/*---------------------------------------------
测试主函数
-------------------------------------------------*/
void main()
{
	unsigned char i,m;
	unsigned char code c[]="南京普耕科技有限责任公司";
	LCD_Init();
	
//	LCD_TU();
	
	for(i=0;i<24;i+=2) //24为12个汉字
	    {    
	    m=LCD_SEARCH_HZ16(c[i],c[i+1]);
	    LCD_PRINT_HZ16(m,i*8,3);
	    }
	
	
	    for(i=0;i<64;i++)
	    {
			LCD_LINE_SET(i);
		    if(i==0)
		        Delay_xMs(500);    //等待
		    else
		        Delay_xMs(20);    //等待
	    }
		while(1);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -