cl_main1.c
来自「51单片机读写nor flash 读出flash 的ID」· C语言 代码 · 共 1,114 行 · 第 1/2 页
C
1,114 行
/************************************************************/
/* Copyright 2006,北京德彼克创新科技有限公司研发中心
* All rights reserved.
*
* 文件名:CL_main.c
* 摘 要: 长岭主程序
*
* 当前版本:1.0
* 作 者:赵春生
* 完成日期: 2006/06/20
* 修改日期: 2006/12/28
* 修改人 : d-peak R&D 8712
*/
/*****************************************************************/
#include <ABSACC.H>
#include <math.h>
#include "STC89C516.h"
#include "peripherals_control.h"
#include "test_gui.h"
#include "cl_main.h"
#include "SST39VF088.h"
#include <stdio.h>
BYTE xdata CommandBuf[BufLen]; //
BYTE count = 0 ;
bit IsBufFull;
bit IsBufEmpty;
bit temp_pre;
BYTE dataSrc,dataSrcBkup;
//bit HaveCursor = 0;
bit cursorEnable;
BYTE inputMode=COMMON_MODE;
//BYTE inputMode=ASCII_MODE;
BYTE sectorIndex;
BYTE Receive_in;
BYTE Receive_out;
BYTE curCol = 0,curRow = 0;
#ifdef CURSOR_FIXED
BYTE curColUsing=0,curRowUsing=0;
#else
#define curColUsing curCol
#define curRowUsing curRow
#endif
BYTE curColorFront = 7,curColorBg = 0;
BYTE COLOR_FRONT = RED,COLOR_BG = WHITE;
BYTE overlayMode = TRANSPARENT,ZOOMX = 1,ZOOMY=1;
BYTE xdata COLOR_FRONT_BKUP,COLOR_BG_BKUP;
BYTE xdata curColBkup=0,curRowBkup=0;
BYTE xdata overlayModeBkup,ZOOMXBKUP,ZOOMYBKUP;
WORD FlashPtr;
BYTE csflag; //912
BYTE xdata INIT_COLOR_FRONT_BKUP,INIT_COLOR_BG_BKUP;
BYTE xdata INIT_curColBkup,INIT_curRowBkup;
BYTE xdata INIT_overlayModeBkup,INIT_ZOOMXBKUP,INIT_ZOOMYBKUP;
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
时钟初始化
实现功能:设定串口模式及波特率
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
void init_clock_9600(void)
{
EA = 0;
//IE = 0x02; // Enable Timer 0 interrupt
SCON = 0x50; // setup serial port control, serial mode 1
TMOD = 0x21;
TH1 = 0xfa; // 9600 BAUD @ 22.1184MHz
TCON = 0x50; // TR0 = TR1 = 1, start timer //low interrupt
//TCON = 0x51; // TR0 = TR1 = 1, start timer // undershoot interrupt
// TR1 = 1;
// EA = 1;
}
void init_clock_19200(void)
{
EA = 0;
//IE = 0x02; // Enable Timer 0 interrupt
SCON = 0x50; // setup serial port control, serial mode 1
TMOD = 0x21;
TH1 = 0xfd; // 9600 BAUD @ 22.1184MHz
TCON = 0x50; // TR0 = TR1 = 1, start timer //low interrupt
//TCON = 0x51; // TR0 = TR1 = 1, start timer // undershoot interrupt
// TR1 = 1;
// EA = 1;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
指针及参数初始化
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
void init_process(void)
{
IsBufFull = 0;
Receive_in = 1; // 接收缓冲区指针指向首位
Receive_out = 1;
cursorEnable = FALSE;
//IE = 0x90; //允许串行中断
IE = 0x90;
// TCON = 0x51; // undershoot interrupt
TCON = 0x50; //low interrupt
// EA = 1;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
读FLASH
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
BYTE ReadFlashOneByte( BYTE SectorStart,WORD AbsDra)
{
BYTE xdata *Temp;
WORD i;
WORD iSector;
BYTE iBlockNum;
BYTE FlashData;
CS_FLASH088_OPEN();
i = AbsDra ;
iSector=SectorStart+i/4096;
iBlockNum=iSector>>4;
iSector=iSector%16;
SELECT_PAGE(iBlockNum);//写待读数据页号即A19-A16
Temp=(BYTE xdata*)0x0;
Temp=(BYTE xdata *) ((iSector<<12)|(int)Temp);
FlashData = *(Temp+(i%4096));
CS_DISPLAY_OPEN();
return FlashData;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
接收缓冲管理
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
BYTE GetBufData()
{
BYTE uiData;
if(dataSrc==FROM_FLASH)
{
uiData = ReadFlashOneByte(sectorIndex,FlashPtr);
FlashPtr++;
return uiData;
BUSY=1;
}
else if(dataSrc==FROM_SERIAL_PORT || dataSrc==FROM_PARALLEL_PORT)
{
while (IsBufEmpty);
AUXR=0;
uiData = CommandBuf[Receive_out];
AUXR=0x02;
S_DTR = 0;
Receive_out ++;
if (Receive_out ^ Receive_in)
IsBufEmpty = 0; //接收缓冲区不空
else
{
IsBufEmpty = 1;
//SendToPC(0xbb);
}
if (IsBufFull)
{
IsBufFull = 0;
// BUSY=0;
}
BUSY=0;
return uiData;
}
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
串口中断程序
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
void SerialPort(void) interrupt 4 using 1
{
// EA = 0;
ES = 0;
TI = 0;
if(RI&&~IsBufFull)
{
LED3 = ~LED3;
AUXR = 0 ;
CommandBuf[Receive_in] = SBUF;
AUXR = 0x02;
IsBufEmpty = 0;
RI = 0;
Receive_in ++;
if( Receive_in == Receive_out )
{
IsBufFull = 1;
S_DTR = 1;
//SendToPC(0xaa);
}
}
//EA = 1;
ES = 1;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
并口中断程序
作者:R&D8712
---------------------------------------------------------------------------*/
/////////////////////////////////////////////////////////////////////////////
void ParallelPort(void) interrupt 0 //using 1
{
EX0=0;
BUSY=TRUE;
MCU_ALL_CS=0;
P0=0x06;
MCU_CSS_WR=0;
MCU_CSS_WR=1;
MCU_ALL_CS=1;
//BUSY=1;
/*
if(temp_pre)
{
Delay(2);
BUSY =0;
temp_pre = 0;
}
else while(P_STB==0);
*/
while(P_STB==0); //low interrupt enable
AUXR = 0 ;
CommandBuf[Receive_in] =P0;
AUXR = 0x02;
Receive_in ++;
IsBufEmpty =0;
if( Receive_in == Receive_out )
{
IsBufFull = 1;
BUSY=1;
}
else
{
IsBufFull = 0;
//BUSY=0;
}
MCU_ALL_CS=0;
P0=csflag;
MCU_CSS_WR=0;
MCU_CSS_WR=1;
MCU_ALL_CS=1;
LED3 = ~LED3;
//if(IsBufFull==0)
//BUSY=0;
EX0=1;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
发送命令结束字
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////
void SendToPC(BYTE State)
{
S_DTR = 1;
if (!TI)
SBUF = State ;
while (TI);
TI = 0;
if (!IsBufFull)
S_DTR = 0;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
命令解释执行程序
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
//void LoadCommand(void)
//{
//}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
调用FLASH图象
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
/*void LoadP(BYTE n)
{
FlashPtr = 0;
dataSrc = 1;
PictureNumber = n;
while (dataSrc)
LoadCommand();
//LoadPrePicture =0;
}*/
/////////////////////////////////////////////////////////////////////////////////
//使屏翻转和正常显示
//作者:D-PEAK R&D:8712
/////////////////////////////////////////////////////////////////////////////////
void PANEL_NORMAL( )
{
DISPLAY_RL=0;
DISPLAY_UD=1;
}
void PANEL_OVERTURN( )
{
DISPLAY_RL=1;
DISPLAY_UD=0;
}
void backupData()
{
AUXR=0;
dataSrcBkup =dataSrc;
curColBkup =curCol;
curRowBkup =curRow;
COLOR_FRONT_BKUP =COLOR_FRONT;
COLOR_BG_BKUP =COLOR_BG;
overlayModeBkup =overlayMode;
ZOOMXBKUP =ZOOMX;
ZOOMYBKUP =ZOOMY;
AUXR=2;
}
void retrieveData()
{
AUXR=0;
dataSrc =dataSrcBkup;
curCol =curColBkup;
curRow =curRowBkup;
COLOR_FRONT =COLOR_FRONT_BKUP;
COLOR_BG =COLOR_BG_BKUP;
overlayMode =overlayModeBkup;
ZOOMX =ZOOMXBKUP;
ZOOMY =ZOOMYBKUP;
curColUsing =curCol; // it need to be retrieved too!!!
curRowUsing =curRow;
AUXR=2;
}
void INIT_backupData()
{
AUXR=0;
//INIT_dataSrcBkup =dataSrc;
INIT_curColBkup =curCol;
INIT_curRowBkup =curRow;
INIT_COLOR_FRONT_BKUP =COLOR_FRONT;
INIT_COLOR_BG_BKUP =COLOR_BG;
INIT_overlayModeBkup =overlayMode;
INIT_ZOOMXBKUP =ZOOMX;
INIT_ZOOMYBKUP =ZOOMY;
AUXR=2;
}
void INIT_retrieveData()
{
AUXR=0;
//dataSrc =INIT_dataSrcBkup;
curCol =INIT_curColBkup;
curRow =INIT_curRowBkup;
COLOR_FRONT =INIT_COLOR_FRONT_BKUP;
COLOR_BG =INIT_COLOR_BG_BKUP;
overlayMode =INIT_overlayModeBkup;
ZOOMX =INIT_ZOOMXBKUP;
ZOOMY =INIT_ZOOMYBKUP;
curColUsing =curCol; // it need to be retrieved too!!!
curRowUsing =curRow;
AUXR=2;
}
void initParam()
{
dataSrc =FROM_SERIAL_PORT; //prepare for process after loading the pic in flash
curCol =0;
curRow =0;
COLOR_FRONT =RED;
COLOR_BG =WHITE;
overlayMode =TRANSPARENT;
ZOOMX =1;
ZOOMY =1;
AUXR=0;
dataSrcBkup =FROM_SERIAL_PORT;
curColBkup =0;
curRowBkup =0;
COLOR_FRONT_BKUP =RED;
COLOR_BG_BKUP =WHITE;
overlayModeBkup =TRANSPARENT;
ZOOMXBKUP =1;
ZOOMYBKUP =1;
//dataSrcBkup =FROM_SERIAL_PORT;
INIT_curColBkup =0;
INIT_curRowBkup =0;
INIT_COLOR_FRONT_BKUP =RED;
INIT_COLOR_BG_BKUP =WHITE;
INIT_overlayModeBkup =TRANSPARENT;
INIT_ZOOMXBKUP =1;
INIT_ZOOMYBKUP =1;
AUXR=2;
}
/////////////////////////////////////////////////////////////////////////////
/*---------------------------------------------------------------------------
主函数
作者:赵春生
完成日期: 2006/06/20
----------------------------------------------------------------------------*/
//////////////////////////////////////////////////////////////////////////////////
void main( )
{
//WORD i;
BYTE firstData;
BYTE L,H,colorFront,colorBg; //前景色,背景色
WORD X1,X2,Y1,Y2;
BYTE R1,pic_x,pic_y;
BYTE page;//字库高位低位地址,页
//BYTE temp1, temp2 ;
WORD iSector;
ULONG ulLength;
ULONG xdata Location;
BYTE xdata * Addr;
bit temp_bit;
ES = 0;
EX0=0;
P_STB = 1;
BUSY=TRUE;
IsBufEmpty = TRUE;
if(!P43)
PANEL_OVERTURN(); //拨码开关, 3位, on 图象翻转180度
else
PANEL_NORMAL();
if (!P42)
init_clock_9600(); // 拨码开关, 2位,on 波特率9600,否则19200
else
init_clock_19200();
initParam();
init_process();
if(!P40) //调用1号扇区的预制图片
{
backupData();
dataSrc = FROM_FLASH;
FlashPtr = 0;
sectorIndex = 0;
// INIT_backupData();
//INIT_retrieveData();
}
//Draw_Circle (240,80,60,WHITE);
//Write_Ascii_zoom(20,20,80, BYTE front_c, BYTE back_c,BYTE zoom,BYTE mode);
//Rectangle_Empty(170,10,310,150,WHITE);
//for(i=0;i<5;i++){Write_Chinese(4+i*16,4,16,cnlib[i],RED,CYAN);}
//for(i=0;i<6;i++){Write_Ascii(4+i*8,24,asciilib[i],RED,CYAN);}
//for(i=0;i<5;i++){Write_Chinese_Zoomout(4+i*16*3,160,16,cnlib[i],GREEN,BLUE,3);}
//WDT_CONTR = 0X34; // 喂狗
//Delay(5);
CS_ALL_OFF();
CS_ALL_OPEN();
//CS_SRAM_OPEN();
CS_FLASH040_OPEN();
//CS_FLASH088_OPEN();
//CS_DISPLAY_OPEN();
//CS_PCOM_OPEN();
SELECT_PAGE(0x00);
CS_DISPLAY_OPEN();
LED4=0;
LED3=0;
LAMP_ON( );
CS_DISPLAY_OPEN();
// Clear(BLACK);
IsBufFull = FALSE;
S_DTR = 0;
temp_pre =1;
// SendToPC(0xbb);
// if (dataSrc != FROM_FLASH)
ES = 1;
EX0=1;
BUSY =FALSE;
while(1)
{
// WDT_CONTR = 0X34; // 喂狗
//BUSY =FALSE;
firstData=GetBufData();
if (firstData==0x1B)
{
switch(GetBufData())
{
case DrawLine: // 画线,color线颜色,x1H 起点横坐标高位,x1L起点横坐标低位
inputMode=COMMON_MODE;
colorFront= MYCOLOR(GetBufData()) ;
L = GetBufData();
H = GetBufData();
X1 = MAKEWORD(L, H);/////////////
L = GetBufData();
H = GetBufData();
Y1 = MAKEWORD(L, H);/////////////
L = GetBufData();
H = GetBufData();
X2 = MAKEWORD(L, H);//////////////
L = GetBufData();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?