精华内容
下载资源
问答
  • 通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目一、前言1、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目包括用Keil软件编写单片机C语言...

    通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目

    一、前言

    1、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目包括用Keil软件编写单片机C语言程序和用Proteus软件仿真单片机外围电路

    2、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目构思

    (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)求出原先的计时数值,用变量代替原先的计时数值写入按键扫描函数。)。

    二、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目的Keil软件编写的单片机C语言程序

    #include<reg52.h>//单片机头文件
    #define uchar unsigned char//宏定义,用uchar表示unsigned char,叫无符号字符型数据类型,取值范围为:0到255。
    #define uint unsigned int//宏定义,用uint表示unsigned int,叫无符号整数型数据类型,取值范围为:0到65535。
    sbit RS=P0^7;//位定义LCD1602字符型液晶显示器的数据/命令选择引脚                 
    sbit RW=P0^6;//位定义LCD1602字符型液晶显示器的读写引脚                        
    sbit EN=P0^5; //位定义LCD1602字符型液晶显示器的使能引脚
    sbit S1=P3^5;//移位按键S1 
    sbit S2=P3^4;//增加按键S2 
    sbit S3=P3^3;//减少按键S3 
    sbit S4=P3^2;//启停按键S4
    uchar count,S1num,S4num;//count为定时器0中断次数变量,S1num为移位按键S1按键按下次数变量,S4num为启停按键S4按下次数变量。
    uchar shi,fen,miao;//未做时间修改的计时时钟、分钟、秒钟变量
    uchar secondge,secondshi; //秒钟个位、十位的变量
    uchar minutange,minutanshi;//分钟个位、十位的变量
    uchar hourge,hourshi;//时钟个位、十位的变量
    uchar table0[]="2019-11-11";//LCD1602字符型液晶显示器第一行初始显示
    uchar table1[]="00:00:00";//LCD1602字符型液晶显示器第二行初始显示
      void Delay(uint z)//延时程序
    {
       uint x,y;
       for(x=z;x>0;x--)
    	for(y=110;y>0;y--);
     }
      void WriteCommand(uchar command)//LCD1602字符型液晶显示器写指令函数
    {
       RS=0;//LCD1602字符型液晶显示器指令寄存器低电平
       RW=0;//LCD1602字符型液晶显示器写指令操作低电平
       P2=command;//LCD1602字符型液晶显示器写指令函数写指令到单片机P2组端口,再输送到LCD1602字符型液晶显示器指令寄存器中执行。
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=1;//LCD1602字符型液晶显示器使能端高电平  
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=0;//LCD1602字符型液晶显示器使能端低电平
     }
      void WriteData(uchar information)//LCD1602字符型液晶显示器写数据函数
    {  
       RS=1;//LCD1602字符型液晶显示器数据寄存器高电平
       RW=0;//LCD1602字符型液晶显示器写数据操作低电平
       P2=information;//LCD1602字符型液晶显示器写数据函数写数据到单片机P2组端口,再输送到LCD1602字符型液晶显示器上显示。
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=1;//LCD1602字符型液晶显示器使能端高电平 
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=0;//LCD1602字符型液晶显示器使能端低电平
     }
      void LCD1602Init()//LCD1602初始化函数
    {
       WriteCommand(0x38);//设置LCD1602字符型液晶显示器16x2显示,5*7或5*8点阵,8位数据并口,简称显模。
       WriteCommand(0x08);//设置LCD1602字符型液晶显示器显示开,简称亮屏。
       WriteCommand(0x01);//设置清除LCD1602字符型液晶显示器屏上所有内容,并让光标复位到LCD1602字符型液晶显示器屏左上角,简称清屏。
       WriteCommand(0x06);//设置开光标(或字符)地址指针自增1,光标右移动一个字符位,整屏显示不移动。
       WriteCommand(0x0c);//设置开LCD1602字符型液晶显示器显示,关光标,关光标(字符)闪烁。
     }
      void Timer0Init()//定时器0初始化函数
    {
       TMOD=0x01;//设定定时器0工作模式为模式1
       TH0=(65536-50000)/256;//TH0装初值
       TL0=(65536-50000)%256;//TL0装初值
       EA=1;//开启定时器总中断
       ET0=1;//开启定时器0中断开关
       TR0=1;//启动定时器0
     }
      void LCD1602InitDisplay()//LCD1602字符型液晶显示器初始化显示函数
    {
       uchar j;//j表示数组元素个数变量
       WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第一个位置显示
       for(j=0;j<10;j++)//有10个字符,要循环10次。
      {
        WriteData(table0[j]);//显示字符串
        Delay(5);
       }
       WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第一个位置显示
       for(j=0;j<8;j++)//有8个字符,要循环8次。
      { 
        WriteData(table1[j]);//显示字符串
        Delay(5);
       }
     }
      void LCD1602DisplayTime(uchar address,uchar num)//LCD1602字符型液晶显示器显示时间两位数分解函数
    {
       uchar shi,ge;//十位、个位的变量
       shi=num/10;//十位数
       ge=num%10;//个位数
       WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
       WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
       WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
     }
      void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器显示修改时间个位数分解函数
    {
       uchar ge;//个位的变量
       ge=num%10;//个位数
       WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
       WriteData(0x30+ge);//0x30表示字符库的数字0,整个代码表示个位可显示0到9的数字。
     }
      void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶显示器修改时间十位数分解函数
    {
       uchar shi;//十位变量
       shi=num%10;//十位数
       WriteCommand(0x80+0x40+address);//LCD1602字符型液晶显示器第二行某个显示位
       WriteData(0x30+shi);//0x30表示字符库的数字0,整个代码表示十位可显示0到9的数字。
     }
      void KeyScan()//按键扫描函数
    {
       if(S1==0)//判断移位按键S1是否按下					   
      {
    	Delay(5);
    	if(S1==0)//再次判断移位按键S1是否按下
       {	
         S1num++;//移位按键S1按键次数变量先赋值再自加
    	 while(!S1);//等待移位按键S1弹起
    	 switch(S1num)
    	{
    	  case 1:
    	         TR0=0;//关定时器0
    			 S4num=0;//启停按键S4按下次数清零
    			 secondge=miao%10;//关掉定时器0定时后,把秒钟计时时间数值取余赋给秒钟个位显示位。 
    	         secondshi=miao/10;//关掉定时器0定时后,把秒钟计时时间数值取除赋给秒钟十位显示位。
    			 WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第8个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 2:
    	         secondshi=secondshi;//关掉定时器0定时后,把秒钟计时时间数值取除后得到的值再赋给秒钟十位显示位。
    	         WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶显示器第二行第7个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 3:
    	         minutange=fen%10;//关掉定时器0定时后,把分钟计时时间数值取余赋给分钟个位显示位。
    			 minutanshi=fen/10;//关掉定时器0定时后,把分钟计时时间数值取除赋给分钟十位显示位。
    	         WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶显示器第二行第5个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 4:
    	         minutanshi=minutanshi;//关掉定时器0定时后,把分钟计时时间数值取除后得到的值再赋给分钟十位显示位。
    	         WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶显示器第二行第4个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 5:
    	         hourge=shi%10;//关掉定时器0定时后,把时钟计时时间数值取余赋给时钟个位显示位。
    			 hourshi=shi/10;//关掉定时器0定时后,把时钟计时时间数值取除赋给时钟十位显示位。
    	         WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶显示器第二行第2个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 6:
    	         hourshi=hourshi;//关掉定时器0定时后,把时钟计时时间数值取除后得到的值再赋给时钟十位显示位。
    	         WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶显示器第二行第1个位置的显示位
    	         WriteCommand(0x0f);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 break;
    	  case 7:
    	         WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶显示器第二行第8个位置的显示位
    	         WriteCommand(0x0c);//开LCD1602字符型液晶显示器显示,开光标,开光标(或字符)闪烁。
    			 TR0=1;//打开定时器0
    			 S1num=0;//移位按键S1按键按下次数清零
    			 break;
    	  default:
    	          S1num=0;//移位按键S1按键按下次数清零
    			  break;
    	 }
    	}
       }
        if(S1num!=0)//判断移位按键S1按键按下次数变量是否为0
       {
         if(S2==0)//判断增加按键S2是否按下
    	{
    	  Delay(5);
    	  if(S2==0)//再次判断增加按键S2是否按下
    	 {
    	   while(!S2);//等待增加按键S2弹起
           switch(S1num)//移位按键S1按键按下次数变量选择位
    	  {
    	    case 1://移位按键S1按键第一次按下
    			   secondge++;//秒钟个位数先赋值再加加
    		       if(secondge==10)//判断秒钟个位数设定值是否达到10
    		       secondge=0;//秒钟个位数归零
    		       LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x07);//写入LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟个位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 2://移位按键S1按键第二次按下
    			   secondshi++;//秒钟十位数先赋值再加加
    		       if(secondshi==6)//判断秒钟十位数设定值是否达到6
    		       secondshi=0;//秒钟十位数归零
    		       LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x06);//写入LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟十位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
            case 3://移位按键S1按键第三次按下
    			   minutange++;//分钟个位数先赋值再加加
    		       if(minutange==10)//判断分钟个位数设定值是否达到10
    		       minutange=0;//分钟个位数归零
    		       LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x04);//写入LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟个位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 4://移位按键S1按键第四次按下
    			   minutanshi++;//分钟十位数先赋值再加加
    		       if(minutanshi==6)//判断分钟十位数设定值是否达到6
    		       minutanshi=0;//分钟十位数归零
    		       LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第4个位置的分钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第7个位置的分钟十位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟十位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 5://移位按键S1按键第五次按下
    			   hourge++;//时钟个位数先赋值再加加
    		       if(hourge==4)//判断时钟个位数设定值是否达到4
    		       hourge=0;//时钟个位数归零
    		       LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟个位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 6://移位按键S1按键第六次按下
    			   hourshi++;//时钟十位数先赋值再加加
    		       if(hourshi==3)//判断时钟十位数设定值是否达到3
    		       hourshi=0;//时钟十位数归零
    		       LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x00);//写入LCD1602第二行第1个位置的时钟十位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟十位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		default:
    		        S1num=0;//移位按键S1按键按下次数清零
    				break; 
    	   }
    	  }
    	 }
        if(S3==0)//判断减少按键S3是否按下
    	{
    	  Delay(5);
    	  if(S3==0)//再次判断减少按键S3是否按下
    	 {
    	   while(!S3);//等待减少按键S3弹起
    	   switch(S1num)//移位按键S1按键按下次数变量选择位
    	  {
    	    case 1://移位按键S1按键第一次按下
    			   secondge--;//秒钟个位数先赋值再减减
    		       if(secondge==-1)//判断秒钟个位数设定值是否达到-1
    		       secondge=9;//秒钟个位数归9
    		       LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x07);//写入LCD1602字符型液晶显示器第二行第8个位置的秒钟个位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟个位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 2://移位按键S1按键第二次按下
    			   secondshi--;//秒钟十位数先赋值再减减
    		       if(secondshi==-1)//判断秒钟十位数设定值是否达到-1
    		       secondshi=5;//秒钟十位数归5
    		       LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x06);//写入LCD1602字符型液晶显示器第二行第7个位置的秒钟十位显示位
    			   miao=secondshi*10+secondge;//移位修改秒钟十位显示位的数值后,需要通过秒钟十位显示位的数值加上秒钟个位显示位的数值之和赋给秒钟变量,才能在修改秒钟个位或十位显示位的数值后重新计时。(原因:秒钟个位或十位显示位的数值是在秒钟的数值上分解得来,当秒钟个位或十位显示位的数值发生变化后,秒钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
            case 3://移位按键S1按键第三次按下
    			   minutange--;//分钟个位数先赋值再减减
    		       if(minutange==-1)//判断分钟个位数设定值是否达到-1
    		       minutange=9;//分钟个位数归9
    		       LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x04);//写入LCD1602字符型液晶显示器第二行第5个位置的分钟个位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟个位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 4://移位按键S1按键第四次按下
    			   minutanshi--;//分钟十位数先赋值再减减
    		       if(minutanshi==-1)//判断分钟十位数设定值是否达到6
    		       minutanshi=5;//分钟十位数归5
    		       LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶显示器第二行第4个位置的分钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x03);//写入LCD1602字符型液晶显示器第二行第7个位置的分钟十位显示位
    			   fen=minutanshi*10+minutange;//移位修改分钟十位显示位的数值后,需要通过分钟十位显示位的数值加上分钟个位显示位的数值之和赋给分钟变量,才能在修改分钟个位或十位显示位的数值后重新计时。(原因:分钟个位或十位显示位的数值是在分钟的数值上分解得来,当分钟个位或十位显示位的数值发生变化后,分钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 5://移位按键S1按键第五次按下
    			   hourge--;//时钟个位数先赋值再减减
    		       if(hourge==-1)//判断时钟个位数设定值是否达到-1
    		       hourge=3;//时钟个位数归3
    		       LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位的显示数
    		       WriteCommand(0x80+0x40+0x01);//写入LCD1602字符型液晶显示器第二行第2个位置的时钟个位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟个位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		case 6://移位按键S1按键第六次按下
    			   hourshi--;//时钟十位数先赋值再减减
    		       if(hourshi==-1)//判断时钟十位数设定值是否达到-1
    		       hourshi=2;//时钟十位数归2
    		       LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位的显示数
    		       WriteCommand(0x80+0x40+0x00);//写入LCD1602字符型液晶显示器第二行第1个位置的时钟十位显示位
    			   shi=hourshi*10+hourge;//移位修改时钟十位显示位的数值后,需要通过时钟十位显示位的数值加上时钟个位显示位的数值之和赋给时钟变量,才能在修改时钟个位或十位显示位的数值后重新计时。(原因:时钟个位或十位显示位的数值是在时钟的数值上分解得来,当时钟个位或十位显示位的数值发生变化后,时钟的数值也要变化,否则不能在原基础上修改后重新计时,只能返回原基础上计时。)
    			   break;
    		default:
    		        S1num=0;//移位按键S1按键按下次数清零
    				break; 
    	   }
    	  }
    	 }
    	}
        if(S4==0)//判断启停按键S4是否按下
       {
    	 Delay(5);
    	 if(S4==0)//再次判断启停按键S4是否按下
    	{
    	  S4num++;//启停按键S4按下次数先赋值再加加
    	  while(!S4);//等待启停按键S4弹起
    	  if(S4num==1)//判断启停按键S4是否第一次按下过。实现直接停止。
    	 {
    	   TR0=0;//关定时器0
    	  }
    	  if(S1num>=1&&S4num==1)//判断移位按键S1按键和启停按键S4是否按下过。实现移位停止后,可移位修改时间数值或不修改时间数值,然后再启动。
    	 {
    	   TR0=1;//开定时器0
    	   WriteCommand(0x0c);//开LCD1602显示,关光标,关光标(或字符)闪烁。
    	   S4num=0;//启停按键S4按下次数变量清零
    	   S1num=0;//移位按键S1按键按下次数变量清零
    	  }
    	  if(S4num==2)//判断移位按键S1按键是否第二次按下过 
    	 {
    	   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中断次数归零
    	miao++;//秒钟先赋值再加
    	if(miao==60)//判断秒钟是否达到60秒
       {
    	 miao=0;//秒钟归零
    	 fen++;//分钟先赋值再加
    	 if(fen==60)//判断分钟是否达到60分
    	{
    	  fen=0;//分钟归零
    	  shi++;//时钟先赋值再加
    	  if(shi==24)//判断时钟是否达到24时
    	 {
    	   shi=0;//时钟归零
    	  }
    	  LCD1602DisplayTime(0x00,shi);//时钟显示两位数分解函数
    	 }
    	  LCD1602DisplayTime(0x03,fen);//分钟显示两位数分解函数
    	 }
    	 LCD1602DisplayTime(0x06,miao);//秒钟显示两位数分解函数 		
    	}	
       }
       void main()//主函数
    {
        LCD1602Init();//LCD1602字符型液晶显示器初始化函数
        Timer0Init();//定时器0初始化函数
        LCD1602InitDisplay();//LCD1602字符型液晶显示器初始化显示函数
        while(1)
      {
    	 KeyScan();//按键扫描函数		
       }
    }
    

    三、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目的Proteus软件仿真单片机外围电路

    在这里插入图片描述

    四、通过点击移位按键移位修改LCD1602字符型液晶显示器显示时分秒个位十位数值的计时项目的操作功能描述

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

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

    展开全文
  • 5.编写一个程序,要求输入一个三位数,正确分离出它的个位十位和百位数字,并在屏幕上显示出来。 #include<stdio.h> int main(void) { int a,b,c,num; printf("input number:"); scanf("%d",&nu...

    《程序设计基础-c语言》杨莉 刘鸿翔
    ISBN-978-7-03-032903-5
    p91
    习题3
    5.编写一个程序,要求输入一个三位数,正确分离出它的个位、十位和百位数字,并在屏幕上显示出来。

    #include<stdio.h>
    int main(void)
    {
    	int a,b,c,num;
    	printf("input number:");
    	scanf("%d",&num);
    	a=num/100;
    	b=num/10%10;
    	c=num%10;
    	printf("个位:%d,十位:%d,百位:%d",c,b,a);
    }
    

    在这里插入图片描述

    展开全文
  • 由于C语言的强大功能各方面的优点逐渐为人们认识,到了八年代,C开始进入其它操作系统,并很快在各类大、中、小微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。 C语言的特点  C语言是...
  • C语言编程要点

    2017-09-18 00:10:37
    10.6. 16位和32位的数是怎样存储的? 151 第11章 调 试 152 11.1. 如果我运行的程序挂起了,应该怎么办? 152 11.2. 如何检测内存漏洞(leak)? 157 11.3. 调试程序的最好方法是什么? 158 11.4. 怎样调试TSR程序? 163 ...
  • c语言经典案例

    2014-10-30 08:06:57
    本文件中讲述了c语言经典的282案例,由浅入深。有利于提高广大爱好c语言编程的人员。 其中包括: 第1章 初识C语言 1 实例001 第一个C语言程序 2 实例002 一完整的C语言程序 2 实例003 输出名言 3 实例004 用TC ...
  • 2、 用数字万用表标定数码管的段选和位选 3、 编写程序使1数码管上显示数字 4、 编写程序在6数码管上滚动显示数字 5、 重点讲解动态显示,保持时间,以及扫描频率对闪烁亮暗程度的影响。 第五讲:键盘检测原理...
  • 1.假设有变量赋值语句x=10,常量10的类型为short 2.假设有变量赋值语句x=2.2,常量2.2的类型是double 3.short int 类型变量的存储数据范围是:-32768~+32767 ...9.4二进制用于存储整数(可正可负),

    1.假设有变量赋值语句x=10,常量10的类型为short

    2.假设有变量赋值语句x=2.2,常量2.2的类型是double

    3.short int 类型变量的存储数据范围是:-32768~+32767

    4.赋值语句x=082是错误的

    5.语句printf(“abc\x64”)的屏幕显示结果是abcd

    6.字符串"123\071a3\x66y\b\n"有10个有效字符

    7.十进制数转二进制数的方法是:除二取余倒排序

    8.C语言的基本数据类型包括:整型、实型、字符型

    9.4个二进制位用于存储整数(可正可负),其表示数数据范围是-8~+7

    10.二进制中一千字节1kb实际是1024字节

    11.C语言标识符命名不可以使用关键字

    12.C语言标识符命名只能由字母、数字和下划线组成,且第一个符号必须是字母或下划线

    13.x4不是数值常量(也叫直接常量)

    14.指数的表示如:2e5、2e-3、1e+10(字母e或E前必须由数字,e后面的指数必须为整数)

    15.用#define来命令定义一个符号常量N表示数2.718:#define N 2.718

    16.计算机处理信息的最小单位是位(bit简称b),计算机处理信息的基本单位是字节(Byte简称B)

    17.程序是用于解决现实问题的,现实世界中的数据存在不同的大小和形式,所以C语言为程序开发者提供了丰富的数据类型,供程序员根据要存储的实际数据选择合适的类型,以节约存储空间和方便管理

    展开全文
  • 分别对应一函数,最后一0来结束程序。 学生信息的写入(定义FILE *fp指针),先将将学生人数课程门数写入文件,以结构体数组的形式来保存键盘上输入的每学生相应的信息。然后再用fprintf函数的...
  • CG C语言 2-1水仙数

    2021-01-17 21:43:54
    进制整数,如果它的三的数字立方等于这数的数值,则称它为一“水仙数”。编写程序,计算出某一范围内的所有“水仙数”。 【输入形式】 从控制台输入两整数(以空格分割),分别表示数据...

    CG C语言

    2-1水仙数

    • 题目描述

    【问题描述】
    一个三位的十进制整数,如果它的三个数位的数字立方和等于这个数的数值,则称它为一个“水仙数”。编写程序,计算出某一范围内的所有“水仙数”。
    【输入形式】
    从控制台输入两个整数(以空格分割),分别表示数据范围的下限m和上限n,且满足0<=m<=n<=10000。
    【输出形式】
    向控制台输出在该数据范围内(包括数据的上下限)的所有“水仙数”,以从小到大的顺序显示在一行上,各数之间以空格分割。若该数据范围内没有“水仙数”,则输出字符串No Answer。
    【样例输入1】
    50 370
    【样例输出1】
    153 370
    【样例1说明】
    输入的数据范围下限为50,上限为370。因为要求水仙数为三位数,所以实际上就是求100~370之间的 水仙数,由于13 + 53 + 33 = 153,33 + 73 + 03 = 370,因此该范围内的水仙数为153和370(包括上限370)。
    【样例输入2】
    110 150
    【样例输出2】
    No Answer
    【样例2说明】
    输入的数据范围下限为110,上限为150。因为该数据范围之间没有水仙数,所以输出字符串No Answer。
    【评分标准】
    该题要求输出某数据范围内的水仙数,共有5个测试点。上传C语言文件名为example1a.c。

    • 代码
    #include<stdio.h>
    #include<math.h>
    int main() {
     int n, //上限
      m; //下限
     int num_gewei, num_shiwei, num_baiwei;
     bool flag=0;//标志位,是否存在水仙数
     scanf_s("%d %d",&m,&n);
     //只对三位数进行判断,超过范围直接缩小上下限
     if (m < 100)
      m = 100;
     if (n > 999)
      n = 999;
     for (int i = m;i <= n;i++ ) {
      num_gewei = i % 10;
      num_shiwei = (i%100)/10;
      num_baiwei = i / 100;
      //存在水仙数
      if (pow(num_gewei, 3)+ pow(num_shiwei, 3)+ pow(num_baiwei, 3)== i) {         //pow(x,y) 求x的y次方
       printf("%d ", i);
       flag = 1;//存在水仙数,置1
      }
     }
     //不存在水仙数
     if (flag==0) {
      printf("NO Answer");
     }
     return 0;
    }
    • 思考
      1 pow(x,y) 求x的y次方
      2 本题重点在于对于个位、十位、百位数字的求解,方法多种不求一致;以及对数字上下限的判断—三位数。
    展开全文
  • C语言中,使用的整常数有八进制、十六进制和十进制三种。 整型常量 1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。 以下各数是合法的八进制数: ...
  • 由于C语言的强大功能各方面的优点逐渐为人们认识,到了八年代,C开始进入其它操作系统,并很快在各类大、中、小微型计算机上得到了广泛的使用,成为当代最优秀的程序设计语言之一。 1.3 C语言版本 目前最...
  • printf(),scanf()%c---------------输出一字符%d-----------------输出一有符号进制整数%e(%E)------------输出一以规范化指数形式表示的浮点数(实数部分只显示6有效数字,包括一整数小数,指数...
  • (29)某公司在传输数据过程中为了安全要对数据进行加密,若传递的是四位的整数,对其进行加密的规则为:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。...
  • C语言经典例题100道

    2011-01-10 13:14:03
    取一整数从右端开始的4~7。 55.学习使用按取反~ 56.用circle画圆形 57.学用line画直线 58.用rectangle画方形 59.画图综合例子 60.画图综合例子2 61.打印杨辉三角形 62.学习putpixel画点 63.画椭圆ellipse 64....
  • C的适用范围的扩大、在这些年中语言的改变各个组织开发的超出其预定内容的编译器,所有这一切要求对C语言有一比本书第1版更精确更新的定义。在1983年,美国国家标准协会(ANSI)成立了一委员会,它的目标是...
  • 20015当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)百位数字(digit3)的值。 3 20026 输入2个整数 num1 num2,计算并输出它们的、差、积、商与余数。 4 第3周(M3) 5 20031 求1+2+3+......+100...
  • 8 对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7), 相应 8 发光二极管正好与单片机一端口 Pn 的 8 引脚连接,这样单片机就可以通过引脚输出高 低电平控制 8 发光二极的亮与灭,从而显示各种数字...
  • 根据定义或显示的数制分类,可分为进制、八进制十六进制。   2.3.1 整型常量 整型常量是在运算中不可改变的整型数据类型,可使用进制、八进制十六进制描述一整型常量。进制整型常量的表述形式是: ...
  • 2.c模拟weindow下getch.c某月天数.c逆序.c逆序四整数.c排序.c判断某个月的天数.c判断一日期是否合法.c判断一数是不是素数.c扑克.c全局数组实现整数栈.c全字符数字.c闰年.c三角形菱形.c生命细胞.c整数逆序...
  • 20015当n为152时,分别求出n的个位数字(digit1)、十位数字(digit2)百位数字(digit3)的值。 3 20026 输入2个整数 num1 num2,计算并输出它们的、差、积、商与余数。 4 第3周(M3) 5 20031 求1+2+3+......+100...
  • 为完成对十佳运动员的选拔,故设计此程序通过众人对20位候选人的投票表决,选出其中票数最高的前十位,定为十佳运动员。这就要求本程序要能够录入20位候选人的名单,包括起编号姓名,然后程序可以接受用户的投票...
  •  1.5 第一个C语言程序 7  1.5.1 输入并编译hello.c 7  1.6 总结 9  1.7 问与答 9  1.8 作业 10  1.8.1 小测验 10  1.8.2 练习 10  TYPE&RUN1 打印程序清单 12  第一TYPE&RUN 12  第2天课程 ...
  • printf(),scanf() %c---------------输出一字符 ...%e(%E)------------输出一以规范化指数形式表示的浮点数(实数部分只显示6有效  数字,包括一整数小数,指数部分连符号共三) %f(%F)-----------
  • (2)千位、十位数字之为10且百位、个位数字之积为12。 要求每一行显示5个数,并且统计满足条件的数字个数。 下面是我的代码: #include #include int main() { int m,n,qw,bw,sw,gw,sum=0; for(m=1000;m;m...
  • printf(),scanf()%c---------------输出一字符%d-----------------输出一有符号进制整数%e(%E)------------输出一以规范化指数形式表示的浮点数(实数部分只显示6有效 数字,包括一整数小数,指数...
  • 另外在每个LED点亮5次后,个位自动加1,然后判断个位是否是10,如果不是,则点亮个位和十位LED,如果是,则在查看十位是不是9,如果是,则全部清0,如果不是,则十位加1,个位清0,然后继续判断,依次循环下去。...
  • 另外在每个LED点亮5次后,个位自动加1,然后判断个位是否是10,如果不是,则点亮个位和十位LED,如果是,则在查看十位是不是9,如果是,则全部清0,如果不是,则十位加1,个位清0,然后继续判断,依次循环下去。...
  • 进制小数转二进制matlab代码数据采集​​和显示:数字倾角测量系统 使用微控制器加速度计,对能够获取0°至90°倾斜角测量数据的设备进行了原型设计。 该项目是针对微处理器系统课程的,我在其中获得了94%的...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

c语言显示十位和个位

c语言 订阅