📄 main.c
字号:
#include "lcd.h"
#include "lpc214x.h"
Uchar8 SYSTEMSET_code[8] = {0x30, 0x87, 0x07, 0x28, 0x42, 0xf0, 0x28, 0x00}; //P1-P8参数
Uchar8 SCRTAB_code[10] = {0x00, 0x00, 0xf0, 0x00, 0x40, 0x80, 0x00, 0xf0, 0x00, 0x00}; //P1-P10参数
void LCD_INIT(void);
//void DISPON(void);
void delay(int n);
void clear(void);
void Line(void) ;
void pixelw(Uint32 x,Uint32 y, char attr) ;
void Linexy(unsigned int x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char attr) ;
void LCD_CMD(unsigned char cmd) ;
void LCD_DATA(unsigned char cmd) ;
void LCD_Cursorxy( char x, char y);
void test(void);
int main()
{
// int i;
delay(5000);
PINSEL0 &= LCD_PINSEL0; //PINSEL0的管脚定义不变
PINSEL1 &= LCD_PINSEL1; //使p0.29和p0.30为GPIO口
PINSEL2 &= LCD_PINSEL2; //P1口的P1[31:26]用作调试端口,P1[25:16]用作I/0口
IO0DIR |= RDA0_0DIR; //设置P0.29和P0.30为输出引脚
IO1DIR |= WRCS_1DIR | Data_1DIR; //设置P1.16 - P1.25为输出引脚
// LCD_CMD(0x40);
// LCD_DATA(0x30);
// LCD_CMD(0x59);
// LCD_DATA(0x0f);
//l1:
LCD_INIT();
delay(5000);
// DISPON();
// delay(5000);
clear();
LCD_CMD(0x59);
LCD_DATA(DispOnP1);
//设置光标地址
LCD_CMD(0x4c);
LCD_CMD(0x46);
LCD_DATA(0x00);
LCD_DATA(0x00);
LCD_CMD(0x42);
// LCD_DATA(0x55);
// LCD_DATA(0x55);
// LCD_DATA(0x55);
// LCD_DATA(0x55);
// LCD_DATA(0x55);
// LCD_CMD(0x4f);
// LCD_CMD(0x59);
// LCD_DATA(0x54);
// for(i=0;i<10000;i++)
// Line() ;
// Linexy(0,(Uchar8)20,(Uchar8)300,(Uchar8)200,(Uchar8)0) ;
// delay(50000);
// test();
while(1) {
// goto l1;
// Line() ;
// Linexy(0,(Uchar8)20,(Uchar8)300,(Uchar8)100,(Uchar8)1) ;
// delay(5000);
// LCD_INIT();
// DISPON();
// clear();
// LCD_CMD(0x59);
LCD_DATA(0x45);
// test();
}
}
void LCD_INIT()
{
int i;
LCD_CMD(0x40); //写系统设置命令
for(i = 0 ; i<8; i++)
{
LCD_DATA(ParaSysTable[i]); //P1-P8参数
}
delay50ns(20); //延时1us
LCD_CMD(Scroll); //写显示区域设定命令
for(i = 0 ; i<10; i++)
{
LCD_DATA(ParaScrTableA[i]); //P1-P10参数
}
delay50ns(20); //延时1us
LCD_CMD(HdotScr); //写入点位移设置指令
LCD_DATA(HdotScrP1); //写入P1参数,点位移0
delay50ns(20); //延时1us
LCD_CMD(Ovlay); //写入区域合成设定指令
LCD_DATA(OvlayP1); //写入P1参数,L1,L2,L3简单或合成
delay50ns(20); //延时1us
LCD_CMD(CsrForm); //写入光标形状设定指令
LCD_DATA(CsrFormP1); //写入P1参数 8列
LCD_DATA(CsrFormP2); //写入P2参数 8行
delay50ns(20);
}
//写SYSETMSET命令,SYSTEMSET = 0x40;
/*
int i=0;
LCD_CMD(0x40);
delay(100);
//写SYSTEMSET_CODE数据,P1-P8参数;
for(i=0;i<8;i++)
{
LCD_DATA(SYSTEMSET_code[i]);
// delay(60);
}
delay(10);
}
void DISPON()
{
//显示区设置命令
int i;
LCD_CMD(0x44);
//SCROLL 参数 P1-P10
for(i = 0 ; i<10; i++)
{
LCD_DATA(SCRTAB_code[i]);
}
//设置水平滚动的位置,
LCD_CMD(0x5a);
LCD_DATA(0x00);
//设置显示区域的合成指令
LCD_CMD(0x5b);
LCD_DATA(0x04);
//设置光标形状
LCD_CMD(0x5d);
LCD_DATA(0x07);
LCD_DATA(0x87);
//设置屏幕
// LCD_CMD(0x59);
// LCD_DATA(0xff);
//
delay(10);
}
*/
void delay(int n)
{
int i;
for(i = 0; i<n; i++)
{
__asm
{
NOP;
}
}
}
void LCD_CMD(unsigned char cmd)
{
unsigned char cmd1;
cmd1 = ((cmd&0x01)<<7)| ((cmd & 0x02)<<5) |((cmd & 0x04)<<3) | ((cmd & 0x08)<<1) |((cmd & 0x10)>>1) | ((cmd & 0x20)>>3) | ((cmd & 0x40)>>5) | ((cmd & 0x80)>>7) ;
IO1PIN =((IO1PIN&0xFF00FFFF)|(cmd1<<16));//
L_LCD_CS();
H_LCD_A0();
delay50ns(1);
H_LCD_RD();
H_LCD_WR();
delay50ns(1);
L_LCD_WR();
delay50ns(4);
H_LCD_WR();
delay50ns(1);
H_LCD_CS();
H_LCD_A0();
delay50ns(1);
H_LCD_RD();
H_LCD_WR();
delay50ns(1);
}
void LCD_DATA(unsigned char cmd)
{
unsigned char cmd1;
cmd1 = ((cmd&0x01)<<7)| ((cmd & 0x02)<<5) |((cmd & 0x04)<<3) | ((cmd & 0x08)<<1) |((cmd & 0x10)>>1) | ((cmd & 0x20)>>3) | ((cmd & 0x40)>>5) | ((cmd & 0x80)>>7) ;
IO1PIN =((IO1PIN&0xFF00FFFF)|(cmd1<<16));//
L_LCD_CS();
L_LCD_A0();
delay50ns(1);
H_LCD_RD();
H_LCD_WR();
delay50ns(1);
L_LCD_WR();
delay50ns(4);
H_LCD_WR();
delay50ns(1);
H_LCD_CS();
L_LCD_A0();
delay50ns(1);
H_LCD_RD();
H_LCD_WR();
delay50ns(1);
}
void clear()
{
int i;
LCD_CMD(0x4c);
delay(100);
LCD_CMD(0x46);
LCD_DATA(0x8);
LCD_DATA(0x8);
delay(100);
LCD_CMD(0x42);
for(i = 0 ; i<32768; i++)
{
LCD_DATA(0x00);
}
delay(1000);
}
void Line()
{
LCD_CMD(0x4c);
LCD_CMD(0x46);
LCD_DATA(0x30);
LCD_DATA(0x40);
LCD_CMD(0x42);
LCD_DATA(0x55);
}
/*********************************************************************************************************
** 函数名称: LCD_Cursorxy()
** 函数功能 :光标位置
** 入口参数 : x,y为光标的座标
** 出口参数 :无
*********************************************************************************************************/
void LCD_Cursorxy( char x, char y)
{
LCD_DATA(CsrW);
LCD_DATA(x);
LCD_DATA(y);
}
/*********************************************************************************************************
** 函数名称 : pixelw(),控制320×240的屏,图形区从2580开始
** 函数功能 :LCD绘点.消点子函数
** 入口参数 : x绘点/消点的x座标,y绘点/消点的y座标,attr为1表示在该座标下画一个点,为其它表示消除该座标下的点.
** 出口参数 :无
*********************************************************************************************************/
void pixelw(Uint32 x,Uint32 y, char attr) //描一点 x:0--319 y:0--239
{
Uint32 addr;
Uint32 dat;
addr=y*40+(x)/8+0x2580;
LCD_Cursorxy(addr%256,addr/256);
LCD_CMD(MREAD);
// dat=LCD_DATARead();
dat = 0x55;
LCD_Cursorxy(addr%256,addr/256);
LCD_CMD(mWrite);
if(attr==0x01)
{
switch (x%8)
{
case 0 :LCD_DATA((dat | 0x00400000)>>15);break;
case 1 :LCD_DATA((dat | 0x00200000)>>15);break;
case 2 :LCD_DATA((dat | 0x00100000)>>15);break;
case 3 :LCD_DATA((dat | 0x00080000)>>15);break;
case 4 :LCD_DATA((dat | 0x00040000)>>15);break;
case 5 :LCD_DATA((dat | 0x00020000)>>15);break;
case 6 :LCD_DATA((dat | 0x00010000)>>15);break;
case 7 :LCD_DATA((dat | 0x00008000)>>15);break;
}
}
else
{
switch (x%8)
{
case 0 :LCD_DATA((dat &~0x00400000)>>15);break;
case 1 :LCD_DATA((dat &~0x00200000)>>15);break;
case 2 :LCD_DATA((dat &~0x00100000)>>15);break;
case 3 :LCD_DATA((dat &~0x00080000)>>15);break;
case 4 :LCD_DATA((dat &~0x00040000)>>15);break;
case 5 :LCD_DATA((dat &~0x00020000)>>15);break;
case 6 :LCD_DATA((dat &~0x00010000)>>15);break;
case 7 :LCD_DATA((dat &~0x00008000)>>15);break;
}
}
}
/*
*********************************************************************************************************
** 函数名称 : Linexy(),画线。任意方向的斜线,直线数学方程 aX+bY=1
** 函数功能 :LCD图形方式下画线操作
** 入口参数 :x0,y0,xt,yt直线段的两个端点,attr表示绘线还是消线.
** 出口参数 :无
*********************************************************************************************************
*/
void Linexy(unsigned int x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char attr)
{
register unsigned char t;
int xerr=0,yerr=0,delta_x,delta_y,distance;
int incx,incy;
unsigned int row,col;
delta_x = xt-x0; //计算坐标增量
delta_y = yt-y0;
col = x0;
row = y0;
if(delta_x>0) incx=1; //设置单步方向
else
{
if( delta_x==0 ) incx=0; //垂直线
else {incx=-1;delta_x=-delta_x;}
}
if(delta_y>0) incy=1;
else
{
if( delta_y==0 ) incy=0; //水平线
else {incy=-1;delta_y=-delta_y;}
}
if( delta_x > delta_y ) distance=delta_x; //选取基本增量坐标轴
else distance=delta_y;
for( t=0;t <= distance+1; t++ )
{ //画线输出
pixelw(col,row,attr); //画点
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance )
{
xerr-=distance;
col+=incx;
}
if( yerr > distance )
{
yerr-=distance;
row+=incy;
}
}
}
void test()
{
int i;
LCD_CMD(0x5d);
LCD_DATA(0X0F);
LCD_DATA(0x0F);
//设置屏幕
LCD_CMD(0x59);
LCD_DATA(0xff);
//显示区设置命令
LCD_CMD(0x44);
// SCROLL 参数 P1-P10
for(i = 0 ; i<10; i++)
{
LCD_DATA(SCRTAB_code[i]);
}
//设置水平滚动的位置,
// LCD_CMD(0x5a);
// LCD_DATA(0x00);
//设置显示区域的合成指令
// LCD_CMD(0x5b);
// LCD_DATA(0x04);
//设置光标形状
LCD_CMD(0x5d);
LCD_DATA(0x07);
LCD_DATA(0x87);
//设置屏幕
LCD_CMD(0x59);
LCD_DATA(0xff);
delay(10);
}
/**********************************************************************************
* 函数 :delay50ns()
* 函数功能:延时count * 50ns
* 参数 :Uint32 count
* 返回值 :无
************************************************************************************/
void delay50ns(Uint32 count)
{
int i;
for(i = 0; i< count ; i++)
__asm
{
NOP;
NOP;
NOP;
}
}
/****************************************************************************************
* 函数 :delay1us()
* 函数功能:延时count * 1us
*********************************************************************************************/
void delay1us(Uint32 count)
{
int i;
for(i = 0; i<count ; i++)
{
delay50ns(20);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -