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

📄 hand_1010_rs232_ok.c

📁 基于PIC18F6720MCU开发的手持式POS机的原码
💻 C
📖 第 1 页 / 共 5 页
字号:
	static uchar rom xqhznum[]=
					{0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9}; //星期	
				  //   日		 一    二		 三     四    五   六  
    readtime();  
    for(i=0;i<26;i++) buffer.ichar[i]=1;
	temp_buffer[0]='2';				//"2000年00月00日";
	temp_buffer[1]='0';
	temp_buffer[2]=rtc_buf[0];
	temp_buffer[3]=rtc_buf[1];
	temp_buffer[4]=0xc4;
	temp_buffer[5]=0xea;                //0xc4,0xea为‘年’的内码。
  //--------------------------------
	temp_buffer[6]=rtc_buf[2]; 			//buffer.ichar[1]&0x0f
	temp_buffer[7]=rtc_buf[3]; 			//(buffer.ichar[1]&0xf0)>>4
	temp_buffer[8]=0xd4; 				//0xd4,0xc2为‘月’的内码。
	temp_buffer[9]=0xc2; 
  //----------------------------------           
   	temp_buffer[10]=rtc_buf[4];			//buffer.ichar[2]&0x0f
	temp_buffer[11]=rtc_buf[5];			//(buffer.ichar[2]&0xf0)>>4
	temp_buffer[12]=0xc8;              
	temp_buffer[13]=0xd5;              //0xc8,0xd5为‘日’的内码。	
   //------------------------------	
	temp_buffer[14]=0xd0;				//"星期00 00时 00分"
	temp_buffer[15]=0xc7;              //星
	temp_buffer[16]=0xc6;
	temp_buffer[17]=0xda;	
	temp_buffer[18]=xqhznum[rtc_buf[7]*2];	     //注:RTC_BUF[6]为无用数据。	
	temp_buffer[19]=xqhznum[rtc_buf[7]*2+1];
	//-----------------------------------
	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_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(0x8f);            //设置参数片p2
    //---------------------------------------------

⌨️ 快捷键说明

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