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

📄 driver.c.bak

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 BAK
📖 第 1 页 / 共 4 页
字号:
		else if(c2>0x7f)c2--;
		if(c2>=0xA1)
			return (ulong)((c1-0xA1)*94+(c2-0xA1))*32+0xA7700;
		else
			return (ulong)((c1-0xA8)*96+(c2-0x40))*32+0xAE0C0;
	}

	else if(c1 >= 0xA1 && c3 == 0 && c4 == 0)//字符1区	A1A1 --- A9FE  0xA7700
	{
		return (ulong)((c1-0xA1)*94+(c2-0xA1))*32+0xA7700;
	}	
	else if(c1 >= 0x81 && c3 == 0 && c4 == 0)//汉字3区	8140 --- A0FE  0xE46C0
	{
		if(c2>0x7f)c2--;
		return (ulong)((c1-0x81)*190+(c2-0x40))*32+0xE46C0;
	}
	else if(c2>=0x30)//汉字4区
	{
//	four bytes HZ
		h=(((ulong)(c1-0x81)*10+(c2-0x30))*126+(ulong)(c3-0x81))*10+(c4-0x30);
		h-=12439;
		if(h<0 || h>=6530) return(0);
		h += 22046;
		return h*32+0xA7700;
	}	
}


//功能:在LCD指定位置显示一行汉字或字符(16*16或8*16)
//参数说明:
//x 显示起行(0~63只能是8的倍数)  y显示起始列(0~191)
//str需要显示的字符指针
//mode低4位=0:只显示不清除其它内容;
//mode低4位=1:清除本行原有内容并显示;
//mode低4位=2:清除整屏内容并显示;
//mode低4位=10D只显示不清除其它内容并在字符最上面补画一横线,用于画表用
//mode低4位=11D只显示不清除其它内容并在字符最下面补画一横线,用于画表用
//mode低4位=12D只显示不清除其它内容并在字符最上面和下面补画一横线,用于画表用
//mode高4位!=0:反白显示,
//mode高4位==0:正常显示。
//NotLen需要取反显示的字符长度
void LcdDisplay(uchar x,uchar y,uchar *str,uchar mode)
{
   	uchar  Buff[2][192];  //显示缓冲区 上半行和下半行
   	uint  i,j,poz,DisStart, DisEnd;
   	uchar len,val,k,bm1,bm2,bm3,bm4,hzi;
   	ulong  addr; 
	uchar SendPos;
 	
 	if(str[0]==0 || str[0]=='\0')return;
   	len = strlen(str);	//字符长度	
   	x/=8;
   	poz = y;
   	memset(Buff,0,sizeof(Buff));	    //清显示缓冲区
   	for(i=0;i<len;i++)  //读出点阵数据放入缓显示冲区
    {     	
		if(str[i]>0x80)
		{
			k=16;
			hzi = i;
			bm1=str[hzi++];
			bm2=str[hzi++];
			bm3=str[hzi++];
			bm4=str[hzi];
			if(bm1 >= 0x82 && bm2 > 0x35)
			{
				bm3 = bm4 = 0;
				i += 1;
			}
			else i += 3;
				addr = CountZkAdr(bm1,bm2,bm3,bm4);
		}
		else
		{
			k=8;
			addr = 0x18A010+(str[i]-0x20)*16;
		}
       	SerialFlashRead(Flashziku,addr,k,Buff[0]+poz);
        SerialFlashRead(Flashziku,addr+k,k,Buff[1]+poz);        
       	poz+=k;
       	if(poz>192)
       	{ 
       		poz=192;
       		break;
       	}
	}
   	if(mode & 0xf0) //高4位为1反白显示,为0正常显示
    {		 
		for(j=y;j<poz;j++)
        {
			Buff[0][j] = ~Buff[0][j];
			Buff[1][j] = ~Buff[1][j];
		}        
    }
    j=0;
   	switch(mode & 0x0f)
   	{   		   		   		
   		case 2:	j=184;			//清除其余三行(不包括滚动条)并显示
   				
   		case 3:	if(j==0)j=192;
   				for(i=0;i<8;i++)	//清除其余三行(包括滚动条)并显示
		     	{//清屏后显示输入内容
//		     		if(i!=x || i!=x+1)
		     			LcdClearLine(i,j);
		     	}
		
		case 0: DisStart = y;	//只显示不清除其它内容
		        DisEnd = poz;
		        break;
		        
   		case 1:	DisStart = 0;
   				DisEnd = 184;  	
   				break;			//清除本行原有内容并显示,保留滚动条
   		
   		case 4:	DisStart = 0;	//清除本行原有内容并显示
         		DisEnd = 192;  	//不保留滚动条
         		break;
         		
//		case 5: 
		
		case 0x0A:
				DisStart = y;    //只显示不清除其它内容并在字符上面补画一横线,用于画表用
        		DisEnd = poz;
				for(i=DisStart;i<DisEnd;i++)
	            {	            	
	            	Buff[0][i] |= 0x01;	            	
	            }
	            break;
				
		case 0x0B:
				DisStart = y;    //只显示不清除其它内容并在字符下面补画一横线,用于画表用
        		DisEnd = poz;
				for(i=DisStart;i<DisEnd;i++)
	            {	            	
	            	Buff[1][i] |= 0x80;
	            }
	            break;			
	            
		case 0x0C:
				DisStart = y;    //只显示不清除其它内容并在字符上下面都补画一横线,用于画表用
        		DisEnd = poz;
				for(i=DisStart;i<DisEnd;i++)
	            {	            	
	            	Buff[0][i] |= 0x01;	            	
	            	Buff[1][i] |= 0x80;
	            }
	            break;
		
		default:DisStart = 0;DisEnd = 184;  	break;//=case 1
	}
	for(j=0;j<2;j++)   
   	{
		val = x & 0x07 | 0xB8;
        SendPos = DisStart;
	   	
		if(SendPos<64)
		{
			LcdWriteCommand(val,LcdChip1);    //设置行起始位置 页地址
			LcdWriteCommand(0x40|SendPos,LcdChip1);  //列地址设置指令  
			if(DisEnd<64)
			{
				for(i=SendPos;i<DisEnd;i++)
		       		LcdWriteData(Buff[j][SendPos++],LcdChip1);
				x++;
				continue;
			}
			else
			{
				for(i=SendPos;i<64;i++)
					LcdWriteData(Buff[j][SendPos++],LcdChip1); 
			}
		}
		if(SendPos<128)
		{
			LcdWriteCommand(val,LcdChip2);    //设置行起始位置 页地址
			LcdWriteCommand(0x40|(SendPos-64),LcdChip2);  //列地址设置指令  
			{
				if(DisEnd<128)
				{//第三屏没有数据	
					for(i=SendPos;i<DisEnd;i++)				
	       				LcdWriteData(Buff[j][SendPos++],LcdChip2);  
					x++;   
					continue;
				}
				else
				{//第三屏有数据
					for(i=SendPos;i<128;i++)
						LcdWriteData(Buff[j][SendPos++],LcdChip2);
				}
		   	}
		}
		if(SendPos>127)
		{
			LcdWriteCommand(val,LcdChip3);    //设置行起始位置 页地址
			LcdWriteCommand(0x40|(SendPos-128),LcdChip3);  //列地址设置指令  
			for(i=SendPos;i<DisEnd;i++)		//送第三屏数据	
	    		LcdWriteData(Buff[j][SendPos++],LcdChip3);  	
			x++;
		}		   	      	           		 
	}   
}

