⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disklight.c

📁 用C8051F020编写的RA8803控制器320240液晶程序
💻 C
字号:
 #include <c8051f120.h>
 #include <dmxlight.h>
 #include <INTRINS.H>
/*/////////////////////////////////////////////////////
  LCD函数及端口定义
//////////////////////////////////////////////////////*/

#define   LCD_P2DATA          P2       //
sbit      LCD_BUSY   =		 P3^0;
sbit      LCD_CS1    =		 P3^1;
sbit      LCD_RD     =		 P3^2;
sbit      LCD_WR     =		 P3^3;
sbit      LCD_RS     =		 P3^4;
sbit      LCD_INT    =       P1^4;
uchar     data     REG_Read	;
/****************************************/
void LCD_Initial();							  //LCD	初始化,清屏,复位LCD屏,开触摸,开8X8键盘扫描
void LCD_Clear();  //
void LCD_CmdWrite(uchar cmdReg, uchar cmdData);	                          //清除显示内存 子程序
void GotoXY(uchar x1,uchar y1);                //设定 显示坐标 (内存地址) 子程序
void LCD_DataWrite(uchar WrData);

////////////////////////////////////////////////////////
void CPU_Initial();	                          //CPU初始化,开SP1通讯,开外部中断0。
void delay(uint i);                            // 延迟时间子程序
void LCD_WR20TA(uchar menu_a);
code uchar MENU_Chinese[][40];
code uchar LCD_Initial_data[78];
///////////////////////////////////////////////////////
void main()
{
delay(60000);
CPU_Initial();
delay(60000);
LCD_Initial();
LCD_Clear();
LCD_CmdWrite(0x00,0xcd);
GotoXY(0,0);
LCD_WR20TA(0);
while(1);
}
//*******************************************************************************//
// *** 缓存器 写入 子程序 *******************************************************//
//*******************************************************************************//
void LCD_CmdWrite(uchar cmdReg, uchar cmdData)
{

	LCD_P2DATA = cmdReg; // 写入缓存器的地址
	LCD_CS1=0;// 致能 RA8803 读写动作
	LCD_RD=1; // 禁能读取动作
	LCD_RS=0; // 设定为写入资至缓存器模式
	LCD_WR=0; // 开始写入缓存器的地址
	delay(50);
	LCD_WR=1;
	LCD_RS=1;
	LCD_CS1=1; // 致能 RA8803 读写动作
	//…………………………………………………………….
	LCD_P2DATA = cmdData; // 写入缓存器的数据
	LCD_CS1=0; // 致能 RA8803 读写动作
	LCD_RD=1; // 禁能读取动作
	LCD_RS=0; // 设定为写入数据至缓存器模式
	LCD_WR=0; // 开始写入缓存器的数据
	delay(50);
	LCD_WR=1;
	LCD_RS=1;
	LCD_CS1=1; // 致能 RA8803 读写动作
}
//*******************************************************************************//
// *** 缓存器 读取 子程序 *******************************************************//
//*******************************************************************************//
uchar LCD_CmdRead(uchar cmdReg)
{
	LCD_P2DATA=cmdReg; // 写入缓存器的地址
	LCD_CS1=0; // 致能 RA8803 读写动作
	LCD_RD=1; // 禁能读取动作
	LCD_RS=0; // 设定为写入数据至缓存器模式
	LCD_WR=0; // 开始写入缓存器的地址
    delay(50);
	LCD_WR=1;
	LCD_RS=1;
	LCD_CS1=1; // 致能 RA8803 读写动作
	LCD_P2DATA=0xff;
	LCD_CS1=0; // 致能 RA8803 读写动作
	LCD_WR=1; // 禁能写入动作
	LCD_RS=0; // 设定从缓存器读取数据模式
	LCD_RD=0; // 开始读取缓存器的数据
    delay(50);
	REG_Read=LCD_P2DATA;
	LCD_RD=1; // 致能读取缓存器
	LCD_RS=1;
	LCD_CS1=1; // 禁能 RA8803 读写动作
	return REG_Read; // 回传读取缓存器的数据
}
//*******************************************************************************//
// *** 写入数据至显示内存 子程序 ************************************************//
//*******************************************************************************//
void LCD_DataWrite(uchar WrData)
{
	while(LCD_BUSY == 1); // 判断 RA8803 是否忙碌中
	LCD_P2DATA =WrData; // 准备预写入显示内存的数据
	LCD_CS1=0; // 致能 RA8803 读写动作
	LCD_RD=1; // 禁能读取动作
	LCD_RS=1; // 设定为写入数据至显示内存模式
	LCD_WR=0; // 开始写数据至显示内存
	delay(50);
	LCD_WR=1;
	LCD_RS=1;
	LCD_CS1=1; // 禁能 RA8803 读写动作
}

