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

📄 lab.c

📁 主要用于LCD-----HT1622驱动程序
💻 C
字号:
#include	<p18f452.h>

#define unchar unsigned char
#define wr1622_Wr  PORTDbits.RD1    //WR
#define wr1622_Dt  PORTDbits.RD0    //DATA
#define wr1622_Cs   PORTCbits.RC4
unsigned char SC3[10];//={0X46,0X55,0X01,0X00,0X00,0X16,0X00,0X08,0X7E,0};
unsigned char fs_bz,setp,cls_bz,xf_bz;//负数标志,,按钮次数,关屏标志,显示符号标志
rom  unsigned char SC1[]={
0x70,0xd0,0x60,0x00,0x30,0xe0,0x70,0xa0,//0,1,2,3
0x60,0x30,0x50,0xb0,0x50,0xf0,0x70,0x00,//4,5,6,7
0x70,0xf0,0x70,0xb0,0x00,0x00,0x00,0x20};//8,9.NOP,-
rom  unsigned char SC2[]={
0xf0,0xd0,0xe0,0x00,0xb0,0xe0,0xf0,0xa0,//0.,1.,2.,3.
0xe0,0x30,0xd0,0xb0,0xd0,0xf0,0xf0,0x00,//4.,5.,6.,7.
0xf0,0xf0,0xf0,0xb0,0x20,0x80,0xc0,0x00};//8.,9.s5,Kvar.h

#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
#pragma config CCP2MUX = OFF
#pragma config LVP = OFF

void add_dm(void);//全显段码
void cls_dms(void);//清除数码
void cls_dm(void);//段码清屏
void wr1622_Initial(void);// 初始化段码屏
void wr1622_gb(void);//关屏
void mesg_out2(unsigned char m,unsigned char add,rom  unsigned char *b);
void DelayMs(unsigned char i); //延时i 毫秒
void DelayUs(unsigned char i); //延时3*i 微秒
void WcommandID(unsigned char b);//3
void Wmadd(unsigned char b);//7
void Writecommand(unsigned char b);//8
void Writedata(unsigned char b);//4
void wr_b(unsigned char add,unsigned char data);//显示任意字符

void main()
{
	
wr1622_Initial();//初始化段码屏
cls_dms();//清除数码
cls_dm();//段码清屏
//add_dm();//全显段码
    while(1)
    {

       wr_b(14,14);
     }
}
void wr_b(unsigned char add,unsigned char data)
{// add-0-36;data-2-16;
    unsigned char kk,jj;
       wr1622_Cs=1;
	   wr1622_Cs=0;
	   wr1622_Wr=0;

       wr1622_Dt=1;
	   wr1622_Wr=1;//1
	   wr1622_Wr=0;
	   
	   wr1622_Dt=0;
	   wr1622_Wr=1;//0     
	   wr1622_Wr=0;	  
	    
       wr1622_Dt=1;
	   wr1622_Wr=1;//1            //101
	   wr1622_Wr=0;
       wr1622_Cs=0;
for(kk=0;kk<6;kk++)
{
	wr1622_Wr=0;
if((add&0x20)==0x20)
wr1622_Dt=1;
else
wr1622_Dt=0;
wr1622_Wr=1;
wr1622_Dt=0;
add<<=1;
}	  
for(jj=0;jj<5;jj++)
{
	wr1622_Wr=0;
if((data&0x01)==0x01)
wr1622_Dt=1;
else
wr1622_Dt=0;
wr1622_Wr=1;
wr1622_Dt=0;
data>>=1;
}
wr1622_Wr=0;
}
void Writedata(unsigned char b)//4
{
  unsigned char ii;	
  wr1622_Wr=0;
  for(ii=0;ii<4;ii++)
    {
     if((b&0x01)==0x01)wr1622_Dt=1;
     else wr1622_Dt=0;
     _asm
	 NOP
	 NOP
	 NOP
     _endasm
     wr1622_Wr=1;
     _asm
	 NOP
	 NOP
	 NOP
     _endasm
     wr1622_Wr=0;
     b>>=1;
     }	
}
void WcommandID(unsigned char b)
//b=0x80时,进入命令模式。b=0xa0时,进入写或读修改写模式。
{
  unsigned char ii;	
  wr1622_Wr=0;
  for(ii=0;ii<3;ii++)
    {
     if((b&0x80)==0x80)wr1622_Dt=1;
     else wr1622_Dt=0;
     _asm
	 NOP
	 NOP
	 NOP
     _endasm
     wr1622_Wr=1;
     _asm
	 NOP
	 NOP
	 NOP
     _endasm
     wr1622_Wr=0;
     b<<=1;
  	}	
  }
 void Wmadd(unsigned char b)
 {
  unsigned char ii;
  b<<=2; 
  wr1622_Wr=0;	
  for(ii=0;ii<6;ii++)
    {
     if((b&0x80)==0x80)wr1622_Dt=1;
     else wr1622_Dt=0;
     _asm
	 NOP
	 NOP
	 NOP
     _endasm
     wr1622_Wr=1;
     _asm
	 NOP
	 NOP
	 NOP
     _endasm
     wr1622_Wr=0;
     b<<=1;
  	}	
  }
 void Writecommand(unsigned char b)
 {
    unsigned char ii;	
    wr1622_Wr=0;
    for(ii=0;ii<8;ii++)
     {
      if((b&0x80)==0x80)wr1622_Dt=1;
      else wr1622_Dt=0;
        _asm
    	 NOP
    	 NOP
    	 NOP
        _endasm
       wr1622_Wr=1;
        _asm
    	 NOP
    	 NOP
    	 NOP
        _endasm
       wr1622_Wr=0;
       b<<=1;
    	}	
   }
 void wr1622_gb(void)
   {
   wr1622_Cs=0;
   WcommandID(0x80);
   Writecommand(2);//关屏 
   wr1622_Cs=1;

   }
   void wr1622_Initial(void)  // 初始化段码屏
 {
  TRISDbits.TRISD0=0;
  TRISDbits.TRISD1=0;
  TRISCbits.TRISC4=0;	 
  wr1622_Cs=1;
  _asm
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
   _endasm    
  wr1622_Cs=0;
  WcommandID(0x80);
  Writecommand(1);//Turn on system osciallator//开屏频率
  Writecommand(3);//Turn on LCD display开屏
  Writecommand(0x29);//1/4 duty,1/3 bias
 // Writecommand(0x18);//on chip rc oscillator
  wr1622_Cs=1;
  wr1622_Wr=1;
  }
  void cls_dm(void)//段码清屏
   {unsigned char i;
 	for(i=0;i<96;i++)
    mesg_out2(2,i,SC1+20);
   }
  void cls_dms(void)//清除数码
  {unsigned char i;
	  mesg_out2(2,15,SC1+20);
	  mesg_out2(2,28,SC1+20);
	  //mesg_out2(2,26,SC1+20);
	  for(i=0;i<37;i++)
	  { mesg_out2(1,i,SC1+20);
	    if(i==3)i=30;
	   } 
   }
void add_dm(void)//全显段码
{unsigned char i;
 	for(i=0;i<96;i++)
    mesg_out2(2,i,SC2+16);
   }  
   void mesg_out2(unsigned char m,unsigned char add,rom  unsigned char *b)
 {
  unsigned char k,i,j;
  wr1622_Cs=1;
    _asm
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
   _endasm
  wr1622_Cs=0;
    _asm
	  NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
   _endasm
  WcommandID(0xa0);
  Wmadd(add);
    _asm
	  NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
   _endasm
  wr1622_Wr=1;	
  for(i=0;i<m;i++)
  {k=*(b+i);
   for(j=0;j<8;j++)
     {
	   wr1622_Wr=0; 	   
    _asm
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
   _endasm
       if((k&0x80)==0x80)wr1622_Dt=1;
       else wr1622_Dt=0;
       wr1622_Wr=1;
     _asm
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
	 NOP
     _endasm
       k<<=1;
	  }	  
  }
  wr1622_Cs=1;
  wr1622_Wr=1;
 }
void	DelayUs(unsigned char i) //延时3*i 微秒
{
	while(i--);
	}
	
void   DelayMs(unsigned char i) //延时i 毫秒
{    
	while(i--)
	DelayUs(150);
	DelayUs(150);
	}

⌨️ 快捷键说明

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