找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14380|回复: 19
收起左侧

单片机程序怎么把共阴数码管程序改成共阳的

[复制链接]
ID:196319 发表于 2017-5-10 22:11 | 显示全部楼层 |阅读模式

  1. #include<reg51.h>
  2. #define uchar unsigned char         
  3. #define uint unsigned int
  4. //数码管位端口定义
  5. sbit w1=P2^0;
  6. sbit w2=P2^1;
  7. sbit w3=P2^2;
  8. sbit w4=P2^3;
  9. sbit w5=P2^4;
  10. ////////按键/////////////////////
  11. sbit key1=P3^0;//设置时间
  12. sbit key2=P3^1;//加
  13. sbit key3=P3^2;//减        
  14. sbit key4=P3^3;//闹钟
  15. sbit beep=P1^0;//蜂鸣器
  16. /////共阴数码管段信号编码////////
  17. uchar code table[10]=//0---9
  18. {0xFC,0x60,0xDA,0xF2,0x66,
  19. 0xB6,0xBE,0xE0,0xFE,0xF6};//
  20. uchar num,miao,fen,shi;//计时  时分秒变量
  21. uchar fen1,shi1;//闹钟变量
  22. uchar d1,d2,d3,d4;//显示拆分数据
  23. void delay(uint ms)//1ms  延时函数   数据保持用的
  24. {
  25.         uchar x;
  26.         for(ms;ms>0;ms--)
  27.                 for(x=110;x>0;x--);
  28. }
  29. void display()//显示函数
  30. {
  31.         d1=shi/10;//小时
  32.         d2=shi%10;//
  33.         d3=fen/10;//
  34.         d4=fen%10;//分钟
  35.         w1=0;P0=table[d1];delay(10);//第1位显示数据
  36.         P0=0x00;w1=1;//关闭显示消除动态扫描阴影
  37.         w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据
  38.         P0=0x00;w2=1;//关闭显示消除动态扫描阴影
  39.         w3=0;P0=table[d3];delay(10);//第3位显示数据
  40.         P0=0x00;w3=1;//关闭显示消除动态扫描阴影
  41.         w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据
  42.         P0=0x00;w4=1;//关闭显示消除动态扫描阴影


  43. }
  44. void disp_set()//显示函数
  45. {
  46.         d1=shi1/10;//小时
  47.         d2=shi1%10;//
  48.         d3=fen1/10;//
  49.         d4=fen1%10;//分钟
  50.         w1=0;P0=table[d1];delay(10);//第1位显示数据
  51.         P0=0x00;w1=1;//关闭显示消除动态扫描阴影
  52.         w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据
  53.         P0=0x00;w2=1;//关闭显示消除动态扫描阴影
  54.         w3=0;P0=table[d3];delay(10);//第3位显示数据
  55.         P0=0x00;w3=1;//关闭显示消除动态扫描阴影
  56.         w4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据
  57.         P0=0x00;w4=1;//关闭显示消除动态扫描阴影

  58. }
  59. void keyscan()//调时按键扫描函数
  60. {
  61. uchar k_flag,set_flag;
  62.         if(key1==0)//按键按下           一下所有按键执行的模式都是一样的
  63.         {
  64.                 delay(10);//延时消除按键抖动
  65.                 if(key1==0)//确定按键按下
  66.                 {
  67.                         k_flag=1;                        
  68.                 }
  69.                 while(key1==0)display();//等待按键松手
  70.         }
  71.         while(k_flag==1)//开始调整小时数据
  72.         {
  73.                 display();
  74.                 if(key1==0)
  75.                 {
  76.                         delay(10);//延时消抖
  77.                         if(key1==0)
  78.                         {
  79.                                 k_flag=2;
  80.                         }
  81.                         while(key1==0)display();
  82.                 }
  83.                 if(key2==0)
  84.                 {
  85.                         delay(10);
  86.                         if(key2==0)
  87.                         {
  88.                                 shi++;
  89.                                 if(shi==24)shi=0;
  90.                         }
  91.                         while(key2==0)display();
  92.                 }
  93.                 if(key3==0)
  94.                 {
  95.                         delay(10);
  96.                         if(key3==0)
  97.                         {
  98.                                 if(shi==0)shi=24;  
  99.                                 shi--;        
  100.                         }
  101.                                   while(key3==0)display();
  102.                 }        
  103.         }
  104.         while(k_flag==2)//开始调整分钟数据
  105.         {
  106.                 display();
  107.                 if(key1==0)
  108.                 {
  109.                         delay(10);//延时消抖
  110.                         if(key1==0)
  111.                         {
  112.                                 k_flag=3;
  113.                         }
  114.                         while(key1==0)display();
  115.                 }
  116.                 if(key2==0)
  117.                 {
  118.                         delay(10);
  119.                         if(key2==0)
  120.                         {
  121.                                 fen++;
  122.                                 if(fen==60)fen=0;
  123.                         }
  124.                         while(key2==0)display();
  125.                 }
  126.                 if(key3==0)
  127.                 {
  128.                         delay(10);
  129.                         if(key3==0)
  130.                         {
  131.                                 if(fen==0)fen=60;  
  132.                                 fen--;        
  133.                         }
  134.                         while(key3==0)display();
  135.                 }        
  136.         }

  137. ///////设置定时时间///////////////////////////////////////////////
  138.         if(key4==0)
  139.         {
  140.                 delay(10);
  141.                 if(key4==0)
  142.                 {
  143.                         set_flag=1;
  144.                 }
  145.                 while(key4==0)disp_set();
  146.                 }
  147.         while(set_flag==1)
  148.         {
  149.                 disp_set();
  150.                 if(key2==0)
  151.                 {
  152.                         delay(10);
  153.                         if(key2==0)
  154.                         {        
  155.                                 shi1++;
  156.                                 if(shi1==24)shi1=0;
  157.                         }
  158.                         while(key2==0)disp_set();
  159.                 }
  160.                 if(key3==0)
  161.                 {
  162.                         delay(10);
  163.                         if(key3==0)
  164.                         {        
  165.                                 if(shi1==0)shi1=24;
  166.                                 shi1--;
  167.                         }
  168.                         while(key3==0)disp_set();
  169.                 }
  170.                 if(key4==0)
  171.                 {
  172.                         delay(10);
  173.                         if(key4==0)
  174.                         {        
  175.                                 set_flag=2;
  176.                         }
  177.                         while(key4==0)disp_set();
  178.                 }        
  179.         }
  180.         while(set_flag==2)
  181.         {
  182.                 disp_set();
  183.                 if(key2==0)
  184.                 {
  185.                         delay(10);
  186.                         if(key2==0)
  187.                         {        
  188.                             fen1++;
  189.                                 if(fen1==60)fen1=0;
  190.                         }
  191.                         while(key2==0)disp_set();
  192.                 }
  193.                 if(key3==0)
  194.                 {
  195.                         delay(10);
  196.                         if(key3==0)
  197.                         {
  198.                                 if(fen1==0)fen1=60;
  199.                                 fen1--;
  200.                         }
  201.                         while(key3==0)disp_set();
  202.                 }
  203.                 if(key4==0)
  204.                 {
  205.                         delay(10);
  206.                         if(key4==0)
  207.                         {  
  208.                                 set_flag=0;
  209.                         }
  210.                         while(key4==0)disp_set();
  211.                 }        
  212.         }
  213. }

  214. void main()
  215. {
  216.         TMOD=0x01;//定时器0  16位计时模式
  217.         TH0=(65536-50000)/256; //50ms定时
  218.         TL0=(65536-50000)%256; //50ms定时
  219.         EA=1;//开启总中断
  220.         ET0=1;//开启定时器中断
  221.         TR0=1;//开启定时器
  222.         w5=1;
  223.         while(1)
  224.         {        
  225.             w5=~w5;
  226.                 display();//显示函数
  227.                 keyscan();//按键扫描函数
  228.         }
  229. }
  230. void T0_time() interrupt 1
  231. {
  232.         TH0=(65536-50000)/256; //50ms定时
  233.         TL0=(65536-50000)%256; //50ms定时
  234.         num++;//加一次50ms定时
  235.         if(num==20)//1S
  236.         {
  237.                 num=0;
  238.                 miao++;
  239.                 if(miao==60)
  240.                 {
  241.                         miao=0;
  242.                         fen++;
  243.                         if(fen==60)
  244.                         {
  245.                                 fen=0;
  246.                                 shi++;
  247.                                 if(shi==24)shi=0;
  248.                         }
  249.                 }
  250.         }
  251. }

复制代码
回复

使用道具 举报

ID:196319 发表于 2017-5-10 22:18 | 显示全部楼层
突然发现这段函数和平时的共阴数码管函数好像不一样,突然不会改了   数码管1号口接的是P0.7
/////共阴数码管段信号编码////////
uchar code table[10]=//0---9
{0xFC,0x60,0xDA,0xF2,0x66,
0xB6,0xBE,0xE0,0xFE,0xF6};//
有人会修改吗?
回复

使用道具 举报

ID:183046 发表于 2017-5-10 23:10 | 显示全部楼层
下个这个软件就好了可以给你算数组
无标题.png
回复

使用道具 举报

ID:111634 发表于 2017-5-10 23:37 | 显示全部楼层
关键是先改电路。光改程序是改不好的。程序是配合电路的。一上来就贴出冗长程序,说明你思路错了,理解错了。
回复

使用道具 举报

ID:123289 发表于 2017-5-10 23:46 | 显示全部楼层
说明你并未真正地了解LED驱动的原理。
回复

使用道具 举报

ID:192523 发表于 2017-5-11 14:27 | 显示全部楼层
如果是io口直接驱动的数码管程序的话只要把输出取反就可以了,如果是用7段译码器就不一样了
回复

使用道具 举报

ID:199559 发表于 2017-5-11 15:13 | 显示全部楼层
io口直接驱动的数码管程序的话只要把输出取反就可以了
回复

使用道具 举报

ID:111634 发表于 2017-5-11 18:39 | 显示全部楼层
io口直接驱动,若是共阴LED,怎么直接驱动?20uA,会亮么?
回复

使用道具 举报

ID:196319 发表于 2017-5-12 00:15 | 显示全部楼层
zl2168 发表于 2017-5-10 23:37
关键是先改电路。光改程序是改不好的。程序是配合电路的。一上来就贴出冗长程序,说明你思路错了,理解错了 ...

我修改过线路,然后稍微改了程序,发现只能显示出0000  按下功能按键毫无反应,所以来求助了
回复

使用道具 举报

ID:196319 发表于 2017-5-12 00:15 | 显示全部楼层
maidezhu 发表于 2017-5-10 23:10
下个这个软件就好了可以给你算数组

我去下载试试,谢谢提醒
回复

使用道具 举报

ID:196319 发表于 2017-5-12 00:35 | 显示全部楼层
joeky 发表于 2017-5-11 15:13
io口直接驱动的数码管程序的话只要把输出取反就可以了

试过直接取反,没有用
回复

使用道具 举报

ID:196319 发表于 2017-5-12 00:37 | 显示全部楼层
zl2168 发表于 2017-5-11 18:39
io口直接驱动,若是共阴LED,怎么直接驱动?20uA,会亮么?

共阴是直接驱动,共阳加上245芯片
回复

使用道具 举报

ID:196319 发表于 2017-5-12 00:38 | 显示全部楼层
桂木桂马 发表于 2017-5-11 14:27
如果是io口直接驱动的数码管程序的话只要把输出取反就可以了,如果是用7段译码器就不一样了

io直接驱动,但是直接取反没效果
回复

使用道具 举报

ID:111634 发表于 2017-5-12 09:02 | 显示全部楼层
本帖最后由 zl2168 于 2017-5-12 19:14 编辑

给你各介绍几个共阴和共阳的扫描显示案例,你自己去研读改进吧!
共阴动态显示:
实例57  74LS139选通4LED数码管动态显示
实例57 74LS139选通4位共阴LED数码管动态显示.rar (48.12 KB, 下载次数: 13)
回复

使用道具 举报

ID:191441 发表于 2017-5-12 14:02 | 显示全部楼层
共阴编码 改成共阳编码
回复

使用道具 举报

ID:191441 发表于 2017-5-12 14:04 | 显示全部楼层
code&nbsp;unsigned&nbsp;char&nbsp;tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};&nbsp;//共阳数码管&nbsp;0-9
回复

使用道具 举报

ID:196319 发表于 2017-5-12 15:36 | 显示全部楼层
zl2168 发表于 2017-5-12 09:02
给你各介绍几个共阴和共阳的扫描显示案例,你自己去研读改进吧!
共阴动态显示:
实例57  74LS139选通4位 ...

恩,我多看看,谢谢
回复

使用道具 举报

ID:200002 发表于 2017-5-12 16:36 | 显示全部楼层
换一个芯片
回复

使用道具 举报

ID:111634 发表于 2017-5-13 08:37 | 显示全部楼层
啊啊啊12138 发表于 2017-5-12 15:36
恩,我多看看,谢谢

给你9个案例了,共阴共阳、静态动态、串行并行,都有。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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