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

📄 main.c

📁 keil c51开发的8279和51单片机通用键盘控制和Led显示及uart通信程序。
💻 C
字号:
#include <at89x51.h>
#include <absacc.h>
#include "define.h"
#include "Uart.h"

uchar KeyBoard_Int_ID;		//键盘中断标志
uchar KeyData;				//键值
uchar len;

unsigned char state;		 // .7=0 无暗盒 .7=1有暗盒状态  ,
unsigned char bdata ab[4];	 //	.0=1压迫器运动状态 .1=1床体运动状态 .2=1束光器运动状态 .3=1分隔选定状态 
unsigned char bdata Led[3];	 //	
sbit Pmd       =ab[0]^0;	 //压迫器进
sbit Pmu       =ab[0]^1;	 //压迫器退
sbit Sh_on     =ab[0]^2;	 //束光器横向开
sbit Sh_off    =ab[0]^3;	 //束光器横向关
sbit Sv_on     =ab[0]^4;	 //束光器纵向开
sbit Sv_off    =ab[0]^5;	 //束光器纵向关
sbit Trh       =ab[0]^6;	 //床头向旋转
sbit Trf       =ab[0]^7;	 //床足向选装

sbit Imh       =ab[1]^0;		//球管头向移动
sbit Imf       =ab[1]^1;		//球管足向移动
sbit Tml       =ab[1]^2;		//床左移
sbit Tmr       =ab[1]^3;		//床右移
sbit R_driver  =ab[1]^4;        //	曝光
sbit En_bed    =ab[1]^5;   	    //床旋转使能
sbit N_D_mode  =ab[1]^6;	    //常规、数字模式
sbit DSA       =ab[1]^7; 		//dsa模式

sbit Zoom3     =ab[2]^0;		//II zoom3
sbit Zoom2     =ab[2]^1;		//II zoom2
sbit Zoom1     =ab[2]^2;		//II zoom1
sbit Zoom0     =ab[2]^3;  	    //no zoom
sbit Pol_h     =ab[2]^4; 		//图像水平镜像
sbit Pol_v     =ab[2]^5; 		//图像垂直镜像
sbit Sgq_H_A   =ab[2]^6;	    //束光器手动半自动模式
sbit Out_p     =ab[2]^7;		//出片
 
sbit All_p     =ab[3]^0;	 		//全片
sbit H_2       =ab[3]^1; 		//横向2分隔
sbit V_2       =ab[3]^2;		//纵向2分隔
sbit Cp_3      =ab[3]^3; 		//3分隔
sbit Cp_4      =ab[3]^4; 		//4分隔
sbit Cp_S      =ab[3]^5; 		//分隔选定
//sbit F_g       =ab[3]^6;	 	//脚闸
//sbit H_g       =ab[3]^7; 		//手闸
//=============

sbit Zoom3_led     =Led[0]^0;	    //II zoom3
sbit Zoom2_led     =Led[0]^1;	    //II zoom2
sbit Zoom1_led     =Led[0]^2;	    //II zoom1
sbit Zoom0_led     =Led[0]^3;  	    //no zoom
sbit Ph_led        =Led[0]^4; 		//图像水平镜像
sbit Pv_led        =Led[0]^5; 		//图像垂直镜像
sbit SHA_led       =Led[0]^6;	    //束光器手动半自动模式
sbit ND_led        =Led[0]^7;	    //常规、数字模式

sbit H2_led1       =Led[1]^0; 		//横向2分隔led0
sbit H2_led2       =Led[1]^1; 		//横向2分隔led1

sbit V2_led1       =Led[1]^2;		//纵向2分隔led0
sbit V2_led2       =Led[1]^3;		//纵向2分隔led1

sbit Cp3_led1      =Led[1]^4; 		//3分隔led0
sbit Cp3_led2      =Led[1]^5; 		//3分隔led1
sbit Cp3_led3      =Led[1]^6; 		//3分隔led2
sbit Cp_S_led      =Led[1]^7; 		//分隔选定

sbit Cp4_led1      =Led[2]^0; 		//4分隔 led1
sbit Cp4_led2      =Led[2]^1; 		//4分隔 led1
sbit Cp4_led3      =Led[2]^2; 		//4分隔 led1
sbit Cp4_led4      =Led[2]^3; 		//4分隔 led1
sbit All_p_led     =Led[2]^4;	 	//全片
sbit DSA_led       =Led[2]^7; 		//dsa模式



/*
sbit F_g_led       =Led[3]^6;	 	//脚闸
sbit H_g_led       =Led[3]^7; 		//手闸
sbit Pmd_led       =Led[0]^0;	 //压迫器进
sbit Pmu_led       =Led[0]^1;	 //压迫器退
sbit Sgq_h_on_led  =Led[0]^2;	 //束光器横向开
sbit Sgq_h_off_led =Led[0]^3;	 //束光器横向关
sbit Sgq_v_on_led  =Led[0]^4;	 //束光器纵向开
sbit Sgq_v_off_led =Led[0]^5;	 //束光器纵向关
sbit Trh_led       =Led[0]^6;	 //床头向旋转
sbit Trf_led       =Led[0]^7;  	 //床足向选装
sbit Imh_led       =Led[1]^0;		//球管头向移动
sbit Imf_led       =Led[1]^1;		//球管足向移动
sbit Tml_led       =Led[1]^2;		//床左移
sbit Tmr_led       =Led[1]^3;		//床右移
sbit R_driver_led  =Led[1]^4;       //曝光
sbit En_bed_led    =Led[1]^5;   	//床旋转使能

 */



 



uchar Timer_Int_ID;			//定时器定时中断标志
uchar KeyBoard_Int_ID;		//键盘中断标志
//uchar Uart_Int_ID;  		//串口接收中断标志

uchar KeyData;				//键值

uchar AD_Data[2];			//A/D暂存数据

uchar Timer_Int_ID;         //定时器中断标志位
uchar Check;

uchar Table[7]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00};				//定义与键盘和AD有关的数据表
idata unsigned char Tbak[7]={0xff,0xff,0xff,0xff,0xff,0xff,0x00};

uchar Rx_data[5];		//定义从中控板接收到的数据
//uchar Tx_data[10];

extern void Uart_Init(void);
extern void ComOutChar(uchar OutData);
extern unsigned char ComGetChar(); 
extern void Timer0_Init(void);
extern unsigned char GetTLC0832Data(uchar ucCmd);


void Delay(void)
	{
		unsigned char i;
		unsigned char j;
		for(i = 0;i <= 200;i++)
			for(j = 0;j <= 80;j++)
				{
					;
				}
	}

void Led_Display()
	{
	 if((Rx_data[2])==0xff)
	   {
	    state = state&0x7f; //无暗盒
	   	All_p=0;
	    H2_led1=0;
		H2_led2=0;
	    V2_led1=0;
	    V2_led2=0;
	   	Cp3_led1=0;
	   	Cp3_led2=0;
	   	Cp3_led3=0;
	    Cp4_led1=0;
	    Cp4_led2=0;
		Cp4_led3=0;
		Cp4_led4=0;

	   } 
	 else
	   {
	    if((Rx_data[2]&0x01)==0) All_p=1;
		 	else   All_p=0;
	   	if((Rx_data[2]&0x02)==0) H2_led1=1;
		 	else   H2_led1=0;
        if((Rx_data[2]&0x04)==0) H2_led2=1;
		 	else   H2_led2=0;
		if((Rx_data[2]&0x08)==0) V2_led1=1;
		 	else   V2_led1=0;
		if((Rx_data[2]&0x10)==0) V2_led2=1;
		 	else   V2_led2=0;
		if((Rx_data[2]&0x20)==0) Cp3_led1=1;
		 	else   Cp3_led1=0;
		if((Rx_data[2]&0x40)==0) Cp3_led2=1;
		 	else   Cp3_led2=0;
		if((Rx_data[2]&0x80)==0) Cp3_led3=1;
		 	else   Cp3_led3=0;
		
		if((Rx_data[3]&0x01)==0) Cp4_led1=1;
		 	else   Cp4_led1=0;
	    if((Rx_data[3]&0x02)==0) Cp4_led2=1;
		 	else   Cp4_led2=0;
		if((Rx_data[3]&0x04)==0) Cp4_led3=1;
		 	else   Cp4_led3=0;
	    if((Rx_data[3]&0x08)==0) Cp4_led4=1;
		 	else   Cp4_led4=0;
	   }
	}


void Interrupt_Init(void)
	{
		EA = 0;               // CPU所有中断关(IE最高位MSB)
		EX0 = 1;              // INT0中断开
		IT0 = 1;              // INT0低电平触发(为1则为下降沿触发)
		ES = 1;
		ET0 = 1;
		EA = 1;               // CPU总中断开(IE最高位MSB)
	}

//void Speaker_out(void)//峰鸣器响函数
//	{
//		P1_4 = 1;
//		Delay();
//		P1_4 = 0;
//	}

void Int0_Int()interrupt 0 using 0
	{	
		IE0 = 0;
		KeyBoard_Int_ID = 1;		//键盘中断标志
		
	}

void CPU_IO_Int(void) //通用IO口初始化
	{
		Speaker = 0;	//峰鸣器输出脚
		HandGate = 0;	//脚闸输入脚
		FootGate = 0;	//手闸输入脚
		FeedWD = 0;		//喂狗引脚
		LED1 = 0;		//指示UART是否正在发送数据
		LED2 = 0;		//单片机指示灯,由TIMER0定时控制
		LED3 = 0;		//暂无定义 
	}

 
void Timer0_Int(void) interrupt 1	using 1	//TIMER0中断函数
	{
	 uchar i;
	 EA =0;	
	 TF0 = 0;
	 TH0  = 0X04;		//初始化定时器0高8位
	 TL0  = 0X06;		//初始化定时器0低8位
     if(time_u>0) time_u--;
	 i++;
	 if(i ==3)
      {
	  i =0;
	   Timer_Int_ID = 1;
	   LED2 = !LED2;		//指示单片机的状态
	  }
	 	
 
	 TR0 = 1;
	 EA =1;
	}


void main ()
	{
		uchar i;
        uchar k;
		Timer0_Init();
		CPU_IO_Int();
		Uart_Init();
		Interrupt_Init();
        len=0; 
		Delay();
        COM = 0XD1;
		do
			{
				ACC=COM;
			}while(clflag ==1);	
		COM = 0X04;
		COM = 0X2C;
		state=0;

		while(1)
			{

//------------ad---转换-----------------------------------------
			  if(Timer_Int_ID == 1)
					{
					
						if((P3&0x20)==1) {	Table[5] = Table[5]&0xFD; }
                         else   {	Table[5] |=0x02; }               
         	            if((P3&0x40)==1) {	Table[5] = Table[5]&0xFE; }
                         else   {	Table[5] |=0x01; }   
					
					}

//---------------------------//	
	if(KeyBoard_Int_ID==1)
		 {
				uchar i;
				KeyBoard_Int_ID = 0;
				for(i=0;i<4;i++)//接收按键值
					{
						COM = 0X40 +i;
                		ab[i] = DAT;				
                	}
		        for(i=0;i<7;i++){ Tbak[i]=Table[i];} //bak 
			    
		 
		 if((state&0x80)==0x80)		// .7=1有暗盒状态 
		   {
		     if( All_p ==1)     //全片
		      {	;  }
	 	       else		{   ; 	  }	
 		     if( Out_p ==1)    	//出片
		        {	;	  }
	 	       else		{       ;  }	
		     if( H_2 ==1)   {	;	  }	  	    //横向2分隔
	 	       else		{  	  }	
		     if( V_2 ==1)  {	;	  }			//纵向2分隔
	 	       else		{    	  ;}	
		     if( Cp_3  ==1)  {	;	  }		   	//3分隔
	 	       else		{    	  }	
		     if( Cp_4 ==1)  {	;	  }		    //4分隔
	 	       else		{    	 ; }	
		     if( Cp_S ==1)  {	;	  }			//分隔选定
	 	       else		{    	 ; }	
		   }
  	     else					 //无暗盒
		  {
		     Table[4]|=0x80;
		  	 Table[5]|=0x3f;
		  }
      for(i=2;i<7;i++)  
       {
	    if(Table[i]!=Tbak[i])  Table[6]=1;
	   }

						 // Check=0;
						 // for(i = 0;i<4;i++)
						//		{
						//			ComOutChar(ab[i]);
						//		}
                        //  for(k = 0; k<6; k++)
					 	 // {
						 //   Check+=Table[k];
						//	ComOutChar(Table[k]);
						 // }//将数据发给中控板
					     // ComOutChar(' ');
	 
      }

//--------------------led 控制----------------------------------------
       		for(i =0;i<3;i++)//对应位置灯点亮
				{
    			COM = 0X80+i;
	     		DAT =Led[i];
	       		}	

//-----通信-------------------------------------------------------
			  if((len>0)&&(time_u==0))
			    {
				len=0;
			    TIflag=0;
                inTxBuf=TxBuf,outTxBuf=TxBuf;
                head_pt=START_PT;
                tail_pt=START_PT;
				}
			   if(tail_pt!=head_pt)
		       {
		        time_u=0x30;
				i=ComGetChar();   //接受串口0消息  
			   	switch(len)
				 {
				  case 0:
				     if(i==3) {len=1;}
			          break;
				  case 1:
				     if(i==2)
				     { 
					    len=0;
						if(Table[6]>0)
						{
						  Table[6]=0;
						  ComOutChar(0x03);
					      ComOutChar(0xe0);
						  Check=0;
						  for(k = 0; k<6; k++)
					 	  {
						    Check+=Table[k];
							ComOutChar(Table[k]);
						  }//将数据发给中控板
					      ComOutChar(Check);
						}
					    else
						{
						 ComOutChar(0x03);
					     ComOutChar(0xe1);
						}
					  }
			     	  else if(i==1) { len=2;Check=0;} 
				      break;
				  case 2: 
				 default:
				      Rx_data[len]=i;
					  Check+=i;
					  len++;
					  if(len>4)
					    {
					     len=0;
						 if(Check==0)
					      {
					      	Led_Display();
							if(Table[6]>0)
					     	 {
						      	Table[6]=0;
						      	ComOutChar(0x03);
					          	ComOutChar(0xe0);
						      	Check=0;
						      	for(k = 0; k<6; k++) { Check+=Table[k];ComOutChar(Table[k]);  }//将数据发给中控板
					          	ComOutChar(Check);
						    }
					        else
						     {
						      	ComOutChar(0x03);
					          	ComOutChar(0xe1);
						      }
					   	  }
			         	 else
						  {
						  	ComOutChar(0x03);
					      	ComOutChar(0xee);
						  }
					    }
					  break;
				 
				 }
		
				}	
			
		  }

    }

⌨️ 快捷键说明

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