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

📄 led.c

📁 这是本人调用small rtos51的函数来仿真写的基本代码
💻 C
字号:
#include "config.h"

uint8 code led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uint8 code position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

uint8 time[3]={45,58,23};					// 时、分、秒计数
uint8 dis_buff[6];				// 显示缓冲区,存放要显示的6个字符的段码值
uint8 point_on;				    //秒闪烁标志位
uint8 key_time;
sbit  Key_Input	=  P2^7;

extern void Show(void);
extern void Time_Sum(void);
extern void Key_Do(void);

void init(void)						    //单片机初始化
{
P1=P3=0xff;
P2=0xff;
TCON=0;
TMOD=0x01;
TH0=(65536-4000)/256;
TL0=(65536-4000)%256;
ET0=1;
TR0=1;
}


void time_to_disbuffer(void)			// 时间值送显示缓冲区函数
{
	uint8 i,j=0;
	for (i=0;i<=2;i++)
	{
		dis_buff[j++] = time[i] % 10;
		dis_buff[j++] = time[i] / 10;
	}
}


void display(void)				// 扫描显示函数,执行时间24ms
{
	uint8 i;
 	for(i=0;i<=5;i++)
	{
		P3 = led_7[dis_buff[i]]; 
		if (point_on && ( i==2 || i==4 ))P3|= 0x80;
		P1 = position[i]; 
		OSWait(K_TMO,1);								
       	P1 = 0xff;
		
								
  	}
	
}


		
void Show(void)
{	
	
	time_to_disbuffer();
	while(1)
	{
	display();	//用于了24ms
	}
}



void Time_Sum(void)
{
 while(1)
 {  

	OSWait(K_TMO,250);//250*8ms=2s 有点不明白 却显示数码管为正常的1s
	point_on=~point_on;
	//time[0]++;
	if(++time[0]>=60)
	{
		time[0]=0;
		
		//time[1]++;
		
		if(++time[1]>=60)
		{
			time[1]=0;
			//time[2]++;
			if(++time[2]>=24)
			time[2]=0;
		}
	}
	time_to_disbuffer();
 }

}


//读键函数Read_key() 处理单个按键的



#define Key_No 		0
#define Key_Down 	1
#define Key_Up_1	2
#define Key_Up_2	3

bit key_return_1;
bit key_return_2;


uint8 Read_key(void)
{
static 	uint8 Key_State=0;
uint8   Key_Press,Key_Return=0;
Key_Press=Key_Input;

 switch(Key_State)
 {
  
  case Key_No :
  if(!Key_Press)Key_State=Key_Down;          //假若P2.7真的有按下
  break;
  
  case Key_Down :                             //转换到确认状态
  if(!Key_Press)
  {
  Key_Return=1;                                 //按键仍按下,按键确认输出为1
  Key_State=Key_Up_1;                        //状态转换到键释放状态
    
  }
  else Key_State=Key_No;                    //按键在抖动,转换到按键出示状态
  break; 
  
  
  case Key_Up_1 :
  if(Key_Press)
	{
	 Key_State=Key_No;            //按键已释放,转换到按键转换到初始状态
	 Key_Return=1;
	 key_return_1=1;
	}
  else if(++key_time>250)		  //按下时间大于1s
	{
	key_time=0;
	Key_State=Key_Up_2;
	Key_Return=2;

	}
  break;
  
  case Key_Up_2:
  if(Key_Press)Key_State=Key_No;//按键已释放,转换到按键转换到初始状态
  else 
  {
	if(++key_time>=125)		    //按键还没有释放..每500ms自加10
	{
	  key_time=0;
	  Key_Return=2;
	  key_return_2=1;
	 }

  }
  break;

}
 
   return Key_Return;                             //返回按键状态的值
}



#define Key_Do_SEM 0         //伪定义
bit key_return_1;
bit key_return_2;


//按键扫描
void Key_Scan(void)
{
	while(1)
	{
		OSWait(K_TMO,3);
		if(Read_key()==1 || Read_key()==2 )
		{

		//	else	
		//time[1]++;
		//if(time[1]>59)
		//time[1]=0;
		//Key_Found=1;
		OSSemPost(Key_Do_SEM);
		}
		
	}
}

//处理按键要做的任务



void Key_Do(void)
{	
	OSSemCreate(Key_Do_SEM,0);//创建信号量Key_Do_SEM,信号量初始值为1

	while(1)
	{	
		//if(Key_Found)
		//{
		//OSSemPost(Key_Do_SEM);
		//Key_Found=0;
		//}
		OSSemPend(Key_Do_SEM, 0); //等待按键的信号,信号量的值减1

		//OSWait(K_TMO,3);
		//if(Read_key())
		//{
		//OSWait(K_TMO,100);
		if(key_return_1)
		{	
		time[1]++;
		key_return_1=0;
		}
		else
		if(key_return_2)
		{	
		time[1]+=10;
		key_return_2=0;
		}
		if(time[1]>59)
		time[1]=0;
		
		//}


	}
}


void main(void)
{
   	OSInit();
    init();
    OSTaskCreate(Show, NULL, 0); //显示的优先级最高
	OSTaskCreate(Time_Sum,NULL,1);
	OSTaskCreate(Key_Scan,NULL, 2);
	OSTaskCreate(Key_Do,NULL, 3);

	    while(1)
    {
        PCON = PCON | 0x01;                     /* CPU进入休眠状态 */
    }

}




⌨️ 快捷键说明

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