通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程

本文介绍了一个使用Keil软件和Proteus仿真的单片机项目,通过点击移位键控制LCD1602液晶显示器显示的时分秒闪烁,并能修改数值。定时器0用于计时,按键扫描功能实现闪烁位移位和数值修改,确保计时精确。

通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程

一、前言

1、通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路

2、通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程构思

(1)、实现什么功能:LCD1602字符型液晶显示器先显示时分秒,在点击移位按键后,停止计时,LCD1602字符型液晶显示器光标闪烁,每次按下移位键,LCD1602字符型液晶显示器光标随每次按下移位键移位到时分秒个位十位处闪烁,当LCD1602字符型液晶显示器的时分秒个位十位有闪烁后,可修改LCD1602字符型液晶显示器的时分秒个位十位闪烁位上的数值,再通过移位按键或启停按键启动或停止计时。

(2)、如何实现功能:如何让LCD1602字符型液晶显示器先显示时分秒:采用定时器0工作方式1计时,计时得到的数值赋给LCD1602字符型液晶显示器显示时间两位数分解函数进行分解,分解得到的个位数值与十位数值用变量代替分别由LCD1602字符型液晶显示器写指令函数和LCD1602字符型液晶显示器写数据函数写入LCD1602字符型液晶显示器,通过LCD1602字符型液晶显示器显示出来。如何让LCD1602字符型液晶显示器的时分秒个位十位闪烁:采用按键扫描函数扫描,每次按下移位键(此时定时器0停止计时),执行LCD1602字符型液晶显示器光标闪烁指令和LCD1602字符型液晶显示器光标随每次按下移位键移位到时分秒个位十位处闪烁的位置指令。如何修改LCD1602字符型液晶显示器的时分秒个位十位闪烁位数值并在原计时基础上实现计时:当移位键按下后,定时器0停止计时,计时得到的数值采用两位数分解公式(如:shi=num/10,ge=num%10。)进行分解,分解得到的个位数值与十位数值用变量代替写入按键扫描函数,此时也要采用两位数合成公式(如:miao=shi+ge=(num/10)*10+num%10)求出原先的计时数值,用变量代替原先的计时数值写入按键扫描函数(原因:时分秒的个位或十位显示位的数值是在原计时数值上分解得来,当时分秒的个位或十位显示位的数值发生变化后,原计时数值也要变化,否则启动定时器0计时后,LCD1602字符型液晶显示器显示的是原计时时间,而不是修改时分秒的个位或十位显示位的数值后的计时,因此要采用两位数合成公式(miao=shi+ge=(num/10)*10+num%10)求出原先的计时数值,用变量代替原先的计时数值写入按键扫描函数。)。

二、通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程的Keil软件编写的单片机C语言程序

#include<reg52.h>//单片机头文件
#define uchar unsigned char//宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
#define uint unsigned int//宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。
sbit Duan=P2^0;//位定义数码管段选                 
sbit Wei=P1^7;//位定义数码管位选                  
sbit S1=P1^0;//移位按键S1 
sbit S2=P1^2;//增加按键S2 
sbit S3=P1^4;//减少按键S3 
sbit S4=P1^6;//启停按键S4
uchar count,num,S1num,S4num,flag,suojianflag;//count为定时器0中断次数变量,num为定时器1中断次数变量,S1num为移位按键S1按键按下次数变量,S4num为启停按键S4按下次数变量,flag为数码管显示函数是否显示标志位变量。
uchar second,minutan,hour;//计时时钟变量、分钟变量、秒钟变量
uchar secondge,secondshi;//秒钟的个位变量、十位变量。
uchar minutange,minutanshi;//分钟的个位变量、十位变量。
uchar hourge,hourshi;//时钟的个位变量、十位变量。
uchar ge,shi,bai,qian,wan,shiwan;//数码管的个位变量、十位变量、百位变量、千位变量
uchar address,time;//数码管的显示位地址变量、时间变量。
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管显示数字的数组,单片机输送低电平给共阳数码管段位,输送高电平给共阳数码管位选,可点亮数码管。
  void Delay(uint z)//延时程序
{
   uint x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
 }
  void TimerInit()//定时器0初始化函数
{
   TMOD=0x11;//设定定时器0和定时器1工作模式都为模式,切记不能分开设定定时器0和定时器1,否则发生冲突,也就是不管用哪两个定时器,不能分开设定初始化函数。
   TH0=(65536-50000)/256;//TH0装初值
   TL0=(65536-50000)%256;//TL0装初值
   EA=1;//开启定时器总中断
   ET0=1;//开启定时器0中断开关
   TR0=1;//启动定时器0
   ET1=1;//开启定时器1中断开关
   TR1=0;//关闭定时器1
 }
  void ShuMaGuanDisplayTime()//数码管显示时间函数,也是显示时间两位数分解函数。
{
   ge=second%10;//秒钟分解一个秒钟个位变量
   shi=second/10;//秒钟分解一个秒钟十位变量
   bai=minutan%10;//分钟分解一个分钟个位变量
   qian=minutan/10;//分钟分解一个分钟十位变量
   wan=hour%10;//时钟分解一个时钟个位变量
   shiwan=hour/10;//时钟分解一个时钟十位变量
   Duan=1;//开数码管段选
   P0=table[ge];//数码管个位(即秒钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x20;//数码管个位(即秒钟个位)选通
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[shi];//数码管十位(即秒钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x10;//数码管十位(即秒钟十位)选通
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[bai];//数码管百位(即分钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;///关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x08;//数码管百位(即分钟个位)选通
   Wei=0;//关数码管位选
   Delay(1);//延时
   
   Duan=1;//开数码管段选
   P0=table[qian];//数码管千位(即分钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;///关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x04;//数码管千位(即分钟十位)选通
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[wan];//数码管万位(即时钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;///关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x02;//数码管万位(即时钟个位)选通
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[shiwan];//数码管十万位(即时钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;///关数码管所有段选,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x01;//数码管十万位(即时钟十位)选通
   Wei=0;//关数码管位选
   Delay(1);//延时
   Duan=0;//关数码管段位
 }
  void ShuMaGuanGeWeiShanShuoDisplayTime(uchar address,uchar second)//数码管个位(即秒钟个位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second%10];//数码管个位(即秒钟个位)闪烁位
   Duan=0;//关数码管段选
   P0=0xff;///关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时

   Duan=1;//开数码管段选
   P0=table[10];//关掉数码管个位(即秒钟个位)显示
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时
 }
  void ShuMaGuanShiWeiShanShuoDisplayTime(uchar address,uchar second)//数码管十位(即秒钟十位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second/10];//数码管十位(即秒钟十位)闪烁位
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时

   Duan=1;//开数码管段选
   P0=table[10];//关掉数码管十位(即秒钟十位)显示
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时
 }
  void ShuMaGuanBaiWeiShanShuoDisplayTime(uchar address,uchar minutan)//数码管百位(即分钟个位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[minutan%10];//数码管百位(即分钟个位)闪烁位
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时

   Duan=1;//开数码管段选
   P0=table[10];//关掉数码管百位(即分钟个位)显示
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时
 }
  void ShuMaGuanQianWeiShanShuoDisplayTime(uchar address,uchar minutan)//数码管千位(即分钟十位闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[minutan/10];//数码管千位(即分钟十位)闪烁位
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时

   Duan=1;//开数码管段选
   P0=table[10];//关掉数码管千位(即分钟十位)显示
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时
 }
  void ShuMaGuanWanWeiShanShuoDisplayTime(uchar address,uchar hour)//数码管万位(即时钟个位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[hour%10];//数码管万位(即时钟个位)闪烁位
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时

   Duan=1;//开数码管段选
   P0=table[10];//关掉数码管万位(即时钟个位)显示
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时
 }
  void ShuMaGuanShiWanWeiShanShuoDisplayTime(uchar address,uchar hour)//数码管十万位(即时钟十位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[hour/10];//数码管十万位(即时钟十位)闪烁位
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时

   Duan=1;//开数码管段选
   P0=table[10];//关掉数码管十万位(即时钟十位)显示
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=address;//数码管显示位地址
   Wei=0;//关数码管位选
   Delay(5);//延时
 }
  void ShuMaGuanNoGeWeiDisplayTime()//数码管没有个位(即秒钟个位)显示闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second/10];//数码管十位(即秒钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x10;//数码管十位(即秒钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan%10];//数码管百位(即分钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x08;//数码管百位(即分钟个位)显示位
   Wei=0;//关数码管位选;
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan/10];//数码管千位(即分钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x04;//数码管千位(即分钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour%10];//数码管万位(即时钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x02;//数码管万位(即时钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour/10];//数码管十万位(即时钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x01;//数码管十万位(即时钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时
 }
  void ShuMaGuanNoShiWeiDisplayTime()//数码管没有十位(即秒钟十位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second%10];//数码管个位(即秒钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x20;//数码管个位(即秒钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan%10];//数码管百位(即分钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x08;//数码管百位(即分钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan/10];//数码管千位(即分钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x04;//数码管千位(即分钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour%10];//数码管万位(即时钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x02;//数码管万位(即时钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour/10];//数码管十万位(即时钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x01;//数码管十万位(即时钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时
 }
  void ShuMaGuanNoBaiWeiDisplayTime()//数码管没有百位(即分钟个位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second%10];//数码管个位(即秒钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x20;//数码管个位(即秒钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[second/10];//数码管十位(即秒钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x10;//数码管十位(即秒钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan/10];//数码管千位(即分钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x04;//数码管千位(即分钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour%10];//数码管万位(即时钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x02;//数码管万位(即时钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour/10];//数码管十万位(即时钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x01;//数码管十万位(即时钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时
 }
  void ShuMaGuanNoQianWeiDisplayTime()//数码管没有千位(即分钟十位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second%10];//数码管个位(即秒钟位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x20;//数码管个位(即秒钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[second/10];//数码管十位(即秒钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x10;//数码管十位(即秒钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan%10];//数码管百位(即分钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x08;//数码管百位(即分钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour%10];//数码管万位(即时钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x02;//数码管万位(即时钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour/10];//数码管十万位(即时钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x01;//数码管十万位(即时钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时
 }
  void ShuMaGuanNoWanWeiDisplayTime()//数码管没有万位(即时钟个位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second%10];//数码管个位(即秒钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x20;//数码管个位(即秒钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[second/10];//数码管十位(即秒钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x10;//数码管十位(即秒钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan%10];//数码管百位(即分钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x08;//数码管百位(即分钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan/10];//数码管千位(即分钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x04;//数码管千位(即分钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour/10];//数码管十万位(即时钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x01;//数码管十万位(即时钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

 }
  void ShuMaGuanNoShiWanWeiDisplayTime()//数码管没有十万位(即时钟十位)闪烁显示时间函数
{
   Duan=1;//开数码管段选
   P0=table[second%10];//数码管个位(即秒钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x20;//数码管个位(即秒钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[second/10];//数码管十位(即秒钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x10;//数码管十位显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan%10];//数码管百位(即分钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x08;//数码管百位(即分钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[minutan/10];//数码管千位(即分钟十位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x04;//数码管千位(即分钟十位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时

   Duan=1;//开数码管段选
   P0=table[hour%10];//数码管万位(即时钟个位)显示数
   Duan=0;//关数码管段选
   P0=0xff;//关数码管所有显示,防止数码管显示乱码。
   Wei=1;//开数码管位选
   P3=0x02;//数码管万位(即时钟个位)显示位
   Wei=0;//关数码管位选
   Delay(1);//延时
 }
  void KeyScan()//按键扫描函数
{
   if(S1==0)//判断移位按键S1是否按下        
  {
    ShuMaGuanDisplayTime();//数码管显示时间函数延时
    if(S1==0)//再次判断移位按键S1是否按下
   {
     while (!S1)//等待移位按键S1弹起
	 ShuMaGuanDisplayTime();//数码管显示时间函数延时
	 S1num++;//移位按键S1按键次数变量先赋值再自加
	 switch(S1num)//移位按键S1按键按下次数选择位,其中S1num为移位按键S1按键按下次数变量。
    {
   	  case 1://判断移位按键S1是否第1次按下
   			 TR0=0;//关定时器0定时
             TR1=1;//开定时器1定时,秒钟个位(也是数码管个位)开闪烁。
             flag=!flag;//flag=!flag相当于flag=!0=1,关数码管显示时间函数,开数码管没有个位闪烁显示时间函数。
			 S4num=0;//启停按键S4按下次数变量清零
             secondge=second%10;//秒钟分解一个秒钟个位
             secondshi=second/10;//秒钟分解一个秒钟十位
             minutange=minutan%10;//分钟分解一个分钟个位
             minutanshi=minutan/10;//分钟分解一个分钟十位
	         hourge=hour%10;//时钟分解一个时钟个位
	         hourshi=hour/10;//时钟分解一个时钟十位
             time=hourshi*100000+hourge*10000+minutanshi*1000+minutange*100+secondshi*10+secondge; //time表示数码管显示一个4位数的时间变量
			 break;
	  case 2://判断移位按键S1是否第2次按下
             flag=flag;
			 break;
	  case 3://判断移位按键S1是否第3次按下
             flag=flag;
			 break;
	  case 4://判断移位按键S1是否第4次按下
             flag=flag;
			 break;
	  case 5://判断移位按键S1是否第5次按下
             flag=flag;
			 break;
	  case 6://判断移位按键S1是否第6次按下
             flag=flag;
    		 break;
	  case 7://判断移位按键S1是否第7次按下
             flag=!flag;
			 TR0=1;
			 S1num=0;//移位按键S1按键按下次数变量清零
			 suojianflag=0;//移位键锁键标志位
			 break;
	 }     
    }
   }
   if(S2==0)//判断增加按键S2是否按下        
  {
	ShuMaGuanDisplayTime();//数码管显示时间函数延时
    if(S2==0)//再次判断增加按键S2是否按下
   { 
     while (!S2)//等待增加按键S2弹起
	 ShuMaGuanDisplayTime();//数码管显示时间函数延时
	 switch(S1num)//移位按键S1按键按下次数选择位,其中S1num为移位按键S1按键按下次数变量。
    {
   	  case 1://判断移位按键S1是否第1次按下
   			 secondge++;//秒钟的个位(也就是数码管个位)变量先赋值再自加
             if(secondge==10)//判断秒钟的个位(也就是数码管个位)变量是否为10
             secondge=0;//秒钟的个位(也就是数码管个位)变量清0
             second=secondshi*10+secondge;//修改秒钟的个位(也就是数码管个位)上的数值后,再合成秒钟,为了给秒钟的个位(也就是数码管个位)闪烁显示时间函数调用分解来闪烁显示和数码管没有个位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             minutan=minutanshi*10+minutange;//合成分钟,是为了给数码管显示时间函数调用分解来显示。   
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 2://判断移位按键S1是否第2次按下
			 secondshi++;//秒钟的十位(也就是数码管十位)变量先赋值再自加
             if(secondshi==6)//判断秒钟的十位(也就是数码管十位)变量是否为6
             secondshi=0;//秒钟的十位(也就是数码管十位)变量清0
             second=secondshi*10+secondge;//修改秒钟的十位(也就是数码管十位)上的数值后,再合成秒钟,是为了给秒钟的十位(也就是数码管十位)闪烁显示时间函数调用分解来闪烁显示和数码管没有十位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             minutan=minutanshi*10+minutange;//合成分钟,是为了给数码管显示时间函数调用分解来显示。
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 3://判断移位按键S1是否第3次按下
			 minutange++;//分钟的个位(也就是数码管百位)变量先赋值再自加
             if(minutange==10)//判断分钟的个位(也就是数码管百位)变量是否为10
             minutange=0;//分钟的个位(也就是数码管百位)变量清0
             second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
             minutan=minutanshi*10+minutange;//修改分钟的个位(也就是数码管百位)上的数值后,再合成分钟,为了给分钟的个位(也就是数码管百位)闪烁显示时间函数调用分解来闪烁显示和数码管没有百位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 4://判断移位按键S1是否第4次按下
			 minutanshi++;//分钟的十位(也就是数码管千位)变量先赋值再自加
             if(minutanshi==6)//判断分钟的十位(也就是数码管千位)变量是否为6
             minutanshi=0;//分钟的十位(也就是数码管千位)变量清0
             second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
             minutan=minutanshi*10+minutange;//修改分钟的十位(也就是数码管千位)上的数值后,再合成分钟,为了给分钟的十位(也就是数码管千位)闪烁显示时间函数调用分解来闪烁显示和数码管没有千位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 5://判断移位按键S1是否第5次按下
			 hourge++;//时钟的个位(也就是数码管万位)变量先赋值再自加
             if(hourge==4)//判断时钟的个位(也就是数码管万位)变量是否为4
             hourge=0;//时钟的个位(也就是数码管万位)变量清0
             second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
             minutan=minutanshi*10+minutange;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
             hour=hourshi*10+hourge;//修改时钟的个位(也就是数码管万位)上的数值后,再合成时钟,为了给时钟的个位(也就是数码管万位)闪烁显示时间函数调用分解来闪烁显示和数码管没有万位闪烁显示时间函数调用分解来让其他位不闪烁显示。
			 break;
	  case 6://判断移位按键S1是否第6次按下
   			  hourshi++;//时钟的十位(也就是数码管十万位)变量先赋值再自加
              if(hourshi==3)//判断时钟的十位(也就是数码管十万位)变量是否为3
              hourshi=0;//时钟的十位(也就是数码管十万位)变量清0
              second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
              minutan=minutanshi*10+minutange;//合成分钟,是为了给数码管显示时间函数调用分解来显示。
              hour=hourshi*10+hourge;//修改时钟的十位(也就是数码管十万位)上的数值后,再合成时钟,为了给时钟的十位(也就是数码管十万位)闪烁显示时间函数调用分解来闪烁显示和数码管没有十万位闪烁显示时间函数调用分解来让其他位不闪烁显示。
    		  break;
	 }
    }
   }
   if(S3==0)//判断减少按键S3是否按下        
  {
	ShuMaGuanDisplayTime();//数码管显示时间函数延时
    if(S3==0)//再次判断减少按键S3是否按下
   { 
     while (!S3)//等待减少按键S3弹起
	 ShuMaGuanDisplayTime();//数码管显示时间函数延时
	 switch(S1num)//移位按键S1按键按下次数选择位,其中S1num为移位按键S1按键按下次数变量。
    {
   	  case 1://判断移位按键S1是否第1次按下
   			 secondge--;//秒钟的个位(也就是数码管个位)变量先赋值再自减
             if(secondge==-1)//判断秒钟的个位(也就是数码管个位)变量是否为-1
             secondge=9;//秒钟的个位(也就是数码管个位)变量变9
             second=secondshi*10+secondge;//修改秒钟的个位(也就是数码管个位)上的数值后,再合成秒钟,为了给秒钟的个位(也就是数码管个位)闪烁显示时间函数调用分解来闪烁显示和数码管没有个位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             minutan=minutanshi*10+minutange;//合成分钟,是为了给数码管显示时间函数调用分解来显示。   
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 2://判断移位按键S1是否第2次按下
			 secondshi--;//秒钟的十位(也就是数码管十位)变量先赋值再自减
             if(secondshi==-1)//判断秒钟的十位(也就是数码管十位)变量是否为-1
             secondshi=5;//秒钟的十位(也就是数码管十位)变量变5
             second=secondshi*10+secondge;//修改秒钟的十位(也就是数码管十位)上的数值后,再合成秒钟,是为了给秒钟的十位(也就是数码管十位)闪烁显示时间函数调用分解来闪烁显示和数码管没有十位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             minutan=minutanshi*10+minutange;//合成分钟,是为了给数码管显示时间函数调用分解来显示。
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 3://判断移位按键S1是否第3次按下
			 minutange--;//分钟的个位(也就是数码管百位)变量先赋值再自减
             if(minutange==-1)//判断分钟的个位(也就是数码管百位)变量是否为-1
             minutange=9;//分钟的个位(也就是数码管百位)变量变9
             second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
             minutan=minutanshi*10+minutange;//修改分钟的个位(也就是数码管百位)上的数值后,再合成分钟,为了给分钟的个位(也就是数码管百位)闪烁显示时间函数调用分解来闪烁显示和数码管没有百位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 4://判断移位按键S1是否第4次按下
			 minutanshi--;//分钟的十位(也就是数码管千位)变量先赋值再自减
             if(minutanshi==-1)//判断分钟的十位(也就是数码管千位)变量是否为-1
             minutanshi=5;//分钟的十位(也就是数码管千位)变量变5
             second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
             minutan=minutanshi*10+minutange;//修改分钟的十位(也就是数码管千位)上的数值后,再合成分钟,为了给分钟的十位(也就是数码管千位)闪烁显示时间函数调用分解来闪烁显示和数码管没有千位闪烁显示时间函数调用分解来让其他位不闪烁显示。
             hour=hourshi*10+hourge;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
			 break;
	  case 5://判断移位按键S1是否第5次按下
			  hourge--;//时钟的个位(也就是数码管万位)变量先赋值再自减
              if(hourge==-1)//判断时钟的个位(也就是数码管万位)变量是否为-1
              hourge=3;//时钟的个位(也就是数码管万位)变量变3
              second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
              minutan=minutanshi*10+minutange;//合成时钟,是为了给数码管显示时间函数调用分解来显示。
              hour=hourshi*10+hourge;//修改时钟的个位(也就是数码管万位)上的数值后,再合成时钟,为了给时钟的个位(也就是数码管万位)闪烁显示时间函数调用分解来闪烁显示和数码管没有万位闪烁显示时间函数调用分解来让其他位不闪烁显示。
			  break;
	  case 6://判断移位按键S1是否第6次按下
   			 hourshi--;//时钟的十位(也就是数码管十万位)变量先赋值再自减
             if(hourshi==-1)//判断时钟的十位(也就是数码管十万位)变量是否为-1
             hourshi=2;//时钟的十位(也就是数码管十万位)变量变2
             second=secondshi*10+secondge;//合成秒钟,是为了给数码管显示时间函数调用分解来显示。
             minutan=minutanshi*10+minutange;//合成分钟,是为了给数码管显示时间函数调用分解来显示。
             hour=hourshi*10+hourge;//修改时钟的十位(也就是数码管十万位)上的数值后,再合成时钟,为了给时钟的十位(也就是数码管十万位)闪烁显示时间函数调用分解来闪烁显示和数码管没有十万位闪烁显示时间函数调用分解来让其他位不闪烁显示。
    		 break;
	 }
    }
   }
   if(S4==0)//判断启停按键S4是否按下
  {
	ShuMaGuanDisplayTime();//数码管显示时间函数延时
	if(S4==0)//再次判断启停按键S4是否按下
   {
	 while (!S4)//等待启停按键S4弹起
	 ShuMaGuanDisplayTime();//数码管显示时间函数延时
	 S4num++;//启停按键S4按下次数变量先赋值再加加
	 if(S4num==1)//判断启停按键S4是否第一次按下过。实现直接停止。
	{
	  TR0=0;//关定时器0
	 }
	 if(S1num>=1&&S4num==1)//判断移位按键S1按键和启停按键S4是否按下过。实现移位停止后,可移位修改时间数值或不修改时间数值,然后再启动。
	{
	  TR0=1;//开定时器0
	  TR1=0;//关定时器1
	  flag=!flag;
	  S4num=0;//启停按键S4按下次数变量清零
	  S1num=0;//移位按键S1按键按下次数变量清零
	 }
	 if(S4num==2)//判断启停按键S4按键是否第二次按下过 
	{
	  TR0=1;//开定时器0
	  S4num=0;//启停按键S4按下次数变量清零
	 }
	}
   }
  }
  void Timer0() interrupt 1//定时器0中断函数
{
   TH0=(65536-50000)/256;//TH0重新装值
   TL0=(65536-50000)%256;//TL0重新装值
   count++;//定时器0中断次数变量先赋值再加
   if(count==18)//判断定时器0中断次数变量是否为18次
  {
    count=0;//定时器0中断次数变量归零
    second++;//秒钟变量先赋值再加
    if(second==60)//判断秒钟变量是否达到60秒
   {
     second=0;//秒钟变量归零 
     minutan++;//分钟变量先赋值再加
     if(minutan==60)//判断分钟变量是否达到60分
    {
      minutan=0;//分钟变量归零
      hour++;//时钟变量先赋值再加
      if(hour==24)//判断时钟变量是否达到24时
     { 
       hour=0;//时钟变量归零
      }
     } 
    }
   }
  }
  void Timer1() interrupt 3//定时器1中断函数
{
   TH1=(65536-50000)/256;//TH1重新装值
   TL1=(65536-50000)%256;//TL1重新装值
   num++;//定时器0中断次数变量先赋值再加
   if(num==18)//判断定时器1中断次数变量是否到达18
  {
    num=0;//定时器1中断次数变量清零
	switch(S1num)//移位按键S1按键按下次数选择位,其中S1num为移位按键S1按键按下次数变量。
   {
   	 case 1://判断移位按键S1是否第1次按下
   			ShuMaGuanGeWeiShanShuoDisplayTime(0x20,second);//秒钟的个位(也就是数码管个位)闪烁显示时间函数
			break;
	 case 2://判断移位按键S1是否第2次按下
			ShuMaGuanShiWeiShanShuoDisplayTime(0x10,second);//秒钟的十位(也就是数码管十位)闪烁显示时间函数
			break;
	 case 3://判断移位按键S1是否第3次按下
			ShuMaGuanBaiWeiShanShuoDisplayTime(0x08,minutan);//分钟的个位(也就是数码管百位)闪烁显示时间函数
			break;
	 case 4://判断移位按键S1是否第4次按下
			ShuMaGuanQianWeiShanShuoDisplayTime(0x04,minutan);//分钟的十位(也就是数码管千位)闪烁显示时间函数
			break;
	 case 5://判断移位按键S1是否第5次按下
			ShuMaGuanWanWeiShanShuoDisplayTime(0x02,hour);//时钟的个位(也就是数码管万位)闪烁显示时间函数
			break;
	 case 6://判断移位按键S1是否第6次按下
   			ShuMaGuanShiWanWeiShanShuoDisplayTime(0x01,hour);//时钟的十位(也就是数码管十万位)闪烁显示时间函数
    		break;
	}
   }
  }
  void main()//主函数
{
   TimerInit();//定时器初始化函数
   while(1)
 {
    KeyScan();//按键扫描函数
    if(!flag)//flag为无符号字符型数据类型,取值范围为0到255,初始值是0,!flag相当于flag=1,开数码管显示函数显示标志位。
    ShuMaGuanDisplayTime();//数码管显示时间函数
    switch(S1num)//移位按键S1按键按下次数选择位,其中S1num为移位按键S1按键按下次数变量。
   {
   	 case 1://判断移位按键S1是否第1次按下
   			ShuMaGuanNoGeWeiDisplayTime();//数码管没有个位(即秒钟个位)闪烁显示时间函数
			break;
	 case 2://判断移位按键S1是否第2次按下
			ShuMaGuanNoShiWeiDisplayTime();//数码管没有十位(即秒钟十位)闪烁显示时间函数
			break;
	 case 3://判断移位按键S1是否第3次按下
			ShuMaGuanNoBaiWeiDisplayTime();//数码管没有百位(即分钟个位)闪烁显示时间函数
			break;
	 case 4://判断移位按键S1是否第4次按下
			ShuMaGuanNoQianWeiDisplayTime();//数码管没有千位(即分钟十位)闪烁显示时间函数
			break;
	 case 5://判断移位按键S1是否第5次按下
			ShuMaGuanNoWanWeiDisplayTime();//数码管没有万位(即时钟个位)闪烁显示时间函数
			break;
	 case 6://判断移位按键S1是否第6次按下
   			 ShuMaGuanNoShiWanWeiDisplayTime();//数码管没有十万位(即时钟十位)闪烁显示时间函数
    		 break;
	}
   }
  } 


三、通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程的Proteus软件仿真单片机外围电路

在这里插入图片描述

四、通过点击移位键控制数码管显示时分秒某位闪烁后进行增加键或减少键修改时分秒数值的计时项目工程的操作功能描述

(1)、不修改时分秒个位十位数值,只是启动或停止计时的情况:如果第一次按下移位键,则停止计时,启动计时可按下移位键7次或按下启停键,再次停止计时可按下移位键或按下启停键,再次启动计时可按下移位键7次或按下启停键,周而复始。如果第一次按下启停键,则停止计时,启动计时可按下移位键7次或按下启停键,再次停止计时可按下移位键或按下启停键,再次启动计时可按下移位键7次或按下启停键,周而复始。

(2)、修改时分秒个位十位数值,再启动或停止计时的情况:要修改时分秒个位十位上的数值,再启动或停止计时,首先必须按下移位键,此时停止计时,通过点击移位键让LCD1602字符型液晶显示器光标移到时分秒相应个位十位数值上,利用点击增加键或减少键修改数值,修改完毕后,启动计时可按下移位键多次让LCD1602字符型液晶显示器光标回到秒钟个位数值上或按下启停键,停止计时可按下移位键或按下启停键,当按下移位键时,又可修改时分秒个位十位上的数值,再次启动计时可按下移位键多次让LCD1602字符型液晶显示器光标回到秒钟个位数值上或按下启停键,周而复始。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值