切换到宽版
  • 1007阅读
  • 7回复

PIC12F675八脚单片机的数码管时间带3按键,蜂鸣器 [复制链接]

上一主题 下一主题
离线mckk520
 

发帖
180
M币
1600
专家
9
粉丝
23
,
,
,
,
============
,
,
  1. #include <pic.h>
  2. __CONFIG(0X3E54);           //PIC12F675 欠压检测,代码加密,内部复位GPIO3作IO,内部4MHZ震荡
  3. #define uchar unsigned char  
  4. #define uint  unsigned int  
  5. #define ulong unsigned long
  6. //4LED时间
  7. //PIC12F675+TM1620数码管时间,
  8. // ADC分压3按键, 1讯响器,,
  9. //  1PIN 检测是外部供电还是内部供电,亮度不同,
  10. // 内部供电的话显示70分钟后关闭LED显示,以节约电,
  11. //锂电池供电,正常显示23mA
  12. // 关显运行正常走时,电流0.7mA,  ---70mA电池待机100小时,当再次充电的时候时间还准的,不准可以加时间补偿,
  13. //
  14. //----------------------------定义管脚
  15. #define     STB     GPIO0
  16. #define     CLK     GPIO1
  17. #define     DIO     GPIO2
  18. #define    in     GPIO3
  19. #define    ka      GPIO4
  20. #define    bibi      GPIO5
  21. uchar kid1;
  22. uchar kid2;
  23. uchar kid3;
  24. uchar ts;
  25. bit kf1;
  26. bit kf2;
  27. bit kf3;
  28. uint csj;
  29. uint bbsj;
  30. uchar bbsj2;
  31. uint keyid ;
  32. uchar adjj;
  33. uchar ssled1;
  34. uchar ssled2;
  35. uchar LEDSSS3  ;
  36. uchar  KEYKKK3 ;
  37. uchar u100;
  38. uchar m50;
  39. uchar ss;
  40. uchar mm;
  41. uchar hh;
  42. int temps;
  43. uchar dian;
  44. uchar ding;
  45. uchar kk1;
  46. uchar kk2;
  47. uchar id1;
  48. uchar id2;
  49. bit keyf;
  50. uchar hhsj;
  51. uchar liangdu;
  52. //-------------------------------------------
  53. unsigned int i,j;
  54. void delay(unsigned int x)          //延时Xms
  55. {unsigned i,j;
  56. for(i=x;i>0;i--)
  57. for(j=110;j>0;j--);
  58. }
  59. void timer1();
  60. void led_show();
  61. void init_TM1620();
  62. void Write_COM(unsigned char cmd);
  63. void TM1620_Write(uchar wr_data);
  64. const uchar LEDDUAN[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9 共阴数码管段选码表,
  65. uint adcto( void)  // =====PIC的ADC获取程序,非常简单,
  66. {
  67.          uint cTemp;
  68.      //     delay(10);
  69.          ADCON0        = 0x8d;     //A/D 控制寄存器选择AN3 右对齐,vdd
  70.          delay(1);
  71.         GODONE=1;
  72.        while (GODONE);
  73.      //     GO_DONE = 1;
  74.       //    while(GO_DONE == 1);
  75.          cTemp  = ADRESH;
  76.          cTemp &= 0x03;
  77.          cTemp <<= 8;
  78.          cTemp += ADRESL;
  79.          return(cTemp);      
  80. }
  81. //------------------------------------------------
  82. void main()
  83.    {
  84.       // OSCCAL=0xFF;
  85.      OSCCAL=0x53;
  86.     // OSCCAL=0xFF;
  87.     
  88.         CMCON=0B00000111;           //  关闭比较器
  89.       
  90.        ANSEL=0B01111000;            //  关闭ADC  =1开启 0111 XXXX ADC4
  91.       
  92.        TRISIO=0B11011000;          //1为输入,0为输出
  93.   OPTION=0xC8;        //T0CS=0;选择定时器1;1模式,让GP2为普通IO,禁止内部弱上拉
  94. // GPPU=0;               //全局上拉0开,1关 , ,必须在 OPTION 后面,
  95. // WPU1=0;    WPU2=1;    //上拉功能,WPU0,WPU1,或者,  WPU = 0x03;  ,全部默认为开,不要上拉必须WPU1=0;
  96.     PEIE=1;                 //使能外围功能
  97.     TMR1IE=1;               //T1中断使能
  98.      T0IF=0;                      //
  99.     T0IE=1;
  100.     TMR0=156;                    //100us
  101. //----------------------------------------
  102.     T1CON=0x04;             //T1  1分频
  103.     TMR1IF=0;               //清除T1中断标志
  104.   
  105. TMR1H = (65536-1004)/256;
  106. TMR1L = (65536-1004)%256;
  107. //    TMR1H=0xFC;
  108. //   TMR1L=0x28;             //定时器初始值 1MS 983
  109. GIE=1;//使能总中断
  110.   
  111.     TMR1ON=1;               //启动T1计时
  112. dian = 0x00;
  113. ding =  0x00;
  114. kk1= 0x00;
  115. kk2= 0x00;
  116.     STB  =1;
  117.     CLK  =1;
  118.     DIO  =1;
  119. liangdu=138;
  120. init_TM1620();
  121. //delay(500);
  122. hh=23;
  123. mm=59;
  124. ss=0;
  125. u100=0;
  126. m50=0;
  127. hhsj=0;
  128. LEDSSS3 =  0x00;    // 32  64  128
  129. KEYKKK3 = 0x00;
  130. bibi=0;
  131. keyf=0;
  132. keyid=0;
  133. ssled1=0xff;
  134. ssled2=0xff;
  135. ts=0;
  136. kf1=1;
  137. //=============
  138.       while (1)
  139.          {
  140. if(in ==1)
  141. {
  142. hhsj=0;
  143. //=====================白天亮度高,晚上暗,
  144. if( hh>=7  && hh<=19 )  liangdu=142;  
  145. else liangdu=138;
  146. led_show();
  147. }
  148. if(in==0)
  149. {
  150. if(hhsj>=70)
  151. {
  152. hhsj=72;
  153. STB = 0;
  154.     TM1620_Write(137); // 亮度 (0x88-0x8f)8级亮度可调 137-143
  155.     STB = 1;
  156.     STB=0;
  157.     TM1620_Write(0xc0);     // ==    左1
  158.     TM1620_Write( 0x00  );      // 段码
  159.     STB=1;
  160.     
  161.     STB=0;
  162.     TM1620_Write(0xc2);     // 左2
  163.     TM1620_Write( 0x00  );      // 段码
  164.     STB=1;
  165.     
  166.     STB=0;
  167.     TM1620_Write(0xc4);     // 左3
  168.     TM1620_Write( 0x00  );      //段码
  169.     STB=1;
  170.     
  171.       STB=0;
  172.     TM1620_Write(0xc6);     // 左4
  173.     TM1620_Write( 0x00  );      // 段码
  174.     STB=1;
  175.           STB=0;
  176.     TM1620_Write(0xc8);     // 5
  177.     TM1620_Write(  0x00  );      // 段码
  178.     STB=1;
  179.     
  180.       STB=0;
  181.     TM1620_Write(0xca);     // 6
  182.     TM1620_Write(  0x00  );      // 段码
  183.     STB=1;
  184.     
  185.     
  186. }
  187. else
  188. {
  189. liangdu=137;
  190. led_show();
  191. }
  192. }
  193. //========================
  194. //delay(1000);
  195.     }
  196. }  
  197. //====================================================
  198. void interrupt tmer1(void)
  199. {
  200.     if(T0IF==1&&T0IE==1)
  201.      {
  202.           bbsj++;
  203.            TMR0=156;    //100us
  204.           T0IF=0;
  205.   if(bbsj>=5000)   //0.5s
  206.      {  bbsj2=bbsj2+1; if(bbsj2>7)bbsj2=1;     bbsj=0;  }
  207.     //   if(bbsj>=20)   // 1khz
  208.      //     {  bibi=!bibi;     bbsj=0;  }
  209.      }
  210. if(TMR1IF==1&&TMR1IE==1)
  211. {
  212. TMR1IF = 0;
  213. u100++;
  214. /****
  215. if( keyf==1 )
  216. {
  217.       
  218.   if(( KEYKKK3==1)&& (  ka==1 )) hh=11;
  219.   if(( KEYKKK3==2)&& (  ka==1 )) hh=22;
  220.   if(( KEYKKK3==4)&& (  ka==1 )) hh=33;
  221. }
  222. *****/
  223. TMR1H = (65536-1004)/256;
  224. TMR1L = (65536-1004)%256;
  225. //    TMR1H=0xFC;
  226. //  TMR1L=0x28;             //定时器初始值 1MS 983
  227. //------------
  228. if(u100>=200 )  //200ms
  229. {
  230. u100=0;
  231. m50++;
  232. kid1++;
  233. csj++;
  234. // LEDSSS3 = LEDSSS3*2 ;   // 32 64  128
  235. //if(LEDSSS3>128){ LEDSSS3 = 32; }
  236. if(hhsj<70)
  237. {
  238. if(ts==1)
  239. {
  240. LEDSSS3= bbsj2 <<5 ;
  241. ssled2= 0xff;
  242. if( m50 <= 1) ssled1= 0x00;
  243. else   ssled1= 0xff;
  244. }
  245. if(ts==2)
  246. {
  247. LEDSSS3= bbsj2 <<5 ;
  248. ssled1= 0xff;
  249. if( m50 <=1) ssled2= 0x00;
  250. else   ssled2= 0xff;
  251. }
  252.   
  253. if(ts==0)
  254. {
  255. ssled1= 0xff;
  256. ssled2= 0xff;
  257. LEDSSS3=0x00;
  258.   
  259. }
  260. /********
  261. if(!k1)
  262. {
  263. kk1 = 0x80;
  264. ss=0;
  265. hh++;
  266. if(hh>=24)hh=0;
  267. }
  268. else
  269. {
  270.   kk1 = 0x00;
  271. }
  272. if(!k2)
  273. {
  274. kk2 = 0x80;
  275. mm++;
  276. if(mm>=60)mm=0;
  277. }
  278. else
  279. {
  280. kk2 = 0x00;
  281. }
  282. ******/
  283. }
  284. }
  285. if( m50 < 2)
  286. {
  287. dian = 0x80;
  288. }
  289. else
  290. {
  291. dian = 0x00;
  292. }
  293. if( m50 >= 5)  // ========1s
  294. {  
  295. m50=0;
  296. ss++;
  297. if( ss == 2) { ding =  0x00;   LEDSSS3= 0x00; }
  298. if( ss >= 60)  //1m
  299. {  
  300. ss=0;
  301. mm++;
  302. hhsj++;
  303. if( mm>= 60)  //1h
  304. {  
  305. mm=0;
  306. LEDSSS3= bbsj2 <<5 ;
  307. ding =  0x80;
  308. hh++;
  309. if( hh >= 24)  //1s
  310. {
  311. //=====mm=mm+3;   //时间补偿
  312. ss=ss+38;
  313. hh=0;
  314. //=========
  315. }
  316. }
  317. }
  318. }
  319. //-------------
  320. }
  321. }
  322.   
  323. //====================================================
  324. void TM1620_Write(uchar wr_data)
  325. {
  326.     uchar i;
  327.     for(i=0;i<8;i++)
  328.     {
  329.         CLK = 0;
  330.         if(wr_data&0x01)DIO = 1;
  331.         else DIO = 0;
  332.         CLK = 1;   //  NOP();NOP();
  333.         wr_data>>=1;
  334.     }                
  335. }
  336. void Write_COM(unsigned char cmd)        //发送命令字
  337. {
  338.     STB = 0;
  339.     TM1620_Write(cmd);
  340.     STB = 1;
  341. }
  342. void init_TM1620()
  343. {
  344.       STB = 0;
  345.     TM1620_Write(0x02);//显示模式设置,设置为6个GRID,8个SEG  
  346.     STB = 1;
  347.     
  348.       STB = 0;
  349.     TM1620_Write(liangdu); // 亮度 (0x88-0x8f)8级亮度可调 137-143
  350.     STB = 1;
  351.     
  352.         STB = 0;
  353.     TM1620_Write(0x44); //固定地址
  354.     STB = 1;
  355.     
  356.     
  357.     
  358.     
  359.     
  360.     
  361.     STB=0;
  362.     TM1620_Write(0xc0);     // ==    左1
  363.     TM1620_Write(  0x40 );      // 段码
  364.     STB=1;
  365.     
  366.     STB=0;
  367.     TM1620_Write(0xc2);     // 左2
  368.     TM1620_Write(   0x40  );      // 段码
  369.     STB=1;
  370.     
  371.     STB=0;
  372.     TM1620_Write(0xc4);     // 左3
  373.     TM1620_Write(  0x40 );      //段码
  374.     STB=1;
  375.     
  376.       STB=0;
  377.     TM1620_Write(0xc6);     // 左4
  378.     TM1620_Write(  0x40  );      // 段码
  379.     STB=1;
  380.     
  381.           STB=0;
  382.     TM1620_Write(0xc8);     // 5
  383.     TM1620_Write(  0x00  );      // 段码
  384.     STB=1;
  385.     
  386.       STB=0;
  387.     TM1620_Write(0xca);     // 6
  388.     TM1620_Write(  0x00  );      // 段码
  389.     STB=1;
  390.     
  391.   
  392. }
  393. void led_show()  //========== lleedd  1111
  394. {
  395. //  LEDSSS3= 0x00 ;
  396. keyid =0;  
  397. for(adjj=0;adjj<10;adjj++)
  398. {
  399.   keyid = keyid + adcto( );
  400. }
  401. keyid = keyid / 10;
  402. if( keyid >1000    )
  403. {  if( csj>=20) { ts=0;  }   }  //不按按键超时4S退出
  404. else  csj=0;
  405.    if( keyid <11     )
  406.    {
  407. LEDSSS3=32;
  408. if(kid1>= 2 )   //   X200MS  ==0.4s
  409. {
  410. if(kf1)
  411. {
  412. ts=ts+1;
  413. if(ts>2)ts=0;
  414. if(ts==1) temps=hh;
  415. if(ts==2) temps=mm;
  416. //if(ts==3) temps=ds;
  417. kf1=0;
  418. }
  419. }
  420.    }
  421. else{    kid1=0; kf1=1;   }
  422. // ============================================
  423. if (ts ==0 )
  424. {
  425. if( keyid >331 &&   keyid < 351    )LEDSSS3=128;
  426. if( keyid >502 &&   keyid < 522    )LEDSSS3=64;
  427. }
  428. // ============================================
  429. if (ts ==1 )
  430. {
  431. if( keyid >502 &&   keyid < 522    )
  432. {
  433. if(kf2)
  434. {
  435. temps=temps+1;
  436. if(temps>=24)temps=0;
  437. kf2=0;
  438. }
  439. }
  440. else  {  kf2=1; }
  441. if( keyid >331 &&   keyid < 351    )
  442. {
  443. if(kf3)
  444. {
  445. temps=temps-1;
  446. if(temps<0)temps=23;
  447. kf3=0;
  448. }
  449. }
  450. else  {  kf3=1; }
  451. hh=temps;
  452. ss=26;
  453. }
  454. // ============================================
  455. // ============================================
  456. if (ts ==2 )
  457. {
  458. if( keyid >502 &&   keyid < 522    )
  459. {
  460. if(kf2)
  461. {
  462. temps=temps+1;
  463. if(temps>=60)temps=0;
  464. kf2=0;
  465. }
  466. }
  467. else  {  kf2=1; }
  468. if( keyid >331 &&   keyid < 351    )
  469. {
  470. if(kf3)
  471. {
  472. temps=temps-1;
  473. if(temps<0)temps=59;
  474. kf3=0;
  475. }
  476. }
  477. else  {  kf3=1; }
  478. mm=temps;
  479. ss=26;
  480. }
  481. // ============================================
  482. // ============================================
  483. // else if( keyid >502 &&   keyid < 522    )  LEDSSS3=64;
  484. // else if( keyid >331 &&   keyid < 351    )  LEDSSS3=128;
  485. // hh= keyid ;
  486.     STB = 0;
  487.     TM1620_Write(liangdu); // 亮度 (0x88-0x8f)8级亮度可调 137-143
  488.     STB = 1;
  489.     STB=0;
  490.     TM1620_Write(0xc0);     // ==    左1
  491.     TM1620_Write(  kk1 |  ( LEDDUAN[ hh/10%10] & ssled1 )    );      // 段码
  492.     STB=1;
  493.     
  494.     STB=0;
  495.     TM1620_Write(0xc2);     // 左2
  496.     TM1620_Write( kk2 | (  LEDDUAN[ hh%10]  & ssled1 )     );      // 段码
  497.     STB=1;
  498.     
  499.     STB=0;
  500.     TM1620_Write(0xc4);     // 左3
  501.     TM1620_Write( dian | ( LEDDUAN[ mm/10%10]  & ssled2 )       );      //段码
  502.     STB=1;
  503.     
  504.       STB=0;
  505.     TM1620_Write(0xc6);     // 左4
  506.     TM1620_Write( ding |  ( LEDDUAN[mm%10]   & ssled2 )      );      // 段码
  507.     STB=1;
  508.     
  509.               STB=0;
  510.     TM1620_Write(0xc8);     // 5
  511.     TM1620_Write(   0xE0 & LEDSSS3   );      // 段码
  512.     STB=1;
  513.   
  514.       STB=0;
  515.     TM1620_Write(0xca);     // 6
  516.     TM1620_Write( 0x00  );      // 段码   e0
  517.     STB=1;
  518.     
  519.     
  520.     
  521. }


本帖最近打赏记录:共3条打赏M币+27
数码家园 M币 +13 謝謝分享 07-08
keye M币 +1 謝謝分享,贴个电路图会更使人明了。 07-08
温力口 M币 +13 謝謝分享。。。。。 07-07
离线温力口

发帖
58386
M币
169807
专家
515
粉丝
848
只看该作者 1楼 发表于: 07-07
謝謝分享。。。。。
离线308099459

发帖
29
M币
-483
专家
0
粉丝
1
只看该作者 2楼 发表于: 07-08
虽说不玩 但是感谢你的分享
离线小陈兔

发帖
4821
M币
1188
专家
26
粉丝
264
只看该作者 3楼 发表于: 07-08
我没看到原理图。
用“一…就”造句 : 一个人就这样死了…
离线keye

发帖
1698
M币
5531
专家
3
粉丝
48
只看该作者 4楼 发表于: 07-08
謝謝分享,贴个电路图会更使人明了。
离线sanben56

发帖
281
M币
3420
专家
1
粉丝
17
只看该作者 5楼 发表于: 07-08
PIC 是美国微芯产品、最大特点输出点是上拉的三极管C极、有一定电流驱动能力、再者微芯熔丝加密、
离线毒领疯骚

发帖
132
M币
2366
专家
2
粉丝
15
只看该作者 6楼 发表于: 07-10
这些代码中的文字是否要除掉?

内容来自Android手机客户端

离线ycx2002

发帖
374
M币
331
专家
0
粉丝
5
只看该作者 7楼 发表于: 07-17
硬件简单,软件复杂!