切换到宽版
  • 6411阅读
  • 20回复

IBM串口客显配STC15F104W。换个单片机再做个钟。 [复制链接]

上一主题 下一主题
离线alexuo
 

发帖
901
M币
2437
专家
18
粉丝
172
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-02-24
前两天用STC89c52做了个钟,主要为了学习,丑了点,而且40脚也太浪费了,体积又大,放进客显里困难。
于是买了8脚贴片的15f104w 6个io口,串口tx用一个 DS1302 用3个,还剩2个给按键用。

加入了图形,实现了2个按键实现3个功能(这点个人比较得意,本人新手)哈哈。
设置界面字符会闪烁。







拆掉了VFD上的MAX232 直接输入TTL电平。




下一步打算研究一下1302某个口能不能分时共用,打算腾出一个口来做屏幕电源开关,VFD太耗电,寿命也短。

慢慢来吧。边折腾边学才扎实嘛。

  1. #include<reg52.h>     //包含单片机寄存器的头文件
  2. #include<intrins.h>   //包含_nop_()函数定义的头文件
  3. #define BAUD    0xFE80                  // 9600bps @ 11.0592MHz
  4. unsigned char code digit[10]={"0123456789"};   //定义字符数组显示数字
  5. unsigned char  code initialize[]={0X1B,0X5C,0X3F,0X4C,0X53,0X38,0X1B,0X53,0X33,0x06};     //VFD初始化数组16*16简体中文
  6. unsigned char  code clvfd[]={0X1B,0X5B,0X32,0X4A,0X0d,0x06};    //VFD清屏
  7. unsigned int code gImage_ring[] = { 0X1B, 0X5C, 0X3F, 0X4C, 0X47,0x32,0x3b,0x31,0x3b,0x33,0x38,0x3b,0x33,0x35,0x3b,
  8. 0x03,0xE0,0x00,0xF8,0x00,0x07,0xF0,0x01,0xFE,0x00,0x1F,0xF9,0xF3,0xFF,0x00,0x3F,
  9. 0xFD,0xF7,0xFF,0x80,0x7F,0xF8,0x43,0xFF,0xC0,0xFF,0xE0,0x40,0xFF,0xE0,0xFF,0x8F,
  10. 0xFE,0x3F,0xE0,0xFF,0x3F,0xFF,0x8F,0xE0,0xFC,0x7F,0xFF,0xC7,0xE0,0x71,0xFF,0xFF,
  11. 0xF1,0xE0,0x63,0xF0,0x43,0xF8,0xC0,0x03,0xE0,0xE0,0xFC,0x00,0x07,0xC0,0x40,0x7C,
  12. 0x00,0x0F,0x80,0x00,0x3E,0x00,0x1F,0x00,0x40,0x1F,0x00,0x1E,0x18,0x40,0x0F,0x00,
  13. 0x1C,0x0C,0x40,0x0F,0x00,0x3C,0x06,0x40,0x07,0x80,0x3C,0x03,0x40,0x07,0x80,0x3C,              //时钟图标
  14. 0x01,0xE0,0x07,0x80,0x3D,0x00,0xF0,0x17,0x80,0x3F,0x81,0xBF,0xBF,0x80,0x3D,0x01,
  15. 0xF0,0x17,0x80,0x3C,0x00,0xE0,0x07,0x80,0x3C,0x00,0x40,0x07,0x80,0x3C,0x00,0x00,
  16. 0x07,0x80,0x1E,0x00,0x00,0x0F,0x80,0x1E,0x00,0x00,0x0F,0x00,0x1F,0x00,0x00,0x1F,
  17. 0x00,0x0F,0x80,0x00,0x3E,0x00,0x07,0xC0,0x00,0x7C,0x00,0x07,0xE0,0xE0,0xFC,0x00,
  18. 0x03,0xF0,0x41,0xF8,0x00,0x01,0xFF,0xFF,0xF0,0x00,0x01,0xFF,0xFF,0xF0,0x00,0x03,
  19. 0xFF,0xFF,0xF8,0x00,0x07,0xCF,0xFE,0x7C,0x00,0x0F,0x80,0x00,0x3E,0x00,0xaa};
  20. unsigned int code gImage_setting[] = { 0X1B, 0X5C, 0X3F, 0X4C, 0X47,0x33,0x3b,0x32,0x3b,0x33,0x35,0x3b,0x33,0x35,0x3b,
  21. 0x00,0x00,0x00,0x07,0x80,0x01,0xC0,0x00,0x0F,0xC0,0x03,0xF8,0x00,0x1F,0xE0,0x01,
  22. 0xFC,0x00,0x33,0xE0,0x00,0xFE,0x00,0x67,0xE0,0x00,0x7F,0x00,0xCE,0xE0,0x00,0x3F,
  23. 0x01,0x9C,0xC0,0x60,0x3F,0x03,0x39,0x80,0x70,0x3F,0x86,0x73,0x00,0x78,0x3F,0x8C,
  24. 0xE6,0x00,0x7C,0x7F,0x89,0xCC,0x00,0x7F,0xFF,0xC3,0x98,0x00,0x3F,0xFF,0xE3,0x30,
  25. 0x00,0x3F,0xFF,0xF0,0x60,0x00,0x1F,0xFF,0xF8,0xC0,0x00,0x0F,0xFF,0xFC,0x00,0x00,
  26. 0x03,0xFF,0xFE,0x00,0x00,0x00,0x3F,0xFF,0x00,0x00,0x00,0x1F,0xFF,0x80,0x00,0x00,
  27. 0x0F,0xFF,0xC0,0x00,0x00,0x07,0xFF,0xE0,0x00,0x00,0x03,0xFF,0xF0,0x00,0x00,0x31,             //设置图标
  28. 0xFF,0xF8,0x00,0x00,0x70,0xFF,0xFC,0x00,0x00,0xF8,0x7F,0xFE,0x00,0x01,0xF0,0x3F,
  29. 0xFF,0x00,0x07,0xE0,0x1F,0xC7,0x80,0x1F,0xC0,0x0F,0xC3,0x80,0x1F,0x80,0x07,0xC3,
  30. 0x80,0x3F,0x80,0x03,0xC3,0x80,0x7F,0x00,0x01,0xEF,0x00,0x7F,0x00,0x00,0xFF,0x00,
  31. 0xFC,0x00,0x00,0x7E,0x00,0x70,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xaa};
  32.                                                     
  33. unsigned int c;   //数组计数变量
  34. unsigned char k;   //跳出while变量
  35. unsigned char second,minute,hour,day,month,week,year;      //分别储存苗、分、小时,日,月,年  ,周
  36. unsigned char ReadValue;   //储存从1302读取的数据
  37. unsigned char na,nn,and;
  38. sbit SCLK=P3^3;   //位定义1302芯片的接口,时钟输出端口定义在P1.0引脚
  39. sbit DATA=P3^4;   //位定义1302芯片的接口,数据输出端定义在P1.1引脚
  40. sbit RST=P3^5;    //位定义1302芯片的接口,复位端口定义在P1.2引脚
  41. sbit keyset=P3^2;    //加键  
  42. sbit keyup=P3^0;    //减减
  43. sfr AUXR=0x8E;
  44. sbit TXB=P3^1;                  //定义串口 TX 引脚
  45. typedef bit BOOL;
  46. typedef unsigned char BYTE;
  47. BYTE TBUF;        //定义发送缓冲
  48. BYTE TDAT;
  49. BYTE TCNT;
  50. BYTE TBIT;
  51. BOOL TING;
  52. BOOL TEND;
  53. void UART_INIT();
  54. void UART_SEND(BYTE dat);
  55.       
  56. /*****************************************************
  57. 函数功能:延时若干微秒
  58. 入口参数:n
  59. ***************************************************/
  60. void delaynus(unsigned char n)
  61. {
  62. unsigned char i;
  63. for(i=0;i<n;i++);
  64.     _nop_();
  65.     _nop_();
  66.     _nop_();
  67. }
  68. /*****************************************************
  69. 函数功能:向1302写一个字节数据
  70. 入口参数:x
  71. ***************************************************/
  72. void Write1302(unsigned char dat)
  73. {
  74.   unsigned char i;
  75.   SCLK=0;            //拉低SCLK,为脉冲上升沿写入数据做好准备
  76.   delaynus(2);       //稍微等待,使硬件做好准备
  77.   for(i=0;i<8;i++)      //连续写8个二进制位数据
  78.     {
  79.          DATA=dat&0x01;    //取出dat的第0位数据写入1302  低位在前,高位在后
  80.          delaynus(2);       //稍微等待,使硬件做好准备
  81.          SCLK=1;           //上升沿写入数据
  82.          delaynus(2);      //稍微等待,使硬件做好准备
  83.          SCLK=0;           //重新拉低SCLK,形成脉冲
  84.          dat>>=1;          //将dat的各数据位右移1位,准备写入下一个数据位
  85.       }
  86.     
  87. }
  88. /*****************************************************
  89. 函数功能:根据命令字,向1302写一个字节数据
  90. 入口参数:Cmd,储存命令字;dat,储存待写的数据
  91. ***************************************************/
  92. void WriteSet1302(unsigned char Cmd,unsigned char dat)
  93. {      
  94.         RST=0;           //禁止数据传递
  95.         SCLK=0;          //确保写数居前SCLK被拉低
  96.         RST=1;           //启动数据传输
  97.         delaynus(2);     //稍微等待,使硬件做好准备
  98.         Write1302(Cmd);  //写入命令字
  99.         Write1302(dat);  //写数据
  100.         SCLK=1;          //将时钟电平置于高电平状态
  101.         RST=0;           //禁止数据传递
  102. }
  103. /*****************************************************
  104. 函数功能:从1302读一个字节数据
  105. 入口参数:x
  106. ***************************************************/
  107. unsigned char Read1302(void)
  108. {
  109.     unsigned char i,dat;
  110.     delaynus(2);       //稍微等待,使硬件做好准备
  111.     for(i=0;i<8;i++)   //连续读8个二进制位数据
  112.      {     dat>>=1;
  113.          if(DATA==1)    //如果读出的数据是1
  114.          dat|=0x80;    //将1取出,写在dat的最高位
  115.          SCLK=1;       //将SCLK置于高电平,为下降沿读出
  116.          delaynus(2);  //稍微等待
  117.          SCLK=0;       //拉低SCLK,形成脉冲下降沿
  118.          delaynus(2);  //稍微等待
  119.       }    
  120.   return dat;        //将读出的数据返回
  121. }  
  122. /*****************************************************
  123. 函数功能:根据命令字,从1302读取一个字节数据
  124. 入口参数:Cmd
  125. ***************************************************/
  126. unsigned char  ReadSet1302(unsigned char Cmd)
  127. {
  128.   unsigned char dat;
  129.   RST=0;                 //拉低RST
  130.   SCLK=0;                //确保写数居前SCLK被拉低
  131.   RST=1;                 //启动数据传输
  132.   Write1302(Cmd);       //写入命令字
  133.   dat=Read1302();       //读出数据
  134.   SCLK=1;              //将时钟电平置于已知状态
  135.   RST=0;               //禁止数据传递
  136.   return dat;          //将读出的数据返回
  137. }
  138. /*****************************************************
  139. 函数功能:延时1ms
  140. ***************************************************/
  141. void delay1ms()
  142. {
  143.     unsigned char i, j;
  144.     _nop_();
  145.     _nop_();
  146.     _nop_();
  147.     i = 11;
  148.     j = 190;
  149.     do
  150.     {
  151.         while (--j);
  152.     } while (--i);        
  153. }
  154. /*****************************************************
  155. 函数功能:延时若干毫秒
  156. 入口参数:n
  157. ***************************************************/
  158. void delaynms(unsigned int n)
  159. {
  160.    unsigned int i;
  161.     for(i=0;i<n;i++)
  162.        delay1ms();
  163. }
  164. /*****************************************************
  165. 函数功能:指定字符显示的实际地址
  166. 入口参数:x1,x2      坐标
  167. ***************************************************/
  168. void WriteAddress(unsigned char x1,x2)
  169. {
  170.    unsigned char x2a,x2b;
  171.    x2a=x2/16+0x30;
  172.    x2b=x2%16+0x30;
  173.    UART_SEND(0x1b);
  174.    UART_SEND(0x5b);
  175.    UART_SEND(x1);
  176.    UART_SEND(0x3b);
  177.    UART_SEND(x2a);  
  178.    UART_SEND(x2b);
  179.    UART_SEND(0x48);
  180.             
  181. }
  182. /*****************************************************
  183. 函数功能:将数据(字符的标准ASCII码)写入VFD
  184. 入口参数:y(为字符常量)
  185. ***************************************************/
  186. void WriteData(unsigned char y)
  187. {
  188.             UART_SEND(y);
  189.           
  190. }
  191. /*****************************************************
  192. 函数功能:VFD清屏
  193. ***************************************************/
  194. void VFDCLEAN(void)
  195. {
  196.     c=0;
  197.     while(clvfd[c]!=0x06)
  198.         {
  199.             UART_SEND(clvfd[c]);
  200.               c++;
  201.         }
  202. }
  203. /*****************************************************
  204. 函数功能:显示时钟图标
  205. ***************************************************/
  206. void VFDRING(void)
  207. {
  208.     c=0;
  209.     while(gImage_ring[c]!=0xaa)
  210.         {
  211.             UART_SEND(gImage_ring[c]);
  212.               c++;
  213.         }
  214. }
  215. /*****************************************************
  216. 函数功能:显示设置图标
  217. ***************************************************/
  218. void VFDSETTING(void)
  219. {
  220.     c=0;
  221.     while(gImage_setting[c]!=0xaa)
  222.         {
  223.             UART_SEND(gImage_setting[c]);
  224.               c++;
  225.         }
  226. }
  227. /*****************************************************
  228. 函数功能:设置界面字符闪烁         0x30 恢复正常  0x35 闪烁  0x37 反相
  229. ***************************************************/
  230. void phase(unsigned char ph)
  231. {
  232.     UART_SEND(0x1b);
  233.     UART_SEND(0x5b);
  234.      UART_SEND(ph);
  235.     UART_SEND(0x6d);
  236.     }
  237. /*****************************************************
  238. 函数功能:写入VFD显示模式进行初始化设置 16x16 简体中文
  239. ***************************************************/
  240. void LcdInitiate(void)
  241. {
  242.     c=0;
  243.     while(initialize[c]!=0x06)
  244.         {
  245.             UART_SEND(initialize[c]);
  246.             c++;
  247.         }
  248. }
  249. /**************************************************************
  250. 以下是1302数据的显示程序
  251. **************************************************************/
  252. /*****************************************************
  253. 函数功能:显示秒
  254. 入口参数:x
  255. ***************************************************/
  256. void DisplaySecond(unsigned char x)
  257. {
  258. unsigned char i,j;     //j,k分别储存十位和个位
  259.     i=x/10;//取十位
  260.     j=x%10;//取个位    
  261.     WriteAddress(0x32,0x13);    //写显示地址,将在第2行第13列开始显示
  262.     WriteData(digit[i]);    //将百位数字的字符常量写入VFD
  263.     WriteData(digit[j]);    //将十位数字的字符常量写入VFD
  264.       delaynms(50);
  265. }
  266. /*****************************************************
  267. 函数功能:显示分钟
  268. 入口参数:x
  269. ***************************************************/
  270. void DisplayMinute(unsigned char x)
  271. {
  272. unsigned char i,j;     //j,k十位和个位
  273.     i=x/10;//取十位
  274.     j=x%10;//取个位    
  275.     WriteAddress(0x32,0x10);    //写显示地址,将在第2行第10列开始显示
  276.     WriteData(digit[i]);    //将百位数字的字符常量写入VFD
  277.     WriteData(digit[j]);    //将十位数字的字符常量写入VFD
  278.     delaynms(50);
  279. }
  280. /*****************************************************
  281. 函数功能:显示小时
  282. 入口参数:x
  283. ***************************************************/
  284. void DisplayHour(unsigned char x)
  285. {
  286. unsigned char i,j;     //j,k十位和个位
  287.     i=x/10;//取十位
  288.     j=x%10;//取个位    
  289.     WriteAddress(0x32,0x07);    //写显示地址,将在第2行第7列开始显示
  290.     WriteData(digit[i]);    //将百位数字的字符常量写入LCD
  291.     WriteData(digit[j]);    //将十位数字的字符常量写入LCD
  292.     delaynms(50);
  293. }
  294. /*****************************************************
  295. 函数功能:显示日
  296. 入口参数:x
  297. ***************************************************/
  298. void DisplayDay(unsigned char x)
  299. {
  300.      unsigned char i,j;     //j,k十位和个位
  301.     i=x/10;//取十位
  302.     j=x%10;//取个位    
  303.     WriteAddress(0x31,0x17);    //写显示地址,将在第1行第17列开始显示
  304.     WriteData(digit[i]);    //将十位数字的字符常量写入VFD
  305.     WriteData(digit[j]);    //将个位数字的字符常量写入VFD
  306.     delaynms(50);    
  307. }
  308. /*****************************************************
  309. 函数功能:显示月
  310. 入口参数:x
  311. ***************************************************/
  312. void DisplayMonth(unsigned char x)
  313. {
  314. unsigned char i,j;     //j,k分别储存十位和个位
  315.     i=x/10;//取十位
  316.     j=x%10;//取个位    
  317.     WriteAddress(0x31,0x13);    //写显示地址,将在第1行第13列开始显示
  318.     WriteData(digit[i]);    //将十位位数字的字符常量写入VFD
  319.     WriteData(digit[j]);    //将个位数字的字符常量写入VFD
  320.     delaynms(50);  
  321. }
  322.   /*****************************************************
  323. 函数功能:显示周
  324. 入口参数:x
  325. ***************************************************/
  326. void Displayweek(unsigned char x)
  327. {
  328. unsigned char j;     //j,k分别储存十位和个位
  329.     j=x%10;//取个位
  330.     
  331.     WriteAddress(0x32,0x19);    //写显示地址,将在第1行第19列开始显示
  332.     switch(j)
  333.     {
  334.      case 1: WriteData(0xc8);WriteData(0xd5);break;
  335.      case 2: WriteData(0xd2);WriteData(0xbb);break;
  336.      case 3: WriteData(0xb6);WriteData(0xfe);break;
  337.      case 4: WriteData(0xc8);WriteData(0xfd);break;
  338.      case 5: WriteData(0xcb);WriteData(0xc4);break;
  339.      case 6: WriteData(0xce);WriteData(0xe5);break;
  340.      case 7: WriteData(0xc1);WriteData(0xf9);break;
  341.     }
  342.    delaynms(50);
  343. }
  344. /*****************************************************
  345. 函数功能:显示年
  346. 入口参数:x
  347. ***************************************************/
  348. void DisplayYear(unsigned char x)
  349. {
  350. unsigned char i,j;     //j,k分别储存十位和个位
  351.     i=x/10;//取十位
  352.     j=x%10;//取个位    
  353.     WriteAddress(0x31,0x09);    //写显示地址,将在第1行第9列开始显示
  354.     WriteData(digit[i]);    //将十位位数字的字符常量写入VFD
  355.     WriteData(digit[j]);    //将个位数字的字符常量写入VFD
  356.     delaynms(50);  
  357. }
  358. /*****************************************************
  359. 函数功能:显示框架
  360. ***************************************************/
  361. void Disframework(void)
  362. {
  363.   WriteAddress(0x31,0x07);  //写Date的显示地址,将在第1行第7列开始显示
  364.   WriteData('2');      
  365.   WriteData('0');      //将“20”写入VFD
  366.   WriteAddress(0x31,0x011);  //写 年 显示地址, 显示在第1行第11列
  367.   WriteData(0xc4);      //将“年”写入VFD    
  368.   WriteData(0xea);
  369.   WriteAddress(0x31,0x15);  //写 月 显示地址, 显示在第1行第15列
  370.   WriteData(0xd4);      //将“月”写入VFD
  371.   WriteData(0xc2);  
  372.   WriteAddress(0x31,0x19);  //写 日 显示地址, 显示在第1行第19列
  373.   WriteData(0xc8);      //将“日”写入VFD
  374.   WriteData(0xd5);  
  375.   WriteAddress(0x32,0x09);  //写分钟与秒分隔符的显示地址, 显示在第2行第9列
  376.   WriteData(':');      //将“:”写入VFD
  377.   WriteAddress(0x32,0x12);  //写分钟与秒分隔符的显示地址, 显示在第2行第12列
  378.   WriteData(':');      //将“:”写入VFD
  379.   WriteAddress(0x32,0x15);  //写分钟与秒分隔符的显示地址, 显示在第2行第15列
  380.   WriteData(0xd0);      
  381.   WriteData(0xc7);  
  382.   WriteData(0xc6);      //将 “星期” 写入VFD    
  383.   WriteData(0xda);
  384. }
  385. /*****************************************************
  386. 函数功能:实时显示时间
  387. *****************************************************/
  388. void distime (void)
  389. {    
  390.       ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据
  391.       second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化
  392.       DisplaySecond(second);          //显示秒
  393.       ReadValue = ReadSet1302(0x83);  //从分寄存器读
  394.       minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  395.       DisplayMinute(minute);           //显示分
  396.       ReadValue = ReadSet1302(0x85);  //从小时寄存器读
  397.       hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  398.       DisplayHour(hour);                 //显示小时
  399.       ReadValue = ReadSet1302(0x87);  //从日寄存器读
  400.       day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  401.       DisplayDay(day);                //显示日
  402.       ReadValue = ReadSet1302(0x89);  //从月寄存器读
  403.       month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  404.       DisplayMonth(month);                   //显示月
  405.       ReadValue = ReadSet1302(0x8b);    //从周寄存器读      
  406.       week=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  407.       Displayweek(week);            //显示周
  408.       ReadValue = ReadSet1302(0x8d);  //从年寄存器读
  409.       year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  410.       DisplayYear(year);              //显示年
  411. }
  412. void settime (void);
  413. /*****************************************************
  414. 函数功能: 按键侦测
  415. 上键X10+下键得到2位的十进制数
  416. ***************************************************/
  417. void Scankey(void)
  418. {    
  419.     unsigned char ks,ku;
  420.       if((keyset==0)||(keyup==0))        
  421.       {    
  422.            delaynms(20);
  423.            ks=keyset;
  424.            ku=keyup;
  425.            and=ks*10+ku;
  426.            if(and==0)
  427.               {
  428.                  if(na==1)          //na=1说明不在设置模式两键同按进设置模式,进入设置模式na会被置0,再两键同按则会跳出校时循环
  429.                     {
  430.                       settime();
  431.                     }
  432.               }
  433.            switch(and)                        
  434.               {
  435.                  case 0: k=0; break;       //and为0说明两个键同时按下使k=0,跳出校时循环
  436.                  case 1: nn++;break;       //and为1说明加键按下
  437.                  case 10: nn--;break;       //and为10说明减键按下
  438.                  case 11: break;           //and为11说明没有按键操作
  439.               }
  440.         
  441.           
  442.        }
  443. }
  444. /*****************************************************
  445. 函数功能:校时
  446. *****************************************************/
  447. void settime (void)
  448. {
  449.      na=0;
  450.      VFDCLEAN();                //将VFD清屏
  451.      Disframework();        //将框架显示在VFD上
  452.      VFDSETTING();            //显示设置图标
  453.      distime();                //显示一遍当前时间
  454.      phase(0x35);            //文字开闪烁
  455.      WriteSet1302(0x8E,0x00);     //关闭1302写保护
  456. //**********************************************************
  457.     
  458.      ReadValue = ReadSet1302(0x8d);  //从年寄存器读
  459.      nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  460.      k=1;       //为while循环赋初值
  461.      while(k)
  462.      {    
  463.       Scankey();     //扫描按键
  464.       if(nn>99){nn=00;}        //限定设置值
  465.       DisplayYear(nn);        //显示设定值
  466.     WriteSet1302(0x8c,((nn/10)<<4|(nn%10)));   //写入1302年寄存器
  467.       delaynms(100);
  468.       }
  469. //****************************************************
  470.      k=1;
  471.      ReadValue = ReadSet1302(0x89);  //从月寄存器读
  472.      nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  473.         while(k)
  474.      {
  475.       Scankey();
  476.       if(nn>12){nn=01;}
  477.       DisplayMonth(nn);
  478.     WriteSet1302(0x88,((nn/10)<<4|(nn%10)));
  479.       delaynms(100);
  480.       }
  481. //****************************************************
  482.      k=1;
  483.      ReadValue = ReadSet1302(0x87);  //从日寄存器读
  484.      nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  485.         while(k)
  486.      {    
  487.       Scankey();
  488.       if(nn>31){nn=01;}
  489.       DisplayDay(nn);
  490.     WriteSet1302(0x86,((nn/10)<<4|(nn%10)));
  491.       delaynms(100);
  492.       }
  493. //****************************************************
  494.      k=1;
  495.       ReadValue = ReadSet1302(0x85);  //从小时寄存器读
  496.       nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  497.         while(k)
  498.      {    
  499.       Scankey();
  500.       if(nn>23){nn=00;}
  501.       DisplayHour(nn);                 //显示小时
  502.     WriteSet1302(0x84,((nn/10)<<4|(nn%10)));
  503.       delaynms(100);
  504.       }
  505. //****************************************************
  506.      k=1;
  507.       ReadValue = ReadSet1302(0x83);  //从分寄存器读
  508.       nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  509.         while(k)
  510.      {    
  511.       Scankey();
  512.       if(nn>59){nn=00;}
  513.       DisplayMinute(nn);           //显示分
  514.     WriteSet1302(0x82,((nn/10)<<4|(nn%10)));
  515.       delaynms(100);
  516.       }
  517. //****************************************************
  518.      k=1;
  519.       ReadValue = ReadSet1302(0x81);   //从秒寄存器读数据
  520.       nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//将读出数据转化
  521.         while(k)
  522.      {    
  523.        Scankey();
  524.        if(nn>59){nn=00;}
  525.       DisplaySecond(nn);          //显示秒
  526.     WriteSet1302(0x80,((nn/10)<<4|(nn%10)));
  527.       delaynms(100);
  528.       }
  529. //****************************************************
  530.      k=1;
  531.      ReadValue = ReadSet1302(0x8b);  //从周寄存器读
  532.      nn=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //将读出数据转化
  533.         while(k)
  534.      {    
  535.        Scankey();
  536.       if(nn>7){nn=01;}
  537.       Displayweek(nn);
  538.     WriteSet1302(0x8a,((nn/10)<<4|(nn%10)));
  539.       delaynms(100);
  540.       }
  541. //****************************************************
  542.     phase(0x30);
  543.     WriteSet1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式
  544.     WriteSet1302(0x8E,0x80);                //打开1302写保护
  545.     VFDCLEAN();                                //清屏
  546.     VFDRING();                                
  547.     Disframework();
  548. }
  549. /*****************************************************
  550. 函数功能: 1302进行初始化设置
  551. ***************************************************/
  552. void Init_DS1302(void)
  553. {    
  554.   unsigned char flag;
  555.   
  556.     flag= ReadSet1302(0x81);
  557.     if(flag&0x80)     //判断时钟芯片是否关闭
  558.     {  
  559.       settime();
  560.     
  561.     }
  562.   }
  563. /*****************************************************
  564. 函数功能:主函数
  565. ***************************************************/
  566. void main(void)
  567. {
  568.   delaynms(600);          //延时1秒等待VFD启动
  569.     
  570.     TMOD=0x00;                        //定时器0在16位自动重装模式
  571.     AUXR=0x80;                        //定时器0在1T模式
  572.     TL0=BAUD;
  573.     TH0=BAUD>>8;                      //初始化定时器0并设定重装值
  574.     TR0=1;                            //定时器0开始运行
  575.     ET0=1;                            //使能定时器0中断
  576.     PT0=1;                            //提高定时器0的优先级
  577.     EA=1;                             //打开中断开关
  578.     UART_INIT();                    //启动定时器
  579.   LcdInitiate();             //将VFD初始化
  580.   VFDCLEAN();                //将VFD清屏
  581.   VFDRING();
  582.   Disframework();        //将框架显示在VFD上
  583.   Init_DS1302();       //将1302初始化    
  584.   while(1)
  585.     {
  586.      distime();
  587.      Scankey();
  588.      na=1;
  589.      }
  590. }
  591. //-----------------------------------------
  592. //Timer interrupt routine for UART
  593. void tm0() interrupt 1 using 1
  594. {
  595.     if (--TCNT == 0)
  596.     {
  597.         TCNT=3;                       //重置发送波特率计数器
  598.         if (TING)                     //判断是否发送
  599.         {
  600.             if (TBIT == 0)
  601.             {
  602.                 TXB=0;                //发送开始位
  603.                 TDAT=TBUF;            //从TBUF加载数据到TDAT
  604.                 TBIT=9;               //初始化发送位数(8数据位+1停止位)
  605.             }
  606.             else
  607.             {
  608.                 TDAT >>= 1;           //移位数据到CY
  609.                 if (--TBIT == 0)
  610.                 {
  611.                     TXB=1;
  612.                     TING=0;           //停止发送
  613.                     TEND=1;           //设置发送完成标志
  614.                 }
  615.                 else
  616.                 {
  617.                     TXB=CY;           //写CY到TX脚
  618.                 }
  619.             }
  620.         }
  621.     }
  622. }
  623. //-----------------------------------------
  624. //初始化UART模块变量
  625. void UART_INIT()
  626. {
  627.     TING=0;
  628.     TEND=1;
  629.     TCNT=0;
  630. }
  631. //-----------------------------------------
  632. //发送串口数据
  633. void UART_SEND(BYTE dat)
  634. {
  635.     while (!TEND);
  636.     TEND=0;
  637.     TBUF=dat;
  638.     TING=1;
  639. }

附上VFD的编程说明书
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共5条打赏M币+92
离线离子风

发帖
132
M币
539
专家
5
粉丝
12
只看该作者 1楼 发表于: 2017-02-24
显示屏真漂亮  就是贵了点!!!

做任务
离线xinhoujue

发帖
2610
M币
4012
专家
3
粉丝
40
只看该作者 2楼 发表于: 2017-02-24
哈哈,果然你用的两个按钮做三个开关的手法和我的想法一样啊!
鸟妈妈对小鸟说:“早起地小鸟有虫吃!”;
虫妈妈对小虫说:“早起地小虫被鸟吃!”。
离线philipjunn

发帖
151
M币
5333
专家
0
粉丝
15
只看该作者 3楼 发表于: 2017-02-24
謝謝分享,VFD时钟不错。
离线覆铜板

发帖
877
M币
4
专家
-1
粉丝
45
只看该作者 4楼 发表于: 2017-02-24
做得真不错。
销售覆铜板、铝基板边料适合个人DIY和实验使用。我的淘宝店http://shop66022897.taobao.com/
离线devcang

发帖
17741
M币
8693
专家
19
粉丝
93
只看该作者 5楼 发表于: 2017-02-24
優秀文章 認真發帖  謝謝分享
离线luyangting

发帖
317
M币
292
专家
0
粉丝
40
只看该作者 6楼 发表于: 2017-05-29
麻烦问下这屏是多少V的供电,一上电不发指令是否不显示任何东西?谢谢
离线xiaomage

发帖
740
M币
3718
专家
5
粉丝
35
只看该作者 7楼 发表于: 2017-06-01
優秀文章!再接再厉
离线bg4iww

发帖
2334
M币
1342
专家
2
粉丝
23
只看该作者 8楼 发表于: 2017-06-06
VFD显示效果就是漂亮,但寿命是个问题
离线mon51

发帖
161
M币
331
专家
4
粉丝
11
只看该作者 9楼 发表于: 2017-07-11
DS1302只要CS不共用,其它2个脚均可复用。这2个IO完全可以做按键。2个键借用延时,可以当做4个键用。