📄 lcddrv1335.c
字号:
/*
---------------------------------------------------------
文件 : LcdDrv1335.c
目的 : 1335的lcd控制器的驱动,用于uC/GUI
编程 :罗良涛
日期 : 2005-6-24
---------------------------------------------------------
*/
#define uchar unsigned char
#define uint unsigned short
#define ulong unsigned long
/*define SED1335 port address*/
#define SedWrtCmdAdd (0x04160000)
#define SedWrtDatAdd (0x04140000)
#define SedReadStatusAdd (0x04140000)
#define SedReadDatAdd (0x04160000)
/*define LCD code */
#define SYSSET 0x40
#define SCROLL 0x44
#define SLEEP 0x53
#define DISPON 0x59
#define DISPOFF 0x58
#define OVLAY 0x5b
#define HDOTSCR 0x5a
#define CSRFORM 0x5d
#define CGRAMADR 0x5c
#define CSRRGT 0x4c
#define CSRLFT 0x4d
#define CSRUP 0x4e
#define CSRDOWN 0x4f
#define CSRW 0x46
#define CSRR 0x47
#define MWRITE 0x42
#define MREAD 0x43
#define AP 40
/*LCD initial parameters*/
uchar SYSTAB[8] = {0x30,0x07,0x0f,0x27,0x50,0xf0,0x28,0x00};
uchar SCRTAB[10] = {0x00,0x00,0xf0,0x80,0x25,0xf0,0x00,0x4b,0x00,0x00};
uchar test[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x1E,0x22,0x42,0x42,0x3F,0x00,0x00};
uchar longfly[]= {0x00,0x00,0xFF,0xC0,0x00,0x40,0x00,0x48,0x00,0x50,0x00,0x60,0x00,0x60,0x00,0x50,
0x00,0x48,0x00,0x40,0x00,0x20,0x00,0x22,0x00,0x12,0x00,0x0A,0x00,0x06,0x00,0x00};
void Delay()
{
uint i;
for(i = 0; i < 10; i++)
;
}
/*SBUROUTINES OF LCD DRIVE*/
//写LCD控制命令
void InputLCDCmd(uchar cmd )
{
volatile uchar *p;
// uchar rstatus;
// p = (uchar *)SedDatAdd;
// rstatus = *p;
// while(rstatus & 0x40)
// {
// rstatus = *p;
// }
p = (uchar *)SedWrtCmdAdd;
*p = cmd;
Delay();
}
//写LCD控制参数和显示字符数据
void InputLCDData(uchar dat )
{
volatile uchar *p;
// uchar rstatus;
p = (uchar *)SedWrtDatAdd;
// rstatus = *p;
// while(rstatus & 0x40)
// {
// rstatus = *p;
// }
*p = dat;
Delay();
}
/*读1335控制器显示内存,
* ramadd为内存地址
*/
uchar ReadLCDRamDat(uint ramadd)
{
volatile uchar *p;
uchar result;
uchar high,low;
low = ramadd & 0xff;
high = (ramadd>>8) & 0xff;
InputLCDCmd(CSRW);
InputLCDData(low);
InputLCDData(high);
InputLCDCmd(MREAD);
p = (uchar *)SedReadDatAdd;
result = *p;
return(result);
}
//显示存储器清零
void ClrDispRAM(void)
{
ulong i;
InputLCDCmd(CSRRGT);
InputLCDCmd(CSRW);
InputLCDData(0x00);
InputLCDData(0x00);
InputLCDCmd(MWRITE);
for(i = 0; i <= 32 * 1024; i++)
{
InputLCDData(0x00);
}
}
//初始化LCD显示参数以及界面
void InitLCD(void)
{
uchar i;
InputLCDCmd(SYSSET);
for(i = 0; i < 8; i++)
{
InputLCDData(SYSTAB[i]);
}
InputLCDCmd(SCROLL);
for(i = 0; i < 10; i++)
{
InputLCDData(SCRTAB[i]);
}
InputLCDCmd(HDOTSCR);
InputLCDData(0X00);
InputLCDCmd(OVLAY);
InputLCDData(0X1c);
//InputLCDData(0X00);
InputLCDCmd(DISPOFF);
InputLCDData(0X56);
ClrDispRAM();
InputLCDCmd(CSRFORM);
InputLCDData(0X07);
InputLCDData(0X8f);
InputLCDCmd(DISPON);
InputLCDData(0X16);
// InputLCDData(0X10);
// ClrDispRAM();
}
//功能:显示16×8点字符,num为要显示的字符块长度
//x坐标为低8位寄存器(字节),y坐标寄存器(点行)
void WBlock(uint x,uint y,uchar *p,uchar num )
{
uint temp;
uchar hi,lo;
uchar i;
temp = y*AP + x;
hi = (temp >> 8) & 0xff;
lo = temp & 0xff;
InputLCDCmd(CSRDOWN);
InputLCDCmd(CSRW);
InputLCDData(lo);
InputLCDData(hi);
InputLCDCmd(MWRITE);
for(i = 0; i < 16; i++)
{
InputLCDData(*p++);
}
}
//功能:显示16×16点字符,num为要显示的字符块长度
//x坐标为低8位寄存器(字节),y坐标寄存器(点行)
void WBlock_HZ(uint x,uint y,uchar *p,uchar num )
{
unsigned short temp = 0;
uchar hi,lo;
uchar i,temp1[32];
for(i=0;i<32;i++)
temp1[i] = *p++;
temp = y*AP*16 + x;
hi = (temp >> 8) & 0xff;
lo = temp & 0xff;
InputLCDCmd(CSRDOWN);
InputLCDCmd(CSRW);
InputLCDData(lo);
InputLCDData(hi);
InputLCDCmd(MWRITE);
for(i = 0; i < 16; i++)
{
InputLCDData(temp1[2*i]);
}
temp += 1;
hi = (temp >> 8) & 0xff;
lo = temp & 0xff;
InputLCDCmd(CSRDOWN);
InputLCDCmd(CSRW);
InputLCDData(lo);
InputLCDData(hi);
InputLCDCmd(MWRITE);
for(i = 0; i < 16; i++)
{
InputLCDData(temp1[2*i+1]);
}
}
//清除显示屏幕
void ClrScreen(void)
{
uint i,j;
InputLCDCmd(CSRRGT);
InputLCDCmd(CSRW);
InputLCDData(0X00);
InputLCDData(0X00);
InputLCDCmd(MWRITE);
for(i=0;i<40;i++)
{
for(j=0;j<240;j++)
{
InputLCDData(0x00);
}
}
}
/*调试函数*/
void debug(void)
{
uchar *p;
uint i,j;
InitLCD();
ClrScreen();
p = &longfly[0];
for(i=0; i<40; i++)
WBlock(i,0,test,1);
for(j = 1; j<15; j++)
{
for(i=0; i<20; i++)
WBlock_HZ(2*i,j,p,1);
}
//while(1);
//ClrScreen();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -