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

📄 hx8303.c

📁 C8051F单片机应用和液晶显示器编程的例子
💻 C
📖 第 1 页 / 共 2 页
字号:
	  ;
	  }
	  /*wr_com8080(0x2a);
      otp_value=otp_value-1;
      if(otp_value==-1)
        otp_value=0x00;
      wr_com8080(otp_value);*/
     }
    }
  }
 next:
 //==========================
 RS=1;
 //==========================
}
//=============END===========================================================
//=============K9F5608U0A===============
//=============RESET====================
void reset(void)
{
 MCE=0;
 MR_B=1;
 MRE=1;
 MWE=1;
 MCLE=0;
 MALE=0;
 P1=0xff; 
 MCLE=1;
 MALE=0;
 MWE=0;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 MWE=1;
 MCLE=0;
 MALE=0;
 while(MR_B==0)
	{
	 ;
	}
}
//============命令输出函数=================
void writecomd(unsigned char comd)
{ 
  P1=comd;
  MCLE=1;
  MALE=0;
  MWE=0;
  MWE=0;
  MWE=1;
  MWE=1;
  MCLE=0;
  MALE=0;
}
//============地址输出函数====================
void writeaddr(uchar raddrl,uchar raddrh)
{ 
 P1=0x00;
 MCLE=0;
 MALE=1;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 P1=raddrl;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 P1=raddrh;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 MCLE=0;
 MALE=0;
}
//=============数据输出函数=============
void writedata(void)
{ 
 P1= *pointer;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 pointer++;
}
//=============读操作==================
uchar readsta(void)
{ 
 unsigned char soop;
 P1MDOUT=0x00;
 P1=0xff;
 DelayX1ms(20);
 MRE=0;
 MRE=0;
 soop=P1;
 MRE=1;
 P1MDOUT=0xff;
 return(soop);
}
//==============整块擦除1块=32pages 共2048块====
uchar blockerase(uint block)
{
 unsigned char result;
 writecomd(0x60);
 block=block*32;
 P1=block&0x00ff;
 MCLE=0;
 MALE=1;
 MWE=0;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 MWE=1;
 P1=(block&0xff00)>>8;
 MWE=0;
 MWE=0;
 MWE=0;
 MWE=1;
 MWE=1;
 MWE=1;
 MCLE=0;
 MALE=0;
 writecomd(0xd0);
 while(MR_B==0)
	{
	 ;
	}
 writecomd(0x70);
 result=readsta();
 if((result&0x01)== 1)
  {
   return(1);
  }//出错处理
 else
   return(0);
}
//==============整页写入的详细代码======
uchar pagewrite(uchar raddrl,uchar raddrh)
{ 
 int i;
 unsigned char result;
 pointer = &buffer;
 writecomd(0x00);//必须指出开始地址
 writecomd(0x80);
 writeaddr(raddrl,raddrh);
 for(i=0;i<512;i++)
   {
    writedata();
   }
 writecomd(0x10); 
 while(MR_B==0)
	{
	 ;
	}
 writecomd(0x70);
 result=readsta();
 if((result&0x01) == 1)
  {
   return(1);
  }//出错处理
 else
   return(0);
 }
//===============
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use the internal 24.5MHz / 8 
// oscillator as its clock source.  Also enables missing clock detector reset.
//
void SYSCLK_Init (void)
{
   OSCICN = 0x80;                         // IOSCEN IFRDY 0 0 0 0 IFCN1 IFCN0 (sfr OSCICN=0xB2;内部振荡器控制寄存器) 
                                          // IOSCEN=1 内部振荡器使能;IFRDY=0/1 内部振荡器未运行在编程频率/内部振荡器按编程频率运行.
                                          // IFCN1 IFCN0=00~11  8分频 4 2 1分频.

   RSTSRC = 0x04;                         // 0 FERROR C0RSEF SWRSF WDTRSF MCDRSF PORSF PINRSF (sfr RSTSRC=0xEF;复位源寄存器) 
                                          // MCDRSF=0/1 禁止时钟丢失检测器/使能时钟丢失检测器;检测到时钟丢失条件时触发复位.
                                       
}

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports.
//
//
void PORT_Init (void)
{
                                          
   //PCA0MD &= ~0xc0;                      // CIDL WDTE WDCLK 0 CPS2 CPS1 CPS0 ECF (sfr PCA0MD=0xD9;PCA0 MODE)
                                         // CIDL=0/1 当系统控制器处于空闲方式时,PCA 继续正常工作/当系统控制器处于空闲方式时,PCA 停止工作.
                                         // WDTE=0/1 看门狗定时器被禁止/PCA 模块4 被用作看门狗定时器.
                                         // WDCLK=0/1 对看门狗定时器使能位解锁/锁定看门狗定时器使能位(当WDCLK 被置‘1’时,在发生下一次系统复位之前将不能禁止WDT).
                                         // CPS2-CPS0=000 系统时钟的12分频 001 系统时钟的4 分频 010 定时器0 溢出 011 ECI 负跳变(最大速率= 系统时钟频率/4)100 系统时钟 101 外部时钟的8 分频.
                                         // ECF=0/1 禁止CF中断/当CF(PCA0CN.7)被置位时,允许PCA 计数器/定时器溢出的中断请求.
                                         // disable watchdog timer
                                         // WDTE = 0 (clear watchdog timer enable)
   PCA0MD   = 0x00;
   //============================================================
   XBR0     = 0x00;                       // CP1AE CP1E CP0AE CP0E SYSCKE SMB0E SPI0E URT0E (sfr XBR0=0xE1;端口I/O 交叉开关寄存器0)
                                          // no digital peripherals selected

   XBR1     = 0x40;                       // WEAKPUD XBARE T1E T0E ECIE PCA0ME(3位) (sfr XBR1=0xE2;端口I/O 交叉开关寄存器1) 
                                          // WEAKPUD=0 弱上拉使能;XBARE=1 交叉开关使能;T1E=0 T1不连到端口引脚;T0E=0 T0不连到端口引脚.
                                          // ECIE(PCA0 外部计数输入使能位)=0 ECI不连到端口引脚;PCA0ME=000 所有的PCA I/O 都不连到端口引脚.
                                          // Enable crossbar and weak pull-ups

   P3MDOUT |= 0x1e;                       // 000 P3MDOUT[4:0](P3.4–P3.0 输出方式配置位) (sfr P3MDOUT=0xA7;端口3输出方式寄存器)
                                          // P3MDOUT[4:0]=0/1 对应的P3.n 输出为漏极开路/对应的P3.n 输出为推挽方式.
                                          // enable LED as a push-pull output

   P2MDOUT |= 0xff;
   P1MDOUT |= 0xff;
   P0MDOUT |= 0x01;
}

//-----------------------------------------------------------------------------
/*初始化*/
//========================================
uchar code ini[]={
                  0x10,  //Driver Output Mode Set============================================(10h)
                  
};
//==================================================
void format(void)
{
     uchar i;
     for(i=0;i<47;)
     {
      wr_com8080(ini[i]);
      i=i+1;
     }
     coordinate(0,0);
}
//===========================================================
void donghua1(void)
{
 //=========================
  for(kk=0;kk<9;kk++)
   {
    for(jj=0;jj<80;jj++)
    {
     writecomd(0x00);//必须指出开始地址
     writeaddr(((kk*80+jj)&0x00ff),((kk*80+jj)&0xff00)>>8);
	 P1=0xff;
     while(MR_B==0)
	  {
	   ;
	  }
	 for(ii=0;ii<256;ii++)
      {
	   LP=1;
	   MRE=0;
	   LP=0;
	   MRE=1;

	   MRE=0;
	   WR=0;
	   WR=1;
	   MRE=1;
      }
     }
    pic_wait(1000);
   }
}
//===========================================================
void donghua2(void)
{
 for(kk=0;kk<700;kk++)
   {
	for(jj=0;jj<80;jj++)
    {
     writecomd(0x00);//必须指出开始地址
     writeaddr(((kk*80+736+jj)&0x00ff),((kk*80+736+jj)&0xff00)>>8);
	 P1=0xff;
     while(MR_B==0)
	  {
	   ;
	  }
	 for(ii=0;ii<256;ii++)
      {
	   LP=1;
	   MRE=0;
	   LP=0;
	   MRE=1;

	   MRE=0;
	   WR=0;
	   WR=1;
	   MRE=1;
      }
     }
    key_wait(wait_value);
   }
}
//===========================================================
void donghua3(void)
{
 
 key_wait(wait_value);
}
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void) 
{                                        
 autorun0=0;             	
 SYSCLK_Init ();                        // Initialize system clock to 24.5MHz
 PORT_Init ();                          // Initialize crossbar and GPIO
 //==========================
 LED=1;
 CS1=0;
 otp_value=0x8f;
 wait_value=40;
 //=========================================================================================
 DelayX10ms(20);
 //==============================================================
 wr_com8080_16(0x00,0x07);    //Display Control 1 (R07h)
 wr_data8080_16(0x01,0x04);
 //0 0 0 PT1 PT0 VLE2 VLE1 SPT      0 0 GON DTE CL REV D1 D0
 //PT1 PT0=00 ; VLE2 VLE1=00
 //SPT=1, liquid crystal is driven with 2 split screens. GON DTE D1 D0=1111.
 //CL=0 65K colors ,1 8 colors. REV=??.
 DelayX1ms(40);
 wr_com8080_16(0x00,0x0d);    //Power Control 4 (R0Dh)
 wr_data8080_16(0x02,0x02);
 //0 0 0 0 VRL3 VRL2 VRL1 VRL0      0 0 0 PON VRH3 VRH2 VRH1 VRH0
 //VRL3~VRL0=0000~0110 VREG2OUT=Vcix

⌨️ 快捷键说明

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