DS3231程序大集合,欢迎大家来分享

2019-07-17 13:23发布

本帖最后由 dirtwillfly 于 2015-11-4 09:45 编辑
  1.   #include <msp430.h>
  2. #include"config.h"
  3. #include"1838.h"
  4. #include"1602.h"
  5. #include"dh11.h"
  6. #include"ds3231.h"
  7. #include"ta.h"
  8. //#include"adc.h"
  9. int main(void)
  10. {
  11.   extern_12m();
  12.   hc164_init();
  13.   LCD_init();
  14.   h1838_init();
  15.   init_TA();
  16. //  I2cByteWrite(0xD0,0x0e,0);
  17. //  I2cByteWrite(0xD0,0x0f,0);
  18. //  ModifyTime(15,7,19,12,07,00);//初始化时钟,2007/11/20,12/59/00
  19.                                //小时采用24小时制
  20.   get_show_time();
  21.   get_show_Temperature();
  22.   dh11_read();

  23. // adc_init();
  24.   _EINT();
  25.   while (1)
  26.   {
  27. //  LCD_disp_string(0,0,"I AM A BOY?");
  28. //  LCD_disp_string(0,1,"YOU ARE A GIRL!");
  29.   Red_Code();
  30.   Key_Icode(key_code[2]);

  31. }
  32. }



  33. #include"config.h"
  34. uchar change;

  35. void extern_12m()
  36. {
  37.    WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  38.   if (CALBC1_12MHZ==0xFF)                                        // If calibration constant erased
  39.   {                                                                                       
  40.     while(1);                               // do not load, trap CPU!!        
  41.   }
  42.   DCOCTL = 0;                               // Select lowest DCOx and MODx settings
  43.   BCSCTL1 = CALBC1_12MHZ;
  44.   DCOCTL = CALDCO_12MHZ;                     // Load 8MHz constants
  45. }

  46. void hc164_init()
  47. {
  48.   P1OUT &= ~(BIT6+BIT7+BIT3);                           // Clear P1.0
  49.   P1DIR |=BIT6+BIT7+BIT3;                            // P1.0 output
  50.   
  51.   P2OUT &= ~(BIT0+BIT1+BIT2);                           // Clear P1.0
  52.   P2DIR |=BIT0+BIT1+BIT2;                            // P1.0 output
  53. }

  54. void LCD_delay_10us(uint n) // - - 10微秒的延时子程序
  55. {
  56.   uint i,j;
  57.   for(i=n;i>0;i--)
  58.     for(j=4;j>0;j--);  
  59. }

  60. void sendbyte(uchar byte)
  61. {            
  62. uchar c,num;   
  63. num=byte;
  64. for(c=0;c<8;c++)        
  65. {     
  66. P1OUT&=~0x80;
  67. CLK0;   
  68. P1OUT|=num&0x80; //(0x80即十进制的128, 二进制的10000000 按位发送
  69. CLK1;         
  70. num<<=1;   
  71. }
  72. }  


  73. // - - 向LCD1602写指令
  74. void LCD_write_command(uchar dat)
  75. {
  76. LCD_delay_10us(2);
  77. LCD_RS_LOW; // - - 指令
  78. //LCD_RW_LOW; // - - 写入
  79. sendbyte(dat);
  80. LCD_delay_10us(2);
  81. LCD_EN_HIGH; // - - 允许
  82. LCD_delay_10us(2);
  83. LCD_EN_LOW;
  84. }

  85. // - - 向LCD1602写数据
  86. void LCD_write_data(uchar dat)
  87. {
  88. LCD_delay_10us(2);
  89. LCD_RS_HIGH;// - - 数据
  90. //LCD_RW_LOW;// - - 写入
  91. sendbyte(dat);
  92. LCD_delay_10us(2);
  93. LCD_EN_HIGH;// - - 允许
  94. LCD_delay_10us(2);
  95. LCD_EN_LOW;
  96. }

  97. // - - 设置显示位置
  98. void LCD_set_xy(uchar x,uchar y)
  99. {
  100.   uchar address;
  101.   if(y==1)
  102.   {
  103.     address=0x80+x; // - - 第一行位置
  104.   } else {
  105.     address=0xc0+x; // - - 第二行位置
  106.   }
  107. //    LCD_delay_10us(1);
  108.     LCD_write_command(address);
  109. }

  110. // - - 显示一个字符函数
  111. void LCD_disp_char(uchar x,uchar y,uchar dat) // - - LCD_disp_char(0,1,0x38); // - - 显示8
  112. {
  113.     LCD_set_xy(x,y);
  114. //    LCD_delay_10us(1);
  115.     LCD_write_data(dat);
  116. }



  117. // - - 显示一个字符串函数
  118. void LCD_disp_string(uchar x,uchar y,char *s)
  119. {
  120.   LCD_set_xy(x,y);
  121. // LCD_delay_10us(1);
  122.   while(*s!='')
  123.   {
  124.     LCD_write_data(*s);
  125.     s++;
  126.   }
  127. }

  128. void LCD_init(void)
  129. {
  130. LCD_delay_10us(20);
  131. LCD_write_command(0x38); // - - 设置8位格式,2行,5x7
  132. LCD_delay_10us(5);
  133. LCD_write_command(0x0c); // - - 整体显示,关光标,不闪烁
  134. LCD_delay_10us(5);
  135. LCD_write_command(0x06); // - - 设定输入方式,增量不移位
  136. LCD_delay_10us(5);
  137. LCD_write_command(0x01); // - - 清除屏幕显示
  138. LCD_delay_10us(200);
  139. }





  140. #include"config.h"
  141. #define IR_DIR_IN P2DIR&=~BIT3//红外接收头P1.0设置为输入,
  142. #define RED_R (P2IN&BIT3)//红外接收头输入值
  143. void h1838_init()
  144. {
  145.   IR_DIR_IN;
  146. }


  147. uchar KEY_VAL;
  148. uchar key_code[4],code_value;
  149. void Red_Code()
  150. {
  151. uchar i,j,k = 0;

  152. for(i = 0;i < 19;i++)
  153. {
  154.   delay_us(400);           //延时400us
  155.   if(RED_R)                //9ms内有高电平,则判断为干扰,退出处理程序
  156.   {
  157.       return;
  158.   }
  159. }

  160. while(!RED_R);            //等待9ms低电平过去
  161. for(i=0;i<5;i++)          //是否连发码
  162. {
  163.   delay_us(500);
  164.   if(!RED_R)
  165.    {
  166.      return;
  167.    }
  168. }


  169. while(RED_R);               //等待4.5ms高电平过去

  170. for(i = 0;i < 4;i++)        //接收4个字节的数据
  171. {
  172.   for(j = 0;j < 8;j++)      //每个字节的数据8位
  173.   {
  174.    

  175.    while(!RED_R);           //等待变高电平
  176.    while(RED_R)             //计算高电平时间
  177.    {
  178.     delay_us(100);
  179.     k++;
  180.     if(k >22)               //高电平时间过长,则退出处理程序
  181.     {
  182.      return;         
  183.     }
  184.    
  185.    }

  186.    code_value>>=1;          //接受一位数据
  187.    if(k >= 7)
  188.    {
  189.     code_value|=0x80;       //高电平时间大于0.56,则为数据1
  190.    }
  191.    k = 0;                  //计时清零
  192.   }
  193.   key_code[i]=code_value;  //四个字节的数据
  194. }
  195. //  Key_Icode();             //调用赋值函数

  196. // Display_Key(KEY_VAL);     //显示按键值
  197.   
  198. //  delay_ms(50);

  199. }
复制代码
  1. #include <msp430.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define ulong unsigned long
  5. #define CLK0  P1OUT&=~BIT6
  6. #define CLK1   P1OUT|=BIT6


  7. #define LCD_EN_HIGH         P2OUT|=BIT2   //拉高
  8. #define LCD_EN_LOW          P2OUT&=~BIT2  //拉低

  9. #define LCD_RW_HIGH         P2OUT|=BIT1   //拉高
  10. #define LCD_RW_LOW          P2OUT&=~BIT1   //拉低

  11. #define LCD_RS_HIGH         P2OUT|=BIT0   //拉高
  12. #define LCD_RS_LOW          P2OUT&=~BIT0   //拉低

  13. #define CPU_F ((double)12000000)   //外部高频晶振8MHZ
  14. //#define CPU_F ((double)32768)   //外部低频晶振32.768KHZ
  15. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  16. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

  17. #define KEY_0     0x16                 //键0
  18. #define KEY_1     0x0C                 //键1
  19. #define KEY_2     0x18                 //键2
  20. #define KEY_3     0x5E                 //键3
  21. #define KEY_4     0x08                 //键4
  22. #define KEY_5     0x1C                 //键5
  23. #define KEY_6     0x5A                 //键6
  24. #define KEY_7     0x42                 //键7
  25. #define KEY_8     0x52                 //键8
  26. #define KEY_9     0x4A                 //键9
  27. #define prex      0x44                 //电源
  28. #define nex       0x40                 //模式
  29. #define play_pause 0x43                 //静音
  30. #define ch_       0x45                //模式
  31. #define ch        0x46  
  32. #define cha       0x47                 //模式
  33. #define __         0x07
  34. #define _a        0x15
  35. #define eq        0x09
  36. #define _100a      0x19
  37. #define _200a      0x0d
  38. #define power      0x12            //power
  39. #define up      0x1b            //up
  40. #define down      0x1a            //down
  41. #define left      0x04            //left
  42. #define right      0x06            //right
  43. #define ok      0x05            //0k
复制代码
  1. #include"config.h"

  2. //连接端口
  3. #define DHT11_Dir      P1DIR
  4. #define DHT11_In       P1IN
  5. #define DHT11_Out      P1OUT
  6. #define DHT11_Bit      BIT0

  7. char dh11_str[8];

  8. //8bit湿度+8bit湿度小数点
  9. //8bit温度+8bit温度小数点
  10. //数据位为0是高电平26~28us | 1高电平70us

  11. uchar DHT11_Data[5] = {0}; //从DHT11中读到的数据
  12. void read_DHT11(uchar *Data)
  13. {
  14.     uchar re,m,n,Time_out;
  15.     DHT11_Dir &= (~DHT11_Bit);        //引脚为输入
  16.     for(n = 0; n < 5; n++)
  17.     {
  18.         for(m = 0; m < 8; m++)
  19.         {
  20.             while( !(DHT11_In & DHT11_Bit) );     //每1bit以50us低电平时限开始,直到高电平到来
  21.             delay_us(30);                     
  22.             re = 0;            
  23.             if((DHT11_In & DHT11_Bit))          //30us后还是高电平说明是1
  24.             {
  25.                 re = 1;
  26.             }
  27.             Time_out = 2;
  28.             while((DHT11_In & DHT11_Bit) && (Time_out++ ));
  29.             if(Time_out == 1)                   //超时处理
  30.             {
  31.                 break;
  32.             }
  33.             *Data <<= 1;
  34.             if(re)
  35.             {
  36.                 *Data |= 0x01;
  37.             }
  38.         }
  39.         Data++;
  40.     }
  41. }

  42. //DHT11的握手协议模拟和数据的读取
  43. uchar DHT11_GetData(void)
  44. {
  45.     uchar o,sum;
  46.     DHT11_Dir |= DHT11_Bit;
  47.     DHT11_Out &= ~DHT11_Bit;    //拉低,发出开始信号
  48.    
  49.     delay_ms(18);               //拉低18ms
  50.     DHT11_Out |= DHT11_Bit;     //拉高20us等待
  51.     delay_us(20);
  52.     DHT11_Dir &= (~DHT11_Bit);
  53.     if( !(DHT11_In & DHT11_Bit) )       //DHT11响应
  54.     {
  55.         while( !(DHT11_In & DHT11_Bit) );       //80us低电平,等待DHT11的响应信号
  56.         while( (DHT11_In & DHT11_Bit) );        //DHT11准备发送数据
  57.         read_DHT11(DHT11_Data);                 //主机接收数据
  58.         sum = 0;
  59.         for(o = 0; o < 4; o++)                  //数据校验
  60.         {
  61.           sum += DHT11_Data[o];
  62.         }
  63.         if(sum != DHT11_Data[4])
  64.         {
  65.           return 0;
  66.         }
  67.         else
  68.         {
  69.           return 1;
  70.         }
  71.     }
  72.     return 0;
  73. }

  74. //对温度湿度进行格式化(如果获取温度成功)
  75. void DHT11_format(char *Des_str)
  76. {
  77.     Des_str[0] = DHT11_Data[0]/10 + 0x30;
  78.     Des_str[1] = DHT11_Data[0]%10 + 0x30;
  79.     Des_str[2] = '%';
  80.     Des_str[3] = ' ';
  81.     Des_str[4] = DHT11_Data[2]/10 + 0x30;
  82.     Des_str[5] = DHT11_Data[2]%10 + 0x30;
  83.     Des_str[6] = 'C';
  84.     Des_str[7] = ' ';
  85. }

  86. void dh11_read()
  87. {
  88.   if(DHT11_GetData())
  89.    DHT11_format(dh11_str);
  90.   LCD_disp_string(0,0,dh11_str);
  91. }

复制代码
  1. #include"config.h"

  2. #define SDA_DIR_OUT P1DIR|=BIT4
  3. #define SDA_DIR_IN P1DIR&=~BIT4
  4. #define SCL_DIR_OUT P1DIR|=BIT5

  5. #define SDA_IN P1IN&BIT4

  6. #define SDA1 P1OUT|=BIT4
  7. #define SDA0 P1OUT&=~BIT4
  8. #define SCL1 P1OUT|=BIT5
  9. #define SCL0 P1OUT&=~BIT5
  10. uchar year,month,date,hour,minute,second;
  11. uchar const table[]={'0','1','2','3','4','5','6','7','8','9'};
  12. uchar const month_12[]={31,29,31,30,31,30,31,31,30,31,30,31};

  13. uchar clockset,clockon,clockoff[5],clock_on;
  14. uchar oclock[5][2];
  15. uchar BCD2HEX(uchar val)    //BCD转换为Byte
  16. {
  17.     uchar temp;
  18.     temp=val&0x0f;
  19.     val>>=4;
  20.     val&=0x0f;
  21.     val*=10;
  22.     temp+=val;
  23.    
  24.     return temp;
  25. }


  26. uchar HEX2BCD(uchar val)    //B码转换为BCD码
  27. {
  28.     uchar i,j,k;
  29.     i=val/10;
  30.     j=val%10;
  31.     k=j+(i<<4);
  32.     return k;
  33. }



  34. void Start_I2C()
  35. {
  36.     SDA_DIR_OUT;
  37.     SCL_DIR_OUT;
  38.     SDA1;                  //发送起始条件的数据信号
  39.     delay_us(5);
  40.     SCL1;
  41.     delay_us(5);             //起始条件建立时间大于4.7us,延时
  42.    
  43.     SDA0;                  //发送起始信号
  44.     delay_us(5);             // 起始条件锁定时间大于4μs
  45.       
  46. //    SCL0;                  //钳住I2C总线,准备发送或接收数据
  47. //    delay_us(2);
  48. }


  49. void Stop_I2C()
  50. {
  51.     SDA_DIR_OUT;
  52.     SCL_DIR_OUT;
  53.     SDA0;                  //发送结束条件的数据信号
  54.     delay_us(5);             //发送结束条件的时钟信号
  55.     SCL1;                  //结束条件建立时间大于4us
  56.     delay_us(5);
  57.    
  58.     SDA1;                  //发送I2C总线结束信号
  59.     delay_us(1);
  60. }


  61. void SendByte(uchar c)
  62. {
  63.     uchar BitCnt;
  64.     SDA_DIR_OUT;
  65.     SCL_DIR_OUT;
  66.     SCL0;
  67.     delay_us(10);
  68.     for(BitCnt=0;BitCnt<8;BitCnt++)         //要传送的数据长度为8位
  69.     {
  70.         if(c&0x80)
  71.             SDA1;                          //判断发送位
  72.         else
  73.             SDA0;               
  74.           delay_us(1);
  75.           SCL0;                            //置时钟线为高,通知被控器开始接收数据位
  76.           delay_us(1);                       //保证时钟高电平周期大于4μs   
  77.           SCL1;
  78.           delay_us(5);
  79.           c=c<<1;
  80.           SCL0;                            //置时钟线为高,通知被控器开始接收数据位
  81.           delay_us(5);   
  82.     }
  83.     SDA1;                                  //8位发送完后释放数据线,准备接收应答位
  84.     delay_us(1);  
  85.     SCL0;
  86.     delay_us(1);
  87.                      
  88.     SCL1;
  89.     delay_us(1);
  90.      SCL0;
  91.      
  92. }


  93. uchar ReceiveByte(uchar b)
  94. {
  95.   uchar i;
  96.   uchar temp;
  97.   uchar Dat=0;
  98. /*
  99.   SDA_H;
  100.   delay(5);
  101.   SCL_L;
  102.   delay(5);
  103. */
  104. SDA_DIR_IN;
  105.   for(i=0;i<8;i++)
  106.     {
  107.           SCL1;
  108.       delay_us(5);
  109.           Dat=Dat<<1;
  110.           delay_us(1);
  111.           temp=SDA_IN;
  112.           if(temp&0x10)
  113.             Dat|=0x01;
  114.           else
  115.             Dat|=0x00;
  116.          delay_us(1);
  117.          SCL0;
  118.           delay_us(5);
  119.     }
  120.    SDA_DIR_OUT;
  121.   
  122.   if(b)//每收一个数后发送ACK或nACK
  123.     SDA1;
  124.   else
  125.     SDA0;
  126.         
  127.   delay_us(1);
  128.   SCL1;
  129.   delay_us(1);
  130.   SCL0;
  131.   delay_us(1);
  132.   SDA1;        //释放总线
  133.   delay_us(1);
  134.   return Dat;
  135. }
  136. /****************************************************/
  137. /***********将一个字节写入DS3231指定的地址***********/
  138. void I2cByteWrite(uchar device,uint addr,uchar bytedata)
  139. {
  140.   Start_I2C();
  141. // delay_us(1);
  142.   SendByte(device);
  143. // delay_us(1);
  144.   SendByte(addr);
  145. // delay_us(1);
  146.   SendByte(bytedata);
  147. // delay_us(1);
  148.   Stop_I2C();
  149. }
  150. /****************************************************/
  151. /************从DS3231指定的地址读一个字节************/
  152. uchar I2cByteRead(uchar device,uint addr)
  153. {
  154.   uchar Dat=0;
  155.   
  156.   Start_I2C();
  157.   SendByte(device);
  158. //  delay_us(1);
  159.   SendByte(addr);
  160. //  delay_us(1);
  161.   Start_I2C();
  162.   SendByte(0xd1);//读数
  163. // delay_us(1);
  164.   Dat=ReceiveByte(1);//只接收一个字节,所以发nACK
  165.   Stop_I2C();
  166.   return Dat;
  167. }
  168. /***************************************************/
  169. /*********************读取时间**********************/
  170. void Readtime(void)
  171. {
  172.   year=I2cByteRead(0xd0,0x06);  //年
  173.   month=I2cByteRead(0xd0,0x05); //月
  174.   date=I2cByteRead(0xd0,0x04);  //日
  175.   hour=I2cByteRead(0xd0,0x02);  //时
  176.   minute=I2cByteRead(0xd0,0x01);//分
  177.   second=I2cByteRead(0xd0,0x00);//秒
  178. }
  179. /***************************************************/
  180. /****************修改时间,BCD码输入*****************/
  181. void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)
  182. {
  183.   uchar temp=0;
  184.   
  185.   temp=HEX2BCD(yea);
  186.   I2cByteWrite(0xD0,0x06,temp);//修改年
  187.   
  188.   temp=HEX2BCD(mon);
  189.   I2cByteWrite(0xD0,0x05,temp);//修改月
  190.    
  191.   temp=HEX2BCD(da);
  192.   I2cByteWrite(0xD0,0x04,temp);//修改日
  193.   
  194.   temp=HEX2BCD(hou);
  195.   I2cByteWrite(0xD0,0x02,temp);//修改时
  196.   
  197.   temp=HEX2BCD(min);
  198.   I2cByteWrite(0xD0,0x01,temp);//修改分
  199.   
  200.   temp=HEX2BCD(sec);
  201.   I2cByteWrite(0xD0,0x00,temp);//修改秒
  202. }
  203. /****************************************************/
  204. /****************读取时间 计算 并显示****************/
  205. void get_show_time(void)
  206. {
  207. uchar temp1,temp2;
  208. char a[2];
  209. temp1=I2cByteRead(0xd0,0x06);  //年
  210. temp2=BCD2HEX(temp1);
  211. a[0]=table[temp2/10];
  212. a[1]=table[temp2%10];
  213. LCD_disp_string(0,1,a);
  214. LCD_disp_char(2,1,'-');

  215. temp1=I2cByteRead(0xd0,0x05);  //月
  216. temp2=BCD2HEX(temp1);
  217. a[0]=table[temp2/10];
  218. a[1]=table[temp2%10];
  219. LCD_disp_string(3,1,a);
  220. LCD_disp_char(5,1,'-');

  221. temp1=I2cByteRead(0xd0,0x04);  //日
  222. temp2=BCD2HEX(temp1);
  223. a[0]=table[temp2/10];
  224. a[1]=table[temp2%10];
  225. LCD_disp_string(6,1,a);
  226. LCD_disp_char(8,1,'-');

  227. temp1=I2cByteRead(0xd0,0x03);  //星期
  228. temp2=BCD2HEX(temp1);
  229. temp2=table[temp2];
  230. LCD_disp_char(9,1,temp2);
  231. LCD_disp_char(10,1,' ');

  232. LCD_disp_char(8,0,' ');
  233. if(clockset==0)
  234. {
  235. temp1=I2cByteRead(0xd0,0x02);  //时 24小时制
  236. temp1&=0x3f;     
  237. temp2=BCD2HEX(temp1);

  238. a[0]=table[temp2/10];
  239. a[1]=table[temp2%10];
  240. LCD_disp_string(8,0,a);
  241. LCD_disp_char(10,0,':');

  242. temp1=I2cByteRead(0xd0,0x01);  //分
  243. temp2=BCD2HEX(temp1);
  244. a[0]=table[temp2/10];
  245. a[1]=table[temp2%10];
  246. LCD_disp_string(11,0,a);
  247. LCD_disp_char(13,0,':');
  248.   
  249. temp1=I2cByteRead(0xd0,0x00);  //秒
  250. temp2=BCD2HEX(temp1);
  251. a[0]=table[temp2/10];
  252. a[1]=table[temp2%10];
  253. LCD_disp_string(14,0,a);

  254. }

  255. if(clockset!=0)
  256. {
  257. LCD_disp_string(8,0,"        ");
  258. a[0]=table[oclock[clockset-1][0]/10];
  259. a[1]=table[oclock[clockset-1][0]%10];
  260. LCD_disp_string(8,0,a);
  261. LCD_disp_char(10,0,'-');
  262. a[0]=table[oclock[clockset-1][1]/10];
  263. a[1]=table[oclock[clockset-1][1]%10];
  264. LCD_disp_string(11,0,a);
  265. LCD_disp_string(13,0,"CK");
  266. LCD_disp_char(15,0,table[clockoff[clockset-1]]);
  267. }

  268. }

  269. //显示温度

  270. void get_show_Temperature(void)
  271. {
  272.   if(change==0)
  273.   {
  274.     uchar Ttemp1,Ttemp2;
  275.    char a[2];
  276.     Ttemp1=I2cByteRead(0xd0,0x11);     //温度 高字节
  277.     Ttemp2=BCD2HEX(Ttemp1);
  278. //     LCD_disp_string(9,1,"     ");
  279. //    Ttemp3=I2cByteRead(0xd0,0x12);    //温度低字节
  280. //    Ttemp4=BCD2HEX(Ttemp3);
  281.     a[0]=table[Ttemp2/10];
  282.     a[1]=table[Ttemp2%10];
  283.     LCD_disp_string(13,1,a);
  284.     LCD_disp_char(15,1,'c');
  285.   }
  286.    
  287.   if(change!=0)
  288.   {
  289.    LCD_disp_string(13,1,"   ");
  290.   LCD_disp_char(15,1,table[change-1]);
  291.   }
  292.   
  293.   if((clockset!=0)&&(change==0))
  294. {
  295.    LCD_disp_string(13,1,"   ");
  296.    LCD_disp_char(13,1,table[clockset]);
  297.    LCD_disp_char(15,1,table[clockon]);
  298. }
  299.   
  300. }


  301. void change_del()
  302. {
  303.   uchar temp1,temp2,temp3,temp4;
  304.   if(change>0)
  305.   {
  306.    temp1=I2cByteRead(0xd0,change-1);  
  307.    temp2=BCD2HEX(temp1);
  308.    temp2-=1;
  309.    if(change<3)
  310.    {
  311.    if(temp2>59)
  312.      temp2=59;
  313.    }
  314.     if(change==3)
  315.     {
  316.       if(temp2>23)
  317.        temp2=23;
  318.     }
  319.    
  320.    if(change==4)
  321.    {
  322.      if(temp2==0)
  323.        temp2=7;
  324.    }
  325.     if(change==5)
  326.     {
  327.       if(temp2==0)
  328.       {
  329.         temp3=I2cByteRead(0xd0,0x05);  
  330.         temp4=BCD2HEX(temp3);
  331.         temp2=month_12[temp4-1];
  332.       }
  333.     }
  334.    if(change==6)
  335.    {
  336.       if(temp2==0)
  337.       temp2=12;  
  338.    }
  339.    
  340.     temp2=HEX2BCD(temp2);
  341.   I2cByteWrite(0xD0,change-1,temp2);//修改年
  342.   }
  343. }

  344. void change_add()
  345. {
  346.   uchar temp1,temp2,temp3,temp4;
  347.   if(change>0)
  348.   {
  349.    temp1=I2cByteRead(0xd0,change-1);  
  350.    temp2=BCD2HEX(temp1);
  351.    temp2+=1;
  352.    if(change<3)
  353.    {
  354.    if(temp2>59)
  355.      temp2=0;
  356.    }
  357.     if(change==3)
  358.     {
  359.       if(temp2>23)
  360.        temp2=0;
  361.     }
  362.    
  363.    if(change==4)
  364.    {
  365.      if(temp2==8)
  366.        temp2=1;
  367.    }
  368.     if(change==5)
  369.     {  
  370.         temp3=I2cByteRead(0xd0,0x05);  
  371.         temp4=BCD2HEX(temp3);
  372.         if(temp2>month_12[temp4-1])
  373.         temp2=1;   
  374.     }
  375.    if(change==6)
  376.    {
  377.       if(temp2==13)
  378.       temp2=1;  
  379.    }
  380.    
  381.     temp2=HEX2BCD(temp2);
  382.   I2cByteWrite(0xD0,change-1,temp2);//修改年
  383.   }
  384. }

  385. void change_set()
  386. {
  387.   ++change;
  388.   if(change>=8)
  389.     change=0;
  390. }


  391. void clock_set()
  392. {
  393. ++clockset;
  394. if(clockset>=6)
  395.    clockset=0;
  396. }

  397. void clock_add()
  398. {
  399.   change=0;
  400.   ++clockon;
  401.   if( clockon==3)
  402.     clockon=0;
  403. }

  404. void clock_change()
  405. {
  406.   if(clockon==1)
  407.   {
  408.     ++oclock[clockset-1][1];
  409.     if(oclock[clockset-1][1]>59)
  410.       oclock[clockset-1][1]=0;
  411.   }
  412.   
  413.   if(clockon==2)
  414.   {
  415.      ++oclock[clockset-1][0];
  416.     if(oclock[clockset-1][0]>23)
  417.       oclock[clockset-1][0]=0;
  418.   }
  419. }



  420. void Key_Icode(uchar dat)
  421. {
  422.    LCD_disp_char(10,1,' ');
  423. //  LCD_disp_string(10,1,"   ");
  424.    switch(dat)                    //第3个字节是数据,第4个字节是反码
  425.    {                                      //为了更稳定,可以加上第4个字节数据的判断
  426.    case KEY_0:KEY_VAL=0; LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' '); break;
  427.    case KEY_1:KEY_VAL=1; LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' '); break;
  428.    case KEY_2:KEY_VAL=2; LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' '); break;
  429.    case KEY_3:KEY_VAL=3; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  430.    case KEY_4:KEY_VAL=4; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  431.    case KEY_5:KEY_VAL=5; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  432.    case KEY_6:KEY_VAL=6;  LCD_disp_char(11,1,KEY_VAL+0x30);  LCD_disp_char(12,1,' ');break;
  433.    case KEY_7:KEY_VAL=7; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  434.    case KEY_8:KEY_VAL=8; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  435.    case KEY_9:KEY_VAL=9; LCD_disp_char(11,1,KEY_VAL+0x30);   LCD_disp_char(12,1,' ');break;
  436.    case prex:LCD_disp_string(11,1,"PR");clock_change();break;
  437.    case nex :LCD_disp_string(11,1,"NX");clock_add();break;
  438.    case play_pause:LCD_disp_string(11,1,"PS");clock_set();break;
  439.    case ch_: LCD_disp_string(11,1,"C-");change_del();break;
  440.    case ch: LCD_disp_string(11,1,"CH");change_set();break;
  441.    case cha:LCD_disp_string(11,1,"C+");change_add();break;
  442.    case eq: LCD_disp_string(11,1,"EQ");
  443.              if(clockoff[clockset-1]==0)
  444.                clockoff[clockset-1]=1;
  445.              else clockoff[clockset-1]=0;
  446.                break;
  447.    case _a:LCD_disp_string(11,1,"V+");break;
  448.    case __:LCD_disp_string(11,1,"V-");break;
  449.    case _100a:LCD_disp_string(11,1,"1+");break;
  450.    case _200a:LCD_disp_string(11,1,"2+");break;
  451.    
  452.     case power:LCD_disp_string(11,1,"PW");break;
  453.    case up: LCD_disp_string(11,1,"UP");break;
  454.    case down:LCD_disp_string(11,1,"DW");break;
  455.    case left:LCD_disp_string(11,1,"LF");break;
  456.    case right:LCD_disp_string(11,1,"RT");break;
  457.    case ok:LCD_disp_string(11,1,"OK");break;
  458.    default:KEY_VAL=' ';break;
  459.    }
  460.   key_code[2]=' ';
  461.    
  462. }

  463. void oclockon()
  464. {
  465.   uchar clock_flag[5];
  466.   uchar temp1,temp2,temp3;
  467.   temp1=I2cByteRead(0xd0,0x02);  //时 24小时制
  468.   temp1&=0x3f;     
  469.   temp2=BCD2HEX(temp1);
  470.   
  471.   temp1=I2cByteRead(0xd0,0x01);  //分
  472.   temp3=BCD2HEX(temp1);
  473.   uchar i;
  474.   for(i=0;i<5;i++)
  475.   {
  476.     if(temp2==oclock[i][0])
  477.     {
  478.       if(temp3==oclock[i][1])
  479.       {
  480.         if(clockoff[i]==1)
  481.           clock_flag[i]=1;
  482.         else clock_flag[i]=0;
  483.       }
  484.       else clock_flag[i]=0;
  485.     }
  486.      else clock_flag[i]=0;
  487.   }
  488.   clock_on=0;
  489.   for(i=0;i<5;i++)
  490.   {
  491.     if(clock_flag[i]==1)
  492.       clock_on=1;
  493.   }
  494. }
复制代码
  1. #include"config.h"

  2. uchar t;
  3. /***********TA初始化*********/
  4. void init_TA()
  5. {
  6.   TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
  7.   TACCR0 = 60000;                            //5ms中断一次
  8.   TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
  9. }


  10. #pragma vector=TIMER0_A0_VECTOR  
  11. __interrupt void Timer_A (void)
  12. {

  13.   if(++t==200)
  14.   {  
  15.     t=0;
  16.     dh11_read();
  17.     get_show_Temperature();
  18.     get_show_time();
  19.     oclockon();
  20.   }
  21.   if(clock_on==1)
  22.     P1OUT ^= 0x08;
  23. }
复制代码





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。