void ShowPicture(uchar startrow,uchar startcol,uchar endrow,uchar endcol,uchar *dat)
{//startrow,endrow(行/页地址)必须是8的倍数,*dat是点阵数据,必须是纵向取模,字节倒序
	uchar i,j,column,row,val;//row:行;column:列
	uint m;

	m=0;
	row=(endrow-startrow)/8;
//	PCO &= 0x7f;
	for(j=0;j<row;j++)
   	{
		val = (startrow/8+j)|0xB8;
        column = startcol;

		if(column<64)
		{
			LcdWriteCommand(val,LcdChip1);    	//设置起始行/页地址
			LcdWriteCommand(0x40|column,LcdChip1);   //列地址设置指令
			if(endcol<64)
			{
				for(i=column;i<endcol;i++)
		       	{
		       		LcdWriteData(dat[m++],LcdChip1);
		       	}
				continue;
			}
			else
			{
				for(i=column;i<64;i++)
				{
					LcdWriteData(dat[m++],LcdChip1);
					column++;
				}
			}
		}
		if(column<128)
		{
			LcdWriteCommand(val,LcdChip2);    //设置行起始位置 页地址
			LcdWriteCommand(0x40|(column-64),LcdChip2);  //列地址设置指令
			{
				if(endcol<128)
				{//第三屏没有数据
					for(i=column;i<endcol;i++)
	       				LcdWriteData(dat[m++],LcdChip2);
					continue;
				}
				else
				{//第三屏有数据
					for(i=column;i<128;i++)
					{
						LcdWriteData(dat[m++],LcdChip2);
						column++;
					}
				}
		   	}
		}
		if(column>127)
		{
			LcdWriteCommand(val,LcdChip3);    //设置行起始位置 页地址
			LcdWriteCommand(0x40|(column-128),LcdChip3);  //列地址设置指令
			for(i=column;i<endcol;i++)		//送第三屏数据
	    		LcdWriteData(dat[m++],LcdChip3);
		}
	}
//   	PCO |= 0x80;
}

//画矩形
void DisplayRectangle(uchar Dot_y1,uchar Dot_x1,uchar Dot_y2,uchar Dot_x2,uchar DisON)
{ 
	unsigned char i,j;
   
  	for(i=Dot_y1;i<=Dot_y2;i++)
    { 
    	for(j=Dot_x1;j<=Dot_x2;j++)
        	LcdDisplayDot(j,i,DisON);
//      	LcdDisplayDot(Dot_x2,i);
    }    
}
//画空芯矩形
void DisplayFullRec(uchar Dot_y1,uchar Dot_x1,uchar Dot_y2,uchar Dot_x2,uchar DisON)
{ unsigned char i;

  	for(i=Dot_x1;i<=Dot_x2;i++)
    { 
    	LcdDisplayDot(i,Dot_y1,DisON);
      	LcdDisplayDot(i,Dot_y2,DisON);
    }
  	for(i=Dot_y1;i<=Dot_y2;i++)
    { 
    	LcdDisplayDot(Dot_x1,i,DisON);
      	LcdDisplayDot(Dot_x2,i,DisON);
    }    
}

void Hint(uchar x,uchar y,uchar *str,uchar mode)
{
	ulong t=0;
	uchar k=0xFF;
	
	LcdDisplay(x,y,str,mode);	
	while(k==0xFF)
	{
		k=GetKey();
		t++;
		if(t>10000)break;
		BeepOn;
	}
	BeepOff;
}

void PowerOffHint(uchar *str,uchar *dat,uchar flg)
{
	I2cWrite(PwrFlgAdr,1,&flg);
	LcdDisplay(0,0,"操作过程中断电:",3);
	LcdDisplay(16,0,str,0);
	LcdDisplay(32,0,dat,0);
	while(1);
}

void ErrorHint(uchar *str,uint num)
{
	uchar dat[25];
	
	TR1=0;TR0=0;
	DisableCom;
	DisableCs;
	LcdDisplay(16,0,str,3);
	strcpy(dat,"故障代码:");
//	NumToStr(num,&dat[9],SwitchInt);
	BcdToStr(2,&num,&dat[9],0);
	LcdDisplay(32,0,dat,0);
	LcdDisplay(48,0,"按<合计>键程序复位!",0);
	while(KeyScan()!=K_HJ);
	WDRST=0x70;
	WDKEY=0;
	while(1);
}

//---------------------------Lcd End----------------------------------------------------



//---------------------------Flash Begin--------------------------------------------------

///////////////////////////////////////////////////////////////////////////////
//                    Serial Flash Description
//    chip  D7   D6   D5   D4   D3   D2   D1   D0
//          0    0    0    0    X    X    X    X  ----->>M45PE80== 0x  0xAA
//          0    0    0    1    X    X    X    X  ----->>M25P80 == 1x  0x55
//          0    0    1    0    X    X    X    X  ----->>M25P16 == 2x
//          0    0    1    1    X    X    X    X  ----->>          3x  Hold
//    chip Hihg 4 bit = M25P80 or M45PE80  or  M25P16
///////////////////////////////////////////////////////////////////////////////
//Function: Select chip AND port Low
//Control = 1 Port Low   Control =0 Port High
//Compile: yongjibing
//Time:    2004-11-11 19:48
/////////////////////////////////////////////////////////////////////////////////
void Selectchip(uchar chip,uchar Control)
{
   GS yB;
   yB.bt=chip;
   FlashEnable;
   if(Control)
   {
     switch(yB.swap.bytHigh)
     {
      case 0:           //Select M45PE80
        SerialFlash[0]=0xAA;
        break;
      case 1:           //Select M25P80
        SerialFlash[0]=0x55;
        break;
      case 2:           //Select M25P16
        break;
      default :return;  // Input Unllity
     }
    switch(yB.swap.bytlow)
    {
      case 1:
          Mcs1_Enable;
        return;         //Select chip = 1
      case 2:
          Mcs2_Enable;
        return;         //Select chip = 2
      case 3:
          Mcs3_Enable;
        return;         //Select chip = 3
      case 4:
          Mcs4_Enable;
        return;         //Select chip = 4
      default:return;   //Input Unllity
    }
  }
  else FlashDisable;
}



uchar ReadFlashStatus(uchar chip,uchar type)
{
    uchar value=0xf;
    ulong Overtime;
    
    if(type == FlashBE || type == FlashSE || type == FlashPE)//块擦除,扇区擦除,页擦除
    	Overtime = 352000;		//22s
    if(type == FlashPP || type == FlashPW) //页写与页编程
    	Overtime = 32000;			//20ms

    Selectchip(chip,1);
    SpiSendChar(FlashRSR);//05
	while(--Overtime)
	{
	    if(value&0x01)
			value=SpiReceiveChar();
	    else	break;
	}

    Selectchip(chip,0);
   	if(Overtime != 0)
   		return 1;
   	else
   		return 0;				//超时
}


//write status Regrister only M25P80 use
//void WriteFlashStatus(uchar chip)
//{
//   Selectchip(chip,1);
//   SpiSendChar(FlashRSR);
//   SpiSendChar(0);
//   Selectchip(chip,0);
//}

/*----------------------------------------------------------------------
          write enable insturction
----------------------------------------------------------------------*/
void FlashWriteEnable(uchar chip)
{
 	Selectchip(chip,1);
 	SpiSendChar(FlashWE);
 	Selectchip(chip,0);
}

/*-----------------------------------------------------------------------
          write num data to Flash
-------------------------------------------------------------------------*/
uchar FlashWriteData( uchar chip, ulong address, uint Len, uchar *Dat)//向某个25p80写num个数据
{
  	uint  i;
  	gyt4 mydat1;
  	gyt2 mydat2;
  	
  	mydat1.dat=address;
  	mydat2.dat=Len;
  	FlashWriteEnable(chip);//wriet enable insturction
 	Selectchip(chip,1);

 	for(i=0;i<Len;i++)
  	TxdBuf[i]=Dat[i];
  	SerialFlash[1]=mydat2.str[1];//写数据长度高位1字节
  	SerialFlash[2]=mydat1.str[1];//地址3字节
  	SerialFlash[3]=mydat1.str[2];
  	SerialFlash[4]=mydat1.str[3];
  	
 	SpiSendData();
 	Selectchip(chip,0);
 	if(ReadFlashStatus(chip,FlashPP))
 		return SpiOK;
 	else 
 	{
 		ErrorHint("写Flash出错!",0x8100|chip);
 		return SpiErr;
 	}
}

/*---------------------------------------------------------------------------------
调用方法:  uchar SerialFlashWrite(uchar chip,ulong address,uint Len,uchar *Dat);
     ch:  选择操作芯片    address: 写入地址   Len:  写入长度    Dat[]: 写入数组
      返回  1  操作成功   返回   0  操作失败
----------------------------------------------------------------------------------*/
uchar SerialFlashWrite(uchar chip,ulong address,uint Len,uchar *Dat)
{
  	uint   n,k;
  	
//  	if(Len>256) return SpiWriteLenErr;
  	if(Len>256)Len=256;
  	n=256-(address%256);//一个扇区剩下多少字节
  	if(n>=Len)//本扇区所剩空间可以全写入本数组的内容
  	{
  	  	return FlashWriteData(chip,address,Len,Dat);
  	}
  	if(n<Len)//本扇区所剩空间不可以全写入本数组的内容
  	{
  	   	if(FlashWriteData(chip,address,n,Dat)!=SpiOK)
  	   		return SpiErr;
  	   	k=Len-n;
  	   	return FlashWriteData(chip,address+n,k,&Dat[n]);
  	}
}
/*------------------------------------------------------------------------------------
      form Flash FlashRD num data to *Dat
   调用方法:  read_data(uchar chip,ulong add,uint Len,uchar *Dat);
   说明:  chip: 选择芯片  address:  读起始地址  Len: 读取长度  Dat[]:  读取存放数据
--------------------------------------------------------------------------------------*/

void SerialFlashRead(uchar chip,ulong address,uint Len,uchar *Dat)//读某个25P80的num个字节数据
{
    uint i;
    uchar flag=0;
    gyt4 mydat1;
    gyt2 mydat2;
    
	if(Len>256)Len=256;
    mydat1.dat=address;
    mydat2.dat=Len;

    Selectchip(chip,1);
    SerialFlash[1]=mydat2.str[1];//读数据长度高位1字节
  	SerialFlash[2]=mydat1.str[1];//地址3字节
  	SerialFlash[3]=mydat1.str[2];
  	SerialFlash[4]=mydat1.str[3];

    SpiReceiveData();
    for(i=0;i<Len;i++)
      Dat[i]=RxdBuf[i];
    Selectchip(chip,0);
}

/*----------------------------------------------------------------------------
   调用方式:  sector_erase(uchar chip,ulong FlashSE);
   说    明:  chip:  选择芯片  Sector:  扇区(0--15)
//sector erase function
// M45Pe80 and M25P80
-----------------------------------------------------------------------------*/
uchar SerialFlashSectorErase(uchar chip,uchar Sector)//sector value  form 0 to 15
{
  	ulong address;
  	gyt4 addr;
  	address=Sector*0x10000;
  	addr.dat = address;
  	FlashWriteEnable(chip);//wriet enable insturction
  	Selectchip(chip,1);
  	SpiSendChar(FlashSE);//FlashSE
  	SpiSendChar(addr.str[1]);
  	SpiSendChar(addr.str[2]);
  	SpiSendChar(addr.str[3]);
  	Selectchip(chip,0);
  	if(ReadFlashStatus(chip,FlashSE)) return SpiOK;
  	else 
  	{
  		ErrorHint("Flash扇区擦除出错!",0x8200|chip);
  		return SpiErr;
  	}

⌨️ 快捷键说明

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