📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef signed char int8;
typedef signed int int32;
#define GUI_LCM_YMAX 64
#define GUI_LCM_XMAX 132
#define LCD_SDA 19
#define LCD_SCK 17
#define LCD_DorC 23
#define LCD_CS1 25
#define LCD_RES 24
#define CMD_SET_PADDR 0xb0
#define CMD_SET_CADDR_H 0x10 //设置列地址高4位
#define CMD_SET_CADDR_L 0x00
#define CMD_RD_WR 0xe0 //读-修改-写
#define CMD_RD_WR_END 0xee //读-修改-写结束
#define DISPALAY_ON 0xaf
#define MAX(x,y) (x)>(y)?(x):(y)
#define MIN1(x,y) (x)<(y)?(x):(y)
volatile unsigned long * PortClrSetAddr[2][4] =
{
{
&IO0CLR,
&IO1CLR,
&IO2CLR,
&IO3CLR
},
{
&IO0SET,
&IO1SET,
&IO2SET,
&IO3SET
}
};
volatile unsigned long * PortPinAddr[4] =
{
&IO0PIN,
&IO1PIN,
&IO2PIN,
&IO3PIN
};
void GPIOSet(uint32 Port, uint32 Pin, uint32 Set)
{
*(PortClrSetAddr[Set][Port]) = 1<<Pin;
}
void p_delay(int32 delay)
{
int32 i,j;
for(i=0; i<delay; i++)
{
for(j=0;j<5;j++)
{
}
}
}
//---------------------------------
//函数功能: 写LCD的数据端口
//参数说明:
// dat 要写的数据
//--------------------------------
void wrPort(uint8 dat)
{
S1PDR=dat;
while(!((uint8)S1PSR & 0x80))
{
}
}
void wrData(uint8 dat)
{
GPIOSet(0,LCD_CS1,0);
GPIOSet(0,LCD_DorC,1);
wrPort(dat);
GPIOSet(0,LCD_CS1,1);
p_delay(3);
}
void wrCommand(uint8 dat)
{
GPIOSet(0,LCD_CS1,0);
GPIOSet(0,LCD_DorC,0);
wrPort(dat);
GPIOSet(0,LCD_CS1,1);
p_delay(3);
}
//----------------------------------------------------------
//函数功能: 写NT7532的RAM区
//参数说明:
// pAddr 页地址
// cAddr 列地址
// *dat 存放读出的数据
// size 要存的数据长度
//----------------------------------------------------------
void wrDis(uint8 pAddr, uint8 cAddr, uint8 *dat, uint32 size,uint8 *Pointer_start)
{
int32 i,j,k;
uint8 *pointer;
j=0;
pointer=Pointer_start+(int32)cAddr+(int32)pAddr*GUI_LCM_XMAX;
while(size>0)
{
wrCommand(CMD_SET_PADDR | (pAddr&0x0f)); //设置页地址
wrCommand(CMD_SET_CADDR_H | (cAddr>>4)); //设置列地址高4位
wrCommand(CMD_SET_CADDR_L | (cAddr&0x0f)); //列地址低4位
for(i=(int32)cAddr; i<GUI_LCM_XMAX; i++)
{
if(size>0)
{
size--;
wrData(*(dat+j));
*pointer=*(dat+j);
pointer++;
j++;
}
else
break;
}
cAddr=0x00;
k=(int32)pAddr;
k++;
pAddr=(uint8)k;
}
}
//-----------------------------------
//函数功能: 找到显示屏上对应于显示缓冲区的位置
//参数说明:
// x, y-坐标
// Pointer_start--显示缓冲区的头指针
//-----------------------------------
uint8 *findPointer(int32 x, int32 y, uint8 *Pointer_start)
{
uint8 *pointer;
y=y/8;
pointer=Pointer_start+y*GUI_LCM_XMAX+x;
return pointer;
}
//-----------------------------------
//函数功能: 在指定的坐标画点或清点
//参数说明:
// x, y-坐标
// mode-操作点的状态
//-----------------------------------
void putPixel(int32 x, int32 y, uint8 mode, uint8 *Pointer_start)
{
uint8 yy,xx;
uint8 pAddr, cAddr, i;
uint8 *pointer;
yy=(uint8)y;
xx=(uint8)x;
pAddr = yy>>3; //y/8页地址
cAddr = xx;
i= yy&0x07; //y%8点在页里的第几行
pointer=findPointer(x,y,Pointer_start);
if(0x01==mode) //画点
{
*pointer=(1<<(int32)i)|*pointer;
}
else if(0x00==mode) //清点
{
*pointer=(~(1<<(int32)i))&*pointer;
}
wrDis(pAddr, cAddr, pointer, 1,Pointer_start);
}
//-----------------------------------
//函数功能: 全屏填充
//参数说明:
// dat 0x00或0xFF
// Pointer_start--显示缓冲区的头指针
//-----------------------------------
void GUI_FILLSCR(uint8 dat, uint8 *Pointer_start)
{
uint32 i;
for(i=0; i<GUI_LCM_YMAX*GUI_LCM_XMAX/8; i++)
{
*(Pointer_start+i)=dat;
}
wrDis(0, 0, Pointer_start, GUI_LCM_YMAX*GUI_LCM_XMAX/8, Pointer_start);
}
//-----------------------------------
//函数功能: 初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏
//参数说明:
// Pointer_start--显示缓冲区的头指针
//-----------------------------------
void GUI_Initailize(uint8 *Pointer_start)
{
GPIOSet(0,LCD_RES,0);
p_delay(1000);
GPIOSet(0,LCD_RES,1);
wrCommand(0xe2);//Software Reset
p_delay(300);
wrCommand(0x2f);//Power controller set
p_delay(10);
wrCommand(0x81);//Electronic Volume, 设置Vo的电压大小的, 两个字节的命令
p_delay(10);
wrCommand(0x31);
p_delay(10);
wrCommand(0xa2);//Bias select 1/9, 设置液晶驱动电压输出偏置率
p_delay(10);
wrCommand(0xa1);//ADC select, 设置ram中列的地址和segment之间的对应关系为正常模式
p_delay(10);
wrCommand(0xc0);//Common output mode set, 选择Common输出的方向,
p_delay(10);
wrCommand(0xaf);//Display on
p_delay(10);
wrCommand(0xa5); // set entir on(10)
p_delay(5000);
wrCommand(0xa4); //set entir off(10)
wrCommand(0x61);//Display start address, 显示起始行选择为0(bit0-5)(COM0)
p_delay(10);
wrCommand(0xb0);//Page address, 设置页地址为0(bit0-3)
p_delay(10);
wrCommand(0x10);//High column, 设置列地址的高4位为0(bit0-3)
p_delay(10);
wrCommand(0x01);//Low column, 设置列地址的低4位为0(bit0-3)
p_delay(10);
}
//-----------------------------------
//函数功能: 在指定的坐标画点或清点
//参数说明:
// 返回0 表示操作失败
// 返回1 表示操作成功
//-----------------------------------
int32 GUI_Point(int32 x, int32 y, uint8 mode, uint8 *Pointer_start)
{
if(x>=GUI_LCM_XMAX)
return 0;
if(y>=GUI_LCM_YMAX)
return 0;
putPixel(x, y, mode, Pointer_start);
return 1;
}
//-----------------------------------
//函数功能: 画水平线
//参数说明:
// x1,x2 起始点和终止点
// y 垂直位置
//-----------------------------------
int32 GUI_HLine(int32 x1, int32 x2, int32 y, uint8 mode, uint8 *Pointer_start)
{
int32 x_max,x_min;
x_max=MAX(x1,x2);
x_min=MIN1(x1,x2);
while(x_min<=x_max)
{
if(GUI_Point(x_min, y, mode, Pointer_start)==0)
{
return 0;
}
x_min++;
}
return 1;
}
//-----------------------------------
//函数功能: 画垂直线
//参数说明:
// y1,y2 起始点和终止点
// x 水平位置
//-----------------------------------
int32 GUI_RLine(int32 x, int32 y1, int32 y2, uint8 mode, uint8 *Pointer_start)
{
int32 y_max,y_min;
y_max=MAX(y1,y2);
y_min=MIN1(y1,y2);
while(y_min<=y_max)
{
if(GUI_Point(x, y_min, mode, Pointer_start)==0)
{
return 0;
}
y_min++;
}
return 1;
}
///////////////////////////////////////////
//SPI初始化
void init_SPI()
{
S1PCR=0x0020;
S1PCCR=0x10;
}
//////////////////////////////////////
int main(void)
{
uint8 LCD_RAM[GUI_LCM_YMAX*GUI_LCM_XMAX/8];
PINSEL1=0X02A8;
IO0DIR = 0x039E0000;
init_SPI();
GPIOSet(0,LCD_CS1,0);
GPIOSet(0,LCD_DorC,0);
GPIOSet(0,LCD_RES,0);
GPIOSet(0,LCD_DorC,1);
GPIOSet(0,LCD_CS1,1);
GPIOSet(0,LCD_RES,1);
GUI_Initailize(LCD_RAM);
GUI_FILLSCR(0x00, LCD_RAM);
GUI_FILLSCR(0xff, LCD_RAM);
GUI_FILLSCR(0x00, LCD_RAM);
// GUI_Point(16, 8, 0x01, LCD_RAM);
GUI_Point(17, 1, 0x01, LCD_RAM);
GUI_Point(18, 7, 0x01, LCD_RAM);
GUI_Point(19, 8, 0x01, LCD_RAM);
GUI_Point(20, 63, 0x01, LCD_RAM);
GUI_HLine(1, 131, 16, 1, LCD_RAM);
//GUI_RLine(10, 1, 64, 1, LCD_RAM);
GUI_RLine(14, 1, 63, 1, LCD_RAM);
GUI_RLine(13, 11, 63, 1, LCD_RAM);
GUI_FILLSCR(0x0f, LCD_RAM);
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -