📄 led.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 + -