找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8392|回复: 2
打印 上一主题 下一主题
收起左侧

5x7小点阵时钟,使用了反并联技术

[复制链接]
跳转到指定楼层
楼主
我的起亚智跑车上的时钟被阉割了,车友一般都是买个成品小时钟加装。咱正在学习单片机就打算自己做一个。
由于安装空间有限,选择了横放的4个5x7点阵,SOP28的STC-15F2K60S2MCU直接焊接在5x7LED的12个引脚上并直接驱动(跟杜洋老师学的)。
上图:




4个5x7点阵之间使用漆包线连接。


程序刚有点眉目,目前显示正常:
视频地址:
http://pan.baidu.com/s/1o6OJmjS



视频转成GIF的效果较差,实际显示很稳定的。
因为车里有GPS,所以没有做设置按键,打算直接使用GPS授时(未完成)。
由于MCU的IO口数量有限,所以使用了LED反并联驱动技术,4位5x7点阵仅使用了17个IO口。见下图:



借用网上找的mini3216电路图说一下原理:



该电路使用48脚MCU STC12C5A60S2 直接驱动3216点阵,如果用传统方法直接驱动至少要用48个IO口。
图中可看出左边4块与右边4块LED模块是完全的反并联,这样只需使用16+16=32个IO口。
再看一下STC 手册中IO口模式设置:



程序借鉴了杜洋兄特色的LED逐点驱动理念。
1/   上电初始化时将相应IO口的PxM0置1,
2/   关闭显示段落中将相应IO口的PxM1置1,也就是将相应IO口全部设置为开漏输出。再将相应IO口置1(高电平)。
此时IO口等效电路如下图:


相当于是高阻状态。
当我们要点亮某一个点时,以上图D1模块的1行1列点及列共阴为例,发命令:H1端口PxM1=0,L1=0,此时H1端口模式被设置为推挽并高电平输出,L1端口为开漏的低电平。D1模块的1行1列点得到正向电压并发光,D3模块的1行1列点得到反向电压,不发光。
延时一段时间后,关闭显示。
再以上图D3模块的1行1列点为例,它是与D1模块的1行1列反并联的,发命令:L1端口PxM1=0,H1=0,此时L1端口模式被设置为推挽并高电平输出,H1端口为开漏的低电平。D3模块的1行1列点得到正向电压并发光,D1模块的1行1列点得到反向电压,不发光。
延时一段时间后,关闭显示。
由此可以看出,LED的反并联驱动充分利用了LED的单向导通发光的特性。假设每一个发光点是一个白炽灯泡的话,这个方法就不行了。
目前俺还在研究GPS授时,程序里没有设置时间的功能,仅供参考。下载:http://pan.baidu.com/s/1hq6E97I

8.jpg (28.59 KB, 下载次数: 278)

8.jpg

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2015-5-4 03:44 | 只看该作者
  1. /*********************************************************************************************
  2. 出品: DoYoung Studio
  3. 程序名:    数码管驱动程序
  4. 编写时间:  2011年8月16日
  5. 硬件支持:  STC12C4052AD
  6. 接口说明:  点扫描  
  7. 修改日志:  
  8.   NO.1-                                                               
  9. /*********************************************************************************************
  10. 说明:

  11. /*********************************************************************************************/
  12. #include <STC15F2K60S2.H>

  13. /**********************************************************************************************/
  14. //“程序开发调试设置项”
  15. #define LI                        1         //设置LED显示的亮度(值域:1~9)
  16. #define DELAY                10         //设置每一个点显示的时间长度(1~20)
  17. /**********************************************************************************************/
  18. sbit        LED_1        =P2^3; //设置LED点阵屏连接的I/O口
  19. sbit        LED_2        =P2^5; //设置LED点阵屏连接的I/O口
  20. sbit        LED_3        =P3^7; //设置LED点阵屏连接的I/O口
  21. sbit        LED_4        =P1^4; //设置LED点阵屏连接的I/O口
  22. sbit        LED_5        =P5^4; //设置LED点阵屏连接的I/O口
  23. sbit        LED_6        =P2^7; //设置LED点阵屏连接的I/O口
  24. sbit        LED_7        =P2^4; //设置LED点阵屏连接的I/O口
  25. sbit        LED_8        =P2^2;
  26. sbit        LED_9        =P2^0;
  27. sbit        LED_10        =P1^1;
  28. sbit        LED_11        =P3^3;
  29. sbit        LED_12        =P3^5;
  30. sbit        LED_13        =P1^6;
  31. sbit        LED_14        =P2^1;
  32. sbit        LED_15        =P1^2;
  33. sbit        LED_16        =P1^0;
  34. sbit        LED_17        =P2^6;

  35. #define P1M0SET                0x57 //设置I/O口工作方式//01010111
  36. #define P2M0SET                0xff //设置I/O口工作方式//11111111
  37. #define P3M0SET                0xa8 //设置I/O口工作方式//10101000
  38. #define P5M0SET                0x10 //设置I/O口工作方式//00010000

  39. //sbit        KEY                =P3^2; //按键1

  40. bit PD;//秒点显示标志
  41. unsigned char MENU;//菜单切换标志位
  42. data unsigned char TIME_HH,TIME_MM,TIME_SS;//设置时、分、秒存放区
  43. data unsigned char hs  = 0; // 软计数器,对10ms时基信号累加到0.5s
  44. data unsigned char cou  = 0; // 软计数器,对10ms时基信号累加到1s
  45. data unsigned char bn;//扫描映射全局变量
  46. data unsigned char PWM;//显示亮度

  47. /**********************************************************************************************/
  48. unsigned char code NUM[]={//显示数字字样
  49. 0X1F,0X11,0X1F,//0
  50. 0x12,0x1F,0x10,//1
  51. 0x1D,0x15,0x17,//2
  52. 0x15,0x15,0x1F,//3
  53. 0x07,0x04,0x1F,//4
  54. 0x17,0x15,0x1D,//5
  55. 0x1F,0x15,0x1D,//6
  56. 0x01,0x01,0x1F,//7
  57. 0x1F,0x15,0x1F,//8
  58. 0x17,0x15,0x1F,//9
  59. 0x02,0x1C,0x14,//C
  60. 0x0E,0x10,0x0E,//V
  61. };
  62. /**********************************************************************************************/
  63. unsigned char code Week[]={//显示星期字样
  64. 0x00,0x04,0x04,0x04,0x04,0x04,0x00,//一
  65. 0x00,0x0A,0x0A,0x0A,0x0A,0x0A,0x00,//二
  66. 0x00,0x10,0x15,0x15,0x15,0x10,0x00,//三
  67. 0x1F,0x11,0x17,0x11,0x17,0x11,0x1F,//四
  68. 0x00,0x10,0x15,0x1F,0x15,0x1D,0x10,//五
  69. 0x00,0x12,0x0A,0x03,0x0A,0x12,0x00,//六
  70. 0x00,0x1F,0x15,0x15,0x15,0x15,0x1F,//日
  71. };
  72. /*********************************************************************************************/
  73. void delay (unsigned int a){ // 用于点扫描的延时
  74.         unsigned int i;
  75.         while( a-- != 0){
  76.                 for(i = 0; i < DELAY; i++);
  77.         }                                     
  78. }
  79. /*********************************************************************************************/
  80. void dis_off (void){//全关
  81.         P1M1 = 0x57;         //P1置为开漏 01010111
  82.         P2M1 = 0xff;        //P2置为开漏 11111111
  83.         P3M1 = 0xa8;        //P3置为开漏 10101000
  84.         P5M1 = 0x10;        //P5置为开漏 00010000
  85.         P1 = 0x57;                //P1置1
  86.         P2 = 0xff;                //P2置1
  87.         P3 = 0xa8;                //P3置1
  88.         P5 = 0x10;                //P5置1
  89.         delay(10-PWM);
  90. }
  91. /*********************************************************************************************/
  92. void displayHH1 (unsigned char d){ //第1列横向显示程序
  93.         unsigned char i;
  94.         i = d & 0x01;
  95.         if(i == 0x01){P2M1 = 0xef;LED_1 = 0;delay(PWM);dis_off();}//11101111
  96.         i = d & 0x02;
  97.         if(i == 0x02){P2M1 = 0xfb;LED_1 = 0;delay(PWM);dis_off();}//11111011
  98.         i = d & 0x04;
  99.         if(i == 0x04){P2M1 = 0xfe;LED_1 = 0;delay(PWM);dis_off();}//11111110
  100.         i = d & 0x08;
  101.         if(i == 0x08){P1M1 = 0x55;LED_1 = 0;delay(PWM);dis_off();}//01010101
  102.         i = d & 0x10;
  103.         if(i == 0x10){P3M1 = 0xa0;LED_1 = 0;delay(PWM);dis_off();}//10100000
  104. }
  105. /*********************************************************************************************/
  106. void displayHH2 (unsigned char d){ //第2列横向显示程序 10111100
  107.         unsigned char i;
  108.         i = d & 0x01;
  109.         if(i == 0x01){P2M1 = 0xef;LED_2 = 0;delay(PWM);dis_off();}//11101111
  110.         i = d & 0x02;
  111.         if(i == 0x02){P2M1 = 0xfb;LED_2 = 0;delay(PWM);dis_off();}//11111011
  112.         i = d & 0x04;
  113.         if(i == 0x04){P2M1 = 0xfe;LED_2 = 0;delay(PWM);dis_off();}//11111110
  114.         i = d & 0x08;
  115.         if(i == 0x08){P1M1 = 0x55;LED_2 = 0;delay(PWM);dis_off();}//01010101
  116.         i = d & 0x10;
  117.         if(i == 0x10){P3M1 = 0xa0;LED_2 = 0;delay(PWM);dis_off();}//10100000
  118. }
  119. /*********************************************************************************************/
  120. void displayHH3 (unsigned char d){ //第3列横向显示程序 11011100
  121.         unsigned char i;
  122.         i = d & 0x01;
  123.         if(i == 0x01){P2M1 = 0xef;LED_3 = 0;delay(PWM);dis_off();}//11101111
  124.         i = d & 0x02;
  125.         if(i == 0x02){P2M1 = 0xfb;LED_3 = 0;delay(PWM);dis_off();}//11111011
  126.         i = d & 0x04;
  127.         if(i == 0x04){P2M1 = 0xfe;LED_3 = 0;delay(PWM);dis_off();}//11111110
  128.         i = d & 0x08;
  129.         if(i == 0x08){P1M1 = 0x55;LED_3 = 0;delay(PWM);dis_off();}//01010101
  130.         i = d & 0x10;
  131.         if(i == 0x10){P3M1 = 0xa0;LED_3 = 0;delay(PWM);dis_off();}//10100000
  132. }
  133. /*********************************************************************************************/
  134. void displayHH4 (unsigned char d){ //第4列横向显示程序 11101100
  135.         unsigned char i;
  136.         i = d & 0x01;
  137.         if(i == 0x01){P2M1 = 0xef;LED_4 = 0;delay(PWM);dis_off();}//11101111
  138.         i = d & 0x02;
  139.         if(i == 0x02){P2M1 = 0xfb;LED_4 = 0;delay(PWM);dis_off();}//11111011
  140.         i = d & 0x04;
  141.         if(i == 0x04){P2M1 = 0xfe;LED_4 = 0;delay(PWM);dis_off();}//11111110
  142.         i = d & 0x08;
  143.         if(i == 0x08){P1M1 = 0x55;LED_4 = 0;delay(PWM);dis_off();}//01010101
  144.         i = d & 0x10;
  145.         if(i == 0x10){P3M1 = 0xa0;LED_4 = 0;delay(PWM);dis_off();}//10100000
  146. }
  147. /*********************************************************************************************/
  148. void displayHH5 (unsigned char d){ //第5列横向显示程序 11110100
  149.         unsigned char i;
  150.         i = d & 0x01;
  151.         if(i == 0x01){P2M1 = 0xef;LED_5 = 0;delay(PWM);dis_off();}//11101111
  152.         i = d & 0x02;
  153.         if(i == 0x02){P2M1 = 0xfb;LED_5 = 0;delay(PWM);dis_off();}//11111011
  154.         i = d & 0x04;
  155.         if(i == 0x04){P2M1 = 0xfe;LED_5 = 0;delay(PWM);dis_off();}//11111110
  156.         i = d & 0x08;
  157.         if(i == 0x08){P1M1 = 0x55;LED_5 = 0;delay(PWM);dis_off();}//01010101
  158.         i = d & 0x10;
  159.         if(i == 0x10){P3M1 = 0xa0;LED_5 = 0;delay(PWM);dis_off();}//10100000
  160. }
  161. /*********************************************************************************************/
  162. void displayHH6 (unsigned char d){ //第6列横向显示程序 11111000
  163.         unsigned char i;
  164.         i = d & 0x01;
  165.         if(i == 0x01){P2M1 = 0xef;LED_6 = 0;delay(PWM);dis_off();}//11101111
  166.         i = d & 0x02;
  167.         if(i == 0x02){P2M1 = 0xfb;LED_6 = 0;delay(PWM);dis_off();}//11111011
  168.         i = d & 0x04;
  169.         if(i == 0x04){P2M1 = 0xfe;LED_6 = 0;delay(PWM);dis_off();}//11111110
  170.         i = d & 0x08;
  171.         if(i == 0x08){P1M1 = 0x55;LED_6 = 0;delay(PWM);dis_off();}//01010101
  172.         i = d & 0x10;
  173.         if(i == 0x10){P3M1 = 0xa0;LED_6 = 0;delay(PWM);dis_off();}//10100000
  174. }
  175. /*********************************************************************************************/
  176. void displayHH7 (unsigned char d){ //第7列横向显示程序 11111000
  177.         unsigned char i;
  178.         i = d & 0x01;
  179.         if(i == 0x01){P1M1 = 0x17;LED_1 = 0;delay(PWM);dis_off();}//00010111
  180.         i = d & 0x02;
  181.         if(i == 0x02){P2M1 = 0xfd;LED_1 = 0;delay(PWM);dis_off();}//11111101
  182.         i = d & 0x04;
  183.         if(i == 0x04){P1M1 = 0x53;LED_1 = 0;delay(PWM);dis_off();}//01010011
  184.         i = d & 0x08;
  185.         if(i == 0x08){P1M1 = 0x56;LED_1 = 0;delay(PWM);dis_off();}//01010110
  186.         i = d & 0x10;
  187.         if(i == 0x10){P2M1 = 0xbf;LED_1 = 0;delay(PWM);dis_off();}//10111111
  188. }
  189. /*********************************************************************************************/
  190. void displayHH8 (unsigned char d){ //第8列横向显示程序 11111000
  191.         unsigned char i;
  192.         i = d & 0x01;
  193.         if(i == 0x01){P1M1 = 0x17;LED_2 = 0;delay(PWM);dis_off();}//00010111
  194.         i = d & 0x02;
  195.         if(i == 0x02){P2M1 = 0xfd;LED_2 = 0;delay(PWM);dis_off();}//11111101
  196.         i = d & 0x04;
  197.         if(i == 0x04){P1M1 = 0x53;LED_2 = 0;delay(PWM);dis_off();}//01010011
  198.         i = d & 0x08;
  199.         if(i == 0x08){P1M1 = 0x56;LED_2 = 0;delay(PWM);dis_off();}//01010110
  200.         i = d & 0x10;
  201.         if(i == 0x10){P2M1 = 0xbf;LED_2 = 0;delay(PWM);dis_off();}//10111111
  202. }
  203. /*********************************************************************************************/
  204. void displayHH9 (unsigned char d){ //第9列横向显示程序 11111000
  205.         unsigned char i;
  206.         i = d & 0x01;
  207.         if(i == 0x01){P1M1 = 0x17;LED_3 = 0;delay(PWM);dis_off();}//00010111
  208.         i = d & 0x02;
  209.         if(i == 0x02){P2M1 = 0xfd;LED_3 = 0;delay(PWM);dis_off();}//11111101
  210.         i = d & 0x04;
  211.         if(i == 0x04){P1M1 = 0x53;LED_3 = 0;delay(PWM);dis_off();}//01010011
  212.         i = d & 0x08;
  213.         if(i == 0x08){P1M1 = 0x56;LED_3 = 0;delay(PWM);dis_off();}//01010110
  214.         i = d & 0x10;
  215.         if(i == 0x10){P2M1 = 0xbf;LED_3 = 0;delay(PWM);dis_off();}//10111111
  216. }
  217. /*********************************************************************************************/
  218. void displayHH10 (unsigned char d){ //第10列横向显示程序 11111000
  219.         unsigned char i;
  220.         i = d & 0x01;
  221.         if(i == 0x01){P1M1 = 0x17;LED_4 = 0;delay(PWM);dis_off();}//00010111
  222.         i = d & 0x02;
  223.         if(i == 0x02){P2M1 = 0xfd;LED_4 = 0;delay(PWM);dis_off();}//11111101
  224.         i = d & 0x04;
  225.         if(i == 0x04){P1M1 = 0x53;LED_4 = 0;delay(PWM);dis_off();}//01010011
  226.         i = d & 0x08;
  227.         if(i == 0x08){P1M1 = 0x56;LED_4 = 0;delay(PWM);dis_off();}//01010110
  228.         i = d & 0x10;
  229.         if(i == 0x10){P2M1 = 0xbf;LED_4 = 0;delay(PWM);dis_off();}//10111111
  230. }
  231. /*********************************************************************************************/
  232. void displayHH11 (unsigned char d){ //第11列横向显示程序 11111000
  233.         unsigned char i;
  234.         i = d & 0x01;
  235.         if(i == 0x01){P1M1 = 0x17;LED_5 = 0;delay(PWM);dis_off();}//00010111
  236.         i = d & 0x02;
  237.         if(i == 0x02){P2M1 = 0xfd;LED_5 = 0;delay(PWM);dis_off();}//11111101
  238.         i = d & 0x04;
  239.         if(i == 0x04){P1M1 = 0x53;LED_5 = 0;delay(PWM);dis_off();}//01010011
  240.         i = d & 0x08;
  241.         if(i == 0x08){P1M1 = 0x56;LED_5 = 0;delay(PWM);dis_off();}//01010110
  242.         i = d & 0x10;
  243.         if(i == 0x10){P2M1 = 0xbf;LED_5 = 0;delay(PWM);dis_off();}//10111111
  244. }
  245. /*********************************************************************************************/
  246. void displayHH12 (unsigned char d){ //第12列横向显示程序 11111000
  247.         unsigned char i;
  248.         i = d & 0x01;
  249.         if(i == 0x01){P1M1 = 0x17;LED_6 = 0;delay(PWM);dis_off();}//00010111
  250.         i = d & 0x02;
  251.         if(i == 0x02){P2M1 = 0xfd;LED_6 = 0;delay(PWM);dis_off();}//11111101
  252.         i = d & 0x04;
  253.         if(i == 0x04){P1M1 = 0x53;LED_6 = 0;delay(PWM);dis_off();}//01010011
  254.         i = d & 0x08;
  255.         if(i == 0x08){P1M1 = 0x56;LED_6 = 0;delay(PWM);dis_off();}//01010110
  256.         i = d & 0x10;
  257.         if(i == 0x10){P2M1 = 0xbf;LED_6 = 0;delay(PWM);dis_off();}//10111111
  258. }
  259. /*********************************************************************************************/
  260. void displayHH13 (unsigned char d){ //第13列横向显示程序 11111000
  261.         unsigned char i;
  262.         i = d & 0x01;
  263.         if(i == 0x01){P2M1 = 0x7f;LED_11 = 0;delay(PWM);dis_off();}//01111111
  264.         i = d & 0x02;                                                                                                                                                                                  
  265.         if(i == 0x02){P2M1 = 0xef;LED_11 = 0;delay(PWM);dis_off();}//11101111
  266.         i = d & 0x04;
  267.         if(i == 0x04){P2M1 = 0xfb;LED_11 = 0;delay(PWM);dis_off();}//11111011
  268.         i = d & 0x08;
  269.         if(i == 0x08){P2M1 = 0xfe;LED_11 = 0;delay(PWM);dis_off();}//11111110
  270.         i = d & 0x10;
  271.         if(i == 0x10){P1M1 = 0x55;LED_11 = 0;delay(PWM);dis_off();}//01010101
  272. }
  273. /*********************************************************************************************/
  274. void displayHH14 (unsigned char d){ //第14列横向显示程序 11111000
  275.         unsigned char i;
  276.         i = d & 0x01;
  277.         if(i == 0x01){P2M1 = 0x7f;LED_12 = 0;delay(PWM);dis_off();}//01111111
  278.         i = d & 0x02;                                                                                                                                                                                  
  279.         if(i == 0x02){P2M1 = 0xef;LED_12 = 0;delay(PWM);dis_off();}//11101111
  280.         i = d & 0x04;
  281.         if(i == 0x04){P2M1 = 0xfb;LED_12 = 0;delay(PWM);dis_off();}//11111011
  282.         i = d & 0x08;
  283.         if(i == 0x08){P2M1 = 0xfe;LED_12 = 0;delay(PWM);dis_off();}//11111110
  284.         i = d & 0x10;
  285.         if(i == 0x10){P1M1 = 0x55;LED_12 = 0;delay(PWM);dis_off();}//01010101
  286. }
  287. /*********************************************************************************************/
  288. void displayHH15 (unsigned char d){ //第15列横向显示程序 11111000
  289.         unsigned char i;
  290.         i = d & 0x01;
  291.         if(i == 0x01){P2M1 = 0x7f;LED_13 = 0;delay(PWM);dis_off();}//01111111
  292.         i = d & 0x02;                                                                                                                                                                                  
  293.         if(i == 0x02){P2M1 = 0xef;LED_13 = 0;delay(PWM);dis_off();}//11101111
  294.         i = d & 0x04;
  295.         if(i == 0x04){P2M1 = 0xfb;LED_13 = 0;delay(PWM);dis_off();}//11111011
  296.         i = d & 0x08;
  297.         if(i == 0x08){P2M1 = 0xfe;LED_13 = 0;delay(PWM);dis_off();}//11111110
  298.         i = d & 0x10;
  299.         if(i == 0x10){P1M1 = 0x55;LED_13 = 0;delay(PWM);dis_off();}//01010101
  300. }
  301. /*********************************************************************************************/
  302. void displayHH16 (unsigned char d){ //第16列横向显示程序 11111000
  303.         unsigned char i;
  304.         i = d & 0x01;
  305.         if(i == 0x01){P2M1 = 0x7f;LED_14 = 0;delay(PWM);dis_off();}//01111111
  306.         i = d & 0x02;                                                                                                                                                                                  
  307.         if(i == 0x02){P2M1 = 0xef;LED_14 = 0;delay(PWM);dis_off();}//11101111
  308.         i = d & 0x04;
  309.         if(i == 0x04){P2M1 = 0xfb;LED_14 = 0;delay(PWM);dis_off();}//11111011
  310.         i = d & 0x08;
  311.         if(i == 0x08){P2M1 = 0xfe;LED_14 = 0;delay(PWM);dis_off();}//11111110
  312.         i = d & 0x10;
  313.         if(i == 0x10){P1M1 = 0x55;LED_14 = 0;delay(PWM);dis_off();}//01010101
  314. }
  315. /*********************************************************************************************/
  316. void displayHH17 (unsigned char d){ //第17列横向显示程序 11111000
  317.         unsigned char i;
  318.         i = d & 0x01;
  319.         if(i == 0x01){P2M1 = 0x7f;LED_15 = 0;delay(PWM);dis_off();}//01111111
  320.         i = d & 0x02;                                                                                                                                                                                  
  321.         if(i == 0x02){P2M1 = 0xef;LED_15 = 0;delay(PWM);dis_off();}//11101111
  322.         i = d & 0x04;
  323.         if(i == 0x04){P2M1 = 0xfb;LED_15 = 0;delay(PWM);dis_off();}//11111011
  324.         i = d & 0x08;
  325.         if(i == 0x08){P2M1 = 0xfe;LED_15 = 0;delay(PWM);dis_off();}//11111110
  326.         i = d & 0x10;
  327.         if(i == 0x10){P1M1 = 0x55;LED_15 = 0;delay(PWM);dis_off();}//01010101
  328. }
  329. /*********************************************************************************************/
  330. void displayHH18 (unsigned char d){ //第18列横向显示程序 11111000
  331.         unsigned char i;
  332.         i = d & 0x01;
  333.         if(i == 0x01){P2M1 = 0x7f;LED_16 = 0;delay(PWM);dis_off();}//01111111
  334.         i = d & 0x02;                                                                                                                                                                                  
  335.         if(i == 0x02){P2M1 = 0xef;LED_16 = 0;delay(PWM);dis_off();}//11101111
  336.         i = d & 0x04;
  337.         if(i == 0x04){P2M1 = 0xfb;LED_16 = 0;delay(PWM);dis_off();}//11111011
  338.         i = d & 0x08;
  339.         if(i == 0x08){P2M1 = 0xfe;LED_16 = 0;delay(PWM);dis_off();}//11111110
  340.         i = d & 0x10;
  341.         if(i == 0x10){P1M1 = 0x55;LED_16 = 0;delay(PWM);dis_off();}//01010101
  342. }
  343. /*********************************************************************************************/
  344. void displayHH19 (unsigned char d){ //第19列横向显示程序 11111000 (符号)
  345.         unsigned char i;
  346.         i = d & 0x01;
  347.         if(i == 0x01){P2M1 = 0x7f;LED_17 = 0;delay(PWM);dis_off();}//11101111
  348.         i = d & 0x02;
  349.         if(i == 0x02){P2M1 = 0xef;LED_17 = 0;delay(PWM);dis_off();}//11111011
  350. }
  351. /*********************************************************************************************/
  352. void displayHH20 (unsigned char d){ //第20列横向显示程序 11111000
  353.         unsigned char i;
  354.         i = d & 0x01;
  355.         if(i == 0x01){P2M1 = 0xf7;LED_11 = 0;delay(PWM);dis_off();}//11110111
  356.         i = d & 0x02;
  357.         if(i == 0x02){P2M1 = 0xdf;LED_11 = 0;delay(PWM);dis_off();}//11011111
  358.         i = d & 0x04;
  359.         if(i == 0x04){P3M1 = 0x28;LED_11 = 0;delay(PWM);dis_off();}//00101000
  360.         i = d & 0x08;
  361.         if(i == 0x08){P1M1 = 0x47;LED_11 = 0;delay(PWM);dis_off();}//01000111
  362.         i = d & 0x10;
  363.         if(i == 0x10){P5M1 = 0x00;LED_11 = 0;delay(PWM);dis_off();}//00000000
  364. }
  365. /*********************************************************************************************/
  366. void displayHH21 (unsigned char d){ //第21列横向显示程序 11111000
  367.         unsigned char i;
  368.         i = d & 0x01;
  369.         if(i == 0x01){P2M1 = 0xf7;LED_12 = 0;delay(PWM);dis_off();}//11110111
  370.         i = d & 0x02;
  371.         if(i == 0x02){P2M1 = 0xdf;LED_12 = 0;delay(PWM);dis_off();}//11011111
  372.         i = d & 0x04;
  373.         if(i == 0x04){P3M1 = 0x28;LED_12 = 0;delay(PWM);dis_off();}//00101000
  374.         i = d & 0x08;
  375.         if(i == 0x08){P1M1 = 0x47;LED_12 = 0;delay(PWM);dis_off();}//01000111
  376.         i = d & 0x10;
  377.         if(i == 0x10){P5M1 = 0x00;LED_12 = 0;delay(PWM);dis_off();}//00000000
  378. }
  379. /*********************************************************************************************/
  380. void displayHH22 (unsigned char d){ //第22列横向显示程序 11111000
  381.         unsigned char i;
  382.         i = d & 0x01;
  383.         if(i == 0x01){P2M1 = 0xf7;LED_13 = 0;delay(PWM);dis_off();}//11110111
  384.         i = d & 0x02;
  385.         if(i == 0x02){P2M1 = 0xdf;LED_13 = 0;delay(PWM);dis_off();}//11011111
  386.         i = d & 0x04;
  387.         if(i == 0x04){P3M1 = 0x28;LED_13 = 0;delay(PWM);dis_off();}//00101000
  388.         i = d & 0x08;
  389.         if(i == 0x08){P1M1 = 0x47;LED_13 = 0;delay(PWM);dis_off();}//01000111
  390.         i = d & 0x10;
  391.         if(i == 0x10){P5M1 = 0x00;LED_13 = 0;delay(PWM);dis_off();}//00000000
  392. }
  393. /*********************************************************************************************/
  394. void displayHH23 (unsigned char d){ //第23列横向显示程序 11111000
  395.         unsigned char i;
  396.         i = d & 0x01;
  397.         if(i == 0x01){P2M1 = 0xf7;LED_14 = 0;delay(PWM);dis_off();}//11110111
  398.         i = d & 0x02;
  399.         if(i == 0x02){P2M1 = 0xdf;LED_14 = 0;delay(PWM);dis_off();}//11011111
  400.         i = d & 0x04;
  401.         if(i == 0x04){P3M1 = 0x28;LED_14 = 0;delay(PWM);dis_off();}//00101000
  402.         i = d & 0x08;
  403.         if(i == 0x08){P1M1 = 0x47;LED_14 = 0;delay(PWM);dis_off();}//01000111
  404.         i = d & 0x10;
  405.         if(i == 0x10){P5M1 = 0x00;LED_14 = 0;delay(PWM);dis_off();}//00000000
  406. }
  407. /*********************************************************************************************/
  408. void displayHH24 (unsigned char d){ //第24列横向显示程序 11111000
  409.         unsigned char i;
  410.         i = d & 0x01;
  411.         if(i == 0x01){P2M1 = 0xf7;LED_15 = 0;delay(PWM);dis_off();}//11110111
  412.         i = d & 0x02;
  413.         if(i == 0x02){P2M1 = 0xdf;LED_15 = 0;delay(PWM);dis_off();}//11011111
  414.         i = d & 0x04;
  415.         if(i == 0x04){P3M1 = 0x28;LED_15 = 0;delay(PWM);dis_off();}//00101000
  416.         i = d & 0x08;
  417.         if(i == 0x08){P1M1 = 0x47;LED_15 = 0;delay(PWM);dis_off();}//01000111
  418.         i = d & 0x10;
  419.         if(i == 0x10){P5M1 = 0x00;LED_15 = 0;delay(PWM);dis_off();}//00000000
  420. }
  421. /*********************************************************************************************/
  422. void displayHH25 (unsigned char d){ //第25列横向显示程序 11111000
  423.         unsigned char i;
  424.         i = d & 0x01;
  425.         if(i == 0x01){P2M1 = 0xf7;LED_16 = 0;delay(PWM);dis_off();}//11110111
  426.         i = d & 0x02;
  427.         if(i == 0x02){P2M1 = 0xdf;LED_16 = 0;delay(PWM);dis_off();}//11011111
  428.         i = d & 0x04;
  429.         if(i == 0x04){P3M1 = 0x28;LED_16 = 0;delay(PWM);dis_off();}//00101000
  430.         i = d & 0x08;
  431.         if(i == 0x08){P1M1 = 0x47;LED_16 = 0;delay(PWM);dis_off();}//01000111
  432.         i = d & 0x10;
  433.         if(i == 0x10){P5M1 = 0x00;LED_16 = 0;delay(PWM);dis_off();}//00000000
  434. }
  435. /*********************************************************************************************/
  436. void displayHH26 (unsigned char d){ //第26列横向显示程序 11111000
  437.         unsigned char i;
  438.         i = d & 0x01;
  439.         if(i == 0x01){P2M1 = 0xf7;LED_17 = 0;delay(PWM);dis_off();}//11110111
  440.         i = d & 0x02;
  441.         if(i == 0x02){P2M1 = 0xdf;LED_17 = 0;delay(PWM);dis_off();}//11011111
  442.         i = d & 0x04;
  443.         if(i == 0x04){P3M1 = 0x28;LED_17 = 0;delay(PWM);dis_off();}//00101000
  444.         i = d & 0x08;
  445.         if(i == 0x08){P1M1 = 0x47;LED_17 = 0;delay(PWM);dis_off();}//01000111
  446.         i = d & 0x10;
  447.         if(i == 0x10){P5M1 = 0x00;LED_17 = 0;delay(PWM);dis_off();}//00000000
  448. }
  449. /*********************************************************************************************/
  450. void displayHH27 (unsigned char d){ //第27列横向显示程序 11111000 (冒号)
  451.         unsigned char i;
  452.         i = d & 0x08;
  453.         if(i == 0x08){P2M1 = 0xfe;LED_17 = 0;delay(PWM);dis_off();}//11111110
  454.         i = d & 0x10;
  455.         if(i == 0x10){P1M1 = 0x55;LED_17 = 0;delay(PWM);dis_off();}//01010101
  456. }
  457. /*********************************************************************************************/
  458. void diplay_data (unsigned char l,unsigned char d){
  459.                 switch (l){//显示的列位置               
  460.                                 case 1://                       
  461.                                         displayHH1(d); //将显示数据送入               
  462.                                         break;//               
  463.                                 case 2://                       
  464.                                         displayHH2(d); //将显示数据送入               
  465.                                         break;//               
  466.                                 case 3://                       
  467.                                         displayHH3(d); //将显示数据送入               
  468.                                         break;//               
  469.                                 case 4://                       
  470.                                         displayHH4(d); //将显示数据送入               
  471.                                         break;//               
  472.                                 case 5://                       
  473.                                         displayHH5(d); //将显示数据送入               
  474.                                         break;//               
  475.                                 case 6://                       
  476.                                         displayHH6(d); //将显示数据送入               
  477.                                         break;//               
  478.                                 case 7://                       
  479.                                         displayHH7(d); //将显示数据送入               
  480.                                         break;//               
  481.                                 case 8://                       
  482.                                         displayHH8(d); //将显示数据送入               
  483.                                         break;//               
  484.                                 case 9://                       
  485.                                         displayHH9(d); //将显示数据送入               
  486.                                         break;//               
  487.                                 case 10://                       
  488.                                         displayHH10(d); //将显示数据送入               
  489.                                         break;//               
  490.                                 case 11://                       
  491.                                         displayHH11(d); //将显示数据送入               
  492.                                         break;//               
  493.                                 case 12://                       
  494.                                         displayHH12(d); //将显示数据送入               
  495.                                         break;//               
  496.                                 case 13://                       
  497.                                         displayHH13(d); //将显示数据送入               
  498.                                         break;//               
  499.                                 case 14://                       
  500.                                         displayHH14(d); //将显示数据送入               
  501.                                         break;//               
  502.                                 case 15://                       
  503.                                         displayHH15(d); //将显示数据送入               
  504.                                         break;//               
  505.                                 case 16://                       
  506.                                         displayHH16(d); //将显示数据送入               
  507.                                         break;//               
  508.                                 case 17://                       
  509.                                         displayHH17(d); //将显示数据送入               
  510.                                         break;//               
  511.                                 case 18://                       
  512.                                         displayHH18(d); //将显示数据送入               
  513.                                         break;//               
  514.                                 case 19://                       
  515.                                         displayHH19(d); //将显示数据送入               
  516.                                         break;//               
  517.                                 case 20://                       
  518.                                         displayHH20(d); //将显示数据送入               
  519.                                         break;//               
  520.                                 case 21://                       
  521.                                         displayHH21(d); //将显示数据送入               
  522.                                         break;//               
  523.                                 case 22://                       
  524.                                         displayHH22(d); //将显示数据送入               
  525.                                         break;//               
  526.                                 case 23://                       
  527.                                         displayHH23(d); //将显示数据送入               
  528.                                         break;//               
  529.                                 case 24://                       
  530.                                         displayHH24(d); //将显示数据送入               
  531.                                         break;//               
  532.                                 case 25://                       
  533.                                         displayHH25(d); //将显示数据送入               
  534.                                         break;//               
  535.                                 case 26://                       
  536.                                         displayHH26(d); //将显示数据送入               
  537.                                         break;//               
  538.                                 case 27://                       
  539.                                         displayHH27(d); //将显示数据送入               
  540.                                         break;//               
  541.                 }
  542. }
  543. /*********************************************************************************************/
  544. void init (void){ //上电初始化
  545.         P1M0 = P1M0SET;
  546.         P2M0 = P2M0SET;
  547.         P3M0 = P3M0SET;
  548.         P5M0 = P5M0SET;
  549.         dis_off();
  550.         PWM = LI;
  551.         TMOD = 0x01;         // 定时/计数器0,1工作于方式1   
  552.     TH0 = 0x4c;          // 预置产生50ms时基信号   
  553.     TL0 = 0x00;   
  554.     EA = 1;              // 开总中断   
  555.     ET0 = 1;             // 定时/计数器0允许中断   
  556.     TR0 = 1;             // 开闭定时/计数器0   
  557. }
  558. /*********************************************************************************************/
  559. void main (void){ //主程序
  560.         unsigned char l;
  561.         init();
  562.         while (1){
  563.                 if (TIME_HH/10==0){
  564.                 for(l=1;l<4;l++)
  565.                         diplay_data (l,0);
  566.                 }else{
  567.                 for(l=1;l<4;l++)
  568.                         diplay_data (l,NUM[TIME_HH/10*3+l-1]);}//*3是字形宽度+列数变量-列数
  569.                 for(l=4;l<7;l++)
  570.                         diplay_data (l,NUM[TIME_HH%10*3+l-4]);
  571.                         if(PD){
  572.                         }else{
  573.                                 diplay_data (27,0x18);}
  574.                 for(l=7;l<10;l++)
  575.                         diplay_data (l,NUM[TIME_MM/10*3+l-7]);
  576.                 for(l=10;l<13;l++)
  577.                         diplay_data (l,NUM[TIME_MM%10*3+l-10]);
  578.                 for(l=13;l<16;l++)
  579.                         diplay_data (l,NUM[TIME_SS/10*3+l-13]);
  580.                 for(l=16;l<19;l++)
  581.                         diplay_data (l,NUM[TIME_SS%10*3+l-16]);
  582.                 for(l=20;l<27;l++)
  583.                         diplay_data (l,Week[(6-1)*7+l-20]);
  584. }}       
  585. /**********************************************************************************************/       
  586. void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   
  587.     cou++;                      // 软计数器加1   
  588.     if(cou > 19){                 // 计数值到50(0.5s)   
  589.         cou = 0;               // 软计数器清零   
  590.                 PD =~ PD;                                //秒点闪烁
  591.                 hs++;
  592.         if(hs > 1){                 // 计数值到2(1s)   
  593.                 hs = 0;                                                // 半秒计数器清零
  594.                 TIME_SS++;                 // 秒计数器加1(进位10ms*100=1s)   
  595.         if(TIME_SS > 59){          // 秒计数值到60   
  596.            
  597.             TIME_SS = 0;           // 秒计数器清零   
  598.             TIME_MM++;             // 分计数器加1(进位60s=1m)  
  599.             if(TIME_MM > 59){      // 分计数到60   
  600.                 TIME_MM = 0;       // 分计数器清零   
  601.                 TIME_HH++;         // 时计数器加1(进位60m=1h)   
  602.                 if(TIME_HH > 23){  // 时计数到23   
  603.                     TIME_HH = 0;   // 时计数器清零
  604.                                 }  
  605.                                 }  
  606.             }   
  607.         }   
  608.     }   
  609.     TH0 = 0x4c;                // 重置定时常数   
  610. //    TL0 = 0xb0;   
  611. }
复制代码


回复

使用道具 举报

板凳
ID:78714 发表于 2015-8-24 18:52 | 只看该作者


试着贴一下视频
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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