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

📄 lcd3.c

📁 带T6963C控制器的LCD的驱动程序和简单的显示测试程序
💻 C
字号:
#include <absacc.h>
#include <reg51.h>
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#include <zifu.c>
#include <hz.c>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80  // 显示方式:逻辑“或”
#define LC_MOD_XOR 0x81 // 显示方式:逻辑“异或”
#define LC_MOD_AND 0x82 // 显示方式:逻辑“与”
#define LC_MOD_TCH 0x83 // 显示方式:文本特征
#define LC_DIS_SW 0x9B  // 显示开关:D0=1/0:光标闪烁启用/禁用;
                                  // D1=1/0:光标显示启用/禁用;
                                  // D2=1/0:文本显示启用/禁用;
                                  // D3=1/0:图形显示启用/禁用;
#define LC_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
#define LC_AUT_WR 0xB0  // 自动写设置
#define LC_AUT_RD 0xB1  // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0  // 数据一次写,地址加1
#define LC_INC_RD 0xC1  // 数据一次读,地址加1
#define LC_DEC_WR 0xC2  // 数据一次写,地址减1
#define LC_DEC_RD 0xC3  // 数据一次读,地址减1
#define LC_NOC_WR 0xC4  // 数据一次写,地址不变
#define LC_NOC_RD 0xC5  // 数据一次读,地址不变
#define LC_SCN_RD 0xE0  // 屏读
#define LC_SCN_CP 0xE8  // 屏拷贝
#define LC_BIT_OP 0xF0  // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除


#define LCMDW XBYTE[0x7AFF] // 数据口
#define LCMCW XBYTE[0x7BFF] // 命令口
void key(void);
uchar xdata rbuf[500];
uchar xdata tbuf[88];

uint  r_in;
uchar  c,q;
uchar  a,b;
uchar  key_flag;
uchar x,y;
uchar t=0;
uchar gCurRow,gCurCol; 
uint d,g,n,h;
uchar uRow,uCol;
uint i,e,f;

uchar fnGetRow(void)
{
return gCurRow;
}
uchar fnGetCol(void)
{
return gCurCol;
}
void fnST01(void)      // 状态位STA1,STA0 判断(读写指令和读写数据)
{uchar sta; 
do{ sta=LCMCW & 0x03; }
while(sta!=0x03); 

}

/*void fnST2(void)     // 状态位ST2 判断(数据自动读状态)
{
uchar sta; 
do{ sta=LCMCW & 0x04; }
while(sta!=0x04);
}*/
                  
void fnST3(void)           // 状态位ST3 判断(数据自动写状态)
{
uchar sta; 
do{ sta=LCMCW & 0x08; }
while(sta!=0x08);
}
uchar fnST6(void)           // 状态位ST6 判断(屏读/屏拷贝状态)
{
uchar i;
for(i=10;i>0;i--)
{
if((LCMCW & 0x40) == 0x40)
break;
}
return i; // 若返回零,说明错误
}


void fnPR1(uchar uCmd,uchar uPar1,uchar uPar2) // 写双参数的指令
{
fnST01(); 
LCMDW = uPar1;
fnST01(); 
LCMDW = uPar2;
fnST01(); 
LCMCW = uCmd;

}
void fnPR11(uchar uCmd,uchar uPar1) // 写单参数的指令

{
fnST01(); 
LCMDW = uPar1;
fnST01(); 
LCMCW = uCmd;
}
void  fnPR12(uchar uCmd)       // 写无参数的指令
{fnST01(); 
LCMCW = uCmd;
}
void  fnPR13(uchar uData)     // 写数据
{fnST01(); 
LCMDW = uData;
}
/*uchar fnPR2(void)            // 读数据
{fnST01(); 
return LCMDW;
}*/
// 设置当前地址
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos = urow * 30 + ucol;                                       
fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
gCurRow = urow;
gCurCol = ucol;
}
// 设置当前显示行、列
void cursor(uchar uRow, uchar uCol)       
{
fnSetPos(uRow * 16, uCol);
}
//指针设置
void Text_Curser(uchar x3,uchar y3)
{fnPR1(0x21,x3,y3);

a=x3;
b=y3;}


