📄 main.c
字号:
/************************** ************************************************
Copyright (c) HUST ESRI 1999-2007. All Rights Reserved.
文件名: main.c
摘要:LCD测试程序(RTX51 FULL)
作者: turtle
完成日期: 2008.03.28
源版本:
**************************************************************************/
#include "inc\ConstDef.h" //硬件相关常数定义
#include "inc\main.h" //硬件相关常数定义
//X向中断模式测量命令字,0x90
#define CODE_INT_X 0x90
//Y向中断模式测量命令字
#define CODE_INT_Y 0xd0
uchar temp;
long Tx;
long Ty;
void main (void)
{
long tempx,tempy;//注意类型和Tx,Ty保持一致
int i,r,x[6],y[6],xmin,xmax,ymin,ymax;
int SETX=0,SETY=0,X_temp[2],Y_temp[2];
//通过多次读数据取平均来提高精
//=========系统初始化
WDTCN = 0xDE;
WDTCN = 0xAD; //关闭看门狗
SysClkInit(); //初始化系统时钟
PortInit(); //初始化GPIO和交叉开关
DelayL(10);
//=========外设与变量初始化
P7 = 0x00; //打开指示灯
LCD_Reset();
lcd_initial();
lcd_clear();
lcd_regwrite(0x00,0xcD);//打开屏
temp=lcd_regread(0x00);
SetXY(4,24);
lcd_datawrite(0xD1);
lcd_datawrite(0xEE);
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
SetXY(8,24);
lcd_datawrite(0xD1);
lcd_datawrite(0xEE);
/* lcd_regwrite(0x00,0xc5);
DelayS(1);
lcd_photo(tab2);
*/
while(1)
{
if(INT2==0)
{
DelayS(200);
DelayS(200);
if(INT2==0)
{
while(INT2==0);
CS=0;
for(i=0;i<2;i++)
{
for(r=0;r<6;r++)//X,Y的坐标读取六次
{
WriteCharTo7843(CODE_INT_X);
//Step2. Receive X-dir locating information
x[r] = ReadFromCharFrom7843();
//Step3. Send out Y-dir locating command
WriteCharTo7843(CODE_INT_Y);
//Step4. Receive Y-dir locating information
y[r] = ReadFromCharFrom7843();//读Y轴坐标
}
xmin=x[0];xmax=x[0];ymin=y[0];ymax=y[0];
for(r=1;r<6;r++)
{
if(x[r]<xmin)
xmin=x[r];
if(x[r]>xmax)
xmax=x[r];
if(y[r]<ymin)
ymin=y[r];
if(y[r]>ymax)
ymax=y[r];
}
//坐标中去掉最大的和最小的
X_temp[i]=(x[0]+x[1]+x[2]+x[3]+x[4]+x[5]-xmin-xmax)/4;
Y_temp[i]=(y[0]+y[1]+y[2]+y[3]+y[4]+y[5]-ymin-ymax)/4;
}
//将处理后的触摸屏坐标取平均,得到较准确的触摸屏坐标X,Y
SETX=(X_temp[0]+X_temp[1])/2;
SETY=(Y_temp[0]+Y_temp[1])/2;
// tempx=TS_X-385;//这里TS_X,TS_Y是获取的触摸屏坐标
tempx=SETX-375;//这里X,Y是经过处理的触摸屏的坐标
if(tempx<0)
tempx=0;
else
Tx=(tempx*320)/(1800-375);
tempy=SETY-500;
if(tempy<0)
tempy=0;
else
Ty=tempy*240/(1800-590);
}
SETX=0;
}
}
}
// ===============================================================
// 子函数
// ===============================================================
/*-------------------------------------------------------------------
* 功能: 长时间延时
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 长时间延时,工作在11.0592M时,此函数近似延时28ms
-------------------------------------------------------------------*/
void DelayL(uchar Time)
{
uchar i,j,k;
while(Time--)
{
for(k=0; k<CLK_BASE; k++)
for(j=0; j<100; j++)
for(i=0; i<100; i++)
_nop_();
}
}
/*-------------------------------------------------------------------
* 功能: 短时间延时
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 工作在11.0592M时,此函数近似延时0.11ms
-------------------------------------------------------------------*/
void DelayS(uchar Time)
{
uchar i;
while(Time--)
{
for(i=0; i<250; i++)
{_nop_(); _nop_(); _nop_(); _nop_(); _nop_();}
}
}
/*-------------------------------------------------------------------
* 功能: 系统时钟初始化
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 切换至11.0592M外部晶振
-------------------------------------------------------------------*/
void SysClkInit (void)
{
int i;
OSCXCN = 0x67; // 使用22MHz的外部晶振
for(i=0; i<3000; i++); // 延时,等待外部晶振起振
while(!(OSCXCN&0x80)); // 等待外部晶振起振完成
OSCICN = 0x08; // 启用外部晶振,启用时钟丢失检测器
}
/*-------------------------------------------------------------------
* 功能: C8051端口初始化
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 配置各端口输入输出状态。如非必要,关闭不相关端口的弱上拉
-------------------------------------------------------------------*/
void PortInit (void)
{
XBR0 = 0x07; //允许SMBus、UART0、SPI0
XBR2 = 0x46; //允许交叉开关和弱上拉,允许UART1
P0MDOUT = 0x1D; // Output configuration for P0
P1MDOUT = 0xF9; // Output configuration for P1
P2MDOUT = 0x0D; // Output configuration for P2
P3MDOUT = 0xFF; // Output configuration for P3
P74OUT = 0xF3; // Output configuration for P4-7
P1MDIN = 0xFF; // Input configuration for P1
}
/*-------------------------------------------------------------------
* 功能: 液晶屏的相关程序
* 调用: NULL
* 输入: NULL
* 返回: NULL
* 说明: 对LCD的寄存器和DDRAM
-------------------------------------------------------------------*/
void lcd_regwr(uchar regnada)
{
LCD_DB = regnada;
LCD_COMMAND &=LCD_CS1_ENABLE; // chip enable.
LCD_COMMAND |=LCD_CS2_ENABLE;
LCD_COMMAND |=LCD_RD_DISABLE;
LCD_COMMAND &=LCD_RS_REG;
LCD_COMMAND &=LCD_WR_ENABLE;
;
LCD_COMMAND |=LCD_WR_DISABLE;
LCD_COMMAND |=LCD_RS_DDRAM;
LCD_COMMAND |=LCD_CS1_DISABLE;
}
//.............................................
void lcd_datawrite(uchar wrdata)
{ //写资料到DDRAM
//while(LCD_BUSY == 1);
LCD_DB = wrdata;
LCD_COMMAND &=LCD_CS1_ENABLE; // chip enable.
LCD_COMMAND |=LCD_CS2_ENABLE;
LCD_COMMAND |=LCD_RD_DISABLE;
LCD_COMMAND |=LCD_RS_DDRAM;
LCD_COMMAND &=LCD_WR_ENABLE;
;
LCD_COMMAND |=LCD_WR_DISABLE;
LCD_COMMAND |=LCD_RS_REG;
LCD_COMMAND |=LCD_CS1_DISABLE;
}
uchar lcd_regread(uchar regname)
{ //读缓存器
uchar reg_rddata;
lcd_regwr(regname);
LCD_DB= 0xff;
P74OUT = 0x03; // Output configuration for P4-7
DelayS(10);
LCD_COMMAND &=LCD_CS1_ENABLE; // chip enable.
LCD_COMMAND |=LCD_CS2_ENABLE;
LCD_COMMAND |=LCD_WR_DISABLE;
LCD_COMMAND &=LCD_RS_REG;
LCD_COMMAND &=LCD_RD_ENABLE;
;
reg_rddata=LCD_DB;
LCD_COMMAND |=LCD_RD_DISABLE;
LCD_COMMAND |=LCD_RS_DDRAM;
LCD_COMMAND |=LCD_CS1_DISABLE;
;
P74OUT = 0xF3;
DelayS(10);
return(reg_rddata);
}
//=============================================
void LCD_Reset(void)
{
DelayL(10); // delay 120ms 等待上电复位
LCD_COMMAND &=LCD_RST_ENABLE; // RST置低电平
DelayL(10);
LCD_COMMAND |=LCD_RST_DISABLE; // RST置高电平
DelayL(10);
}
void lcd_regwrite(uchar regname,uchar regdata)
{ //写资料到缓存器
lcd_regwr(regname);
DelayS(1);
lcd_regwr(regdata);
}
//.............................................
void lcd_initial(void)
{ //初始化
lcd_regwrite(0x00,0xc9); // lcd control register(lcr)
lcd_regwrite(0x01,0xe2); // misc.register(mir)
lcd_regwrite(0x02,0x10); // advance power setup register(apsr)
lcd_regwrite(0x03,0x80); // advance display setup regiser(adsr)
lcd_regwrite(0x10,0x69); // cursor control register(ccr)
lcd_regwrite(0x11,0x00); // distance of word or lines register(dwlr)
lcd_regwrite(0x12,0x91); // memory access mode register(awrr)
lcd_regwrite(0x21,0x27); // display window right register(dwrr)
lcd_regwrite(0x31,0xef); // display window bottom register(dwbr)
lcd_regwrite(0x41,0x00); // display window left register(dwlr)
lcd_regwrite(0x51,0x00); // display window top register(dwtr)
lcd_regwrite(0x20,0x27); // active window right register(awrr)
lcd_regwrite(0x30,0xef); // active window bottom register(awbr)
lcd_regwrite(0x40,0x00); // active window left register(awlr)
lcd_regwrite(0x50,0x00); // active window top register(awtr)
lcd_regwrite(0x60,0x00); // cursor position x register(cpxr)
lcd_regwrite(0x61,0x00); // begin segment position register(bgsg)
lcd_regwrite(0x70,0x00); // cursor position y register(cpyr)
lcd_regwrite(0x71,0x00); // shift action range,begin commom register(bgcm)
lcd_regwrite(0x72,0xef); // shift action range,end commom register(edcm)
lcd_regwrite(0x80,0xaa); // blink time register(btr)
lcd_regwrite(0x81,0x00); // frame rate polarity change at common_fa register(fdca)
lcd_regwrite(0x91,0x00); // frame rate polarity change at common_fb register(fdcb)
lcd_regwrite(0x90,0x06); // shift clock control register(sccr)
lcd_regwrite(0xa0,0x11); // interrupt setup & status register(frcb)
lcd_regwrite(0xa1,0x00); // key scan control register(kscr)
lcd_regwrite(0xa2,0x00); // key scan data register(ksdr)
lcd_regwrite(0xa3,0x00); // key scan data expand register(kser)
lcd_regwrite(0xb0,0x27); // interrupt column setup register(intx)
lcd_regwrite(0xb1,0xef); // interrupt row setup register(inty)
lcd_regwrite(0xc0,0x00); // touch panel control register(tpcr)
lcd_regwrite(0xc1,0x24); // adc status register(adcs)
lcd_regwrite(0xc8,0x80); // touch panel segment high byte data register(tpxr)
lcd_regwrite(0xc9,0x80); // touch panel common high byte data register(tpyr)
lcd_regwrite(0xca,0x00); // touch panel segment/common low byte data register(tpzr)
lcd_regwrite(0xd0,0x80); // lcd contrast control register (lccr)
lcd_regwrite(0xe0,0x00); // pattern data register(pdr)
lcd_regwrite(0xf0,0xa0); // font control register(fcr)
lcd_regwrite(0xf1,0x0f); // font size control register
}
//.............................................
void lcd_clear(void)
{ //清屏
uchar reg_rddata;
lcd_regwrite(0xe0,0x00);
reg_rddata =lcd_regread(0xf0);
reg_rddata |= 0x08;
lcd_regwrite(0xf0,reg_rddata);
}
void SetXY(uchar x,uchar y)
{
lcd_regwrite(0x60,x); // active window top register(awtr)
lcd_regwrite(0x70,y); // active window top register(awtr)
}
/*void lcd_photo(uchar code *pho)
{ //显示图形
uchar i,j,k;
uchar code *pp;
SetXY(0,0);
for(k=0;k<4;k++)
{
pp=pho;
for(j=0;j<60;j++)
{
for(i=0;i<40;i++)
{
lcd_datawrite(*pp);
++pp;
}
}
}
}*/
void WriteCharTo7843(unsigned char num)
{
unsigned char count;
DCLK=0;
for(count=0;count<8;count++)
{
if((num&0x80)==0x80)
DIN=1;
else if((num&0x80)==0x00)
DIN=0;
DCLK=0; _nop_();_nop_();_nop_();
DCLK=1; _nop_();_nop_();_nop_();
num<<=1;
}
}
unsigned int ReadFromCharFrom7843()
{
unsigned char count=0;
unsigned int Num=0;
for(count=0;count<12;count++)
{
Num<<=1;
DCLK=1; _nop_();_nop_();_nop_();
DCLK=0; _nop_();_nop_();_nop_();
if(DOUT==1) Num++;
}
return(Num);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -