105+.c

来自「一个用keil写的,动行在c8051f410上的自己做的开关电源的驱动程序,在p」· C语言 代码 · 共 468 行 · 第 1/2 页

C
468
字号
#include <c8051f410.H>

#define uchar unsigned char
#define uint  unsigned int 
#define LCD_PORT P2                      
#define Left  2                                     
#define Right 1

////////////////////12864
sbit  LCD_Busy=P2^7;     
sbit  LCD_EN = P1^7;
sbit  LCD_RW = P1^6;
sbit  LCD_RS = P1^5;
sbit  LCD_CS1= P1^4;
sbit  LCD_CS2= P1^3;
sbit  LCD_RST= P1^1;
sbit  kk= P1^0;

uchar Page_Num,Clm_Num,tempdata,page,clum,pagestart,clmstart,clmsum,pageend,i,j,k,dataout,digih2,digih,digil2,digil,digitalin,clockrecog;
uchar swd,symbolin,symbolout,con,ab,keysetsymbol,keyud,keylr,keyset,keysetin,dir,enterkeynumber=0,keyclr,x,y;
uint  v5,v15,vm15,v151,v152,v153,v154,v24,v24h;
uchar count,dafig=0;
uchar serial,accidentrecog=0;
uchar dt[7];
uchar datacenter[3][9];					 
code uchar digital[19][14]={{0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,0x03,0x04,0x08,0x08,0x04,0x03,0x00},/*"0",0*/
                           {0x00,0x08,0x08,0xFC,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x08,0x08,0x00},/*"1",1*/
                           {0x00,0x18,0x04,0x04,0xC4,0x38,0x00,0x00,0x0C,0x0A,0x09,0x08,0x0C,0x00},/*"2",2*/
                           {0x00,0x18,0x04,0x44,0x44,0xB8,0x00,0x00,0x06,0x08,0x08,0x08,0x07,0x00},/*"3",3*/
                           {0x80,0x40,0x30,0x08,0xFC,0x00,0x00,0x01,0x01,0x01,0x09,0x0F,0x09,0x01},/*"4",4*/
                           {0x00,0x7C,0x24,0x24,0x64,0xC4,0x00,0x00,0x06,0x08,0x08,0x0C,0x07,0x00},/*"5",5*/
                           {0xF0,0x88,0x44,0x44,0x44,0x8C,0x00,0x07,0x08,0x08,0x08,0x08,0x07,0x00},/*"6",6*/
                           {0x00,0x1C,0x04,0xC4,0x34,0x0C,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00},/*"7",7*/
                           {0x38,0xE4,0x44,0x44,0xC4,0x38,0x00,0x07,0x08,0x08,0x08,0x08,0x07,0x00},/*"8",8*/
                           {0x78,0x84,0x84,0x84,0x4C,0xF0,0x00,0x0C,0x08,0x08,0x0C,0x06,0x01,0x00},/*"9",9*/
                           {0x20,0xE0,0x40,0x20,0x20,0xC0,0x00,0x20,0x3F,0x28,0x08,0x0C,0x07,0x00},/*"p",10*/
                           {0x00,0x40,0x20,0xA0,0xA0,0xC0,0x00,0x00,0x06,0x09,0x08,0x08,0x0F,0x08},/*"a",11*/
                           {0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00},//:	 12	   
                           {0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/
                           {0x80,0x80,0x80,0xF0,0x80,0x80,0x80,0x00,0x00,0x00,0x07,0x00,0x00,0x00},/*"+",14*/
                           {0x00,0x38,0x44,0xFE,0x84,0x18,0x00,0x00,0x06,0x08,0x3F,0x08,0x07,0x00},/*"$",15*/
						   {0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00},/*"=",16*/
                           {0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x07,0x38,0x0E,0x01,0x00,0x00},/*"V",17*/
				           {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00}};/*".",18*/

void Delay_us(unsigned int DelayTime)
 {
   while(DelayTime) DelayTime--;
  }

void Delay_x10ms(unsigned char DelayTime)   //***************10ms延时**********//
   {
       unsigned char iq,jq,kq;
       for(iq=0;iq<DelayTime;iq++)
          for(jq=0;jq<50;jq++)
             for(kq=0;kq<120;kq++) {;}
    }	   


/*---------------------------------------------------------------------------- 
下面这个函数用于液晶模块的忙信号检测。 
----------------------------------------------------------------------------*/ 
void LCD_Check_Busy(void)
  {
   while(1)
	{ LCD_Busy=1;
	  Delay_us(3);
	  LCD_EN = 0;
	  LCD_RS = 0;
	  Delay_us(10);
	  LCD_RW = 1;
	  LCD_PORT = 0xff;
	  LCD_EN = 1;
	 
	  if(!LCD_Busy) break;
     }
   LCD_EN = 0;
  }
/*---------------------------------------------------------------------------- 
下面这个函数用于向液晶模块写入控制指令代码。 
函数入口参数:Command ------ 向液晶模块写入的控制指令代码 。 
              CS_Num  ------ 左右半屏的选数值 
----------------------------------------------------------------------------*/ 
void LCD_WriteCommand(uchar Command, uchar CS_Num) 
{  Delay_us(3);
  if(CS_Num==1)			/*选择左半屏*/
   {
     LCD_CS1 = 0;
	 LCD_CS2 = 1;
	}
  else if(CS_Num==2)	/*选择右半屏*/
   {
     LCD_CS1 = 1;
	 LCD_CS2 = 0;
	}
	Delay_us(3);
  LCD_Check_Busy();       /* 使能信号为L */ 
  LCD_RS = 0;           /* 置寄存器选择为L */ 
  LCD_RW = 0;           /* 置读/写选择为L */ 
  LCD_PORT = Command;   /* 将控制指令代码输出到的数据端口 */ 
  LCD_EN = 1;           /* 使能信号为H */ 
  Delay_us(10);          /* 延时2us */ 
  LCD_EN = 0;           /* 使能信号为L */ 
  LCD_CS1 = 1;          /* 置片选1为L */ 
  LCD_CS2 = 1;          /* 置片选2为L */ 
} 


/*---------------------------------------------------------------------------- 
下面这个函数用于向液晶模块写入显示数据。 
函数入口参数:Data------ 向液晶模块写入的显示数据 。 
            CS_Num-------左右半屏的选数值 
----------------------------------------------------------------------------*/ 
void LCD_WriteData(uchar Data,uchar CS_Num) 
{ Delay_us(3); 
if(CS_Num==1)		 /*选择左半屏*/
   {
     LCD_CS1 = 0;
	 LCD_CS2 = 1;
	}
  else if(CS_Num==2)  /*选择右半屏*/
   {
     LCD_CS1 = 1;
	 LCD_CS2 = 0;
	}
  LCD_Check_Busy();
  LCD_EN = 0;
  LCD_RS = 1;  /* 置寄存器选择为H */ 
  LCD_RW = 0;       /* 置读/写选择为L */  
  LCD_PORT = Data;  /* 将显示数据输出到的数据端口 */ 
  LCD_EN = 1;       /* 使能信号为H */ 
  Delay_us(10);      /* 延时2us */ 
  LCD_EN = 0;       /* 使能信号为L */ 
  LCD_CS1= 1;       /* 置片选1为L */ 
  LCD_CS2= 1;       /* 置片选2为L */ 
}    

/*---------------------------------------------------------------------------
下面这个函数用于液晶模块的清屏。
---------------------------------------------------------------------------*/
void LCD_keyclr(uchar Side_Num)
 {
   uchar i,k,COM;
   
   for(i=0;i<8;i++)				  
   {
	 COM=0xB8+i;
     LCD_WriteCommand(COM,Side_Num);    
	 COM=0x40;
	 LCD_WriteCommand(COM,Side_Num);  
	 	 
     for(k=0;k<64;k++)
      {
	    LCD_WriteData(0x00,Side_Num);
	   }
	}
	 Delay_us(2);
  }


/*---------------------------------------------------------------------------
下面这个函数用于向液晶模块初始化。
如果没有写完一个半屏的数据就要充分结合此函数来达到要显示的效果
---------------------------------------------------------------------------*/
void LCD_Initial(void) 
{   
  LCD_RST = 0;    /* 置复位信号为低电平 */ 
  //Delay_us(2);  
  LCD_RST = 1;    /* 置复位信号为高电平 */ 
  LCD_WriteCommand(0x3F,Left);	  /*显示开*/
  LCD_WriteCommand(0x3F,Right);
  LCD_WriteCommand(0xC0,Left);    /*起始行*/
  LCD_WriteCommand(0xC0,Right);			    
  LCD_WriteCommand(0xB8,Left); 	  /*起始页*/
  LCD_WriteCommand(0xB8,Right);  
  LCD_WriteCommand(0x40,Left);	  /*起始列*/
  LCD_WriteCommand(0x40,Right); 
} 


/*---------------------------------------------------------------------------
下面这个函数用于数字数组例坐标选择,对应相应数值的点阵
---------------------------------------------------------------------------*/
swi()
{
  switch (swd)
  {
  case 0: k=0; break;
  case 1: k=1; break;
  case 2: k=2; break;
  case 3: k=3; break;
  case 4: k=4; break;
  case 5: k=5; break;
  case 6: k=6; break;
  case 7: k=7; break;
  case 8: k=8; break;
  case 9: k=9; break;
  case 10: k=10; break;
  case 11: k=11; break;
  case 12: k=12; break;
  case 13: k=13; break;
  case 14: k=14; break;
  case 15: k=15; break;
  case 16: k=16; break;
  case 17: k=17; break;
  case 18: k=18; break;

  }
}

/*---------------------------------------------------------------------------
下面这个函数用于左半屏数字位的显示示,只需给定页地址,起始例
---------------------------------------------------------------------------*/
digitaloutleft()
{
for(j=0;j<2;j++)
{
  LCD_WriteCommand((page+j),Left);
  LCD_WriteCommand(clmstart,Left);
for(i=0;i<7;i++)
{
   digitalin=digital[k][7*j+i];
  if(keysetin==1){digitalin=~digital[k][7*j+i];};
  
  LCD_WriteData(digitalin,Left); 
}}
keysetin=0;
}

/*---------------------------------------------------------------------------
下面这个函数用于右半屏数字位的显示,只需给定页地址,起始例
---------------------------------------------------------------------------*/
digitaloutright()
{

⌨️ 快捷键说明

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