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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6588|回復: 0
打印 上一主題 下一主題
收起左側

msp430g2553鬧鐘源程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:90014 發表于 2015-9-14 12:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  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!='\0')
  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. }
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲高清一区二区三区 | www亚洲精品 | 美国黄色一级片 | 在线免费黄色小视频 | 人人擦人人 | 日韩欧美成人精品 | 久久久久久国产精品免费免费 | 国产精品久久久久久久久久久久 | 亚洲一区精品在线 | 亚洲一区二区免费看 | 国产三区在线观看视频 | 亚洲人成人一区二区在线观看 | 精品久久九九 | 亚洲欧美日韩在线 | 日本一区二区三区精品视频 | 国产一区2区 | 九色91视频 | 欧美三级电影在线播放 | 在线观看第一页 | 久久躁日日躁aaaaxxxx | 亚洲区视频| 亚洲视频免费在线观看 | 久久人爽 | 九九在线视频 | 国产精品久久久久久久免费观看 | 久久精品视频免费看 | 国产精品一区二区三区久久 | 毛片网在线观看 | 成人免费在线小视频 | 成人av一区 | 亚洲国产69 | 午夜精品一区二区三区在线视 | 一区二区视频在线观看 | 国产精品久久影院 | 国产高清免费在线 | 国产黄色大片 | 国产乱码精品一区二区三区中文 | 麻豆国产精品777777在线 | 国产成人一区二区三区精 | 日韩欧美久久 | 亚洲精品一区二区在线观看 |