prog.c

来自「单片机C语言,常用的多个功能, 子程序」· C语言 代码 · 共 263 行

C
263
字号
/*************************
*	名称:prog.c
*	功能:子程序
*  日期:2008-3-20
*
*****************************/


/**************************************************************************
public          bit     D_FLASHB
                        闪烁标志
                byte    D_LIG           D_FLASH         D_LED(12)
                        亮度            闪烁位          显存
                word    D_LEDA          D_WEI1          D_WEI2
                        段码            3-0             11-4
external        bit
                byte    M_FU
                        监控方式
                word
**************************************************************************/
#include <REG51.H>
#include <ABSACC.h> 
        unsigned char data M_FU,M_FU1;	

        unsigned char data D_LIG,D_FLASH;
        bit D_FLASHB;
        unsigned char data D_LED[12];

/*
 	SCH_DISP: 显示初始化

* 	D_DISP: LED 显示功能 
          段地址:(C000H)  位0-3 地址: (C800H) 位4-11地址:(D000H)
  	1, O_BCD:接收显示一位十进制数
	2, I_BCD:接收显示一位十进制数
  	3, O_HEX:接收显示一位十六进制数
	4, I_HEX:接收显示一位十六进制数
  	5, O_ADDR:接收显示地址
	6, I_ADDR:接收显示地址
  	7, IO_MEM:接收显示连续HEX码


************************************************/

void SCH_DISP(void)
{        
		 extern unsigned char data D_LED[12];
		 D_FLASH=0;            
         D_FLASHB=0;				   /*不闪烁*/
         for(D_LIG=0;D_LIG<12;D_LIG++)
         {   D_LED[D_LIG]=16;
         }
         D_LIG=1;              /*   亮度 */
}


 //               77H,14H,0B3H,0B6H,0D4H,0E6H,0E7H,74H,0F7H,0F6H,0F5H,0C7H,63H,
 //               /*0   1   2    3   4     5   6    7    8    9   A    B    C*/
 //               97H,0E3H,0E1H,00H,08H,0F1H,0CBH,57H,17H,80H,81H,87H,0C3H,0E7H,
 //               /*D  E    F    []  .   P   |_.   U   J   -   r   o  k    G	
 //                13  14   15   16  17  18  19    20  21  22  23  24 25   26*/
//		0D5H,0A0H,082H);
//		/*H    =   =			
//		27    28   29*/

        /*************************************************
        *        5                                       *
        *        --                                      *
        *    6 |    | 4                                  *
        *        --                                      *
        *    0 | 7  | 2                                  *
        *        __     .                                *
        *        1      3                                *
        *************************************************/
/*********************************
*  名称:LED显示程序					*
*	功能:LED[12]显存->显示			*
*  日期:2008-3-25					*
*********************************/

void D_DISP(void)
{
	extern unsigned char data D_LED[12];
	unsigned char code D_TAB[31]={0x77,0x14,0xB3,0xB6,0xD4,0xE6,0xE7,0x74,0xF7,0xF6,0xF5,0xC7,0x63,0x97,0xE3,0xE1,0x00,0x08,0xF1,0xCB,0x57,0x17,0x80,0x81,0x87,0xC3,0xE7,0xD5,0xA0,0x82,0x75};
                	       	      //0    1    2    3   4   5   6    7    8    9   A   B   C     D    E    F    []     .   P   |_.   U   J   -     r   	o    t    G    H    `=	 =     M
   	                                		      //	              				10   11    12	13   14    15   16    17  18   19    20  21  22    23  	24   25   26   27    28  29   30   
	unsigned char data D_WEI,D_Y,D_FLA,D_NUM,j;
	bit D_FLASHT;

	D_FLA++;/* 闪烁时间 */
	if(D_FLA>50)
	{
 		D_FLA=0;
        D_FLASHT=!(D_FLASHT);
	}
//	XBYTE[0xC800]=0;
	D_WEI=1;		/* 0000 0001*/
	XBYTE[0xD000]=0;
	for(D_NUM=0;D_NUM<12;D_NUM++)
	{

		if(D_NUM<4)
		{	
		 	if(D_FLASHB==1 && D_FLASHT==1 && D_NUM==D_FLASH)/* 暗 */
			{
               goto D_NEXT;			
			}
			
			XBYTE[0xC800]=D_WEI;		//4 位码
			D_Y=D_TAB[D_LED[D_NUM]];
			if(M_FU==1 && D_NUM==2)
				D_Y=D_Y | 0x08;
			if(M_FU==5 && D_FLASHB==0 && D_NUM==2)
				D_Y=D_Y | 0x08;
		}
		if(D_NUM==4)	//关4位码
		{
			XBYTE[0xC800]=0;
			D_WEI=1;
			
		}
		if(D_NUM>=4)
		{	
		
		 	if(D_FLASHB==1 && D_FLASHT==1 && D_NUM==D_FLASH)/* 暗 */
			{
               goto D_NEXT;			
			}
		
		
			XBYTE[0xD000]=D_WEI;
			D_Y=D_TAB[D_LED[D_NUM]];
			if(M_FU==1)
			{	if(D_NUM==4 || D_NUM==6)
				D_Y=D_Y | 0x08;
			}
			if(M_FU==5)
			{	
 				if(D_FLASHB==1)
				{	if(D_NUM==9 || D_NUM==10)
						D_Y=D_Y | 0x08;
				}
				else
				{	if(D_NUM==10 || D_NUM==8 || D_NUM==4)
						D_Y=D_Y | 0x08;
				}
			}
		
		 }	
			XBYTE[0xC000]=D_Y;
	  
D_NEXT:   	for(j=0;j<D_LIG;j++)  //亮延时
				{;} 
			XBYTE[0xC000]=0;//暗延? 
				for(j=0;j<(30-D_LIG);j++)
				{;} 
			D_WEI=D_WEI<<1;
		
	}
}
/***********************************
*  1 2   显示 接收 一位十进制数
*       D_BCD(LED,BCD,B)
*        (显示位,十进制数,I/O)
*       HIGH(BCD) -> D_LED(LED)    *
*       LOW(BCD) -> D_LED(LED-1)   *
***********************************/
void O_BCD(unsigned char LED,unsigned char BCD)
       {
           D_LED[LED]=BCD/10;
           D_LED[LED-1]=BCD%10;
      }


unsigned char I_BCD(unsigned char LED)
        {
          return(D_LED[LED]*10+D_LED[LED-1]);
       }
        
/***********************************
*  3 4    显示 接收 一位十六进制数
*       IO_HEX(LED,D_HEX,B)
*        (显示位,十六进制数,I/O)
*       HIGH(BCD) -> D_LED(LED)    *
*       LOW(BCD) -> D_LED(LED-1)   *
***********************************/
void O_HEX(unsigned char LED,unsigned char D_HEX)
      { 
               D_LED[LED]=D_HEX>>4;
               D_LED[LED-1]=D_HEX&0x0F;
       }
unsigned char I_HEX(unsigned char LED)
       { 
            return(D_LED[LED]<<4 | D_LED[LED-1]);
        }

/*******************************************
*  5 6  显示接收 地址ADDR      
*          ( )       *
*                                          *
*******************************************/
	void 	O_ADDR(unsigned char LED,unsigned int ADDR)
      {  
               D_LED[LED]=ADDR>>12;
               D_LED[LED-1]=ADDR>>8&0x0F;
               D_LED[LED-2]=ADDR>>4&0x0F;
               D_LED[LED-3]=ADDR&0x0F;
       }
	void	SCH_IADDR(void)
	{
		D_FLASH=8;
		D_FLASHB=1;
		for(D_FLASH=0;D_FLASH<=8;D_FLASH++)
		{
			D_LED[D_FLASH]=0;
		}	
		D_LED[4]=22;
		
	}

	unsigned int I_ADDR(unsigned char LED)
      {  unsigned int ADDR,ADDR0;
			ADDR0=D_LED[LED];
         ADDR=ADDR0<<12;
			ADDR0=D_LED[LED-1];
		ADDR=ADDR0<<8|ADDR;
			ADDR0=D_LED[LED-2];
		ADDR=ADDR0<<4|ADDR;
		return(ADDR|D_LED[LED-3]);
          
      }
/*******************************************
*   7  显示接收连续HEX码<—>外存(ADDR)       *
*          ( 显示位,地址,位数,I/O)       *
*                                          *
*******************************************/
void	IO_MEM(unsigned char LED,signed int ADDR,unsigned char NO,bit B)
{       unsigned char Y;
         for(Y=1;Y<=NO;Y++)
         {  if(!B)
           		{			
                D_LED[LED]=XBYTE[ADDR]>>4;
                D_LED[LED-1]=XBYTE[ADDR]&0x0F;
           		}
           else
                XBYTE[ADDR]=D_LED[LED]<<4|D_LED[LED-1];
           ADDR++;
           LED=LED-2;
        }
}

 /*******************************************
*   7  显示接收连续HEX码<—>外存(ADDR)       *
*          ( 显示位,地址,位数,I/O)       *
*                                          *
*******************************************/

void reset (void)
{
((void (code *) (void)) 0x0000) ();
}

⌨️ 快捷键说明

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