找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4916|回复: 4
收起左侧

用msp430g2553火箭板做的闹钟

[复制链接]
ID:73171 发表于 2015-2-2 22:30 | 显示全部楼层 |阅读模式
      因为我的mp4坏了,手机也不太给力,所以自己想用单片机给自己做个闹钟,51单片机又太垃圾了,32又没有学会,就试着用火箭板给自己做个小小的闹钟。
      实习的时候写过闹钟程序,所以一个下午就把程序给写出来了,但其中由于有些缺陷,修改了3个下午才调试完成,虽然有些纰漏,但还是挺满意的。
//这是主函数
  1. #include <msp430g2553.h>
  2. #include "wenben.h"
  3. #include "5110.h"
  4. char t=0,t1=0;
  5. /***********TA初始化*********/
  6. void init_TA()
  7. {
  8.   TACCTL0 = CCIE;                           // TACCR0 interrupt enabled
  9.   TACCR0 = 50150;
  10.   TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
  11. }

  12. /************ADC10初始化************/
  13. void init_ADC10()
  14. {
  15.   ADC10CTL0 = ADC10SHT_3 + ADC10ON + ADC10IE; // /* 4 x ADC10CLKs */ /* ADC10 On/Enable */
  16.    /* ADC10 Sampling Rate 0:200ksps / 1:50ksps */
  17.   ADC10AE0 |= 0x01;                         // P2.0 ADC option select
  18. }

  19. main()
  20. {       
  21.         WDTCTL = WDTPW + WDTHOLD;
  22.         DCOCTL=CALDCO_1MHZ;
  23.         BCSCTL1=CALBC1_1MHZ;
  24.   LCD_init();  //初始化LCD模块
  25. LCD_clear(); //清屏幕
  26.           init_TA();
  27.        Port_Init1();     
  28.         init_ADC10();
  29.         __bis_SR_register(GIE);
  30.          P1OUT&=0XfF;
  31.          timedisplay();
  32.         while(1)
  33.         { if(t==0)
  34.          {
  35.            locktime();
  36.           timedisplay1();
  37.         }
  38.           Red_Code();  
  39.          
  40.           if(t1==0)
  41.           {
  42.                 LCD_init();  //初始化LCD模块
  43.                 LCD_clear(); //清屏幕
  44.                 Port_Init1();     
  45.                 timedisplay();
  46.                 datado();
  47.           }
  48.         }
  49. }
  50. #pragma vector = ADC10_VECTOR             //ADC10中断服务
  51. __interrupt void adc_isr(void)
  52. {
  53.   ad_value=ADC10MEM;                      //将AD采样值存入ad_value
  54.    
  55. }
  56. #pragma vector=TIMER0_A0_VECTOR  
  57. __interrupt void Timer_A (void)
  58. {
  59.   if(++t==20)    //每隔1s计数一次,虽然没有专门的时钟芯片准确,但可以用
  60.   {  
  61.     t=0;
  62.    timechange();
  63.   if(++t1==120)
  64.   {t1=0;
  65.   }
  66.   }
  67. }


  68. // wenben.h
  69. //显示字幕数据库
  70. unsigned char  zimu[]={

  71. 0xF0,0x08,0x08,0x18,0xE0,0x00,0x1F,0x20,0x20,0x30,0x0F,0x00,/*"0",0*/
  72. 0x00,0x10,0xF8,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,/*"1",1*/
  73. 0x70,0x08,0x08,0x08,0xF0,0x00,0x30,0x2C,0x22,0x21,0x30,0x00,/*"2",2*/
  74. 0x30,0x08,0x88,0x88,0x70,0x00,0x18,0x20,0x20,0x31,0x1E,0x00,/*"3",3*/
  75. 0x00,0x80,0x60,0xF0,0x00,0x00,0x06,0x05,0x24,0x3F,0x24,0x04,/*"4",4*/
  76. 0xF8,0x08,0x88,0x88,0x08,0x00,0x19,0x21,0x20,0x31,0x1F,0x00,/*"5",5*/
  77. 0xE0,0x18,0x88,0x98,0x00,0x00,0x0F,0x31,0x20,0x20,0x1F,0x00,/*"6",6*/
  78. 0x38,0x08,0x08,0xE8,0x18,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,/*"7",7*/
  79. 0x70,0x88,0x08,0x88,0x70,0x00,0x1E,0x21,0x21,0x21,0x1E,0x00,/*"8",8*/
  80. 0xF0,0x08,0x08,0x18,0xE0,0x00,0x01,0x32,0x22,0x31,0x0F,0x00,/*"9",9*/
  81. 0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,/*":",10*/
  82. 0x80,0x80,0x00,0x80,0x80,0x00,0x20,0x3F,0x21,0x00,0x3F,0x20,/*"n",11*/
  83. 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x3D,0x26,0x22,0x3F,0x20,/*"a",12*/
  84. 0x80,0x80,0x00,0x00,0x80,0x80,0x00,0x07,0x38,0x1C,0x03,0x00,/*"v",13*/
  85. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,/*".",14*/
  86. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",15*/
  87. 0xF0,0x98,0x60,0xE0,0x38,0x00,0x00,0x31,0x0E,0x1F,0x33,0x0C,/*"%",16*/
  88. 0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,/*"!",17*/
  89. 0xF0,0x10,0x08,0x08,0x18,0x00,0x1F,0x20,0x20,0x20,0x10,0x00,/*"C",18*/
  90. 0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00,//0,19//
  91. 0x08,0xF8,0x88,0xE8,0x18,0x00,0x20,0x3F,0x20,0x03,0x00,0x00,/*"F",20*/
  92. 0x00,0x00,0xF0,0x00,0x00,0x00,0x01,0x01,0x1F,0x01,0x01,0x00,/*"+",21*/
  93. 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x00,/*"-",22*/
  94. 0x40,0x80,0xF0,0x80,0x40,0x00,0x02,0x01,0x0F,0x01,0x02,0x00,/*"*",23*/
  95. 0x00,0x00,0x80,0x70,0x0C,0x00,0x60,0x1C,0x03,0x00,0x00,0x00,/*"/",24*/
  96. 0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x23,0x00,/*"e",25*/
  97. 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x1F,0x20,0xA0,0xFF,0x80,/*"q",26*/
  98. 0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x00,/*"=",27*/
  99. 0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x23,0x24,0x24,0x39,0x00,/*"s",28*/
  100. 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0xFF,0xA0,0x20,0x1F,0x00,/*"p",29*/
  101. };


  102. unsigned char hanzi[]=
  103. {
  104. /*--  文字:  温  --*/
  105. /*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  106. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  107. 0x22,0x44,0x00,0xC0,0x5F,0xD5,0x55,0xD5,0x5F,0xC0,0x00,0x00,0x04,0x02,0x09,0x0F,
  108. 0x08,0x0F,0x08,0x0F,0x08,0x0F,0x08,0x00,

  109. /*--  文字:  度  --*/
  110. /*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  111. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  112. 0x00,0xFE,0x0A,0x8A,0xBE,0xAA,0xAB,0xAA,0xBE,0x8A,0x0A,0x00,0x08,0x07,0x00,0x08,
  113. 0x09,0x0A,0x04,0x04,0x0A,0x09,0x08,0x00,

  114. /*--  文字:  华  --*/
  115. /*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  116. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  117. 0x10,0x08,0x7C,0x03,0x10,0x90,0x3F,0x48,0x44,0x42,0x70,0x00,0x01,0x01,0x01,0x01,
  118. 0x01,0x0F,0x01,0x01,0x01,0x01,0x01,0x00,

  119. /*--  文字:  氏  --*/
  120. /*--  宋体9;  此字体下对应的点阵为:宽x高=12x12   --*/
  121. /*--  高度不是8的倍数,现调整为:宽度x高度=12x16  --*/
  122. 0x00,0xFE,0x22,0x22,0x22,0x22,0x7E,0xA1,0x21,0x21,0x20,0x00,0x00,0x0F,0x04,0x02,
  123. 0x00,0x00,0x00,0x01,0x02,0x04,0x0F,0x00,

  124. 0x00,0x7C,0xC4,0x44,0x7C,0x00,0xFC,0x44,0x44,0xC4,0x04,0x00,0x00,0x3F,0x3F,0x22,
  125. 0x11,0x00,0x7F,0x44,0x44,0x43,0x20,0x00,/*"距",4*/
  126. 0x00,0x00,0xF8,0x08,0x58,0x2A,0x3C,0x48,0xE8,0x18,0x04,0x00,0x00,0x7C,0x03,0x13,
  127. 0x1F,0x13,0x13,0x2B,0x53,0x7E,0x02,0x00,/*"离",5*/

  128. };
  129. // 5110屏幕的库文件

  130. #define   res1 P2OUT|=BIT0;  //片选
  131. #define  res0 P2OUT&=~BIT0;  //片选
  132. #define   sce1 P2OUT|=BIT1;  //复位,0复位
  133. #define   sce0 P2OUT&=~BIT1;
  134. #define   dc1  P2OUT|=BIT2;  //1写数据,0写指令
  135. #define   dc0  P2OUT&=~BIT2;
  136. #define   sdin1 P2OUT|=BIT3;  //数据
  137. #define   sdin0 P2OUT&=~BIT3;
  138. #define   sclk1 P2OUT|=BIT4;  //时钟
  139. #define   sclk0 P2OUT&=~BIT4;
  140. #define   led0 P1OUT&=~BIT6;
  141. #define   led1 P1OUT&=BIT6;
  142. #define   buzz0 P1OUT&=~BIT7;
  143. #define   buzz1 P1OUT&=BIT7;
  144. #define CPU_F ((double)1000000)
  145. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
  146. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  147. #define uchar unsigned char
  148. #define uint unsignded int
  149. #define ulong unsignded long
  150. #include <math.h>
  151. /*--------------------------------------------
  152. LCD_write_byte: 使用SPI接口写数据到LCD
  153. 输入参数:dt:写入的数据;
  154. command :写数据/命令选择;
  155. 编写日期:20080918
  156. ----------------------------------------------*/

  157. void LCD_write_byte(unsigned char dt, unsigned char command)
  158. {
  159. unsigned char i;
  160. sce0;       
  161. if(command==1)
  162.         {dc1;        }
  163.         else {dc0;}
  164. for(i=0;i<8;i++)
  165. {
  166. if(dt&0x80)
  167.                 {sdin1;}
  168. else
  169.                 {sdin0;}
  170. dt=dt<<1;       
  171. sclk0;
  172. sclk1;
  173. }       
  174. dc1;       
  175. sce1;       
  176. sdin1;
  177. }
  178. /*---------------------------------------
  179. LCD_init: 3310LCD初始化
  180. 编写日期:20080918
  181. -----------------------------------------  */
  182. void LCD_init(void)
  183. {       P2DIR=0Xff;
  184.         P1DIR=0Xff;
  185.         P1OUT=0XFF;
  186. res0;         
  187.   res1;  
  188. LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
  189. LCD_write_byte(0xd0,0);//设定液晶偏置电压
  190. LCD_write_byte(0x20,0);//使用基本指令
  191. LCD_write_byte(0x0C,0);//设定显示模式,正常显示
  192. }
  193. /*-------------------------------------------
  194. LCD_set_XY: 设置LCD坐标函数
  195. 输入参数:X:0-83  Y:0-5
  196. 编写日期:20080918
  197. ---------------------------------------------*/
  198. void LCD_set_XY(unsigned char X, unsigned char Y)
  199. {
  200. LCD_write_byte(0x40 | Y, 0);// column
  201. LCD_write_byte(0x80 | X, 0);// row
  202. }
  203. /*------------------------------------------
  204. LCD_clear: LCD清屏函数
  205. 编写日期:20080918
  206. --------------------------------------------*/
  207. void LCD_clear(void)
  208. {
  209. unsigned char t;
  210. unsigned char k;
  211. LCD_set_XY(0,0);
  212. for(t=0;t<6;t++)
  213. {
  214. for(k=0;k<84;k++)
  215. {
  216. LCD_write_byte(0x00,1);
  217. }
  218. }
  219. }
  220. /*---------------------------------------------
  221. LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
  222. 输入参数:c:显示的字符;
  223. 编写日期:20080918
  224. -----------------------------------------------*/
  225. void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
  226. {
  227. unsigned char i;         
  228. LCD_set_XY(row*6, page);// 列,页
  229. for(i=0; i<6;i++)
  230. {
  231. LCD_write_byte(zimu[c*12+i],1);
  232. }
  233.     LCD_set_XY(row*6, page+1);// 列,页
  234. for(i=6; i<12;i++)
  235. {
  236. LCD_write_byte(zimu[c*12+i],1);
  237. }       
  238. }


  239. void LCD_write_str(unsigned char row,unsigned char page,unsigned char *s)
  240. {
  241.     while (*s)
  242.     {
  243.     void LCD_write_shu(unsigned char row,unsigned char page,unsigned char s);
  244.     s++;
  245.         row++;
  246.     }
  247. }
  248. //定义全局变量,设置7个闹钟,一个时钟
  249. char flag1;
  250. uchar flag2=0;
  251. int nian=2015;
  252. char time[6]={0,0,0,1,1,0},set=5;
  253. uchar yue[12]={31,28,31,30,31,30,31,31,30,30,31};
  254. char lock[7][3],lockset=3,lockge;
  255. char displaytime[6];
  256. int displaynian;        
  257. uchar oclock[7];   
  258. uchar oclockon;

  259. //每隔一秒会显示在屏幕上
  260. void timechange(void)
  261. {uchar i;
  262. {
  263.   for(i=0;i<6;i++)
  264.   displaytime[i]=time[i];
  265.   displaynian=nian;   
  266. }   
  267.      if(++time[0]>=60)
  268. {time[0]=0;
  269. if(++time[1]>=60)
  270. {time[1]=0;
  271. if(++time[2]>=24)
  272. {time[2]=0;
  273. if(++time[3]==yue[time[4]-1]+1)
  274. {time[3]=1;
  275. if(++time[4]>=13)
  276. {time[4]=1;
  277.   nian++;
  278. }
  279. }
  280. }
  281. }
  282. }

  283. }


  284. //定时与当前时间相同,闹钟响起来
  285. void locktime()
  286. { P1OUT=0X8F;
  287. uchar i;
  288. for(i=0;i<7;i++)
  289. {
  290. if(time[2]==lock[i][2])
  291.     {
  292. if(time[1]==lock[i][1])
  293.         {
  294.           if(oclock[i]==1)
  295.           {
  296.             P1OUT=0X7F;
  297.             LCD_write_shu(2,2,i);
  298.             oclockon=i;
  299.           }
  300.         }
  301.     }       
  302. }
  303. }
  304. void lockdisplay(void)
  305. {uchar j;
  306.   if(flag1==1)
  307. {      
  308.    for(j=0;j<2;j++)  
  309. if(lock[lockge][j]>=60) lock[lockge][j]=0;
  310. if(lock[lockge][2]>=24) lock[lockge][2]=0;
  311.        LCD_write_shu(0,0,19);//
  312.    
  313.       {
  314.        LCD_write_shu(4,2,lock[lockge][2]/10);//c
  315.        LCD_write_shu(5,2,lock[lockge][2]%10);//o
  316.         LCD_write_shu(6,2,10);//.
  317.       }
  318.    
  319.        {
  320.        LCD_write_shu(7,2,lock[lockge][1]/10);//e
  321.        LCD_write_shu(8,2,lock[lockge][1]%10);//d
  322.        LCD_write_shu(9,2,10);//f
  323.        }

  324.       {
  325.         LCD_write_shu(10,2,lock[lockge][0]/10);//.
  326.         LCD_write_shu(11,2,lock[lockge][0]%10);//c
  327.       }
  328. }
  329.   
  330. }

  331. //显示当前时间 完全
  332. void timedisplay(void)
  333. {uchar i;
  334.   for(i=0;i<2;i++)
  335. if(time[i]>=60|time[i]<=0) time[i]=0;
  336. if(time[2]>=24|time[2]<=0)time[2]=0;
  337. if(time[3]>yue[time[4]-1]|time[3]<=0)time[3]=1;
  338. if(time[4]>12|time[4]<=0)time[4]=1;
  339.    
  340. {
  341.         LCD_write_shu(2,0,nian/1000);//
  342.        LCD_write_shu(3,0,nian%1000/100);//
  343.        LCD_write_shu(4,0,nian%100/10);//c
  344.        LCD_write_shu(5,0,nian%10);//o
  345.        }
  346.         LCD_write_shu(6,0,15);//.
  347.        LCD_write_shu(7,0,time[4]/10);//e
  348.        LCD_write_shu(8,0,time[4]%10);//d
  349.        LCD_write_shu(9,0,15);//f
  350.         LCD_write_shu(10,0,time[3]/10);//.
  351.         LCD_write_shu(11,0,time[3]%10);//c
  352.     //  LCD_write_shu(12,0,15);//n*/
  353.        LCD_write_shu(4,2,time[2]/10);//c
  354.        LCD_write_shu(5,2,time[2]%10);//o
  355.         LCD_write_shu(6,2,10);//.
  356.        LCD_write_shu(7,2,time[1]/10);//e
  357.        LCD_write_shu(8,2,time[1]%10);//d
  358.        LCD_write_shu(9,2,10);//f
  359.         LCD_write_shu(10,2,time[0]/10);//.
  360.         LCD_write_shu(11,2,time[0]%10);//c
  361.    //    LCD_write_shu(12,2,15);//n*/   
  362.       
  363.       {//进行年月日判断
  364. if(nian%4 !=0)  time[5]=0;       
  365. else if(nian%400==0)  time[5]=0;
  366. else if(nian%4==0)  time[5]=1;
  367. if(time[5]==1)yue[1]=29;
  368. if(time[5]==0)yue[1]=28;
  369.                
  370.       }  

  371. }
  372. //x显示当前时间部分
  373. void timedisplay1(void)
  374. { uchar i;
  375.   if(flag1==0)
  376. {   
  377.    for(i=0;i<2;i++)
  378. if(time[i]>=60|time[i]<=0) time[i]=0;
  379. if(time[2]>=24|time[2]==0)time[2]=0;
  380. if(time[3]>yue[time[4]-1]|time[3]<=0)time[3]=1;
  381. if(time[4]>12|time[4]<=0)time[4]=1;
  382.       if(displaynian!=nian)
  383.       {
  384.         LCD_write_shu(2,0,nian/1000);//
  385.        LCD_write_shu(3,0,nian%1000/100);//
  386.        LCD_write_shu(4,0,nian%100/10);//c
  387.        LCD_write_shu(5,0,nian%10);//o     
  388.        }
  389.        if(displaytime[4]!=time[4])
  390.        {
  391.         LCD_write_shu(6,0,15);//.
  392.        LCD_write_shu(7,0,time[4]/10);//e
  393.        LCD_write_shu(8,0,time[4]%10);//d
  394.        LCD_write_shu(9,0,15);//f
  395.        }
  396.       if(displaytime[3]!=time[3])
  397.       {
  398.         LCD_write_shu(10,0,time[3]/10);//.
  399.         LCD_write_shu(11,0,time[3]%10);//c
  400.     //  LCD_write_shu(12,0,15);//n*/
  401.       }
  402.       
  403.         {
  404.        LCD_write_shu(4,2,time[2]/10);//c
  405.        LCD_write_shu(5,2,time[2]%10);//o
  406.         LCD_write_shu(6,2,10);//.
  407.         }
  408.       
  409.         {
  410.        LCD_write_shu(7,2,time[1]/10);//e
  411.        LCD_write_shu(8,2,time[1]%10);//d
  412.        LCD_write_shu(9,2,10);//f
  413.         }
  414.      
  415.       {
  416.         LCD_write_shu(10,2,time[0]/10);//.
  417.         LCD_write_shu(11,2,time[0]%10);//c
  418.    //    LCD_write_shu(12,2,15);//n*/   
  419.       }
  420.      
  421. }
  422. }

  423. //红外遥控模块,通过按红外遥控,修改时间或者闹钟,或者显示当前温度
  424. #define KEY_0     0x16                 //键0
  425. #define KEY_1     0x0C                 //键1
  426. #define KEY_2     0x18                 //键2
  427. #define KEY_3     0x5E                 //键3
  428. #define KEY_4     0x08                 //键4
  429. #define KEY_5     0x1C                 //键5
  430. #define KEY_6     0x5A                 //键6
  431. #define KEY_7     0x42                 //键7
  432. #define KEY_8     0x52                 //键8
  433. #define KEY_9     0x4A                 //键9
  434. #define prex      0x44                 //电源
  435. #define nex       0x40                 //模式
  436. #define play_pause 0x43                 //静音
  437. #define ch_       0x45                //模式
  438. #define ch        0x46  
  439. #define cha       0x47                 //模式
  440. #define __         0x07
  441. #define _a        0x15
  442. #define eq        0x09
  443. #define _100a      0x19
  444. #define _200a      0x0d
  445. //红外接收头H1838控制脚,单脚控制
  446. #define RED_IN               P1DIR &= ~BIT3                 //设置输入,红外接收头接单片机PE3口
  447. #define RED_OUT               P1DIR |=  BIT3                 //设置输出
  448. #define RED_L               P1OUT &= ~BIT3                 //置低电平
  449. #define RED_H               P1OUT |= BIT3            //置高电平
  450. #define RED_R               (P1IN & BIT3)                 //读电平

  451. uchar KEY_VAL=0;
  452. uchar code_value=0;
  453. uchar key_code[4];
  454. int ad_value;
  455. //温度显示,计算100次,误差较小
  456. void datado()
  457. {  long int advalue=0;
  458.     uchar i;
  459.      int IntDegC,  IntDegF ;
  460.       for(i=0;i<100;i++)
  461.       {  
  462.         ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  463.         advalue=advalue+ad_value;
  464.          ADC10CTL0 |= ~(ENC + ADC10SC);  
  465.       }
  466.       ad_value=(advalue/100);
  467.       IntDegF = ((ad_value - 630) * 761) / 1024;
  468.        IntDegC = ((ad_value - 673) * 423) / 1024;
  469.         if(IntDegC>0)
  470.          LCD_write_shu(1,4,15);
  471.        if(IntDegC<=0)
  472.        {
  473.          IntDegC=-IntDegC;
  474.          LCD_write_shu(1,4,22);
  475.        }
  476.        LCD_write_shu(2,4,IntDegC /10);//
  477.        LCD_write_shu(3,4,IntDegC%10);//
  478.        LCD_write_shu(4,4,18);//c
  479.        LCD_write_shu(5,4,19);//o
  480.         LCD_write_shu(6,4,15);//.
  481.         
  482.         if(IntDegF>0)
  483.          LCD_write_shu(1,4,15);  
  484.         if(IntDegF<=0)
  485.        {
  486.          IntDegF=-IntDegF;
  487.          LCD_write_shu(6,4,22);
  488.        }
  489.        LCD_write_shu(7,4,IntDegF/10);//e
  490.        LCD_write_shu(8,4,IntDegF%10);//d
  491.       LCD_write_shu(9,4,20);//f
  492.             
  493.       
  494.      
  495. }

  496. //***********************************************************************
  497. //               MSP430IO口初始化
  498. //***********************************************************************
  499. void Port_Init1()
  500. {
  501. //  LED8DIR  = 0xFF;                      //设置IO口方向为输出
  502. //  LED8 = 0xFF;                      //P2口初始设置为FF
  503.    
  504.   RED_L;
  505.   RED_IN;

  506. }
  507. void switchoclock()
  508. {
  509.   switch(oclock[lockge])
  510.   {
  511.   case 0:oclock[lockge]=1;LCD_write_shu(0,2,28);break;
  512.   case 1:oclock[lockge]=0;LCD_write_shu(0,2,18);break;
  513.   default:break;
  514.   }  
  515. }

  516. void setlockortime(void)
  517. {
  518.    
  519. if(flag1==0)
  520.   {
  521.     switch(KEY_VAL)
  522.     {
  523.     default:break;
  524.     case '/':++set;if(set>=7) set=1;break;
  525.     case '*':++time[set-1];break;
  526.     }
  527.    if(set==6&KEY_VAL=='+')++nian;
  528.    if(set==6&KEY_VAL=='-')--nian;
  529.    LCD_write_shu(13,2,set);
  530.    timedisplay();
  531.   }

  532. if(flag1==1)
  533.   {
  534.     switch(KEY_VAL)
  535.     {
  536.     default:break;
  537.     case '/':++lockset;if(lockset>=4) lockset=1;break;
  538.     case '*':++lock[lockge][lockset-1];break;
  539.     case 0x40:++lockge;if(lockge>=7)lockge=0;break;
  540.     case 0x44:switchoclock();break;  
  541.     }
  542.     lockdisplay();
  543.     LCD_write_shu(13,2,lockset);
  544.     LCD_write_shu(13,0,lockge);
  545.   }
  546. if(KEY_VAL>0&KEY_VAL<=9)
  547.    {
  548.           switch(oclock[oclockon])
  549.        {
  550.        default:break;
  551.        case 0:oclock[oclockon]=1;break;
  552.        case 1:oclock[oclockon]=0;break;  
  553.        }
  554.    }

  555.    
  556. }


  557. void startit(void)
  558. {
  559. switch(flag1)
  560.   {
  561.   case 0:flag1=1;;break;
  562.   case 1:flag1=0;break;
  563.   default:break;
  564.   }

  565. }
  566. //*************************************************************************
  567. //        遥控器键值赋功能值子程序
  568. //*************************************************************************
  569. void Key_Icode(void)
  570. {
  571.    {
  572.      LCD_write_shu(13,2,15);
  573.      LCD_write_shu(0,0,15);
  574.      LCD_write_shu(12,4,15);
  575.      LCD_write_shu(2,2,15);
  576.      LCD_write_shu(13,0,15);
  577.      LCD_write_shu(0,2,15);
  578.       LCD_write_shu(12,2,15);
  579.       LCD_write_shu(2,2,15);
  580.    }
  581.     KEY_VAL=' ';
  582.    switch(key_code[2])                    //第3个字节是数据,第4个字节是反码
  583.    {                                      //为了更稳定,可以加上第4个字节数据的判断
  584.    case KEY_0:KEY_VAL=0; LCD_write_shu(13,4,KEY_VAL); break;
  585.    case KEY_1:KEY_VAL=1; LCD_write_shu(13,4,KEY_VAL); break;
  586.    case KEY_2:KEY_VAL=2; LCD_write_shu(13,4,KEY_VAL); break;
  587.    case KEY_3:KEY_VAL=3; LCD_write_shu(13,4,KEY_VAL); break;
  588.    case KEY_4:KEY_VAL=4; LCD_write_shu(13,4,KEY_VAL); break;
  589.    case KEY_5:KEY_VAL=5; LCD_write_shu(13,4,KEY_VAL); break;
  590.    case KEY_6:KEY_VAL=6;  LCD_write_shu(13,4,KEY_VAL); ;break;
  591.    case KEY_7:KEY_VAL=7; LCD_write_shu(13,4,KEY_VAL); break;
  592.    case KEY_8:KEY_VAL=8; LCD_write_shu(13,4,KEY_VAL); break;
  593.    case KEY_9:KEY_VAL=9; LCD_write_shu(13,4,KEY_VAL); break;
  594.    case prex: KEY_VAL=0x44;  datado();
  595.                      LCD_write_shu(12,4,29);
  596.                     LCD_write_shu(13,4,25);
  597.                    break;
  598.    case nex :KEY_VAL=0x40;LCD_write_shu(12,4,11);
  599.                    LCD_write_shu(13,4,25);
  600.                    break;
  601.    case play_pause: datado();
  602.                     KEY_VAL=0x43;
  603.                    LCD_write_shu(12,4,28);
  604.                    LCD_write_shu(13,4,29);break;
  605.    case ch_:KEY_VAL='/';LCD_write_shu(13,4,24); break;
  606.    case ch: KEY_VAL='='; LCD_init();  //初始化LCD模块
  607.                LCD_clear(); //清屏幕
  608.                          Port_Init1();     
  609.                         P1OUT&=0XfF;
  610.                          break;
  611.    case cha:KEY_VAL='*';LCD_write_shu(13,4,23);break;
  612.    case eq: startit();break;
  613.    case _a:KEY_VAL='+';LCD_write_shu(13,4,21);;break;
  614.    case __:KEY_VAL='-';LCD_write_shu(13,4,22);;break;
  615.    case _100a:KEY_VAL=0xa2;LCD_write_shu(12,4,1);
  616.                            LCD_write_shu(13,4,21); break;
  617.    case _200a:KEY_VAL=0xa3;LCD_write_shu(12,4,2);
  618.                            LCD_write_shu(13,4,21); break;
  619.    default:KEY_VAL=10;break;
  620.    }

  621.    setlockortime();   
  622.   
  623. }



  624. //*************************************************************************
  625. //        遥控器解码子程序
  626. //*************************************************************************

  627. void Red_Code()
  628. {
  629. uchar i,j,k = 0;

  630. for(i = 0;i < 19;i++)
  631. {
  632.   delay_us(400);           //延时400us
  633.   if(RED_R)                //9ms内有高电平,则判断为干扰,退出处理程序
  634.   {
  635.       return;
  636.   }
  637. }

  638. while(!RED_R);            //等待9ms低电平过去



  639. for(i=0;i<5;i++)          //是否连发码
  640. {
  641.   delay_us(500);
  642.   if(!RED_R)
  643.    {
  644.      return;
  645.    }
  646. }


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

  648. for(i = 0;i < 4;i++)        //接收4个字节的数据
  649. {
  650.   for(j = 0;j < 8;j++)      //每个字节的数据8位
  651.   {
  652.    

  653.    while(!RED_R);           //等待变高电平
  654.    while(RED_R)             //计算高电平时间
  655.    {
  656.     delay_us(100);
  657.     k++;
  658.     if(k >22)               //高电平时间过长,则退出处理程序
  659.     {
  660.      return;         
  661.     }
  662.    
  663.    }

  664.    code_value>>=1;          //接受一位数据
  665.    if(k >= 7)
  666.    {
  667.     code_value|=0x80;       //高电平时间大于0.56,则为数据1
  668.    }
  669.    k = 0;                  //计时清零
  670.   }
  671.   key_code[i]=code_value;  //四个字节的数据
  672. }

  673.   Key_Icode();             //调用赋值函数

  674. // Display_Key(KEY_VAL);     //显示按键值
  675.   
  676. // delay_ms(5);

  677. }
复制代码



回复

使用道具 举报

ID:73223 发表于 2015-2-23 21:28 | 显示全部楼层
请教一下 除了单片机那块板子 做这个闹钟还需要买什么配件啊?键盘吗?
回复

使用道具 举报

ID:73223 发表于 2015-2-23 21:29 | 显示全部楼层
挺急的 要做这个作业不知道做什么好 没啥头绪 觉得楼主这个不错呀
回复

使用道具 举报

ID:73223 发表于 2015-2-24 22:28 | 显示全部楼层
楼主 急啊QAQ
回复

使用道具 举报

ID:75612 发表于 2015-4-1 21:18 | 显示全部楼层
请教一下 除了单片机那块板子 做这个闹钟还需要买什么配件啊?键盘吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表