📄 19264.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 + -