📄 显示时间.c
字号:
/********************************************************************************
当前时间送电脑同时显示
********************************************************************************/
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
sbit P2_6=P2^6; //八字高位选通位
sbit P2_7=P2^7; //八字底位选通位
sbit P3_6=P3^6; //按扭触动定义
unsigned char Num; //显示时间定义
unsigned char times; //按键次数定义
/********************************************************************************
延长时间程序
********************************************************************************/
void delay_1us (unsigned int time)
{
unsigned int i;
for (i=0;i<time;i++)
{
_nop_(); //调用延长1us时间程序
}
}
/********************************************************************************
数码管显示
********************************************************************************/
unsigned char code dispcode[]=
{
0xcf,0x03,0x5d,0x5b,0x93,0xda,0xde,0x43,0xdf,0xdb
};
void disp_num (unsigned char Disp_Num)
{
unsigned char i,j,high,low;
for(j=0;j<70;j++)
{
low=Disp_Num%10; //取低位
P0=dispcode[low]; //取显示码
P2_7=0; //选通亮
delay_1us(100); //延长时间100us
P2_7=1; //选通灭
high=Disp_Num/10; //通上,这次换高位亮
P0=dispcode[high];
P2_6=0;
delay_1us (100);
P2_6=1;
}
}
/********************************************************************************
按键识别
********************************************************************************/
void key_scan (void)
{
while(1)
{
while (P3_6){disp_num (Num);} //等待按键按下,同时不断显示
delay_1us (500); //延时500us,去抖
if (P3_6==1) {continue;} //如果没有就跳到while从新扫描按键
while(1)
{
delay_1us (200);
if (P3_6==0) {disp_num (Num);continue;} ////如果没有就跳到while从新扫描按键
return; //确定按键后跳到主程序执行按键后程序
}
}
}
/*******************************************************************************
电脑串口通信
*******************************************************************************/
void s_communication (unsigned char number)
{
SCON=0x40; //串口初始化
PCON=0x80; //串口初始化
TH1=0xf3; //串口初始化
TL1=0xf3; //串口初始化
TR1=1; //启动记数
SBUF=number; //送数到电脑
while(!TI); //查询送完了没有
TI=0; //送完了把TI置"0"准备下一次送数
}
/********************************************************************************
中断服务程序
********************************************************************************/
void inter_rupt (void) interrupt 1 using 1
{
unsigned char i;
if (i<20)
{
TH0=(-50000)/256; //定时时间为50MS
TL0=(-50000)%256;
i++; //单位50ms加1,因为50ms*20=1000ms=1秒
return; //返回主程序
}
else if (Num<60) //1分钟为60秒
{
TH0=(-50000)/256; //定时时间为50MS
TL0=(-50000)%256;
i=0; //50ms记数单位重新给植为0
Num=++Num; //显示数加1
return;
}
else {Num=0;} //显示数记到60重新给0
}
/********************************************************************************
主程序
********************************************************************************/
void main (void)
{
while (1)
{
times=00;
Num=00;
key_scan ();
TMOD=0x21; //T0定时模式1
TH0=(-50000)/256; //定时时间为50MS
TL0=(-50000)%256;
ET0=1; //允许T0中断
EA=1; //允许中断
TR0=1; //启动记数
while(1)
{
key_scan (); //扫描按键
times=++times; //按键次数加1
s_communication(times);//送按键次数到电脑
s_communication(Num); //送当前时间到电脑
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -