久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 基于51單片機通過點擊移位按鍵移位修改LCD1602字符型液晶顯示器顯示時分秒個位十位... [打印本頁]

作者: 51黑電子會員    時間: 2020-4-25 08:08
標題: 基于51單片機通過點擊移位按鍵移位修改LCD1602字符型液晶顯示器顯示時分秒個位十位...
本帖最后由 51黑電子會員 于 2020-4-25 09:50 編輯
  1. #include<reg52.h>//單片機頭文件
  2. #define uchar unsigned char//宏定義,用uchar表示unsigned char,叫無符號字符型數據類型,取值范圍為:0到255。
  3. #define uint unsigned int//宏定義,用uint表示unsigned int,叫無符號整數型數據類型,取值范圍為:0到65535。
  4. sbit RS=P0^7;//位定義LCD1602字符型液晶顯示器的數據/命令選擇引腳                 
  5. sbit RW=P0^6;//位定義LCD1602字符型液晶顯示器的讀寫引腳                        
  6. sbit EN=P0^5; //位定義LCD1602字符型液晶顯示器的使能引腳
  7. sbit S1=P3^5;//移位按鍵S1
  8. sbit S2=P3^4;//增加按鍵S2
  9. sbit S3=P3^3;//減少按鍵S3
  10. sbit S4=P3^2;//啟停按鍵S4
  11. uchar count,S1num,S4num;//count為定時器0中斷次數變量,S1num為移位按鍵S1按鍵按下次數變量,S4num為啟停按鍵S4按下次數變量。
  12. uchar shi,fen,miao;//未做時間修改的計時時鐘、分鐘、秒鐘變量
  13. uchar secondge,secondshi; //秒鐘個位、十位的變量
  14. uchar minutange,minutanshi;//分鐘個位、十位的變量
  15. uchar hourge,hourshi;//時鐘個位、十位的變量
  16. uchar table0[]="2019-11-11";//LCD1602第一行初始顯示
  17. uchar table1[]="00:00:00";//LCD1602第二行初始顯示
  18.   void Delay(uint z)//延時程序
  19. {
  20.    uint x,y;
  21.    for(x=z;x>0;x--)
  22.     for(y=110;y>0;y--);
  23. }
  24.   void WriteCommand(uchar command)//LCD1602字符型液晶顯示器寫指令函數
  25. {
  26.    RS=0;//LCD1602字符型液晶顯示器指令寄存器低電平
  27.    RW=0;//LCD1602字符型液晶顯示器寫指令操作低電平
  28.    P2=command;//LCD1602字符型液晶顯示器寫指令函數寫指令到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器指令寄存器中執行。
  29.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  30.    EN=1;//LCD1602字符型液晶顯示器使能端高電平  
  31.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  32.    EN=0;//LCD1602字符型液晶顯示器使能端低電平
  33. }
  34.   void WriteData(uchar information)//LCD1602字符型液晶顯示器寫數據函數
  35. {  
  36.    RS=1;//LCD1602字符型液晶顯示器數據寄存器高電平
  37.    RW=0;//LCD1602字符型液晶顯示器寫數據操作低電平
  38.    P2=information;//LCD1602字符型液晶顯示器寫數據函數寫數據到單片機P2組端口,再輸送到LCD1602字符型液晶顯示器上顯示。
  39.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  40.    EN=1;//LCD1602字符型液晶顯示器使能端高電平
  41.    Delay(5);//實際單片機演示,可以去掉延時。Proteus 仿真,需要保留延時。
  42.    EN=0;//LCD1602字符型液晶顯示器使能端低電平
  43. }
  44.   void LCD1602Init()//LCD1602初始化函數
  45. {
  46.    WriteCommand(0x38);//設置LCD1602字符型液晶顯示器16x2顯示,5*7或5*8點陣,8位數據并口,簡稱顯模。
  47.    WriteCommand(0x08);//設置LCD1602字符型液晶顯示器顯示開,簡稱亮屏。
  48.    WriteCommand(0x01);//設置清除LCD1602字符型液晶顯示器屏上所有內容,并讓光標復位到LCD1602字符型液晶顯示器屏左上角,簡稱清屏。
  49.    WriteCommand(0x06);//設置開光標(或字符)地址指針自增1,光標右移動一個字符位,整屏顯示不移動。
  50.    WriteCommand(0x0c);//設置開LCD1602字符型液晶顯示器顯示,關光標,關光標(字符)閃爍。
  51. }
  52.   void Timer0Init()//定時器0初始化函數
  53. {
  54.    TMOD=0x01;//設定定時器0工作模式為模式1
  55.    TH0=(65536-50000)/256;//TH0裝初值
  56.    TL0=(65536-50000)%256;//TL0裝初值
  57.    EA=1;//開啟定時器總中斷
  58.    ET0=1;//開啟定時器0中斷開關
  59.    TR0=1;//啟動定時器0
  60. }
  61.   void LCD1602Display()//LCD1602字符型液晶顯示器顯示函數
  62. {
  63.    uchar j;//j表示數組元素個數變量
  64.    WriteCommand(0x80+0x00);//LCD1602字符型液晶顯示器第一行第一個位置顯示
  65.    for(j=0;j<10;j++)//有10個字符,要循環10次。
  66.   {
  67.     WriteData(table0[j]);//顯示字符串
  68.     Delay(5);
  69.    }
  70.    WriteCommand(0x80+0x40);//LCD1602字符型液晶顯示器第二行第一個位置顯示
  71.    for(j=0;j<8;j++)//有8個字符,要循環8次。
  72.   {
  73.     WriteData(table1[j]);//顯示字符串
  74.     Delay(5);
  75.    }
  76. }
  77.   void LCD1602DisplayTime(uchar address,uchar num)//LCD1602顯示時間兩位數分解函數
  78. {
  79.    uchar shi,ge;//十位、個位的變量
  80.    shi=num/10;//十位數
  81.    ge=num%10;//個位數
  82.    WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
  83.    WriteData(0x30+shi);//0x30表示字符庫的數字0,整個代碼表示十位可顯示0到9的數字。
  84.    WriteData(0x30+ge);//0x30表示字符庫的數字0,整個代碼表示個位可顯示0到9的數字。
  85. }
  86.   void LCD1602DisplayGeDigitResolve(uchar address,uchar num)//LCD1602字符型液晶顯示器顯示修改時間個位數分解函數
  87. {
  88.    uchar ge;//個位的變量
  89.    ge=num%10;//個位數
  90.    WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
  91.    WriteData(0x30+ge);//0x30表示字符庫的數字0,整個代碼表示個位可顯示0到9的數字。
  92. }
  93.   void LCD1602DisplayShiDigitResolve(uchar address,uchar num)//LCD1602字符型液晶顯示器修改時間十位數分解函數
  94. {
  95.    uchar shi;//十位變量
  96.    shi=num%10;//十位數
  97.    WriteCommand(0x80+0x40+address);//LCD1602字符型液晶顯示器第二行某個顯示位
  98.    WriteData(0x30+shi);//0x30表示字符庫的數字0,整個代碼表示十位可顯示0到9的數字。
  99. }
  100.   void KeyScan()//按鍵掃描函數
  101. {
  102.    if(S1==0)//判斷移位按鍵S1是否按下                                          
  103.   {
  104.     Delay(5);
  105.     if(S1==0)//再次判斷移位按鍵S1是否按下
  106.    {        
  107.      S1num++;//移位按鍵S1按鍵次數變量先賦值再自加
  108.      while(!S1);//等待移位按鍵S1彈起
  109.      switch(S1num)
  110.     {
  111.       case 1:
  112.              TR0=0;//關定時器0
  113.              S4num=0;//啟停按鍵S4按下次數清零
  114.              secondge=miao%10;//關掉定時器0定時后,把秒鐘計時時間數值取余賦給秒鐘個位顯示位。
  115.              secondshi=miao/10;//關掉定時器0定時后,把秒鐘計時時間數值取除賦給秒鐘十位顯示位。
  116.              WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第8個位置的顯示位
  117.              WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  118.              break;
  119.       case 2:
  120.              secondshi=secondshi;//關掉定時器0定時后,把秒鐘計時時間數值取除后得到的值再賦給秒鐘十位顯示位。
  121.              WriteCommand(0x80+0x40+0x06);//LCD1602字符型液晶顯示器第二行第7個位置的顯示位
  122.              WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  123.              break;
  124.       case 3:
  125.              minutange=fen%10;//關掉定時器0定時后,把分鐘計時時間數值取余賦給分鐘個位顯示位。
  126.              minutanshi=fen/10;//關掉定時器0定時后,把分鐘計時時間數值取除賦給分鐘十位顯示位。
  127.              WriteCommand(0x80+0x40+0x04);//LCD1602字符型液晶顯示器第二行第5個位置的顯示位
  128.              WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  129.              break;
  130.       case 4:
  131.              minutanshi=minutanshi;//關掉定時器0定時后,把分鐘計時時間數值取除后得到的值再賦給分鐘十位顯示位。
  132.              WriteCommand(0x80+0x40+0x03);//LCD1602字符型液晶顯示器第二行第4個位置的顯示位
  133.              WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  134.              break;
  135.       case 5:
  136.              hourge=shi%10;//關掉定時器0定時后,把時鐘計時時間數值取余賦給時鐘個位顯示位。
  137.              hourshi=shi/10;//關掉定時器0定時后,把時鐘計時時間數值取除賦給時鐘十位顯示位。
  138.              WriteCommand(0x80+0x40+0x01);//LCD1602字符型液晶顯示器第二行第2個位置的顯示位
  139.              WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  140.              break;
  141.       case 6:
  142.              hourshi=hourshi;//關掉定時器0定時后,把時鐘計時時間數值取除后得到的值再賦給時鐘十位顯示位。
  143.              WriteCommand(0x80+0x40+0x00);//LCD1602字符型液晶顯示器第二行第1個位置的顯示位
  144.              WriteCommand(0x0f);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  145.              break;
  146.       case 7:
  147.              WriteCommand(0x80+0x40+0x07);//LCD1602字符型液晶顯示器第二行第8個位置的顯示位
  148.              WriteCommand(0x0c);//開LCD1602字符型液晶顯示器顯示,開光標,開光標(或字符)閃爍。
  149.              TR0=1;//打開定時器0
  150.              S1num=0;//移位按鍵S1按鍵按下次數清零
  151.              break;
  152.      default:
  153.              S1num=0;//移位按鍵S1按鍵按下次數清零
  154.              break;
  155.     }
  156.   }
  157. }
  158.    if(S1num!=0)//判斷移位按鍵S1按鍵按下次數變量是否為0
  159.   {
  160.     if(S2==0)//判斷增加按鍵S2是否按下
  161.    {
  162.      if(S2==0)//判斷增加按鍵S2是否按下
  163.     {
  164.       Delay(5);
  165.       if(S2==0)//再次判斷增加按鍵S2是否按下
  166.      {
  167.        while(!S2);//等待增加按鍵S2彈起
  168.        switch(S1num)//移位按鍵S1按鍵按下次數變量選擇位
  169.       {
  170.         case 1://移位按鍵S1按鍵第一次按下
  171.                secondge++;//秒鐘個位數先賦值再加加
  172.                if(secondge==10)//判斷秒鐘個位數設定值是否達到10
  173.                secondge=0;//秒鐘個位數歸零
  174.                LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位的顯示數
  175.                WriteCommand(0x80+0x40+0x07);//寫入LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位
  176.                miao=secondshi*10+secondge;//移位修改秒鐘個位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  177.                break;
  178.         case 2://移位按鍵S1按鍵第二次按下
  179.                secondshi++;//秒鐘十位數先賦值再加加
  180.                if(secondshi==6)//判斷秒鐘十位數設定值是否達到6
  181.                secondshi=0;//秒鐘十位數歸零
  182.                LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位的顯示數
  183.                WriteCommand(0x80+0x40+0x06);//寫入LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位
  184.                miao=secondshi*10+secondge;//移位修改秒鐘十位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  185.                break;
  186.         case 3://移位按鍵S1按鍵第三次按下
  187.                minutange++;//分鐘個位數先賦值再加加
  188.                if(minutange==10)//判斷分鐘個位數設定值是否達到10
  189.                minutange=0;//分鐘個位數歸零
  190.                LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位的顯示數
  191.                WriteCommand(0x80+0x40+0x04);//寫入LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位
  192.                fen=minutanshi*10+minutange;//移位修改分鐘個位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  193.                break;
  194.         case 4://移位按鍵S1按鍵第四次按下
  195.                minutanshi++;//分鐘十位數先賦值再加加
  196.                if(minutanshi==6)//判斷分鐘十位數設定值是否達到6
  197.                minutanshi=0;//分鐘十位數歸零
  198.                LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶顯示器第二行第4個位置的分鐘十位顯示位的顯示數
  199.                WriteCommand(0x80+0x40+0x03);//寫入LCD1602字符型液晶顯示器第二行第7個位置的分鐘十位顯示位
  200.                fen=minutanshi*10+minutange;//移位修改分鐘十位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  201.                break;
  202.         case 5://移位按鍵S1按鍵第五次按下
  203.                hourge++;//時鐘個位數先賦值再加加
  204.                if(hourge==4)//判斷時鐘個位數設定值是否達到4
  205.                hourge=0;//時鐘個位數歸零
  206.                LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位的顯示數
  207.                WriteCommand(0x80+0x40+0x01);//寫入LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位
  208.                shi=hourshi*10+hourge;//移位修改時鐘個位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  209.                break;
  210.         case 6://移位按鍵S1按鍵第六次按下
  211.                hourshi++;//時鐘十位數先賦值再加加
  212.                if(hourshi==3)//判斷時鐘十位數設定值是否達到3
  213.                hourshi=0;//時鐘十位數歸零
  214.                LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶顯示器第二行第1個位置的時鐘十位顯示位的顯示數
  215.                WriteCommand(0x80+0x40+0x00);//寫入LCD1602第二行第1個位置的時鐘十位顯示位
  216.                shi=hourshi*10+hourge;//移位修改時鐘十位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  217.                break;
  218.        default:
  219.                S1num=0;//移位按鍵S1按鍵按下次數清零
  220.                break;
  221.       }
  222.      }
  223.     }
  224.     if(S3==0)//判斷減少按鍵S3是否按下
  225.    {
  226.      Delay(5);
  227.      if(S3==0)//再次判斷減少按鍵S3是否按下
  228.     {
  229.       while(!S3);//等待減少按鍵S3彈起
  230.       switch(S1num)//移位按鍵S1按鍵按下次數變量選擇位
  231.      {
  232.        case 1://移位按鍵S1按鍵第一次按下
  233.               secondge--;//秒鐘個位數先賦值再減減
  234.               if(secondge==-1)//判斷秒鐘個位數設定值是否達到-1
  235.               secondge=9;//秒鐘個位數歸9
  236.               LCD1602DisplayGeDigitResolve(0x07,secondge);//LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位的顯示數
  237.               WriteCommand(0x80+0x40+0x07);//寫入LCD1602字符型液晶顯示器第二行第8個位置的秒鐘個位顯示位
  238.               miao=secondshi*10+secondge;//移位修改秒鐘個位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  239.               break;
  240.        case 2://移位按鍵S1按鍵第二次按下
  241.               secondshi--;//秒鐘十位數先賦值再減減
  242.               if(secondshi==-1)//判斷秒鐘十位數設定值是否達到-1
  243.               secondshi=5;//秒鐘十位數歸5
  244.               LCD1602DisplayShiDigitResolve(0x06,secondshi);//LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位的顯示數
  245.               WriteCommand(0x80+0x40+0x06);//寫入LCD1602字符型液晶顯示器第二行第7個位置的秒鐘十位顯示位
  246.               miao=secondshi*10+secondge;//移位修改秒鐘十位顯示位的數值后,需要通過秒鐘十位顯示位的數值加上秒鐘個位顯示位的數值之和賦給秒鐘變量,才能在修改秒鐘個位或十位顯示位的數值后重新計時。(原因:秒鐘個位或十位顯示位的數值是在秒鐘的數值上分解得來,當秒鐘個位或十位顯示位的數值發生變化后,秒鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  247.               break;
  248.        case 3://移位按鍵S1按鍵第三次按下
  249.               minutange--;//分鐘個位數先賦值再減減
  250.               if(minutange==-1)//判斷分鐘個位數設定值是否達到-1
  251.               minutange=9;//分鐘個位數歸9
  252.               LCD1602DisplayGeDigitResolve(0x04,minutange);//LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位的顯示數
  253.               WriteCommand(0x80+0x40+0x04);//寫入LCD1602字符型液晶顯示器第二行第5個位置的分鐘個位顯示位
  254.               fen=minutanshi*10+minutange;//移位修改分鐘個位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  255.               break;
  256.        case 4://移位按鍵S1按鍵第四次按下
  257.               minutanshi--;//分鐘十位數先賦值再減減
  258.               if(minutanshi==-1)//判斷分鐘十位數設定值是否達到6
  259.               minutanshi=5;//分鐘十位數歸5
  260.               LCD1602DisplayShiDigitResolve(0x03,minutanshi);//LCD1602字符型液晶顯示器第二行第4個位置的分鐘十位顯示位的顯示數
  261.               WriteCommand(0x80+0x40+0x03);//寫入LCD1602字符型液晶顯示器第二行第7個位置的分鐘十位顯示位
  262.               fen=minutanshi*10+minutange;//移位修改分鐘十位顯示位的數值后,需要通過分鐘十位顯示位的數值加上分鐘個位顯示位的數值之和賦給分鐘變量,才能在修改分鐘個位或十位顯示位的數值后重新計時。(原因:分鐘個位或十位顯示位的數值是在分鐘的數值上分解得來,當分鐘個位或十位顯示位的數值發生變化后,分鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  263.               break;
  264.        case 5://移位按鍵S1按鍵第五次按下
  265.               hourge--;//時鐘個位數先賦值再減減
  266.               if(hourge==-1)//判斷時鐘個位數設定值是否達到-1
  267.               hourge=3;//時鐘個位數歸3
  268.               LCD1602DisplayGeDigitResolve(0x01,hourge);//LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位的顯示數
  269.               WriteCommand(0x80+0x40+0x01);//寫入LCD1602字符型液晶顯示器第二行第2個位置的時鐘個位顯示位
  270.               shi=hourshi*10+hourge;//移位修改時鐘個位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  271.               break;
  272.        case 6://移位按鍵S1按鍵第六次按下
  273.               hourshi--;//時鐘十位數先賦值再減減
  274.               if(hourshi==-1)//判斷時鐘十位數設定值是否達到-1
  275.               hourshi=2;//時鐘十位數歸2
  276.               LCD1602DisplayShiDigitResolve(0x00,hourshi);//LCD1602字符型液晶顯示器第二行第1個位置的時鐘十位顯示位的顯示數
  277.               WriteCommand(0x80+0x40+0x00);//寫入LCD1602字符型液晶顯示器第二行第1個位置的時鐘十位顯示位
  278.               shi=hourshi*10+hourge;//移位修改時鐘十位顯示位的數值后,需要通過時鐘十位顯示位的數值加上時鐘個位顯示位的數值之和賦給時鐘變量,才能在修改時鐘個位或十位顯示位的數值后重新計時。(原因:時鐘個位或十位顯示位的數值是在時鐘的數值上分解得來,當時鐘個位或十位顯示位的數值發生變化后,時鐘的數值也要變化,否則不能在原基礎上修改后重新計時,只能返回原基礎上計時。)
  279.               break;
  280.       default:
  281.               S1num=0;//移位按鍵S1按鍵按下次數清零
  282.               break;
  283.      }
  284.     }
  285.    }
  286.   }
  287.    if(S4==0)//判斷啟停按鍵S4是否按下
  288.   {
  289.     Delay(5);
  290.     if(S4==0)//再次判斷啟停按鍵S4是否按下
  291.    {
  292.      S4num++;//啟停按鍵S4按下次數先賦值再加加
  293.      while(!S4);//等待啟停按鍵S4彈起
  294.      if(S4num==1)//判斷啟停按鍵S4是否第一次按下過。實現直接停止。
  295.     {
  296.       TR0=0;//關定時器0
  297.      }
  298.      if(S1num>=1&&S4num==1)//判斷移位按鍵S1按鍵和啟停按鍵S4是否按下過。實現移位停止后,可移位修改時間數值或不修改時間數值,然后再啟動。
  299.     {
  300.       TR0=1;//開定時器0
  301.       WriteCommand(0x0c);//開LCD1602顯示,關光標,關光標(或字符)閃爍。
  302.       S4num=0;//啟停按鍵S4按下次數變量清零
  303.       S1num=0;//移位按鍵S1按鍵按下次數變量清零
  304.      }
  305.      if(S4num==2)//判斷移位按鍵S4按鍵是否第二次按下過
  306.     {
  307.       TR0=1;//開定時器0
  308.       S4num=0;//啟停按鍵S4按下次數變量清零
  309.      }
  310.     }
  311.    }
  312.   }
  313.   void Timer0() interrupt 1//定時器0中斷函數
  314. {
  315.    TH0=(65536-50000)/256;//TH0重新裝值
  316.    TL0=(65536-50000)%256;//TL0重新裝值
  317.    count++;//定時器0中斷次數先賦值再加
  318.    if(count==18)//判斷定時器0中斷次數是否為18次
  319.   {
  320.     count=0;//定時器0中斷次數歸零
  321.     miao++;//秒鐘先賦值再加
  322.     if(miao==60)//判斷秒鐘是否達到60秒
  323.    {
  324.      miao=0;//秒鐘歸零
  325.      fen++;//分鐘先賦值再加
  326.      if(fen==60)//判斷分鐘是否達到60分
  327.     {
  328.       fen=0;//分鐘歸零
  329.       shi++;//時鐘先賦值再加
  330.       if(shi==24)//判斷時鐘是否達到24時
  331.      {
  332.        shi=0;//時鐘歸零
  333.       }
  334.        LCD1602DisplayTime(0x00,shi);//時鐘顯示兩位數分解函數
  335.       }
  336.       LCD1602DisplayTime(0x03,fen);//分鐘顯示兩位數分解函數
  337.      }
  338.      LCD1602DisplayTime(0x06,miao);//秒鐘顯示兩位數分解函數                 
  339.     }        
  340.    }
  341.    void main()//主函數
  342. {
  343.     LCD1602Init();//LCD1602字符型液晶顯示器初始化函數
  344.     Timer0Init();//定時器0初始化函數
  345.     LCD1602Display();//LCD1602字符型液晶顯示器顯示函數
  346.     while(1)
  347.   {
  348.      KeyScan();//按鍵掃描函數               
  349.     }
  350. }
復制代碼



作者: 天道酬情    時間: 2020-4-26 13:38
程序夠詳細,謝謝分享
作者: 51黑電子會員    時間: 2020-5-6 19:59
天道酬情 發表于 2020-4-26 13:38
程序夠詳細,謝謝分享

不客氣
作者: 劉鉦    時間: 2020-5-15 15:53
樓主,程序中減數沒能實現的了
作者: 51黑電子會員    時間: 2020-5-15 20:49
劉鉦 發表于 2020-5-15 15:53
樓主,程序中減數沒能實現的了

是嗎  我看看
作者: 51黑電子會員    時間: 2020-5-15 20:52
劉鉦 發表于 2020-5-15 15:53
樓主,程序中減數沒能實現的了

可以減的喔  再仔細看看哦
作者: yiwangt    時間: 2020-5-19 14:06
問一下代碼編譯不了

捕獲.PNG (327.81 KB, 下載次數: 25)

捕獲.PNG

作者: yiwangt    時間: 2020-5-19 14:47
樓主,你發的代碼第313行的前面差一個”}“號,不然編譯不了
作者: xllin    時間: 2020-5-20 10:35

謝謝分享




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩av网址在线观看 | 91精品国产综合久久久动漫日韩 | av片毛片 | 欧美激情精品久久久久久 | 久久久高清| 色综合av | 久久久国产一区二区三区 | 在线免费毛片 | 日韩一级免费看 | 在线区 | 精品亚洲一区二区三区四区五区 | 国产91色在线 | 亚洲 | 欧美二级 | 国产综合精品一区二区三区 | 国产精品久久久久久久久久久久久 | 日韩在线小视频 | 插插宗合网 | 午夜三级网站 | 国产精品一二三区 | 国产精品一区二区三区四区 | 国产在线a | 久久久久国产视频 | 亚洲永久| 在线一区视频 | 日本在线免费视频 | 国产特黄一级 | 国产精品久久毛片av大全日韩 | 国产成人一区二 | 日韩三级电影在线看 | 国产成人精品一区二三区在线观看 | 综合久久av | www.国产| 欧美日韩久久久 | 日韩av一区二区在线观看 | 久久国产精品无码网站 | 精品视频一区二区三区四区 | 日韩欧美久久 | 国产精品亚洲综合 | 欧洲视频一区二区 | 国产视频二区 | 欧一区二区|