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

📄 lcd.c

📁 数据采样显示控制数据采样显示控制数据采样显示控制
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <shiboliliang.h>
#define uint unsigned int
#define uchar unsigned char

#define lcmcw XBYTE [0x8001]
#define lcmdw XBYTE [0x8000]
#define RDKEY XBYTE [0x9000]
#define TDX_RDX XBYTE[0xc000]
#define kr	  XBYTE [0xB000]

#define TM_second XBYTE[0xa000] //秒
#define AM_second XBYTE[0xa001] //秒闹
#define TM_minute XBYTE[0xa002] //分
#define AM_minute XBYTE[0xa003] //分闹
#define TM_hour   XBYTE[0xa004] //时
#define AM_hour   XBYTE[0xa005] //时闹
#define TM_week   XBYTE[0xa006] //周
#define TM_day    XBYTE[0xa007] //日(2位数)
#define TM_month  XBYTE[0xa008] //月(2位数)
#define TM_year   XBYTE[0xa009] //年 (2位)
#define REG_a     XBYTE[0xa00a] //寄存器A
#define REG_b     XBYTE[0xa00b]
#define REG_c     XBYTE[0xa00c]
#define REG_d     XBYTE[0xa00d]
#define RAM_114   XBYTE[0xa00e]

//-----按键的相关定义--------------
#define quxiao  0x07
#define shang   0x0b
#define xia     0x0d
#define queren  0x0e

uchar jianzhi;
uchar caidan,caidan1=3;
sbit  bkl = P1^3;
//--------------------------------------------------
//串口存储器相关定义及函数定义
//--------------------------------------------------
sbit       SPI_CS 		= P1^7; 
sbit       SPI_SCK		= P1^0; 
sbit       SPI_SO		= P1^2; 
sbit       SPI_SI		= P1^1; 

uchar record_num;
//-----------------------------------
//主机读字节
uchar SPI_HostReadByte(void)
{ 
    uchar i,rByte=0; 
     
    for(i=0;i<8;i++)
	{ 
    	SPI_SCK=0; 
        SPI_SCK=1; 
         
        rByte<<=1; 
        rByte|=SPI_SO; 
    } 
    return rByte;     
} 

//-------------------------------------
//主机写字节
void SPI_HostWriteByte(uchar wByte)
{ 
    uchar i; 
     
    for(i=0;i<8;i++)
	{ 
        if((wByte<<i)&0x80){SPI_SI=1;} 
        else{SPI_SI=0;} 
         
        SPI_SCK=0; 
        SPI_SCK=1; 
    }     
} 

//-------------------------------------------------
//读存储器状态寄存器
uchar AT45DB041B_StatusRegisterRead(void)
{ 
    uchar i; 
                 
    SPI_CS=0;     
    SPI_HostWriteByte(0xd7); 
    i=SPI_HostReadByte(); 
    SPI_CS=1; 
     
    return i;     
} 

//存储器读数组
void Memroy_Array_Read(uint PA,uint BFA,uchar *pHeader,uint len)
{        
    uint i;       
     
    while(i++<255)
	{	
		if(AT45DB041B_StatusRegisterRead()&0x80)
			{break;}
	} 
    SPI_CS=0;                  //选中本器件
    SPI_HostWriteByte(0xe8);   //Continuous Array Read  
    SPI_HostWriteByte((unsigned char)(PA>>7));     
    SPI_HostWriteByte((unsigned char)((PA<<1)|(BFA>>8))); 
    SPI_HostWriteByte((unsigned char)BFA); 
    for(i=0;i<4;i++)
	{
		SPI_HostWriteByte(0x00);    //写入4个任意字节,然后读数据
	} 
    
   	for(i=0;i<len;i++)
	{
		pHeader[i]=SPI_HostReadByte(); //读出规定长度数据
	} 
    SPI_CS=1;                  //失能本器件
} 
/******************************************************************************/ 
/*描述:                                                                      */ 
/*    将指定数据写入从某个地址(0~263)开始的BUFFER中。                       */ 
/*参数:                                                                      */ 
/*    buffer  - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2                  */ 
/*              在该指令序列中,操作码84H选择BUFFER 1,87H选择BUFFER 2        */ 
/*    BFA     - BUFFER中的起始地址,0~263                                     */ 
/*    pHeader - 待存数据的头指针                                              */ 
/*    len     - 待存数据的长度1~264                                           */ 
/******************************************************************************/ 
void AT45DB041B_BufferWrite(uchar buffer,uint BFA,uchar *pHeader,uchar len)
{ 
    uint i; 
     
    while(i++<255)
	{
		if(AT45DB041B_StatusRegisterRead()&0x80)  //判断存储器忙则等待,非忙退出
			{break;}
	} 
    SPI_CS=0;                //选通本器件     
    switch(buffer)           //选缓冲区
	{ 
       	case 1:
			SPI_HostWriteByte(0x84);
			break; 
       	case 2:
			SPI_HostWriteByte(0x87);
			break; 
    } 
    SPI_HostWriteByte(0x00);                    //"x"
    SPI_HostWriteByte((unsigned char)(BFA>>8)); //BUFFER中的起始地址"xxxxxxxbfa8"
    SPI_HostWriteByte((unsigned char)BFA);      //强制转化为字节,"bfa7......bfa0"
     
    for(i=0;i<len;i++)
	{
		SPI_HostWriteByte(pHeader[i]);
	} 
    SPI_CS=1;         
} 
/****************************************************************************/ 
/*    将指定数据写入从某个地址(0~263)开始的页中:包含2个动作,首先将指定数据   */ 
/*描述:                                                                     */ 
/*    写入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始写入地址,此写入  */  
/*    动作不影响BUFFER中其它地址中的数据,然后再将BUFFER中的整个数据写入到某指   */ 
/*    定页中(带预擦除)。                                                      */        
/*参数:                                                                      */ 
/*    buffer  - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2                   */ 
/*    PA      - 页地址,0~2047                                                */ 
/*    BFA     - 指定BUFFER中的起始写入地址                                     */ 
/*    pHeader - 指定数据的首地址                                               */ 
/*    len     - 指定数据的长度                                  4               */ 
/******************************************************************************/ 
void Memory_write_inErase(uchar buffer,uint PA,uint BFA,uchar *pHeader,uint len)
{ 
    uint i; 

    AT45DB041B_BufferWrite(buffer,BFA,pHeader,len); 
    while(i++<1000)   //等待存储器空闲
	{	
		if(AT45DB041B_StatusRegisterRead()&0x80)
			{break;}
	} 
             
    SPI_CS=0;         
    switch(buffer)
	{ 
        case 1:SPI_HostWriteByte(0x83);break; 
        case 2:SPI_HostWriteByte(0x86);break; 
    } 
    SPI_HostWriteByte((unsigned char)(PA>>7)); //"rrrrpa10 pa9 pa8 pa7"
    SPI_HostWriteByte((unsigned char)(PA<<1)); //"pa6......pa0 0"
    SPI_HostWriteByte(0x00); 

	
    SPI_CS=1; 
} 
/******************************************************************************/ 
/*描述: 与上一个函数的唯一区别是不带预擦除。                                     */ 
/******************************************************************************/ 
void Memory_write_not_inErase(uchar buffer,uint PA,uint BFA,uchar *pHeader,uint len)
{ 
    unsigned int i=0; 

    AT45DB041B_BufferWrite(buffer,BFA,pHeader,len); 
    while(i++<1000)
	{
		if(AT45DB041B_StatusRegisterRead()&0x80){break;}
	} 
     
    SPI_CS=0; 
    SPI_HostWriteByte(0x88+buffer); 
    SPI_HostWriteByte((unsigned char)(PA>>7)); 
    SPI_HostWriteByte((unsigned char)(PA<<1)); 
    SPI_HostWriteByte(0x00); 
     
    for(i=0;i<len;i++)
	{
		SPI_HostWriteByte(pHeader[i]);
	} 
    SPI_CS=1; 
} 


	
uchar idata time_buf[8];
uchar flag=0;
void settime() //设置系统时间
{
	uchar xdata i;
      
    i=REG_d;
    REG_b=0xfe;
    TM_second =time_buf[5];
    TM_minute=time_buf[4];
    TM_hour=time_buf[3];
    TM_day=time_buf[2];
    TM_month=time_buf[1];
    TM_year=time_buf[0];
    REG_b=0x7a;
    i=REG_c;
}

void readtime() //读取系统时间
{
	uchar idata a;
    do{ a=REG_a;} while((a&0x80)==0x80);
    time_buf[5]=TM_second;
    time_buf[4]=TM_minute;
    time_buf[3]=TM_hour;
    time_buf[2]=TM_day;
    time_buf[1]=TM_month;
    time_buf[0]=TM_year;
}


void start12887(void) //启动时钟
{	
    REG_a=0x2f;      //晶振启动,500ms中断周期
    REG_b=0xfe;      //芯片更新禁止,允许周期中断输出,允许闹钟中断输出,允许更新结束中断输出
	                    //SQW输出设定频率的方波,数据为bcd码,24小时制,不允许夏时制.
    AM_second=0;     //每分钟发生闹钟中断
    AM_minute=0xff;  // 
    AM_hour=0xff;    //
    REG_b=0x7a;      //芯片更新正常进行
    
    
}
void bintobcd(uchar shuju[])
{
	uchar shi,ge,l;
	for(l=0;l<6;l++)
	{
		shi=shuju[l]/10;
		ge=shuju[l]%10;
		shi<<=4;
		shuju[l]=shi+ge;
		if(l==1)
			l++;
	}
	
}
void bcdtobin(uchar shuju[])
{
	uchar shi,ge,l;
	for(l=0;l<6;l++)
	{
		shi=shuju[l]&0xf0;
		shi>>=4;
		shi=shi*10;
		ge=shuju[l]&0x0f;
		shuju[l]=shi+ge;
		if(l==1)
			l++;
	}
}


uchar data cradd1,cradd2,dat2,dat0,com,ctrlcode;
uchar urow,ucol,h;



/*=======================================================*/
void short_delay(uint i)
{
	uint j;
    for(j=0;j<=i;j++);
}
void delayms(uchar tickms)
{
	uchar count,i;
    _nop_();
    _nop_();
    _nop_();
	for(i=tickms;i>0;i--)
    {
    	for(count=0;count<=58;count++) {;}
        _nop_();
    }
}
void wrdata(uchar dat0)/* 写显示数据子程序(左)*/
{
	while((lcmcw&0x03)==0) ;
    lcmdw=dat0;

}
void wrctrl0(uchar com)/* 写指令代码子程序(左)*/
{
	while((lcmcw&0x03)==0);
    lcmcw=com;
          
}

void wrctrl(dat1,dat2,ctrlcode)
{
	wrdata(dat1);
    _nop_();
    _nop_();
    _nop_();
    wrdata(dat2);
    _nop_();
    _nop_();
    _nop_();
    wrctrl0(ctrlcode);
} 
//--------------------------------------
//---------写满屏的f--------------------     
void cls(uchar f)
{
	uchar i,j;
    wrctrl(0x00,0x08,0x24);
    wrctrl0(0xb0);
    for(i=0;i<128;i++)
    {
    	for(j=0;j<30;j++)
        { 
        	wrdata(f);
       	}
  	}
}
//----------------------------------------
//----------- 设置当前地址-----------------
void fnSetPos(uchar urow, uchar ucol)
{
	uint  iPos;

	iPos = urow * 30 + ucol;
	wrctrl(iPos & 0xFF,iPos / 256+0x08,0x24);
	
}   
//--------------------------------------------
//----------清图形内存------------------------
void clrg(urow,ucol)
{
	uchar i,j;
    fnSetPos(urow*16,ucol);
    wrctrl0(0xb0);
	for(i=urow*16;i<111;i++)
	{
		for(j=ucol;j<30;j++)
		{ 
			wrdata(0x00);
		}
	}
	wrctrl0(0xb2);
}      
//--------------------------------------------
//---------------写汉字子程序------------------
void wrhz(urow, ucol,uchar const shuju[],uchar l)
{
    uint i,j;
    uchar const *dpdat=shuju;
    uchar k;   
    
    for(k=0;k<l;k++)
    {   
    	fnSetPos(urow*16, ucol);   
    	for(i=0;i<16;i++)
    	{ 
    		wrctrl0(0xb0);
        	for(j=0;j<2;j++)       
        	{             
            	wrdata(*(dpdat++));     
            
        	}  
        	wrctrl0(0xb2);
        	fnSetPos(urow*16+(i+1), ucol); 
     	}
     	ucol+=2;
     } 
}
//-------------------------------------
//-------------写字符------------------  
void wrzf(urow,ucol,uchar c)
{
	uchar i;
	uint k;
    k=c*16;       
    fnSetPos(urow*16, ucol);
    
    for(i=0;i<16;i++)
    { 
    	wrctrl0(0xb0);
    	wrdata(ewzk[k]);
    	wrctrl0(0xb2);
    	k++;     
        fnSetPos(urow*16+(i+1), ucol);    
    }  
}
//------------------------------------------------------------
//------------------------------------------------------------
uchar anjian(void)
{
	
    jianzhi=RDKEY;
    jianzhi=jianzhi&0x0f;
    if(jianzhi!=0x0f)
    {
        short_delay(900);
        jianzhi=RDKEY;
        jianzhi=jianzhi&0x0f;
        return 1;
    }
    else
    	return 0;
}
//--------------------------------------------------
//------------------显示时间-------------------------
void dptime(urow,ucol)
{
	wrzf(urow,ucol+6,2);							//year
	wrzf(urow,ucol+7,0);							//year
	wrzf(urow,ucol+8,(time_buf[0]&0xf0)>>4);		//year
	wrzf(urow,ucol+9,time_buf[0]&0x0f);				//year
	wrzf(urow,ucol+10,22);							//"-"
	wrzf(urow,ucol+11,(time_buf[1]&0xf0)>>4);		//mon
	wrzf(urow,ucol+12,time_buf[1]&0x0f);			//mon
	wrzf(urow,ucol+13,22);						    //"-"
	wrzf(urow,ucol+14,time_buf[2]/10);		        //day	
	wrzf(urow,ucol+15,time_buf[2]%10);			    //day
/*	wrzf(urow,ucol+14,(time_buf[2]&0xf0)>>4);		//day	
	wrzf(urow,ucol+15,time_buf[2]&0x0f);*/			//day
//	wrzf(urow,ucol+14,22);						    //"-"
	wrzf(urow,ucol+17,(time_buf[3]&0xf0)>>4);	    //hour
	wrzf(urow,ucol+18,time_buf[3]&0x0f);		    //hour
	wrzf(urow,ucol+19,19);						    //":"
	wrzf(urow,ucol+20,(time_buf[4]&0xf0)>>4);	    //min	
	wrzf(urow,ucol+21,time_buf[4]&0x0f);		    //min
	wrzf(urow,ucol+22,19);						    //":"
	wrzf(urow,ucol+23,(time_buf[5]&0xf0)>>4);	    //sec
	wrzf(urow,ucol+24,time_buf[5]&0x0f);		    //sec
}
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------