// 清屏
void cls(void)
{
uint i;
fnPR1(LC_ADD_POS,0x00,0x00);  // 置地址指针
fnPR12(LC_AUT_WR);            // 自动写
for(i=0;i<240*128;i++)
{
fnST3();
fnPR13(0x00);                 // 写数据
}
fnPR12(LC_AUT_OVR);           // 自动写结束
fnPR1(LC_ADD_POS,0x00,0x00);  // 重置地址指针
gCurRow = 0;                  // 置地址指针存储变量
gCurCol = 0;
}


// LCM 初始化
void fnLCMInit(void)
{

fnPR1(LC_TXT_STP,0xDF,0x01) ;   // 文本显示区首地址
fnPR1(0x41,0x1E,0x00);          // 文本显示区宽度
fnPR1(LC_GRH_STP,0x00,0x00);    // 图形显示区首地址
fnPR1(LC_GRH_WID,0x1E,0x00);    // 图形显示区宽度
fnPR12(0xA0);                   // 光标形状
fnPR12(0x80);                   // 显示方式设置
fnPR12(0x9F);                   // 显示开关设置
cls();

}
//延时
void shortdelay(uint tt)
{ uchar i;
  while(tt)
  {i=100;
   while(i) 
   i--;
   tt--;};
   }
//显示一个字符

void dchar(uchar x,uchar y,uchar a)
{uchar j,uRow,uCol;
for(j=0;j<16;j++)
{
uRow=y;
uCol=x;
fnSetPos(uRow*16+j,uCol);
uRow = fnGetRow();
uCol = fnGetCol();
fnPR12(LC_AUT_WR);
fnPR13(ASC_MSK[(a-0x20)*16+j]);
fnPR12(LC_AUT_OVR);
}
}
//显示字符串
void dstring(uchar x,uchar y,uchar *ptr)
{
char c1;
uchar i,j,uLen,uRow,uCol;
uLen=strlen(ptr);
for(i=0;i<uLen;i++)
{c1 =ptr[i];
for(j=0;j<16;j++)
{uRow=y;
uCol=x;
fnSetPos(uRow*16+j,uCol);
uRow = fnGetRow();
uCol = fnGetCol(); 
fnPR12(LC_AUT_WR);
fnPR13(ASC_MSK[(c1-0x20)*16+j]);
fnPR12(LC_AUT_OVR);}
if(x<29)
{x++;}
else 
{y++;x=0;}}

}
//显示汉字
void dhz(uchar x,uchar y,uchar *shz)
{uint  length=0,no,k;
 uchar uRow,uCol;
  while (*(shz+length)!='\0')
  {length++;}
 for(no=0;no<length/2;no++)
  {uint j,find=0;
   for(j=0;j<sizeof(hzinx)/2;j++)
    {if(hzinx[j*2]==*(shz+no*2)&&hzinx[j*2+1]==*(shz+no*2+1))
	{find=1;break;}}

for(k=0;k<16;k++)
{uRow=y;
uCol=x+no*2;
fnSetPos(uRow*16+k,uCol);
uRow = fnGetRow();
uCol = fnGetCol(); 
fnPR12(LC_AUT_WR);
fnPR13(zimo[j*32+2*k]);
fnPR12(LC_AUT_OVR);
x++;
fnPR12(LC_AUT_WR);
fnPR13(zimo[j*32+2*k+1]);
fnPR12(LC_AUT_OVR);
x--;}
}}



//欢迎使用
void welcom(void)
{ 
dhz(5,2,"欢迎使用激光陀螺");
dhz(7,3,"捷联惯导系统");
dstring(8,4,"welcom");}



//主函数
void main(void) 
{
fnLCMInit();

welcom();
shortdelay(5000);

}

⌨️ 快捷键说明

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