//*******************************************************************************//
// *** 清除显示内存 子程序 ******************************************************//
//*******************************************************************************//
void LCD_Clear()
{
	uchar READ_REG;
	LCD_CmdWrite(0xE0,0x00); // 设定将显示内存的数据全部写入”0x00”
	READ_REG = LCD_CmdRead(0xF0);
	READ_REG &= 0xF7;
	READ_REG |= 0x08;
	LCD_CmdWrite(0xF0,READ_REG); // 当缓存器[0xF0]之位3 设定为”1”时,
	delay(50000); // 硬件自动将显示内存全部写入缓存器[E0]的资料
}
//*******************************************************************************//
// *** 设定 显示坐标 (内存地址) 子程序 *******************************************//
//*******************************************************************************//
void GotoXY(uchar x1,uchar y1)
{
	LCD_CmdWrite(0x60,x1); // 设定水平坐标地址
	LCD_CmdWrite(0x70,y1); // 设定垂直坐标地址
}
//*******************************************************************************//
// *** 延迟 子程序 *************************************************************//
//*******************************************************************************//
void delay(uint i) // 延迟时间子程序
{
	uint k ;
	for ( k=0;k>i;k++ );
}
/////////////////////////////////////////////////////////////////////////
void LCD_WR20TA(uchar menu_a) //八个字同时写
{
	uchar a,b;
 	a=0;
	do{
	b=MENU_Chinese[menu_a][a];
	LCD_DataWrite(b);
	a++ ;
	}
	while(a<40);
 	}

 
/////////////////////////////////////
code uchar MENU_Chinese[][40]={
							{"      做擦除全部Wipe ALL(清控制台)      "},//0
							};


 /****************************************
//CPU初始化,开SP1通讯,开外部中断0。
****************************************/
 void CPU_Initial()
 {
    SFRPAGE   = CONFIG_PAGE;
	WDTCN=0xDE;
    WDTCN=0xAD;
    OSCICN    = 0x83;
    CCH0CN    &= ~0x20;
    SFRPAGE   = LEGACY_PAGE;
    FLSCL     = 0xB0;
    SFRPAGE   = CONFIG_PAGE;
    CCH0CN    |= 0x20;
    PLL0CN    |= 0x01;
    PLL0DIV   = 0x01;
    PLL0FLT   = 0x01;
    PLL0MUL   = 0x04;
    delay(5000);
    PLL0CN    |= 0x02;
    while ((PLL0CN & 0x10) == 0);
    CLKSEL    = 0x02;
    XBR0      = 0x03;  //开SPI,IC2,INT0
    XBR1      = 0x04;
	XBR2      = 0x40;
	P0MDOUT   = 0xFF;
	P1MDOUT   = 0x00;
	P2MDOUT   = 0x00;
	P3MDOUT   = 0x00;
	P0=0x00;
	P1=0x00;
	P2=0xFF;
	P3=0xFF;
	P4=0x00;
	P5=0;
	P6=0;
	P7=0;
	WDTCN = 0XDE;
	WDTCN = 0X67;
	SFRPAGE   = SPI0_PAGE;	  //SPI
    SPI0CFG   = 0x40;
    SPI0CN    = 0x05;
	SFRPAGE   = 0x00;
	SFRPAGE   = TIMER01_PAGE;
    TMOD      = 0x0A;
    CKCON     = 0x08;
	SFRPAGE   = CONFIG_PAGE;
	IE        = 0x02;
    EIE1      = 0x03;
 }
//*******************************************************************************//
// *** 定义LCD所有缓存器的初始值 **************************************************//
//*******************************************************************************//
void LCD_Initial()
{uchar a,b,c;
	a=0;
	do{
     b=LCD_Initial_data[a];
	 a++;
	 c=LCD_Initial_data[a];
	 LCD_CmdWrite(b,c);
	 a++;
	 }
	while(a<78);
}
code uchar LCD_Initial_data[78]={
                               0x00,0xC9,0x01,0xF3,0x02,0x10,0x03,0x81,0x10,0x2B,
							   0x11,0x00,0x12,0x91,0x21,0x27,0x31,0xEF,0x41,0x00,
							   0x51,0x00,0x20,0x27,0x30,0xEF,0x40,0x00,0x50,0x00,
							   0x60,0x00,0x61,0x00,0x70,0x00,0x71,0x00,0x72,0xEF,
							   0x80,0xAA,0x81,0x40,0x91,0x00,0x90,0x06,0xA0,0x11,//0x81,0x00
							   0xA1,0x00,0xA2,0x00,0xA3,0x00,0xB0,0x27,0xB1,0xEF,
							   0xC0,0x00,0xC1,0x0A,0xC8,0x80,0xC9,0x80,0xCA,0x00,
							   0xD0,0x80,0xE0,0x00,0xF0,0xA0,0xF1,0x0F,
                               };

/*************************************************************************************/
void   INT0(void)interrupt 0
{
}
void   TOINT(void)interrupt 2
{
}
void   INT1(void)interrupt 1
{
}
void   T1(void)interrupt 3
{
}
void   UART0()interrupt 4
{
}
void   T2()interrupt 5
{
}
void   SPI_MAIN_DATA(void)interrupt 6
{
}
void   SMBUS(void)interrupt 7
{
}
void   ADC0(void)interrupt 8
{
}
void   PCA(void)interrupt 9
{
}
void   INT10DAT(void)interrupt 10
{
}

void   INT11DAT(void)interrupt 11
{
}
void   INT12DAT(void)interrupt 12
{
}
void   T3(void)interrupt 13
{
}
void   ADC0A(void)interrupt 14
{
}
void   INT15DAT(void)interrupt 15
{
}
void   INT16DAT(void)interrupt 16
{
}
void   INT17DAT(void)interrupt 17
{
}
void   INT18DAT(void)interrupt 18
{
}
void   INT19DAT(void)interrupt 19
{
}
void   INT20DAT(void)interrupt 20
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -