?? lcddrv.c
字號:
#include "p24HJ128GP506.h"
#define INT16U unsigned int
#define INT8U unsigned char
#define CSLCD LATGbits.LATG8/*cs*/
#define WRLCD LATGbits.LATG6/*wr*/
#define RDLCD LATGbits.LATG7/*wr*/
#define DATALCD LATGbits.LATG15/*data*/
static void timedelay(INT16U time);
static void timedelayMS(INT16U time);
static void wrcom(INT16U *p);
static void wrdd(INT16U *p);
//static void wrda(INT16U *p);
//static void walp(INT16U *p);
static void LCDinit(void);
static void LCDdis(INT8U,INT8U);
static void UINTDeal(INT16U);
static void LCDdisUINT(INT8U *);
INT16U command;
INT16U lcdaddr;
INT16U lcdaddrtemp;
INT16U lcddata;
INT16U lcddatatemp;
INT8U segdata[10] = {0xeb,0x0a,0xad,0x8f,0x4e,0xc7,0xe7,0x8a,0xef,0xcf
/* 0 1 2 3 4 5 6 7 8 9 */
};
INT8U DISChar[4] = {0,0,0,0};
void main(void)
{
INT8U i=0;
LCDinit();
while(1)
{
for(i=0;i<10000;i++)
{
/*
LCDdis(i,0);
LCDdis(i,2);
LCDdis(i,4);
LCDdis(i,6);
*/
UINTDeal(i);
LCDdisUINT(DISChar);
timedelayMS(500);
if(i==9999)
i = 0;
}
}
}
/*
*****************************************************
* initialize LCD
*****************************************************
*/
static void LCDinit(void)
{
INT16U *p;
TRISG &= 0b0111111000111111;//0x7e3f
RDLCD = 1;
p=&command;
timedelay(500);
*p=0x29;
wrcom(p); //initialize
timedelay(500);
*p=0x18;
wrcom(p); //rc
*p=0x01;//0x18;
wrcom(p); //sys en
*p=0x03;
wrcom(p); //lcd on
timedelay(500);
}
/*
*****************************************************
* write command
*****************************************************
*/
void wrcom(INT16U *p)
{
INT8U i;
CSLCD=1; /*----|_________*/
timedelay(5);
CSLCD=0;
timedelay(5);
WRLCD=0; /*1*/
timedelay(5);
DATALCD=1;
timedelay(5);
WRLCD=1;
timedelay(5);
WRLCD=0; /*0*/
timedelay(5);
DATALCD=0;
timedelay(5);
WRLCD=1;
timedelay(5);
WRLCD=0; /*0*/
timedelay(5);
DATALCD=0;
timedelay(5);
WRLCD=1;
timedelay(5);
for(i=0;i<9;i++)/*write command data*/
{timedelay(5);
WRLCD=0;
timedelay(5);
if( (*p)&0x80 )/*check the bits from bit7*/
{DATALCD=1;timedelay(5);}
else
{DATALCD=0;timedelay(5);}
WRLCD=1;
timedelay(5);
*p=(*p)<<1;
}
}
/*
*****************************************************
* write data
*****************************************************
*/
void wrdd(INT16U *p)
{
INT8U i;
CSLCD=1;/*----|_________*/
timedelay(5);
CSLCD=0;
timedelay(5);
WRLCD=0; /*1*/
timedelay(5);
DATALCD=1;
timedelay(5);
WRLCD=1;
timedelay(5);
WRLCD=0; /*0*/
timedelay(5);
DATALCD=0;
timedelay(5);
WRLCD=1;
timedelay(5);
WRLCD=0; /*1*/
timedelay(5);
DATALCD=1;
timedelay(5);
WRLCD=1;
timedelay(5);
for(i=0;i<10;i++)
{
timedelay(5);
WRLCD=0;
timedelay(5);
if(*p&0x0200)
{timedelay(5);DATALCD=1;timedelay(5);}
else
{DATALCD=0;timedelay(5);}
timedelay(5);
WRLCD=1;
timedelay(5);
*p=(*p)<<1;
}
}
/*
*****************************************************
* write data for continue data write
*****************************************************
*/
/*void wrda(INT16U *p)
{
INT8U i;
for(i=0;i<4;i++)
{timedelay(5);
WRLCD=0;
timedelay(5);
if(*p&0x01)
{timedelay(5);DATALCD=1;timedelay(5);}
else
{DATALCD=0;timedelay(5);}
timedelay(5);
WRLCD=1;
timedelay(5);
*p=(*p)>>1;
}
}*/
/*
*****************************************************
* continue data write
*****************************************************
*/
/*void walp(INT16U *p)
{
INT8U i;
for(i=0;i<32;i++)
{wrdd(p);
wrda(p);}
}*/
/*
*****************************************************
* deal data and address
*****************************************************
*/
static void LCDdis(INT8U data,INT8U addr)
{
INT16U *pt;
*pt = 0;
*pt = addr;
*pt = (*pt)<<4 | ( (segdata[data]>>4)&0x0f );
wrdd(pt);
*pt = 0;
*pt = addr+1;
*pt = (*pt)<<4 | ( segdata[data]&0x0f );
wrdd(pt);
}
static void UINTDeal(INT16U a)
{
// INT16U temp;
// temp = a;
DISChar[3] = 0;
DISChar[2] = 0;
DISChar[1] = 0;
DISChar[0] = 0;
while(a>0)
{
if((a<10000)&&(a>=1000))
{
a=a-1000;
DISChar[3]++;
}
if((a<1000)&&(a>=100))
{
a=a-100;
DISChar[2]++;
}
if((a<100)&&(a>=10))
{
a=a-10;
DISChar[1]++;
}
if((a<10)&&(a>0))
{
a=a-1;
DISChar[0]++;
}
// if(a>9999)
// {
// goto out;
// }
}
//out: a=temp;
}
static void LCDdisUINT(INT8U *pdata)
{
LCDdis(*(pdata++),6);
LCDdis(*(pdata++),4);
LCDdis(*(pdata++),2);
LCDdis(*(pdata),0);
timedelay(10);
}
static void timedelay(INT16U time)
{
INT16U j;
for(j=0;j<time;j++)
{
j++;
j--;
}
}
static void timedelayMS(INT16U time)
{
INT16U i,j;
for(i=0;i<800;i++)
for(j=0;j<time;j++)
{
j++;
j--;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -