当前位置:网站首页 > Go语言开发 > 正文

时钟代码c语言怎么写(时钟代码c语言怎么写出来)



  1.                                                                                                                                                                                 

  2.       #include<stc8g.h>

  3.       #include  "intrins.h"



  4.       sbit sw1 = P3^1;

  5.       sbit sw2 = P3^2;

  6.       sbit sw3 = P3^3;

  7.       sbit sw4 = P3^4;

  8.       sbit sw5 = P3^5;

  9.       sbit sw6 = P3^6;

  10.       sbit sw7 = P3^7;

  11.       

  12.       sbit SWEN = P1^6;  //按键选通口       

  13. sbit LED_P31 = P3^1;       // 低电平发亮



  14.       sbit RUN_TST= P5^4; //检测输入,低电平时确认有测试动作

  15. sbit OUT1 = P5^5; //第1路输出  高电平时接通

  16. sbit BUZ = P3^0; //报警输出,为0时有响声

  17.       sbit POW_TST = P1^7;  //电压过低检测输入,输入为低电平时即电压过低





  18. sbit LCD_D0  =  P1^2;

  19. sbit  LCD_D1  =  P1^3 ;

  20. sbit  LCD_D2  =  P3^2 ;

  21. sbit  LCD_D3  =  P3^3 ;

  22. sbit  LCD_D4  =  P3^4 ;

  23. sbit  LCD_D5  =  P3^5 ;

  24. sbit  LCD_D6  =  P3^6 ;

  25. sbit  LCD_D7  =  P3^7;

  26. sbit  LCD_RS  =  P1^0; //LCD1602 的 RS端  ,1-数据,0-指令

  27. sbit  LCD_EN  =  P1^1 ;  //LCD1602 的 E端 ,先从低变高,再变低,以确认输入数据或命令

  28. //-----------------------------------------------------------------------------------------

  29.                         //iic串口控制寄存器定义       下面宏定义来自STC官网的例程

  30.      

  31.       #define I2CCFG       (*(unsigned char volatile xdata *)0xfe80)  // #define又称宏定义,标识符为所定义的宏名,简称宏。

  32.       #define I2CMSCR       (*(unsigned char volatile xdata *)0xfe81) //volatile的本意是“易变的”

  33.       #define I2CMSST       (*(unsigned char volatile xdata *)0xfe82)

  34.       #define I2CSLCR       (*(unsigned char volatile xdata *)0xfe83)

  35.       #define I2CSLST       (*(unsigned char volatile xdata *)0xfe84)

  36.       #define I2CSLADR       (*(unsigned char volatile xdata *)0xfe85)

  37.       #define I2CTXD       (*(unsigned char volatile xdata *)0xfe86)

  38.       #define I2CRXD       (*(unsigned char volatile xdata *)0xfe87)

  39.       #define I2CMSAUX       (*(unsigned char volatile xdata *)0xfe88)



  40.    sbit SDA = P1^4;

  41.    sbit SCL = P1^5;      



  42.       unsigned char xdata I2C_ADDR1; //I2C从器件的硬件地址存放点

  43.       unsigned char xdata I2C_ADDR2; //I2C从器件的数据地址首址存放点

  44.       unsigned char xdata I2C_X;  //I2C数据每次存放或取出个数,最大16字节

  45.       unsigned char xdata I2C_i=0; //主器件的数据地址首址

  46. //--------------------------------------------------------------------------

  47. #define ADCTIM (*(unsigned char volatile xdata *)0xfea8)       //ADC转换控制寄存器定义





  48.       

  49.       unsigned char xdata LCD1602RAM1[2][16]={

  50.       {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20},                //LCD1602的缓存,初始值是空格20H

  51.       {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20}

  52.       };

  53.      

  54.       unsigned char xdata I2C_1[64]={          //I2C读或写的临时缓存

  55.       0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

  56.       0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

  57.       0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

  58.       0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,

  59.       };



  60.                //

  61.          unsigned char xdata kkeysta[7] ={ //全部按键的当前状态

  62.                         1,1,1,1,1,1,1,

  63.          };



  64.          signed char xdata SWJC1=0; //用于按键位置计数,带符号整形,用以小于0的计数判断



  65.       //---------------------时间存放 每个变量存放一个BCD数



  66.       unsigned char xdata SEC1; //秒个位

  67.       unsigned char xdata SEC10; //秒十位

  68.       unsigned char xdata MIN1=0; //分个位

  69.       unsigned char xdata MIN10; //分十位

  70.       unsigned char xdata HOUR1; //时个位

  71.       unsigned char xdata HOUR10; //时十位

  72.       unsigned char xdata DAY1;    //日个位

  73.       unsigned char xdata DAY10;    //日十位

  74.       unsigned char xdata MONTH1;       //月个位

  75.       unsigned char xdata MONTH10;       //月十位

  76.       unsigned char xdata YEAR1;    //年个位

  77.       unsigned char xdata YEAR10;    //年十位



  78.       //-----------------------------------------------



  79.       unsigned char bdata LCD1602RAM2;  //LCD1602的写入缓冲

  80.       sbit LCD1602RAM2_D0= LCD1602RAM2^0;

  81.       sbit LCD1602RAM2_D1= LCD1602RAM2^1;

  82.       sbit LCD1602RAM2_D2= LCD1602RAM2^2;

  83.       sbit LCD1602RAM2_D3= LCD1602RAM2^3;

  84.       sbit LCD1602RAM2_D4= LCD1602RAM2^4;

  85.       sbit LCD1602RAM2_D5= LCD1602RAM2^5;

  86.       sbit LCD1602RAM2_D6= LCD1602RAM2^6;

  87.       sbit LCD1602RAM2_D7= LCD1602RAM2^7;



  88.          unsigned int xdata nsec1=0;       //用于闪烁显示的时间计数

  89.      

  90.          unsigned char fabc1 = 0; //计数标志

  91.       unsigned char xdata SW7_S1=0;       //按键SW7的长按标志1

  92.       unsigned int xdata SW7_S2=0;       //按键SW7的长按计时

  93.       //-------------------------------------------------------------

  94.          void keysm();          //按键扫描函数

  95.          void keycl();          //按键处理函数



  96.          void SWABC1(); //时间数值调整函数

  97.          void SET_RTC(); //设置好的数据保存到RX8025T

  98.       //

  99.       void LCD_SC1();    ////全屏显示数据写入程序

  100.       void SCXL(); //LCD闪烁显示操作

  101.       //----------------------

  102.       void RX8025T_BCD(); //BCD数据转换成两字节       ,RX8025读出的数分离出两字节BCD数

  103.       

  104.       //---------------------------------



  105.       void LCD1602ZL();  //LCD1602指令写入函数

  106.          void LCD1602SZ();  //LCD1602数据写入函数

  107.       void LCD1602CCH();  //LCD1602初始化函数

  108.       void LCD1602SC();       //LCD1602全屏写入函数



  109.       //------------------------------------------------------

  110.             void I2C_RX(); //I2C多字节读出,1到16字节

  111.       void I2C_TX(); //I2C多字节写入,1到16字节

  112.       //--------------------------------------------------

  113.       void rx8025t_RX(); //RX8025T读出函数

  114.       void rx8025t_TX(); //RX8025T写入函数

  115.          void I2C_1_CLR(); //缓存数据清除



  116.       void delay_ms(unsigned int ms);                                     //函数声明       ,延时函数

  117.       void Delay60us();       //60us延时,用于LCD1602写入数据

  118.       void SecJC();       //定时执行操作(里面嵌套需要定期执行操作的函数,最短定期时间是1ms)





  119.       #define MAIN_Fosc L //定义主时钟,  自定义变量 ,L是长整型的意思 这段代码源自 STC官网例程





  120.       void main()

  121.       {



  122. P0M0=0x00;

  123.       P0M1=0x00;

  124. P1M0=0x00;

  125.       P1M1=0x00;

  126. P2M0=0x00;

  127.       P2M1=0x00;

  128. P3M0=0x00;

  129.       P3M1=0x00;

  130. P5M0=0x00;

  131.       P5M1=0x00;

  132.       OUT1=0;

  133.    BUZ=1;

  134.       LED_P31=1;

  135.    AUXR |= 0x04;             //定时器时钟1T模式

  136.       T2L = 0xCD;             //设置定时初值

  137.       T2H = 0xD4;             //设置定时初值

  138.       AUXR |= 0x10;             //定时器2开始计时

  139.       IE2 = 0x04;      

  140.       P_SW2 =0x80;             //D7位控制访问扩展SFR特殊寄存器       ,D4 D5位控制选用某端口做I2C的SCL SDA

  141.       //I2C初始设置

  142.       I2CCFG=0xE0; // I2C允许和速度控制寄存器

  143.       I2CMSST=0x00;



  144.       LCD1602CCH();             //LCD1602初始化

  145.       

  146. EA = 1; //中断使能       

  147.       

  148.       //主函数//

  149.       while (1)    //下面重复循环

  150.       {



  151.       SecJC();       //计数和BCD转换函数      

  152.          LCD1602SC();          //LCD1602全屏写入函数

  153.          LCD_SC1();    //数据显示程序 1

  154.          keycl();       //按键处理函数

  155.      

  156.       }

  157.       }

  158.       ////////////////*



  159.       /*计数*/



  160.       void SecJC()       //定时执行操作(里面嵌套需要定期执行操作的函数,最短定期时间是1ms)

  161.       {

  162.       static unsigned int cnt = 0; // 1ms计数到1秒

  163.       static unsigned long nsec = 9999; // 秒计数

  164.       if(fabc1==1)

  165.       {

  166.       fabc1 =0; //清计数标志



  167.       cnt++;

  168.       if(cnt>=100)

  169.       {

  170.          cnt=0;

  171.          nsec--;                                     //段用于测试和显示正在计时

  172.                      LCD1602RAM1[1][3] = (nsec%10)+0x30;             //个位

  173.             LCD1602RAM1[1][2] = (nsec/10%10)+0x30;          //十位

  174.             LCD1602RAM1[1][1] = (nsec/100%10)+0x30;       //百位

  175.             LCD1602RAM1[1][0] = (nsec/1000%10)+0x30;       //千位

  176.       if(SWJC1==0)                //       ---只有设置键没按下时才读出时钟数

  177.       {

  178.          rx8025t_RX(); //RX8025T读出函数  

  179.             RX8025T_BCD();       //RX8025T时钟BCD数据转换成两字节

  180.          }

  181.       }

  182.       nsec1++; //用于闪烁显示的计数

  183.       if(nsec1>800)

  184.       {

  185.             nsec1=0;

  186.             }

  187.             }

  188.             }



  189.             //* 定时器0中断服务函数 */

  190.             void InterruptTimer2() interrupt 12

  191.             {



  192.       fabc1=1; //设置计数标志为1

  193.                keysm(); //按键扫描函数

  194.            

  195.                   }



  196.       //以下是按键程序

  197.                ///////////////////////////////////////////////////////



  198.       //按键扫描函数       1行7个键 【按键扫描和处理函数参照书本《手把手教你学51单片机-C语言版》清华大学出版社, 第119页】





  199.       void keysm()

  200.       {

  201.       unsigned char i;

  202.       unsigned char push1; //暂时存放按键端口此前的值



  203.      

  204.       static unsigned char xdata keybuf[7] = { //1行7个键 7个缓冲字节

  205.                      0xff,0xff,0xff,0xff,0xff,0xff,0xff};

  206.                     

  207.          SWEN=0;

  208.          push1=P3;       //暂时保存P3口原来的值  ,这里用P3口作按键扫描输入

  209.          P3=0xff;

  210.            

  211.               

  212.                               //将一行的8个键值移入缓冲区

  213.             keybuf[0]=(keybuf[0]<<1)|sw1;

  214.             keybuf[1]=(keybuf[1]<<1)|sw2;

  215.             keybuf[2]=(keybuf[2]<<1)|sw3;

  216.             keybuf[3]=(keybuf[3]<<1)|sw4;

  217.             keybuf[4]=(keybuf[4]<<1)|sw5;

  218.             keybuf[5]=(keybuf[5]<<1)|sw6;

  219.             keybuf[6]=(keybuf[6]<<1)|sw7;          



  220.             //消抖和更新键值



  221.             for(i=0; i<7;i++)       //每行7个键

  222.             {

  223.             if((keybuf[i] & 0x0f) == 0x00)       //移入的键值 与  0x0f,如果是4次都是0(按下),那就是0x00输出

  224.             {                                                                               //如果4次都是1,那就是没按下或弹上。

  225.             kkeysta[i] = 0;

  226.                                                                                              //如果其他值,那就是有抖动

  227.          }

  228.          else if((keybuf[i] & 0x0f) == 0x0f)

  229.          {

  230.          kkeysta[i] = 1;

  231.                                                                                  //每个键的实时情况反映在keysta[行]上,

  232.          }

  233.          }

  234.          P3=push1; //恢复此前P3的值

  235.          SWEN=1;

  236.          }

  237.       //---------------------------------------------------------------





  238.                      void keycl()          //按键处理函数       【按键扫描和处理函数参照书本《手把手教你学51单片机-C语言版》清华大学出版社, 第119页】



  239.             {



  240.       static unsigned char xdata backup[7] = { //1行*7按键值备份的当前状态       

  241.                                           1,1,1,1,1,1,1};                //加入static是静态局部变量,上电后只执行一次

  242.            

  243.                         //////////sw1       处理程序

  244.                   if(backup[0] != kkeysta[0])       //如果本次按钮值与上一次不同,那执行下一句,否则就跳过到下一组

  245.             {

  246.                      if(backup[0] == 0)       //如果按键值是0,那就是有按下,那执行一下句操作,

  247.                      {

  248.                   SWJC1--;             //按键减计数,显示闪烁位置右移*

  249.                      if(SWJC1<0)

  250.                      {SWJC1=6;}

  251.                     

  252.                     

  253.                      }

  254.                      backup[0] = kkeysta[0]; //更新备份

  255.                      }

  256.                     

  257.                      //////////sw2 处理程序



  258.                         if(backup[1] != kkeysta[1])

  259.             {

  260.                      if(backup[1] == 0)

  261.                      {

  262.                   SWJC1++;             //按键加计数,显示闪烁位置左移*

  263.                      if(SWJC1>=7)

  264.                      {SWJC1=0;}

  265.                     

  266.                      }

  267.                      backup[1] = kkeysta[1]; //更新备份

  268.                      }



  269.                         //////////sw3 处理程序



  270.                         if(backup[2] != kkeysta[2])

  271.             {

  272.                      if(backup[2] == 0)

  273.                      {

  274.                   //LED_P31 = ~LED_P31;                         //测试语句  //*这条就是SW3对应执行的内容

  275.                      SWABC1(); //时间数值调整函数

  276.                      }

  277.                      backup[2] = kkeysta[2]; //更新备份

  278.                      }



  279.            

  280.                //////////sw4 处理程序



  281.                         if(backup[3] != kkeysta[3])

  282.             {

  283.                      if(backup[3] == 0)

  284.                      {

  285.                   //LED_P31 = ~LED_P31;                         //测试语句  //*这条就是SW3对应执行的内容      

  286.                      SET_RTC();          //设置好的数据保存到RX8025T

  287.                      }

  288.                      backup[3] = kkeysta[3]; //更新备份

  289.                      }

  290.                //////////sw5  处理程序



  291.                         if(backup[4] != kkeysta[4])

  292.             {

  293.                      if(backup[4] == 0)

  294.                      {

  295.                   LED_P31 = ~LED_P31;                         //测试语句  //*这条就是SW4对应执行的内容

  296.                     

  297.                      }

  298.                      backup[4] = kkeysta[4]; //更新备份

  299.                      }



  300.                //////////sw6 处理程序



  301.                         if(backup[5] != kkeysta[5])

  302.             {

  303.                      if(backup[5] == 0)

  304.                      {

  305.                   LED_P31 = ~LED_P31;                         //LED灯取反 测试语句

  306.                      SWJC1=0;    // SWJC1计数置0,退设置操作



  307.                      }

  308.                      backup[5] = kkeysta[5]; //更新备份

  309.                      }



  310.                      //////////sw7 处理程序



  311.                         if(backup[6] != kkeysta[6])

  312.             {

  313.                      if(backup[6] == 0)

  314.                      {

  315.                     



  316.                      I2C_1_CLR();    // 缓存数据清除  

  317.                      }



  318.                      backup[6] = kkeysta[6]; //更新备份

  319.                      }



  320.               



  321.                      //sw7 长按处理程序

  322.                      if(kkeysta[6]==0)

  323.                {                

  324.                SW7_S1=1;  //如果sw7按下那就置位标志作计时用

  325.               

  326.                }

  327.                if(kkeysta[6]==1)

  328.                {

  329.                      SW7_S1=0;       //如果SW7弹开,那标志关闭

  330.                      SW7_S2=0;    //清除计时

  331.                      //BUZ=1;             //测试语句

  332.                      //LED_P31 =1;       //熄灭LED       测试语句

  333.                      }

  334.                }



  335.       //---------------------------------------------------------



  336.             //以上是按键程序



  337.                                                

  338.       



  339.             void Delay60us()             //@11.0592MHz       60us延时       源自stc-isp软件生成

  340.       {

  341.       unsigned char i, j;



  342.       _nop_();

  343.       i = 1;

  344.       j = 162;

  345.       do

  346.       {

  347.             while (--j);

  348.       } while (--i);

  349.       }



  350.       void delay_ms(unsigned int ms)    //延时函数,ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.

  351. {                                                          //       延时函数 源自 STC官网例程

  352.    unsigned int i;

  353.    do{

  354.       i = MAIN_Fosc / 13000;

  355.       while(--i) ; //14T per loop

  356.    }while(--ms);

  357. }





  358.                      //LCD1602指令写入 *下面所有LCD1602操作的程序都是梁百万 参照网上前辈的程序重新编写

  359.                      void LCD1602ZL()

  360.                      {

  361.                      LCD_RS=0;

  362.                      LCD_EN=1;

  363.                LCD_D0=LCD1602RAM2_D0;

  364.                LCD_D1=LCD1602RAM2_D1;

  365.                LCD_D2=LCD1602RAM2_D2;

  366.                LCD_D3=LCD1602RAM2_D3;

  367.                LCD_D4=LCD1602RAM2_D4;

  368.                LCD_D5=LCD1602RAM2_D5;

  369.                LCD_D6=LCD1602RAM2_D6;

  370.                LCD_D7=LCD1602RAM2_D7;

  371.                   LCD_EN=0;                //E,下降沿,让LCD读取

  372.                      Delay60us();  //延时80us



  373.                      }



  374.                //LCD1602数据写入

  375.                      void LCD1602SZ()

  376.                {

  377.                      LCD_RS=1;

  378.                      LCD_EN=1;

  379.                LCD_D0=LCD1602RAM2_D0;

  380.                LCD_D1=LCD1602RAM2_D1;

  381.                LCD_D2=LCD1602RAM2_D2;

  382.                LCD_D3=LCD1602RAM2_D3;

  383.                LCD_D4=LCD1602RAM2_D4;

  384.                LCD_D5=LCD1602RAM2_D5;

  385.                LCD_D6=LCD1602RAM2_D6;

  386.                LCD_D7=LCD1602RAM2_D7;

  387.                   LCD_EN=0;  //E,下降沿,让LCD读取

  388.                      Delay60us();  //延时80us



  389.                      }



  390.                      //LCD1602初始化

  391.                      void LCD1602CCH()

  392.                      {

  393.                     

  394.                      LCD1602RAM2=0;

  395.                      delay_ms(15);       //延时15毫秒

  396.                      LCD1602RAM2=0x38;  //;16行*2,5*8

  397.                      LCD1602ZL();       //写入指令

  398.                delay_ms(5);       //延时5毫秒

  399.                LCD1602RAM2=0x38;  //;16行*2,5*8

  400.                      LCD1602ZL();       //写入指令

  401.                delay_ms(5);       //延时5毫秒

  402.                LCD1602RAM2=0x08; // 关显示

  403.                LCD1602ZL();       //写入指令

  404.                delay_ms(1);       //延时1毫秒

  405.                LCD1602RAM2=0x01;       //清屏

  406.                LCD1602ZL();       //写入指令

  407.                delay_ms(5);       //延时5毫秒

  408.                LCD1602RAM2=0x06;       //;地址计数器AC自动加1,光标右移 *

  409.                delay_ms(1);       //延时1毫秒

  410.                LCD1602RAM2=0x0C;       //开显示

  411.                LCD1602ZL();       //写入指令

  412.                delay_ms(1);       //延时1毫秒

  413.               

  414.                }





  415.                //------------------------------------------------------------------------



  416.               

  417.             void LCD_SC1()    //全屏显示数据写入程序       把RX8025T分离出来后的BCD数据送到显示缓存,

  418.                   {                               //跟着在显示程序void LCD1602SC()那写入到显示屏

  419.                      LCD1602RAM1[0][0] ='2';                         //年的2

  420.                               LCD1602RAM1[0][1] ='0'; //年的0



  421.                      LCD1602RAM1[0][2] =YEAR10 + 0x30;  //年十位

  422.                               LCD1602RAM1[0][3] =YEAR1 + 0x30;  //年个位

  423.                              

  424.                               LCD1602RAM1[0][4] =       '/';                //分隔符



  425.                      LCD1602RAM1[0][5] =MONTH10 + 0x30;  //月十位

  426.                               LCD1602RAM1[0][6] =MONTH1 + 0x30;  //月个位



  427.                               LCD1602RAM1[0][7] ='/';                //分隔符



  428.                      LCD1602RAM1[0][8] =DAY10 + 0x30;  //日十位

  429.                               LCD1602RAM1[0][9] =DAY1 + 0x30;  //日个位



  430.                               LCD1602RAM1[0][10] ='/';                //分隔符



  431.                      LCD1602RAM1[0][11] =HOUR10 + 0x30;  //时十位

  432.                               LCD1602RAM1[0][12] =HOUR1 + 0x30;  //时个位  



  433.                               LCD1602RAM1[0][13] =':';                //分隔符



  434.                      LCD1602RAM1[0][14] =MIN10 + 0x30;  //分十位         

  435.                               LCD1602RAM1[0][15] =MIN1+0x30;  //分个位





  436.                      //LCD1602RAM1[1][0] =1+0X30;

  437.                               //LCD1602RAM1[1][1] =1+0X30;



  438.                      // LCD1602RAM1[1][2] =       1+0X30;

  439.                         //LCD1602RAM1[1][3] =       1+0X30;

  440.                              

  441.                               LCD1602RAM1[1][4] =       0X20;



  442.                      LCD1602RAM1[1][5] =0X20;

  443.                               LCD1602RAM1[1][6] =0X20;



  444.                               LCD1602RAM1[1][7] =       0X20;



  445.                      LCD1602RAM1[1][8] = 0X20;

  446.                               LCD1602RAM1[1][9] =       0X20;



  447.                               LCD1602RAM1[1][10] = 0X20;



  448.                      LCD1602RAM1[1][11] = 0X20;



  449.                               LCD1602RAM1[1][12] =0X20;

  450.                               LCD1602RAM1[1][13] =0X20;

  451.                      LCD1602RAM1[1][14] =SEC10+0X30;  //秒十位

  452.            



  453.                               LCD1602RAM1[1][15] =SEC1+0X30;  //秒个位



  454.                               SCXL(); //LCD闪烁显示操作       //       调用大于0.6秒就对应键计数给对应缓存填上0X20

  455.                            }





  456.                         void I2C_1_CLR() //缓存数据清除

  457.                         {

  458.                         unsigned char i=8;



  459.                         while(i--)

  460.                         { I2C_1[i]=0x00;       }

  461.                         }

  462.                      //---------------------------------------------------------------



  463.                      // LCD1602全屏显示程序,16字*2行



  464.                void LCD1602SC()

  465.                {

  466.                unsigned char i=16;       //每行的个数计数

  467.                unsigned char x=0;                //行数

  468.                unsigned char y=0;             //列数

  469.               

  470.                LCD1602RAM2=0x80; //这个是LCD第1行的地址

  471.                LCD1602ZL(); //以地址/指令形式发送到LCD1602



  472.                while(i--)

  473.                {

  474.                LCD1602RAM2=LCD1602RAM1[0][y];

  475.                LCD1602SZ(); //以数据形式发送到LCD1602

  476.                y++;

  477.                };



  478.             LCD1602RAM2=0xC0; //这个是LCD第2行的地址

  479.                LCD1602ZL(); //以地址/指令形式发送到LCD1602

  480.                i=16       ;                //每行的个数计数

  481.                y=0;       //每行的个数

  482.                while(i--)

  483.                {

  484.                LCD1602RAM2=LCD1602RAM1[1][y];

  485.                LCD1602SZ(); //以数据形式发送到LCD1602

  486.                y++;

  487.                };

  488.                }          



  489.             //----------------------------------------------



  490.                void SCXL() //LCD闪烁显示操作       用于设置时某位的显示闪烁

  491.                {

  492.                if(SWJC1>=1)

  493.                {

  494.                      if(nsec1>600)       //大于0.6秒就在对应位置空格  SWJC1中设置按键对应数

  495.                      {

  496.                      if(SWJC1==1)

  497.                      {

  498.                      LCD1602RAM1[0][15]=0x20;

  499.                      }



  500.                      if(SWJC1==2)

  501.                      {

  502.                      LCD1602RAM1[0][14]=0x20;

  503.                      }

  504.                     

  505.                      if(SWJC1==3)

  506.                      {

  507.                      LCD1602RAM1[0][12]=0x20;

  508.                      LCD1602RAM1[0][11]=0x20;

  509.                      }

  510.                      if(SWJC1==4)

  511.                      {

  512.                      LCD1602RAM1[0][9]=0x20;

  513.                      LCD1602RAM1[0][8]=0x20;

  514.                      }

  515.                      if(SWJC1==5)

  516.                      {

  517.                      LCD1602RAM1[0][6]=0x20;

  518.                      LCD1602RAM1[0][5]=0x20;

  519.                      }

  520.                      if(SWJC1==6)

  521.                      {

  522.                      LCD1602RAM1[0][3]=0x20;

  523.                      LCD1602RAM1[0][2]=0x20;

  524.                      }



  525.                      else;

  526.                      }

  527.                      }

  528.                      }



  529.                //--------------------------------------------------------



  530.          // 硬件I2C串口       程序       参照STC官方文档有关I2C硬件操作的程序,由梁百万重新编写

  531.                                                 //下面的I2C读写函数可以读写8位地址的器件,如24C01~24C16, DS1307,RX8025T

  532.          //变量说明

  533.          //unsigned char xdata I2C_ADDR1    ;从器件的硬件地址

  534.             //unsigned char xdata I2C_ADDR2    ;从器件的数据地址首址

  535.             //unsigned char xdata I2C_X; 数据每次存放或取出的字节数,1到256字节

  536.             //unsigned char xdata I2C_i; //主器件缓存的数据地址首址       (1维数组的个数计数变量)

  537.             //unsigned char xdata I2C_1[16]       // 主器件缓存 ,用变量I2C_i作位置计数

  538.       

  539.                //I2C多字节写入,1到16字节



  540.                void I2C_TX() //I2C多字节写入,1到16字节

  541.             {

  542.                I2C_i=0;       //主器件缓存的数据地址首址

  543.                            //第1步,起始+发送硬件地址+接收ACK

  544.                I2CTXD=I2C_ADDR1; //从器件的硬件地址

  545.                I2CMSCR=0x09;  //此命令是 START+SDATA+ACK

  546.               

  547.                while (!(I2CMSST & 0x40)); //检查是否发送完成

  548.       I2CMSST &= ~0x40;



  549.                   //第2步,发送从器件的数据地址首址+接收ACK

  550.                I2CTXD=I2C_ADDR2; //从器件的数据地址首址

  551.                I2CMSCR=0x0a; //此命令是SDATA+ACK

  552.                        

  553.                while (!(I2CMSST & 0x40));  //检查是否发送完成

  554.          I2CMSST &= ~0x40;



  555.                while(I2C_X--)       //第3步,主器件的缓存上写入多个数据到从器件

  556.                {

  557.                I2CTXD=I2C_1[I2C_i];//主器件缓存的数据地址首址

  558.                I2CMSCR=0x0a; //此命令是SDATA+ACK

  559.                        

  560.                while (!(I2CMSST & 0x40));       //检查是否发送完成

  561.          I2CMSST &= ~0x40;       

  562.                I2C_i++; //主器件缓存的数据地址加1

  563.                }

  564.                      //第4步,发送停止信号命令

  565.                I2CMSCR=0x06; //停止信号命令

  566.               

  567.                while (!(I2CMSST & 0x40));  //检查是否发送完成

  568.       I2CMSST &= ~0x40;

  569.       I2CMSST &= ~0x40;  

  570.                }



  571.                //--------------------------------------------------



  572.                //I2C多字节读出,1到16字节



  573.                void I2C_RX() //I2C多字节读出,1到16字节

  574.                {

  575.               

  576.                I2C_i=0;       //主器件缓存的数据地址首址

  577.               

  578.                   //第1步,起始+发送硬件地址+接收ACK

  579.                I2CTXD=I2C_ADDR1; //从器件的硬件地址

  580.                I2CMSCR=0x09;  //此命令是 START+SDATA+ACK

  581.                while (!(I2CMSST & 0x40)); //检查是否发送完成

  582.       I2CMSST &= ~0x40;

  583.               

  584.                            //第2步,发送从器件的数据地址首址+接收ACK

  585.                I2CTXD=I2C_ADDR2; //从器件的数据地址首址

  586.                I2CMSCR=0x0a; //此命令是SDATA+ACK

  587.                        

  588.                while (!(I2CMSST & 0x40));  //检查是否发送完成

  589.          I2CMSST &= ~0x40;



  590.                I2C_ADDR1++;  //对硬件地址由写入改成读出,  地址数据D0位是1为读,0为写

  591.                            //第3步,再次发送,起始+发送硬件地址 读+接收ACK

  592.                I2CTXD=I2C_ADDR1; //从器件的硬件地址

  593.                I2CMSCR=0x09;  //此命令是 START+SDATA+ACK

  594.                

  595.                while (!(I2CMSST & 0x40)); //检查是否发送完成

  596.       I2CMSST &= ~0x40;



  597.                while(I2C_X--)       //第4步,读出多个数据并存放到缓存上

  598.                {

  599.                I2CMSCR=0x0b; //此命令是 接收数据+发送ACK

  600.                while (!(I2CMSST & 0x40)); //检查是否发送完成

  601.       I2CMSST &= ~0x40;



  602.                I2C_1[I2C_i]=I2CRXD       ;  //读出后要传送到需要的寄存器

  603.                I2C_i++; //主器件缓存的数据地址加1

  604.                }

  605.                               //第5步,发出非应答信号NACK,

  606.                I2CMSCR=0x0c; //此命令是 接收数据+发送NACK

  607.                        

  608.                while (!(I2CMSST & 0x40));       //检查是否发送完成

  609.          I2CMSST &= ~0x40;



  610.                         //第6步,停止

  611.                I2CMSCR=0x06; //停止信号命令

  612.                while (!(I2CMSST & 0x40)); //检查是否发送完成

  613.       I2CMSST &= ~0x40;

  614.                }



  615.                //--------------------------------------------------------





  616.                   void rx8025t_RX()             //RX8025T读出函数

  617.                   {

  618.                         I2C_ADDR1=0x64; // RX8025T硬件地址0x64, 24C04地址0ACH

  619.                         I2C_ADDR2=0x00;       //从器件需要读出的地址首址

  620.                         I2C_X=8;                      //需要读出的字节数

  621.                         I2C_i=0x00; //缓存首址

  622.                         I2C_RX();       //读出数据

  623.                         }







  624.                void rx8025t_TX() //RX8025T写入函数

  625.                   {

  626.                         I2C_ADDR1=0x64; // RX8025T硬件地址0x64, 24C04地址0ACH

  627.                      I2C_ADDR2=0x00;       //从器件需要写入的地址首址

  628.                         I2C_X=8;                      //需要写入的字节数

  629.                         I2C_i=0x00; //缓存首址

  630.                         I2C_TX();       //写入数据

  631.                         }





  632.                void RX8025T_BCD()       //BCD数据转换成两字节

  633.                {

  634.                SEC1=(I2C_1[0]) & 0x0f;       //取秒个位值

  635.                SEC10=(I2C_1[0] & 0xf0)/16;          //取秒十位值

  636.                MIN1=(I2C_1[1]) & 0x0f;       //取分个位值

  637.                MIN10=(I2C_1[1] & 0xf0)/16;       //取分十位值

  638.                HOUR1=(I2C_1[2]) & 0x0f;       //取时个位值

  639.                HOUR10=(I2C_1[2] & 0xf0)/16;//取时十位值

  640.                DAY1=(I2C_1[4]) & 0x0f;       //取日个位值

  641.                DAY10=(I2C_1[4] & 0xf0)/16;       //取日十位值

  642.                MONTH1=(I2C_1[5])& 0x0f;       //取月个位值

  643.                MONTH10=(I2C_1[5]& 0xf0)/16;       //取月十位值

  644.                YEAR1=(I2C_1[6])& 0x0f;       //取年个位值

  645.                YEAR10=(I2C_1[6]& 0xf0)/16;       //取年个位值

  646.                }









  647.             //---------------------------------



  648.                //SWJC1 ,不为0时是设置键有按下,才能作加数操作



  649.             void SWABC1() //时间数值调整函数

  650.          {

  651.             if(SWJC1 != 0)       //SWJC1 ,不为0,也就是左右移位有按下时才能加数操作

  652.             {

  653.             if(SWJC1 == 1)          //分个位调整

  654.             {

  655.                MIN1++;                //分个位加1

  656.                if(MIN1>=10)

  657.                {

  658.                MIN1=0;

  659.                }

  660.                }

  661.             if(SWJC1 == 2)          //分十位调整

  662.             {

  663.                MIN10++;

  664.             if(MIN10>=6)

  665.             {

  666.             MIN10=0;

  667.             }

  668.             }

  669.             if(SWJC1 == 3)          //小时位调整

  670.             {

  671.                HOUR1++;

  672.                if(HOUR1>=10)

  673.                {

  674.                HOUR10++;

  675.                HOUR1=0;

  676.                }

  677.                if(((HOUR10*10) + HOUR1) >= 24) //计算个位和十位总数是否大于24小时

  678.                {

  679.                HOUR10=0;

  680.                HOUR1=0;

  681.                }

  682.                }

  683.                //---------------------------------------------------------------//

  684.                if(SWJC1 == 4)          //日数调整                                                                     

  685.                {                                                                                                                  

  686.                DAY1++;                                                                                                            

  687.                if(DAY1>=10)                                                                                                       

  688.                {                                                                                                                              

  689.                DAY10++;                                                                                                                

  690.                DAY1=0;                                                                                                               

  691.                }                                                                                                                              

  692.                //--------------------日数设置对应月数最大值的计算                         

  693.                switch((MONTH10*10)+MONTH1)                                                                      

  694.                {                                                                                                                              

  695.                case 1:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;               

  696.                case 3:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;            

  697.                case 5:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;            

  698.                case 7:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;                

  699.                case 8:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;               

  700.                case 10:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;       

  701.                case 12:if(((DAY10*10)+DAY1)>=32) {DAY10=0;DAY1=1;} break;      

  702.                case 4:if(((DAY10*10)+DAY1)>=31) {DAY10=0;DAY1=1;} break;         

  703.                case 6:if(((DAY10*10)+DAY1)>=31) {DAY10=0;DAY1=1;} break;            

  704.                case 9:if(((DAY10*10)+DAY1)>=31) {DAY10=0;DAY1=1;} break;                

  705.                case 11:if(((DAY10*10)+DAY1)>=31) {DAY10=0;DAY1=1;} break;       

  706.                case 2: if(((YEAR10*10)+YEAR1)%4 ==0)                                                      

  707.                {                                                                                                                              

  708.                if(((DAY10*10)+DAY1) >= 30)       //闰年,那2月有29天                      

  709.                   {                                                                                                                     

  710.                      DAY10=0;DAY1=1;                                                                                          

  711.                      }                                                                                                                      

  712.                      }                                                                                                                      

  713.                      if(((YEAR10*10)+YEAR1)%4 !=0)                                                            

  714.                      {                                                                                                         

  715.                   if(((DAY10*10)+DAY1) >= 29) //非闰年,那2月有28天                     

  716.                   {                                                                                                                      

  717.                   DAY10=0;DAY1=1;                                                                                        

  718.                      }                                                                                                                     

  719.                      }                                                                                                                         

  720.                         break;                                                                                        

  721.                                                                                                                                          

  722.                default:break;                                                                                             

  723.                   }                                                                                                               

  724.                //-------------------------------                                                       

  725.                }                                                                                                                               

  726.                //--------------------------------------------------------------



  727.                if(SWJC1 == 5)          //月数调整

  728.                {

  729.                MONTH1++;

  730.                if(MONTH1>=10)

  731.                {

  732.                MONTH10++;

  733.                MONTH1=0;

  734.                }

  735.                if(((MONTH10*10)+MONTH1) >= 13)

  736.                {

  737.                MONTH10=0;

  738.                MONTH1=1;

  739.                }

  740.                switch((MONTH10*10)+MONTH1)                                                                         

  741.                {                                                                                                                              

  742.                case 4:if(((DAY10*10)+DAY1)>=31) {DAY10=3;DAY1=0;} break;    // 如果月数调整到是4.6.9.11,那要回头计算日数是否大于30

  743.                case 6:if(((DAY10*10)+DAY1)>=31) {DAY10=3;DAY1=0;} break;            

  744.                case 9:if(((DAY10*10)+DAY1)>=31) {DAY10=3;DAY1=0;} break;               

  745.                case 11:if(((DAY10*10)+DAY1)>=31) {DAY10=3;DAY1=0;} break;       

  746.                case 2: if(((YEAR10*10)+YEAR1)%4 ==0)                                                   

  747.                {                                                                                                                               

  748.                if(((DAY10*10)+DAY1) >= 30)       //闰年,那2月有29天 //如果月数调整到是2月,那要回头计算日数是否大于28/29

  749.                   {                                                                                                                     

  750.                      DAY10=2;DAY1=9;                                                                                             

  751.                      }                                                                                                                     

  752.                      }                                                                                                                     

  753.                      if(((YEAR10*10)+YEAR1)%4 !=0)                                                            

  754.                      {                                                                                                         

  755.                   if(((DAY10*10)+DAY1) >= 29) //非闰年,那2月有28天                     

  756.                   {                                                                                                                      

  757.                   DAY10=2;DAY1=8;                                                                                 

  758.                      }                                                                                                                      

  759.                      }                                                                                                                     

  760.                         break;                                                                                     

  761.                                                                                                                                          

  762.                default:break;                                                                                              

  763.                   }       

  764.                }

  765.                //----------------

  766.                if(SWJC1 == 6)          //年数调整  

  767.                {

  768.                YEAR1++;

  769.                if(YEAR1>=10)

  770.                {

  771.                YEAR10++;

  772.                YEAR1=0;

  773.                if(YEAR10>=10)

  774.                {

  775.                YEAR10=0;

  776.                }

  777.                }

  778.                if(((YEAR10*10)+YEAR1)%4 !=0)       //如设置是非闰年,那要回头看看和处理2月份的日数是否大于28

  779.                {                                                                                                                                                                                                                                                                                     //

  780.                   if(((DAY10*10)+DAY1) >= 29) //非闰年,那2月有28天                         

  781.                   {                                                                                                                  

  782.                   DAY10=2;DAY1=8;                                                                                        

  783.                      }                                                                                                                     

  784.                      }

  785.                      }

  786.                //-----------------------------------------

  787.                }



  788.                }

  789.            



  790.                void SET_RTC()          //设置好的数据保存到RX8025T

  791.                {

  792.                if(SWJC1 != 0)       //需要在只有按下过数值设置时才把数值存回到RX8025T

  793.                {

  794.                I2C_1[1] = ((MIN10*16) + MIN1);             //把两个BCD数合并成一个字节

  795.                I2C_1[2] = ((HOUR10*16) + HOUR1);

  796.                I2C_1[4] = ((DAY10*16) + DAY1);

  797.                I2C_1[5] = ((MONTH10*16) + MONTH1);

  798.                I2C_1[6] = ((YEAR10*16) + YEAR1);

  799.                I2C_1[0] =0;

  800.                rx8025t_TX(); //RX8025T写入函数

  801.                SWJC1=0; //存放好数据后就退出设置

  802.                }

  803.                else;

  804.                }



到此这篇时钟代码c语言怎么写(时钟代码c语言怎么写出来)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • windows驱动开发教程(windows驱动开发教程 豆瓣)2026-02-15 16:09:07
  • Bsp驱动开发培训(bsp驱动开发怎么学)2026-02-15 16:09:07
  • 单向链表冒泡排序(单链表排序(冒泡排序)(c语言))2026-02-15 16:09:07
  • 源代码开发网站(源代码开发网站怎么用)2026-02-15 16:09:07
  • linux 微信开发者工具(微信开发者工具 arm)2026-02-15 16:09:07
  • console是什么意思在程序里面(console是什么语言)2026-02-15 16:09:07
  • 嵌入式驱动开发流程(嵌入式驱动开发流程视频)2026-02-15 16:09:07
  • goa 电路(goa电路原理讲解)2026-02-15 16:09:07
  • 注册苹果开发者账号有什么风险(2020苹果开发者账号注册流程)2026-02-15 16:09:07
  • vscode配置go开发环境(vscode官方配置环境教程)2026-02-15 16:09:07
  • 全屏图片