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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5643|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

6312 驅(qū)動(dòng)程序 VFD顯示屏 時(shí)鐘

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104835 發(fā)表于 2016-2-4 03:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式


  1. #include<reg51.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. /*
  5. sbit VFD_REM = P1^7;
  6. sbit VFD_CLK = P1^6;
  7. sbit VFD_STB = P1^5;
  8. sbit VFD_DIN = P1^4;

  9. sbit DS1302_IO=P2^6;
  10. sbit DS1302_CLK=P2^5;
  11. sbit DS1302_RST=P2^7;

  12. sbit k1=P3^4;//功能鍵
  13. sbit k2=P3^5;//增加鍵
  14. sbit k3=P3^6;//減小鍵
  15. sbit k4=P3^7;//查看鍵

  16. */

  17. sbit VFD_CLK = P1^6;
  18. sbit VFD_STB = P1^5;
  19. sbit VFD_DIN = P1^7;

  20. sbit k1=P3^0;//功能鍵
  21. sbit k2=P3^1;//增加鍵
  22. sbit k3=P3^2;//減小鍵
  23. sbit k4=P3^6;//鬧鐘查看鍵

  24. sbit DS1302_IO=P1^0;
  25. sbit DS1302_CLK=P3^7;
  26. sbit DS1302_RST=P1^1;


  27. bit r=1; //用來(lái)顯示秒點(diǎn)

  28. uchar code vfdmap[]={0xfc, 0x60, 0xda, 0xf2, 0x66, 0xb6, 0xbe, 0xe0, 0xfe, 0xf6, 0x00};//0-9,-,全滅
  29. uchar code tab[]={0x00,0x10,0x20,0x40,0x80,0x01,0x02,0x04};//用于星期的

  30. uchar sec,min,hour,year,month,day,week,s1num,flag,shu;
  31. unsigned char vfdbuf[]={0,0,0,0,0,0,0};
  32. uchar time[7];


  33. void vfd_cmd (uchar vfd_cmd0); /* 寫命令*/
  34. void vfd_wrdata (uchar vfd_wrdata0); /* 寫數(shù)據(jù) */
  35. void vfd_init (void); /*16312初始化 */


  36. void vfd_cmd (uchar vfd_cmd0) /* VFD 寫控制命令子程序 */
  37. {
  38. unsigned char i;
  39. VFD_STB=1;
  40. VFD_CLK=1;
  41. for ( i=0;i<8;i++ )
  42. {
  43. VFD_STB=0;
  44. VFD_CLK=0;
  45. VFD_DIN = vfd_cmd0&0x01;
  46. VFD_CLK=1;
  47. vfd_cmd0>>=1;
  48. }
  49. VFD_STB=1;
  50. VFD_CLK=1;
  51. }

  52. void vfd_wrdata (uchar vfd_wrdata0) /* VFD 寫數(shù)據(jù)子程序 */
  53. {
  54. unsigned char i;
  55. for(i=0;i<8;i++)
  56. {
  57. VFD_CLK=1;
  58. VFD_STB=0;
  59. VFD_CLK=0;
  60. VFD_DIN=vfd_wrdata0&0x01;
  61. VFD_CLK=1;
  62. vfd_wrdata0>>=1;
  63. }
  64. VFD_STB=0;
  65. VFD_CLK=1;
  66. }

  67. void vfd_init(void)
  68. {
  69. vfd_cmd ( 0x02 ); /* 6柵X16段顯示模式 */
  70. vfd_cmd ( 0x40 ); /* 顯示正常模式,數(shù)據(jù)地址遞增 */
  71. vfd_wrdata ( 0xc0 ); /* 設(shè)置地址從00H開(kāi)始 */
  72. }

  73. void delay_ms(int z)
  74. {
  75. int x,y;
  76. for(x=z;x>0;x--)
  77. for(y=150;y>0;y--);
  78. }


  79. void vfd_time_disp(uchar t_sec,t_min,t_hour,t_week) //顯示
  80. {
  81. uchar min_ge,sec_shi,sec_ge,min_shi,hour_ge,hour_shi,week;
  82. sec_shi=(t_sec>>4)&0x0f;
  83. sec_ge=t_sec&0x0f;
  84. min_shi=(t_min>>4)&0x0f;
  85. min_ge=t_min&0x0f;
  86. hour_shi=(t_hour>>4)&0x0f;
  87. hour_ge=t_hour&0x0f;
  88. week=t_week&0x0f;


  89. vfdbuf[0]=vfdmap[hour_shi];
  90. vfdbuf[1]=vfdmap[hour_ge];
  91. vfdbuf[2]=vfdmap[min_shi];
  92. vfdbuf[3]=vfdmap[min_ge];
  93. vfdbuf[4]=vfdmap[sec_shi];
  94. vfdbuf[5]=vfdmap[sec_ge];
  95. vfdbuf[6]=tab[week]; //星期

  96. vfd_init( );
  97. vfd_wrdata (vfdbuf[1]); //C0 第1柵
  98. vfd_wrdata (vfdbuf[0]); //C1
  99. vfd_wrdata (0x08); //C2 第2柵
  100. vfd_wrdata (0); //C3
  101. vfd_wrdata (vfdbuf[3]|r); //C4 第3柵
  102. vfd_wrdata (vfdbuf[2]|0x01); //C5
  103. vfd_wrdata (vfdbuf[5]); //C6 第4柵
  104. vfd_wrdata (vfdbuf[4]|0x01); //C7
  105. vfd_wrdata (0x10); //C8 第5柵
  106. vfd_wrdata (0x10); //C9
  107. vfd_wrdata (0); //CA
  108. vfd_wrdata (vfdbuf[6]);//CB
  109. VFD_STB=1;
  110. delay_ms(10);
  111. vfd_cmd ( 0x8f ); // 顯示開(kāi),14/16脈寬
  112. delay_ms(1);
  113. }

  114. void vfd_date_disp(uchar t_day,t_month,t_year,t_week) //顯示
  115. {
  116. uchar day_shi,day_ge,month_shi,month_ge,year_ge,year_shi,week;
  117. day_shi=(t_day>>4)&0x0f;
  118. day_ge=t_day&0x0f;
  119. month_shi=(t_month>>4)&0x0f;
  120. month_ge=t_month&0x0f;
  121. year_shi=(t_year>>4)&0x0f;
  122. year_ge=t_year&0x0f;
  123. week=t_week&0x0f;


  124. vfdbuf[0]=vfdmap[year_shi];
  125. vfdbuf[1]=vfdmap[year_ge];
  126. vfdbuf[2]=vfdmap[month_shi];
  127. vfdbuf[3]=vfdmap[month_ge];
  128. vfdbuf[4]=vfdmap[day_shi];
  129. vfdbuf[5]=vfdmap[day_ge];
  130. vfdbuf[6]=tab[week]; //星期

  131. vfd_init( );
  132. vfd_wrdata (vfdbuf[1]); //C0 第1柵
  133. vfd_wrdata (vfdbuf[0]); //C1
  134. vfd_wrdata (0x08); //C2 第2柵
  135. vfd_wrdata (0); //C3
  136. vfd_wrdata (vfdbuf[3]); //C4 第3柵
  137. vfd_wrdata (vfdbuf[2]); //C5
  138. vfd_wrdata (vfdbuf[5]); //C6 第4柵
  139. vfd_wrdata (vfdbuf[4]); //C7
  140. vfd_wrdata (0x10); //C8 第5柵
  141. vfd_wrdata (0x10); //C9
  142. vfd_wrdata (0); //CA
  143. vfd_wrdata (vfdbuf[6]);//CB
  144. VFD_STB=1;
  145. delay_ms(10);
  146. vfd_cmd ( 0x8f ); // 顯示開(kāi),14/16脈寬
  147. delay_ms(1);
  148. }



  149. void wdayte_byte(uchar dat) //寫1字節(jié)數(shù)據(jù)到1302,低位在前。
  150. {
  151. uchar i;
  152. for(i=0;i<8;i++)
  153. {
  154. DS1302_IO=0;
  155. if(dat&0x01)
  156. DS1302_IO=1;
  157. else
  158. DS1302_IO=0;
  159. dat=dat>>1;
  160. DS1302_CLK=0;
  161. DS1302_CLK=1;
  162. }
  163. DS1302_CLK=0;
  164. }

  165. uchar read_byte() //從DS1302中讀1字節(jié)數(shù)據(jù),讀出時(shí)高位在前。
  166. {
  167. uchar i,dat;
  168. for(i=0;i<8;i++)
  169. {
  170. dat=dat>>1;
  171. if(DS1302_IO)
  172. dat=dat|0x80;
  173. DS1302_CLK=1;
  174. DS1302_CLK=0;
  175. }
  176. DS1302_CLK=0;
  177. return(dat);
  178. }

  179. void wdayte_ds1302(uchar add,uchar dat) //向DS1302的add地址中寫入dat數(shù)據(jù)
  180. {
  181. DS1302_RST=0;
  182. DS1302_CLK=0;
  183. DS1302_RST=1;
  184. wdayte_byte(add);
  185. wdayte_byte(dat);
  186. DS1302_CLK=0;
  187. DS1302_RST=0;
  188. }

  189. uchar read_ds1302(uchar add) //從DS1302的add地址中讀出數(shù)據(jù)
  190. {
  191. uchar time ;
  192. DS1302_RST=0;
  193. DS1302_CLK=0;
  194. DS1302_RST=1;
  195. wdayte_byte(add);
  196. time=read_byte();
  197. DS1302_CLK=0;
  198. DS1302_RST=0;
  199. return(time);
  200. }

  201. void init_ds1302() //時(shí)間初始化函數(shù),不進(jìn)行初始化DS1302不能正常工作
  202. {
  203. wdayte_ds1302(0x8e,0x00);
  204. wdayte_ds1302(0x8c,time[0]); //寫入年數(shù)據(jù)
  205. wdayte_ds1302(0x88,time[1]); //寫入月數(shù)據(jù)
  206. wdayte_ds1302(0x86,time[2]); //寫入日數(shù)據(jù)
  207. wdayte_ds1302(0x84,time[3]); //寫入時(shí)數(shù)據(jù)
  208. wdayte_ds1302(0x82,time[4]); //寫入分?jǐn)?shù)據(jù)
  209. wdayte_ds1302(0x80,time[5]); //寫入秒數(shù)據(jù)
  210. wdayte_ds1302(0x8a,time[6]); //寫入星期數(shù)據(jù)
  211. wdayte_ds1302(0x90,0xa5); //充電(因用的是法拉電容,所以選一個(gè)二極管,2K電阻)
  212. wdayte_ds1302(0x8e,0x80);
  213. }

  214. void read_time() //時(shí)間讀取函數(shù)
  215. {
  216. sec=read_ds1302(0x81);
  217. min=read_ds1302(0x83);
  218. hour=read_ds1302(0x85);
  219. week=read_ds1302(0x8b);
  220. day=read_ds1302(0x87);
  221. month=read_ds1302(0x89);
  222. year=read_ds1302(0x8d);
  223. time[0]=year;
  224. time[1]=month;
  225. time[2]=day;
  226. time[3]=hour;
  227. time[4]=min;
  228. time[5]=sec;
  229. time[6]=week;
  230. }


  231. void keyscan() //鍵盤檢測(cè)函數(shù),用于時(shí)間的調(diào)節(jié)
  232. {
  233. if(k4==0) //K4在沒(méi)有調(diào)整時(shí)間時(shí)按下顯示日期,有調(diào)時(shí)按下先保存退出再顯示日期
  234. {

  235. delay_ms(1);
  236. if(k4==0)

  237. {
  238. if(flag==1)
  239. {
  240. init_ds1302();

  241. }
  242. vfd_date_disp(day,month,year,week);
  243. delay_ms(2000);
  244. flag=0;
  245. s1num=0;
  246. }

  247. }

  248. if(k1==0)
  249. {
  250. delay_ms(1);
  251. if(k1==0)
  252. {
  253. while(!k1);
  254. s1num++;
  255. flag=1;
  256. if(s1num==7)
  257. {
  258. init_ds1302();
  259. flag=0;
  260. s1num=0;
  261. }
  262. }
  263. }
  264. if(s1num!=0)
  265. {
  266. if(k2==0)//加鍵按下
  267. {
  268. delay_ms(1);
  269. if(k2==0)
  270. {
  271. switch(s1num)
  272. {
  273. case 1: min=((min/16)*10)+(min%16);
  274. min++;
  275. if(min==60)
  276. min=0;
  277. time[4]=(((min/10)<<4)&0xf0)|((min%10)&0x0f);
  278. time[5]=0x00;
  279. wdayte_ds1302(0x8e,0x00);
  280. wdayte_ds1302(0x80,time[5]);
  281. wdayte_ds1302(0x82,time[4]);
  282. wdayte_ds1302(0x8e,0x80);
  283. break;
  284. case 2: hour=((hour/16)*10)+(hour%16);
  285. hour++;
  286. if(hour==24)
  287. hour=0;
  288. time[3]=(((hour/10)<<4)&0xf0)|((hour%10)&0x0f);
  289. wdayte_ds1302(0x8e,0x00);
  290. wdayte_ds1302(0x84,time[3]);
  291. wdayte_ds1302(0x8e,0x80);
  292. break;
  293. case 3: day=((day/16)*10)+(day%16);
  294. day++;
  295. if(day==32)
  296. day=1;
  297. time[2]=(((day/10)<<4)&0xf0)|((day%10)&0x0f);
  298. wdayte_ds1302(0x8e,0x00);
  299. wdayte_ds1302(0x86,time[2]);
  300. wdayte_ds1302(0x8e,0x80);
  301. break;
  302. case 4: month=((month/16)*10)+(month%16);
  303. month++;
  304. if(month==13)
  305. month=1;
  306. time[1]=(((month/10)<<4)&0xf0)|((month%10)&0x0f);
  307. wdayte_ds1302(0x8e,0x00);
  308. wdayte_ds1302(0x88,time[1]);
  309. wdayte_ds1302(0x8e,0x80);
  310. break;

  311. case 5: year=((year/16)*10)+(year%16);
  312. year++;
  313. if(year>99)
  314. year=0;
  315. time[0]=(((year/10)<<4)&0xf0)|((year%10)&0x0f);
  316. wdayte_ds1302(0x8e,0x00);
  317. wdayte_ds1302(0x8c,time[0]);
  318. wdayte_ds1302(0x8e,0x80);
  319. break;
  320. case 6: week=week%16;
  321. week++;
  322. if(week>7)
  323. week=1;
  324. time[6]=((week%10)&0x0f);
  325. wdayte_ds1302(0x8e,0x00);
  326. wdayte_ds1302(0x8a,time[6]);
  327. wdayte_ds1302(0x8e,0x80);
  328. break;
  329. }
  330. }
  331. }

  332. if(k3==0)//減鍵按下
  333. {
  334. delay_ms(1);
  335. if(k3==0)
  336. {
  337. switch(s1num)
  338. {
  339. case 1: min=((min/16)*10)+(min%16);
  340. min--;
  341. if(min==-1)
  342. min=59;
  343. time[4]=(((min/10)<<4)&0xf0)|((min%10)&0x0f);
  344. time[5]=0x00;
  345. wdayte_ds1302(0x8e,0x00);
  346. wdayte_ds1302(0x80,time[5]);
  347. wdayte_ds1302(0x82,time[4]);
  348. wdayte_ds1302(0x8e,0x80);
  349. break;
  350. case 2: hour=((hour/16)*10)+(hour%16);
  351. hour--;
  352. if(hour==-1)
  353. hour=23;
  354. time[3]=(((hour/10)<<4)&0xf0)|((hour%10)&0x0f);
  355. wdayte_ds1302(0x8e,0x00);
  356. wdayte_ds1302(0x84,time[3]);
  357. wdayte_ds1302(0x8e,0x80);
  358. break;
  359. case 3: day=((day/16)*10)+(day%16);
  360. day--;
  361. if(day==0)
  362. day=31;
  363. time[2]=(((day/10)<<4)&0xf0)|((day%10)&0x0f);
  364. wdayte_ds1302(0x8e,0x00);
  365. wdayte_ds1302(0x86,time[2]);
  366. wdayte_ds1302(0x8e,0x80);
  367. break;
  368. case 4: month=((month/16)*10)+(month%16);
  369. month--;
  370. if(month==-1)
  371. month=12;
  372. time[1]=(((month/10)<<4)&0xf0)|((month%10)&0x0f);
  373. wdayte_ds1302(0x8e,0x00);
  374. wdayte_ds1302(0x88,time[1]);
  375. wdayte_ds1302(0x8e,0x80);
  376. break;

  377. case 5: year=((year/16)*10)+(year%16);
  378. year--;
  379. if(year==-1)
  380. year=99;
  381. time[0]=(((year/10)<<4)&0xf0)|((year%10)&0x0f);
  382. wdayte_ds1302(0x8e,0x00);
  383. wdayte_ds1302(0x8c,time[0]);
  384. wdayte_ds1302(0x8e,0x80);
  385. break;
  386. case 6: week=week%16;
  387. week--;
  388. if(week==0)
  389. week=7;
  390. time[6]=((week%10)&0x0f);
  391. wdayte_ds1302(0x8e,0x00);
  392. wdayte_ds1302(0x8a,time[6]);
  393. wdayte_ds1302(0x8e,0x80);
  394. break;
  395. }
  396. }
  397. }


  398. }


  399. }



  400. void set_time_disp(s1num,flag) //時(shí)間調(diào)節(jié)顯示函數(shù)
  401. {
  402. uchar i;
  403. if((s1num==1)&&(flag==1))
  404. {
  405. read_time();
  406. for(i=0;i<10;i++)
  407. vfd_time_disp(sec,min,hour,week);
  408. for(i=0;i<10;i++)
  409. vfd_time_disp(sec,0xaa,hour,week);
  410. }
  411. if((s1num==2)&&(flag==1))
  412. {
  413. read_time();
  414. for(i=0;i<10;i++)
  415. vfd_time_disp(sec,min,hour,week);
  416. for(i=0;i<10;i++)
  417. vfd_time_disp(sec,min,0xaa,week);
  418. }
  419. if((s1num==3)&&(flag==1))
  420. {
  421. read_time();
  422. for(i=0;i<10;i++)
  423. vfd_date_disp(day,month,year,week);
  424. for(i=0;i<10;i++)
  425. vfd_date_disp(0xaa,month,year,week);
  426. }
  427. if((s1num==4)&&(flag==1))
  428. {
  429. read_time();
  430. for(i=0;i<10;i++)
  431. vfd_date_disp(day,month,year,week);
  432. for(i=0;i<10;i++)
  433. vfd_date_disp(day,0xaa,year,week);
  434. }
  435. if((s1num==5)&&(flag==1))
  436. {
  437. read_time();
  438. for(i=0;i<10;i++)
  439. vfd_date_disp(day,month,year,week);
  440. for(i=0;i<10;i++)
  441. vfd_date_disp(day,month,0xaa,week);
  442. }
  443. if((s1num==6)&&(flag==1))
  444. {
  445. read_time();
  446. for(i=0;i<10;i++)
  447. vfd_date_disp(day,month,year,week);
  448. for(i=0;i<10;i++)
  449. vfd_date_disp(day,month,year,0x00);
  450. }
  451. }

  452. void main()
  453. {
  454. TMOD=0x01; //設(shè)定定時(shí)器0為方式1
  455. TH0=(65536-50000)/256; //定時(shí)時(shí)間設(shè)置,時(shí)間設(shè)為50毫秒
  456. TL0=(65536-50000)%256;
  457. EA=1; //開(kāi)總中斷
  458. ET0=1; //開(kāi)定時(shí)器0中斷
  459. TR0=1; //啟動(dòng)定時(shí)器0
  460. while(1)
  461. {
  462. keyscan();
  463. read_time(); //按鍵檢測(cè)
  464. if(flag==0) //如果沒(méi)有按鍵進(jìn)入這里
  465. {
  466. vfd_time_disp(sec,min,hour,week);
  467. }
  468. if(flag==1) //如果有按鍵進(jìn)入這里
  469. {
  470. set_time_disp(s1num,flag);
  471. }
  472. }
  473. }

  474. void T0_time() interrupt 1 //中斷函數(shù)用于秒點(diǎn)的閃爍,周期1秒
  475. {

  476. TH0=(65536-50000)/256;
  477. TL0=(65536-50000)%256;
  478. shu++; //用于時(shí)間的計(jì)數(shù)10次500MS
  479. if(shu==10)
  480. {
  481. shu=0;
  482. r=~r; //每500毫秒led取反一次
  483. }
  484. }
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
capacitance_1 + 5 很給力!

查看全部評(píng)分

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:60515 發(fā)表于 2016-2-6 13:01 來(lái)自觸屏版 | 只看該作者
可以發(fā)一下電路??控制是什么形號(hào)的VDF屏??
回復(fù)

使用道具 舉報(bào)

板凳
ID:149451 發(fā)表于 2020-1-26 09:08 | 只看該作者
求教各位走過(guò)路過(guò)的朋友,這個(gè)程序如何改成PT6311的?知道顯存地址不同,可是不會(huì)改
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区精品在线 | 欧美成人一区二区三区 | 欧美精品在线免费观看 | 99久久免费精品国产免费高清 | 国产激情在线观看 | 欧美一级欧美三级在线观看 | 成人精品视频在线观看 | 激情福利视频 | 国产高清免费 | 中文字幕日韩欧美 | 中文字幕11页 | 欧美日韩在线精品 | 亚洲成人第一页 | 中文字幕av一区 | 午夜影晥 | 黄色片网站在线观看 | 久久精品在线播放 | 国产情侣啪啪 | 亚洲国产二区 | 精品av天堂毛片久久久借种 | 91中文字幕在线 | 亚洲一区毛片 | 99国产精品久久久 | 午夜影院在线观看免费 | 欧美精品片 | 成人欧美一区二区三区黑人孕妇 | 久久精品中文字幕 | 天天干天天插天天 | 成人毛片在线视频 | 在线欧美一区二区 | 在线观看免费av网站 | 亚洲区中文字幕 | 不卡一区| 欧美二区三区 | 亚洲国产一区二区三区在线观看 | 96av麻豆蜜桃一区二区 | 亚洲精品国产第一综合99久久 | 亚洲色图综合网 | 91极品欧美视频 | 成人高清在线 | av片免费 |