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

📄 main.c

📁 89C52的键盘扫描LED显示及串口程序。 用Keil C51开发。用通用实验板调试通过。
💻 C
字号:
#include"at89x52.h"
#include<intrins.h>
#include"def.h"




//************************************************
extern bit scan(void);
extern void tserial(void);
extern void tsled(void);
extern void S_RL(void);
extern void S_RR(void);
extern void clear(void);
extern void xch(void);

void delay (unsigned int value)		/*延时副程式*/
 {
      while (value!=0) value--;		/*10US延时*/
 }
//***************************************************************************
void main()
{	

	T2CON=0x38;			/*定时器2工作控制寄存器T2CON_________________*/
       					/*| TF2|EXF2|RCLK|TCLK|EXEN2|TR2|C/T2|CP/RL2|*/
       					/*|___________________|_____________________|*/
	TL2=0xfd;			/* 			 X=2^16-fosc/(2*16*波特率) 		 */
	TH2=0xff;			/*   			TL2=X&0x00ff				 */
	RCAP2L=0xdc;		/*   			TL2=X&0xff00				 */
	RCAP2H=0xff;		/*设定传输波特率9600,晶体振荡器=11.059Mhz   */
						//TH2=256-(28800/9600);					
    TR2=1;				/*启动TEMER2*/
	SCON=0x50;			/*设定UART工作在MODE2模式,可传送和接收数据 REN=1*/
						/*串列控制寄存器SCON_______________________*/
       					/*|  7    6    5    4 |  3    2    1    0 |*/
       					/*| SM0| SM1| SM2| REN| TB8| RB8| TI | RI |*/
       					/*|___________________|___________________|*/
    IE=0x98;			/*8是允许中断,a是TIMER0,TIMER1中断致能位*/
						/*|  7    6    5    4 |  3    2    1    0 |*/
       					/*| EA |    | ET2| ES | ET1| EX1| ET0| EX0|*/
       					/*|___________________|___________________|*/
    IP=0x10;			/*中断优先级寄存器IP_______________________*/
       					/*|    |    | PT2| PS | PT1| PX1| PT0| PX0|*/
       					/*|___________________|___________________|*/
	dispbuf[0]=dot;		/*小数点位*/
	dispbuf[7]=0x01;	/*ID号码*/
	dispbuf[8]=0x01;	/*蜂鸣器设定开/二次分频*/
	P0=0xff;
	clear();
	tsled();
	while(1)
	{
		k=scan();    	 				/*键盘扫描副程式*/
		if(k==1) 
		{
			switch(tab[ptr])			/*是则测试ptr键盘扫描计数器指标至TAB[]取到的键盘码*/
        	{	
			

			  case 0x0c:
				      while(m==P1);		/*按钮放开否?*/
				   	  S_RL(); 			//光标左移
					  break;
    	      case 0x0d:				/*光标右移*/
				  while(m==P1);			/*按钮放开否?*/
			  		  S_RR(); 			//光标右移
      		    	  break;			/*跳出此循环*/
       	      case 0x0a: 
       		   		  clear();			/*LED清除显示器CLEAR*/
 		      	while(m==P1);			/*按钮放开否?*/
       	              break;			/*跳出此循环*/
          	  case 0x0b: 
 		      	while(m==P1);			/*按钮放开否?*/
          	 	      if(++dot>6)dot=0;	//小数点左移
                      break;			/*跳出此循环*/
        	  case 0x0e:				/*E被按下发送显示器上的数字*/	
	            	  while(m==P1);		/*按钮放开否?*/
		      	      tserial();	
                      break;		    /*跳出此循环*/                    
         	  case 0x0f: 
                      while(m==P1);	 	/*按钮放开否?*/
                      break;			/*跳出此循环*/
             default:   
		  		     if(disp_temp[0]==0)
          		   	     xch();			/*以上均不是则为数字键呼叫XCH作右键滚入*/
			     	else 
					    {
							dispbuf[disp_temp[0]]=tab[ptr];
							disp_temp[0]=0;
						}
                     break;				/*跳出此循环*/
             }							/*跳出SWITCH*/
         	delay(100);					/*按钮抗机械反弹跳*/
	  		while(m==P1);				/*按钮放开否?*/
			dispbuf[0]=dot;				//显示小数点。
         	tsled();					/*串行发送到DTLED-6副程式*/
   		 }				
    }
}





/******************************************************************
/*宣告串口serial发送副程式*/
/**************************************************************/
void tserial(void)			
{ uchar i=7;
IE=0x8f;
  {while(i>1)
	{
	i--;
	SBUF=dispbuf[i];		/*将LED上人数字以BCD码的形式由SBUF发送出去*/
	while(TI!=1);			/*发送完成否?*/
	TI=0;					/*是,则清除发送完成旗标TI=0*/
 	delay(10);
	}
  }  
 IE=0x9f;
}
//**************************************************************
/*串行口接收中断副程式*/
/******************************************************************/
void uartcom1_in1 () interrupt 4 using 1   	
 {	uchar v,i=0;
     while(RI!=1);			 				/*接收完成否*/	
      {	
 	RI=0;
	v=SBUF;									/*接收的数据存入*/	
	dispbuf[6]=dispbuf[5];
	dispbuf[5]=dispbuf[4];
	dispbuf[4]=dispbuf[3];
	dispbuf[3]=dispbuf[2];
	dispbuf[2]=dispbuf[1];
	dispbuf[1]=SBUF;
      }	
 }					/*返回主程式*/
/********************************************************/

⌨️ 快捷键说明

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