?? cf8051f120.c
字號:
/*********************************************
程序名稱:中文版電腦燈控制臺程序
創建日期:2007年04月30日 01:08:00
CPU型號 :C8051F120 100MHZ
通訊方式:SP1
LCD 320X240帶觸摸
**********************************************/
#include <c8051f120.h>
#include <dmxlight.h>
#include <INTRINS.H>
/*/////////////////////////////////////////////////////
LCD函數及端口定義
//////////////////////////////////////////////////////*/
#define LCD_P2DATA P2 //
sbit LCD_RS = P3^0;
sbit LCD_WR = P3^1;
sbit LCD_RD = P3^2;
sbit LCD_CS1 = P3^3;
sbit LCD_CS2 = P3^4;
sbit LCD_BUSY = P3^5;
sbit LCD_INT = P3^6;
sbit LCD_RSET = P3^7;
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()
{
LCD_RSET=0;
CPU_Initial();
delay(60000);
LCD_RSET=1;
delay(60000);
LCD_CS2=1;
LCD_Initial();
LCD_Clear();
LCD_CmdWrite(0x00,0xcd);
GotoXY(0,0);
LCD_WR20TA(1);
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++ ;
if(a==40)return;
}
while(1);
}
/////////////////////////////////////
code uchar MENU_Chinese[][40]={
{" 做擦除全部Wipe ALL(清控制臺) "},//0
{"1.將控制臺鑰匙轉向(SYSTEM)位置。 "},//1
{"2.按A(Service)服務鍵。 "},//2
{"3.按F(Wipe)擦除鍵。 "},//3
{"4.此時LCD屏幕功能對應為如下(A到G鍵)。 "},//4
{" A: Cancel 取消 "},//5
{" B: Patch 配接 "},//6
{" C: Palettes 素材 "},//7
{" D: Programming 程序 "},//8
{" F: Wipe ALL 擦除全部 "},//9
{" G: OK 確認 "},//10
{"5.按F(Wipe ALL)擦除全部。 "},//11
{"6.如需單獨擦除某一項執行第三步后選擇B,C "},//012
{" D做相應擦除。選擇后按G(OK)。 "},//13
{" 控制臺會重新起動清除所有程序 "},//14
};
/****************************************
//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 = CONFIG_PAGE;
}
//*******************************************************************************//
// *** 定義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++;
if(a==78)return;
}
while(1);
}
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,0x00,0x91,0x00,0x90,0x06,0xA0,0x11,
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 INT0DAT(void)interrupt 0
{
}
void INT2DAT(void)interrupt 2
{
}
void INT1DAT(void)interrupt 1
{
}
void INT3DAT(void)interrupt 3
{
}
void INT6DAT(void)interrupt 6
{
}
void INT7DAT(void)interrupt 7
{
}
void INT8DAT(void)interrupt 8
{
}
void INT9DAT(void)interrupt 9
{
}
void INT10DAT(void)interrupt 10
{
}
void SPI_MAIN_DATA()interrupt 5
{
}
void INT11DAT(void)interrupt 11
{
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -