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

📄 hand_902_cmbus_ok.c

📁 基于PIC18F6720MCU开发的手持式POS机的原码
💻 C
📖 第 1 页 / 共 5 页
字号:
	//-----------------------------------
	temp_buffer[20]=rtc_buf[8];	
	temp_buffer[21]=rtc_buf[9];
	temp_buffer[22]=':';      
    temp_buffer[23]=rtc_buf[10];				//
	temp_buffer[24]=rtc_buf[11];
	temp_buffer[25]=0;
	printscr(9,3,'d',SPACE,temp_buffer);
	return;
	}
/*========================================================================================*
函数:void  printhand(uchar line)
创建日期:2004.7.2                                
作者:rojam
功能:在图像三区显示手图案
参数:line-行,范围为1~8,列参数为固定值:3;
返回值:无
图形三区的RAM开始地址为:4000H
*========================================================================================*/
void  printhand(uchar line)
 {
	uint i,j;
	uchar charh,charl;
	//-----------------------------------
	lcdwritecom(0x4f);                 //光标移动方向,向下,地址加一。
	for(i=0;i<3;i++)
       {
		charh=(line*496+3+i)/256;
    	charl=(line*496+3+i)%256;
   	    lcdwritecom(0x46);                 //设置光标地址
    	lcdwritedata(charl);             //csrl=0x00;
    	lcdwritedata(charh);              //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
		lcdwritecom(0x42);                 //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。	    
   		for(j=0;j<16;j++)
       		{
       		 lcdwritedata(hand[i+j*3]);	    	 
       		}
        }
    return;
 }
//---------------------------------------
void  clearhand(uchar line)
 {
	uint i,j;
	uchar charh,charl;
	//-----------------------------------
	lcdwritecom(0x4f);                 //光标移动方向,向下,地址加一。
	for(i=0;i<3;i++)
       {
		charh=(line*496+3+i)/256;
    	charl=(line*496+3+i)%256;
   	    lcdwritecom(0x46);                 //设置光标地址
    	lcdwritedata(charl);             //csrl=0x00;
    	lcdwritedata(charh);              //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
		lcdwritecom(0x42);                 //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。	    
   		for(j=0;j<16;j++)
       		{
       		 lcdwritedata(0);	    	 
       		}
        }
    return;
 }
/*========================================================================================*
函数:void printscr(uchar type,const rom char *clum,uchar *clum)
创建日期:2004.7.2                                
作者:rojam
功能:屏幕打印函数
参数:line-行,clum-列。type:'c'-字符,'d'-变量。
返回值:无
原来显示:128×64=16字符×8字符
现在:   240*160=30字符×20字符
*========================================================================================*/
void printscr(uchar line,uchar clum,char type,static rom char *drom,uchar *dram)
{
	uint dzposition,dzstep;
	uint len,i,j,h;
	uchar charh,charl;
  	for(i=0;i<248;i++)													//清除缓存
	       { 
			buffer1.ichar[i]=0;
            buffer2.ichar[i]=0;
            }
   for(len=0;len+clum<30;len++)										//一行30个字符。
	{
		if(type=='c')													//取出字符码
		  {
			charh=drom[len];
			charl=drom[len+1];
		   }
		else															//取出变量码
		   {
			charh=dram[len];
			charl=dram[len+1];
		   }
		if((charh==0)||(charh==0xff))									//结束退出
			break;
		if(charh>0x7f)													//汉字
		  {
	    //**********************查找汉字点阵位置**********************
	  // hznum		238		//汉字数组数-1,用于汉字折半查找
        // hzstep	    128		//汉字数组半长,用于汉字折半查找
		//------------------------------------------------------------
		  if(len>28)	break;										   //只剩半角退出			 
		  dzstep=dzposition=hzstep;
		  for(;dzstep>0;)
			 {
				if(dzposition>hznum) dzposition=hznum;									//数组超界拉回
				dzstep/=2;																//折半
				if(HZ_MSK[dzposition].Index[0]>charh)	
				  {
					dzposition=dzposition-dzstep;
					continue;
				  }		
				if(HZ_MSK[dzposition].Index[0]<charh)	
				  {
					dzposition=dzposition+dzstep;
					continue;
				  }		
				if(HZ_MSK[dzposition].Index[1]>charl)	
				  {
					dzposition=dzposition-dzstep;
					continue;
				  }		
				if(HZ_MSK[dzposition].Index[1]<charl)	
				  {
					dzposition=dzposition+dzstep;
					continue;
				  }		
				goto next;
			 } //end 'for'	
	      dzposition=0;													 //显示缺省字符
//-----------------------------------------------------------------------自动写数据
//-----------------dzposition:为对应汉字的位置寄存器。
next:			
	     h=len+clum;                                                     //列位置值
	     for(i=0;i<8;i++)
           	{
 			 buffer1.ichar[h+i*31]=HZ_MSK[dzposition].Msk[i+i];	     //写u左半部分
			 buffer1.ichar[h+i*31+1]=HZ_MSK[dzposition].Msk[i+i+1];  //写u右半部分
	         }  	
		 for(i=0;i<8;i++)
            {
			 buffer2.ichar[h+i*31]=HZ_MSK[dzposition].Msk[i+i+16];        //写d左半部
             buffer2.ichar[h+i*31+1]=HZ_MSK[dzposition].Msk[i+i+16+1];    //写d右半部分			 
			}
         len++;													         //移2位
		 }   //end 'if(charh>0x7f)'
		//************************************查找字符点阵位置*********************************
	else			
		{   //ascstep=64 ascnum=110	
			i=h=ascstep;                          
			while(i)
			{
				if(h>ascnum)							 //数组超界拉回
					h=ascnum;
				i>>=1;									//折半
				if(ASC_MSK[h].Index>charh)	
				{
					h-=i;
					continue;
				}		
				if(ASC_MSK[h].Index<charh)	
				{
					h+=i;
					continue;
				}		
				goto next1;
			 }  //end 'while'	
		 h=0;							                 //显示缺省字符
         //--------------写数据
         //--------------H:为所查找的字符在对应字符模中的索引值。
         //-------------charl:为需显示的列位置。
next1:			
	      charl=len+clum;                                    //列位置值
	      for(i=0;i<8;i++)
               buffer1.ichar[charl+i*31]=ASC_MSK[h].Msk[i];  //写左u部分   
		  for(i=0;i<8;i++)
               buffer2.ichar[charl+i*31]=ASC_MSK[h].Msk[i+8];//写左d部分                 

        }   //end 'else'
     }      //end 'for(len=0;len+clum<30;len++)'
//*********************************************************将显示缓冲区的数据送SD1335。	
  if(type=='c')
	{//------------------------------------------------------整行刷
	charh=(line*496)/256;
	charl=(line*496)%256;
	lcdwritecom(0x4c);                 //光标移动方向,向右,地址加一。
   	lcdwritecom(0x46);                 //设置光标地址
    lcdwritedata(charl);                //csrl=0x00;
    lcdwritedata(charh);               //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
	lcdwritecom(0x42);                  //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
    for(i=0;i<248;i++)
        lcdwritedata(buffer1.ichar[i]);     //上半行。
	for(i=0;i<248;i++)
        lcdwritedata(buffer2.ichar[i]);     //下半行。
    } 
   else 
		{   
			 //---------------------------------------------------部分刷,即从clum向右
        for(j=0;j<8;j++)
           {
        	charh=(line*496+clum+j*31)/256;
	    	charl=(line*496+clum+j*31)%256;
        	lcdwritecom(0x4c);                 //光标移动方向,向右,地址加一。
   			lcdwritecom(0x46);                 //设置光标地址
   			lcdwritedata(charl);                //csrl=0x00;
    		lcdwritedata(charh);               //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
			lcdwritecom(0x42);                  //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
       	 	for(i=clum;i<31;i++)lcdwritedata(buffer1.ichar[j*31+i]);   //上半行。
			}
		 for(j=8;j<16;j++)
           {
        	charh=(line*496+clum+j*31)/256;
	    	charl=(line*496+clum+j*31)%256;
        	lcdwritecom(0x4c);                 //光标移动方向,向右,地址加一。
   			lcdwritecom(0x46);                 //设置光标地址
   			lcdwritedata(charl);                //csrl=0x00;
    		lcdwritedata(charh);               //csrh=0x00;同时设置该地址作为显示缓冲区的当前地址指针。
			lcdwritecom(0x42);                  //允许MCU连续的将显示数据写入显示缓冲区.区的当前地址指针。
       	 	for(i=clum;i<31;i++)lcdwritedata(buffer2.ichar[(j-8)*31+i]);   ////下半行。 
			}	          
        }  	
   return;
}
//=====================================================================================
//
//                      LCD基本读写子程序
//
//=====================================================================================
/***************************************************************************************
创建日期:2004.6.28                                 
作者:rojam
功能:lcd显示初示化程序。
返回值:
参数:
设置液晶显示模式:
****************************************************************************************/
//P1=30H-------->有边界,单屏,8*8点阵,选择80~9F之间的字符代码,选择内部字符发生器。
//P2=87H---------------->MF=1,字符宽度为07H;
//P3=07H---------------->字符高度为07H;
//P4=1eH---------------->液晶一行能够显示的最多字符为C/R=30个;
//P5=22H---------------->LCD工作频率的时间常数TC/R=C/R+4=34;
//P6=A0H---------------->LCD的点行数为160.
//P7=1E,P8=00----------->显示屏一行所占显示缓冲区的字节数,通常取:AP=C/R+1=1DH+1=1f;
//--------------------------------------------------------------------------------------
//-----SCRTAB----
//P1=00,P2=00,P3=A0----->第1显示区的首地址SAD1=0000H,及其占有显示屏上的点行数SL1=160;
//P4=00,P5=20,P6=A0----->第2显示区的首地址SAD2=2000H及其占有显示屏上的点行数SL2=160。
//P7=00,P8=40----------->第3显示区的首地址SAD3=4000H
//P8=00,P10=60---------->第4显示区的首地址SAD2=6000H
//-------------------240160的SYSTEM SET 参数-----------------------------------------
static uchar rom  SYSTAB[8]={0x30,0x87,0x07,0x1E,0x22,0xA0,0x1f,0x00 };
static uchar rom  SCRTAB[10]={0x00,0x00,0xA0,0x00,0x20,0xA0,0x00,0x40,0x00,0x60};
void  lcdinit(void)
   {
    uchar i;
    //-------------------------------------------
	for(i=0;i<248;i++)													//清除缓存
		{
        buffer1.ichar[i]=0;
        buffer2.ichar[i]=0;
		}
	YJVDDCON_DDR=output;
	YJVDDCON_OUT=0;
	YJREST_DDR=output;	
	YJREST_OUT=0;	
    delayms(1);	
	YJREST_DDR=output;	
	YJREST_OUT=1;
	//-------------------------------------------reset lcd
    lcdwritecom(0x40);
    for(i=0;i<8;i++)  lcdwritedata(SYSTAB[i]);
    lcdwritecom(0x44);
    for(i=0;i<10;i++) lcdwritedata(SCRTAB[i]);
    //---------------------------------------------
    lcdwritecom(0x5A);             //HDOT SCR代码
    lcdwritedata(0x00);            //设置参数片p1
	 //---------------------------------------------
    lcdwritecom(0x5D);             //CSRFORM 
    lcdwritedata(0x07);            //设置参数片p1
	lcdwritedata(0x83);            //设置参数片p2
    //---------------------------------------------
	lcdwritecom(0x5B);             //OLLAY代码
    lcdwritedata(0x0C);            //二重合成,设置一,三区为图型方式,合成显示方式为:或.    
	//---------------------------------------------
	clearlcd();                     //调清屏子程序
	//---------------------------------------------
	lcdwritecom(0x59);              //显示开,
	lcdwritedata(0x56);             //设置:1~4区开显示,光标关。54h=01010100
	lcdwritecom(0x4c);              //光标移动方向,向d移动,地址加一。
	//--------------------------------------------------------------------- 
     return;
   }    
/*=========================================================================================*
函数:void	clearscren(void)
功能:清除屏幕
参数:
返回值6
-------------------------------------------------------------------------------------------
更新日期:2003.05.15

⌨️ 快捷键说明

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