//-------------------------------------------
//------------过压故障菜单--------------------
void lcd_guoya(void)
{		
	wrhz(0,0,guzhang,2);
	wrzf(0,4,19);//wrzf(0,5,22);			//"-"
	wrhz(0,6,guoya,2);
	wrhz(1,0,yuanyin,2);   //"原因"
	wrzf(1,4,19);			//":"
	wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);//(1)	
	wrhz(1,9,nibian,2);	//"逆变"
	wrhz(1,13,huo,1);wrhz(1,15,huanchong,2);wrhz(1,19,kailu,2);
	dptime(7,0);
}
//----------------------------------------------------
//----------------缺相故障菜单-------------------------
void lcd_quexiang(void)
{
	wrhz(0,0,guzhang,2);
	wrzf(0,4,19);//wrzf(0,5,22);			//"-"
	wrhz(0,6,quexiang,2);
	wrhz(1,0,yuanyin,2);   //"原因"
	wrzf(1,4,19);			//":"	
	wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);//(1)
	wrhz(1,9,gaoya,2);	//"逆变"
	wrhz(1,13,dianyuan,2);wrhz(1,17,guzhang,2);
	wrzf(2,6,20);wrzf(2,7,2);wrzf(2,8,21);//(2)
	wrhz(2,9,kuairong,2);	//"逆变"
	wrhz(2,13,sunhuai,2);
	dptime(7,0);
}
//--------------------------------------------
//--------------逆变故障菜单-------------------
void lcd_nibian(void)
{
	wrhz(0,0,guzhang,2);
	wrzf(0,4,19);//wrzf(0,5,22);			//"-"
	wrhz(0,6,nibian,2);
	wrhz(1,0,yuanyin,2);   //"原因"
	wrzf(1,4,19);			//":"	
	wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);//(1)
	wrhz(1,9,nibian,2);	//"逆变"
	wrhz(1,13,dianya,2);wrhz(1,17,yanzhong,2);wrhz(1,21,shiheng,2);
	wrzf(2,6,20);wrzf(2,7,2);wrzf(2,8,21);//(2)
	wrhz(2,9,nibian,2);	//"逆变"
	wrhz(2,13,chufa,2);wrhz(2,17,maichong,2);wrhz(2,21,no,1);wrhz(2,23,tongbu,2);
	wrzf(3,6,20);wrzf(3,7,3);wrzf(3,8,21);//(2)
	wrhz(3,9,nibian,2);						//"逆变"
	wrhz(3,13,jingzhaguan,3);				//晶闸管
	wrhz(3,19,sunhuai,2);					//损坏
	dptime(7,0);
}
//----------------------------------------------------
//------------失波故障菜单-----------------------------
void lcd_shibo(void)
{
	wrhz(0,0,guzhang,2);
	wrzf(0,4,19);//wrzf(0,5,22);			//"-"
	wrhz(0,6,shibo,2);
	wrhz(1,0,yuanyin,2);   //"原因"
	wrzf(1,4,19);			//":"	
	wrzf(1,6,20);wrzf(1,7,1);wrzf(1,8,21);	//(1)
	wrhz(1,9,zhanboqi,3);					//"斩波器"
	wrhz(1,15,jian,1);wrhz(1,17,sunhuai,2);
	wrzf(2,6,20);wrzf(2,7,2);wrzf(2,8,21);	//(2)
	wrhz(2,9,waibu,2);						//"外部"
	wrhz(2,13,ganrao,2);					//"干扰"
	wrzf(3,6,20);wrzf(3,7,3);wrzf(3,8,21);	//(3)
	wrhz(3,9,guoya,1);						//"过"
	wrhz(3,11,fuhe,2);						//负荷	
	wrzf(4,6,20);wrzf(4,7,4);wrzf(4,8,21);	//(4)
	wrhz(4,9,nibian,2);						//"逆变"
	wrhz(4,13,zhitong,2);					//直通	
	dptime(7,0);
}
//-------------------------------------------
//-------------delay10ms---------------------
void delay10ms(unsigned int count1)
{

⌨️ 快捷键说明

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