模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

[单片机课堂] 第十二课:最便宜的显示屏

  [复制链接]
发表于 2016-11-27 15:23:41 | 显示全部楼层
课讲的很好
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-27 17:35:31 | 显示全部楼层
厉害了啊
回复 支持 0 反对 1

使用道具 举报

发表于 2016-11-27 21:46:16 | 显示全部楼层

回复 支持 0 反对 1

使用道具 举报

发表于 2016-11-27 23:18:16 | 显示全部楼层
好好好,萝莉辛苦了!
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 00:16:10 | 显示全部楼层
路过帮顶
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 00:36:14 | 显示全部楼层
路过帮顶
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-28 04:47:48 | 显示全部楼层
本帖最后由 我爱萝丽爱萝丽 于 2016-11-29 03:32 编辑

1.1 什么是数码管?


数码管其实就是很多个发光LED,排列成一个“8”字形,控制数码管跟我们之前学习的点亮LED完全一样,只是原来是点亮一个,现在要点亮4*8=32个!


知识点(46)数码管结构
第十二课:最便宜的显示屏  作者:我爱萝丽爱萝丽 6100
数码管的结构很简单,8个LED构成一个数字。如果想要显示“3”,只需要让A、B、C、D、G为高电平(引脚11、7、4、2、5),其余引脚为低电平即可。




使用第三课提到的方法,获得单片机的引脚图:
第十二课:最便宜的显示屏  作者:我爱萝丽爱萝丽 9256
按照引脚,写出一个让数码管显示“3333”的小程序:
你也可以按照这个方法,显示出1、2、3、4……等

  1. #include<reg51.h>

  2. sbit DA=P2^4;                        //数码管每个引脚
  3. sbit DB=P3^2;
  4. sbit DC=P3^6;
  5. sbit DD=P2^0;
  6. sbit DE=P2^1;
  7. sbit DF=P2^3;
  8. sbit DG=P3^5;
  9. sbit DP=P3^7;

  10. sbit B1=P2^5;                        //四个数码管的引脚定义
  11. sbit B2=P2^2;
  12. sbit B3=P3^3;
  13. sbit B4=P3^4;


  14. main()
  15. {
  16.         DA=1;
  17.         DB=1;
  18.         DC=1;
  19.         DD=1;
  20.         DE=0;
  21.         DF=0;
  22.         DG=1;
  23.         DP=0;//A、B、C、D、G引脚为高电平,显示“3”
  24.         
  25.         B1=0;
  26.         B2=0;
  27.         B3=0;
  28.         B4=0;//四个数码管都显示
  29.         
  30.         
  31.         while(1)
  32.         {
  33.                
  34.                
  35.         }
  36. }
复制代码




回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-28 05:26:26 | 显示全部楼层
本帖最后由 我爱萝丽爱萝丽 于 2016-11-29 03:32 编辑

1.2 让数字动起来!


学会了显示3,自己再显示出来0~9对你来说应该小意思!
只是好像有些不对劲,灯光很暗?
那是你忘记开启引脚的大电流模式了。这是个很重要的技能,要熟练掌握。开了之后立马高亮!


写一个小程序,让数字从0到9自动变化起来吧:

  1. #include<reg51.h>

  2. sfr P2M0=0x96;     //声明 P2引脚模式寄存器
  3. sfr P3M0=0xb2;     //声明 P3引脚模式寄存器


  4. sbit DA=P2^4;                        //数码管每个引脚
  5. sbit DB=P3^2;
  6. sbit DC=P3^6;
  7. sbit DD=P2^0;
  8. sbit DE=P2^1;
  9. sbit DF=P2^3;
  10. sbit DG=P3^5;
  11. sbit DP=P3^7;

  12. sbit B1=P2^5;                        //四个数码管的引脚定义
  13. sbit B2=P2^2;
  14. sbit B3=P3^3;
  15. sbit B4=P3^4;

  16. void Delay1ms()                //@12.000MHz
  17. {
  18.         unsigned char i, j;

  19.         i = 12;
  20.         j = 169;
  21.         do
  22.         {
  23.                 while (--j);
  24.         } while (--i);
  25. }

  26. void delay_n_ms(unsigned int n) //延时n毫秒函数
  27. {
  28.         while(n)         
  29.         {
  30.                 Delay1ms();
  31.                 n=n-1;//每循环一次n减小1
  32.         }   
  33. }


  34. main()
  35. {
  36.         P2M0=0x1B;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
  37.         P3M0=0xE4;                //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
  38.         
  39.         B1=0;
  40.         B2=0;
  41.         B3=0;
  42.         B4=0;//四个数码管都显示
  43.         
  44.         
  45.         while(1)
  46.         {
  47.                 DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;//显示“0”
  48.                 delay_n_ms(500);                //延时0.5秒
  49.                
  50.                 DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;//显示“1”
  51.                 delay_n_ms(500);
  52.                
  53.                 DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;//显示“2”
  54.                 delay_n_ms(500);
  55.                
  56.                 DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;//显示“3”
  57.                 delay_n_ms(500);               
  58.                
  59.                 //…………
  60.                 //…………试着自己添加显示其他数字的程序
  61.         
  62.         
  63.         
  64.         
  65.                
  66.         }
  67. }
复制代码




回复 支持 0 反对 1

使用道具 举报

发表于 2016-11-28 07:08:35 | 显示全部楼层
第十二课:最便宜的显示屏  作者:lv838999 8765 第十二课:最便宜的显示屏  作者:lv838999 6862 第十二课:最便宜的显示屏  作者:lv838999 3436 第十二课:最便宜的显示屏  作者:lv838999 4023
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 08:04:29 | 显示全部楼层
看了白激动啦
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 08:19:25 | 显示全部楼层
原来如此
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 08:32:26 | 显示全部楼层
老大好辛苦,凌晨5点还在写帖子。老师辛苦辛苦。学生将加倍努力。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 09:30:56 | 显示全部楼层
终于更新了!顶。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-28 10:25:22 | 显示全部楼层
大神的教程太详细了,好懂,顶起。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-29 03:29:20 | 显示全部楼层
本帖最后由 我爱萝丽爱萝丽 于 2016-11-29 03:34 编辑

1.3 唯快不破


能不能让每个数码管显示的数字不一样呢?
显示数字的时候,同时也可以控制四个数码管中哪个显示,这样你就可以显示出来“0123”了。


在屏幕上滚动显示“0123”的小程序:


只能滚动显示,不能同时显示吗?你可以试着把延时500ms改成100ms、20ms……试试,自然就明白这一小节为什么叫这个标题。
  1. #include<reg51.h>

  2. sfr P2M0=0x96;     //声明 P2引脚模式寄存器
  3. sfr P3M0=0xb2;     //声明 P3引脚模式寄存器


  4. sbit DA=P2^4;                        //数码管每个引脚
  5. sbit DB=P3^2;
  6. sbit DC=P3^6;
  7. sbit DD=P2^0;
  8. sbit DE=P2^1;
  9. sbit DF=P2^3;
  10. sbit DG=P3^5;
  11. sbit DP=P3^7;

  12. sbit B1=P2^5;                        //四个数码管的引脚定义
  13. sbit B2=P2^2;
  14. sbit B3=P3^3;
  15. sbit B4=P3^4;

  16. void Delay1ms()                //@12.000MHz
  17. {
  18.         unsigned char i, j;

  19.         i = 12;
  20.         j = 169;
  21.         do
  22.         {
  23.                 while (--j);
  24.         } while (--i);
  25. }

  26. void delay_n_ms(unsigned int n) //延时n毫秒函数
  27. {
  28.         while(n)         
  29.         {
  30.                 Delay1ms();
  31.                 n=n-1;//每循环一次n减小1
  32.         }   
  33. }


  34. main()
  35. {
  36.         P2M0=0x1B;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
  37.         P3M0=0xE4;                //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
  38.         
  39.         
  40.         while(1)//显示“0123”
  41.         {
  42.                 B1=0;B2=1;B3=1;B4=1;        //第一个数码管显示,二三四数码管关闭
  43.                 DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;//显示“0”
  44.                 delay_n_ms(500);                //延时0.5秒
  45.                
  46.                 B1=1;B2=0;B3=1;B4=1;        //第二个数码管显示
  47.                 DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;//显示“1”
  48.                 delay_n_ms(500);
  49.                
  50.                 B1=1;B2=1;B3=0;B4=1;        //第三个数码管显示
  51.                 DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;//显示“2”
  52.                 delay_n_ms(500);
  53.                
  54.                 B1=1;B2=1;B3=1;B4=0;        //第四个数码管显示
  55.                 DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;//显示“3”
  56.                 delay_n_ms(500);                                
  57.                
  58.         }
  59. }
复制代码




回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-29 08:00:59 | 显示全部楼层
萝莉的教程一个字,绝
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-29 21:29:19 | 显示全部楼层
期待电压表程序讲解
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-11-30 01:09:28 | 显示全部楼层
本帖最后由 我爱萝丽爱萝丽 于 2016-11-30 01:21 编辑

1.4 程序模块化


做过前三小节的练习后,相信你已经学会了数码管的显示。
实际上四位数码管同一时间只能显示一位,因此想要让四位“同时显示”,就要利用单片机的“快”,在人眼察觉到之前就把四个依次显示一遍。这样,由于视觉暂留,人眼就会看到四位数码管同时在亮。这种显示方法就是“动态扫描法”。
那么人眼能够察觉到闪烁的时间是多少呢?
我们在看视频的时候都会关心一个参数:屏幕刷新率(每秒帧数)。一般刷新率达到50Hz以上,人眼就不能感觉到了。
也就是说四个数码管显示一遍的时间小于20ms,每个显示小于5ms,就能够稳定显示。


当然只学会如何显示是远远不够的,显示程序是给别的程序服务的,为了方便以后的使用,你要学会把程序模块化起来:就像我们一开始写的函数 delay_n_ms(n)一样,会重复使用到的小程序可以封装成函数,随时调用。
这里我们封装了一个新函数:
display(x)//显示数字x

  1. #include<reg51.h>

  2. sfr P2M0=0x96;     //声明 P2引脚模式寄存器
  3. sfr P3M0=0xb2;     //声明 P3引脚模式寄存器


  4. sbit DA=P2^4;                        //数码管每个引脚
  5. sbit DB=P3^2;
  6. sbit DC=P3^6;
  7. sbit DD=P2^0;
  8. sbit DE=P2^1;
  9. sbit DF=P2^3;
  10. sbit DG=P3^5;
  11. sbit DP=P3^7;

  12. sbit B1=P2^5;                        //四个数码管的引脚定义
  13. sbit B2=P2^2;
  14. sbit B3=P3^3;
  15. sbit B4=P3^4;


  16. unsigned char display_time;        //定义变量用于显示次数

  17. unsigned char Data1;        //第一个数码管要显示的数据
  18. unsigned char Data2;        //第二个数码管要显示的数据
  19. unsigned char Data3;        //第三个数码管要显示的数据
  20. unsigned char Data4;        //第四个数码管要显示的数据


  21. void Delay1ms()                //@12.000MHz
  22. {
  23.         unsigned char i, j;

  24.         i = 12;
  25.         j = 169;
  26.         do
  27.         {
  28.                 while (--j);
  29.         } while (--i);
  30. }

  31. void delay_n_ms(unsigned int n) //延时n毫秒函数
  32. {
  33.         while(n)         
  34.         {
  35.                 Delay1ms();
  36.                 n=n-1;//每循环一次n减小1
  37.         }   
  38. }


  39. void display(unsigned char x)//控制数码管显示内容的函数
  40. {
  41.         //判断x的值来决定显示什么
  42.         if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;} //显示“0”
  43.         
  44.         if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“1”
  45.         
  46.         if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;} //显示“2”
  47.         
  48.         if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;} //显示“3”

  49.         if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;} //显示“4”
  50.         
  51.         if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“5”
  52.         
  53.         if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“6”
  54.         
  55.         if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示“7”
  56.         
  57.         if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示“8”
  58.         
  59.         if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示“9”
  60.         
  61. }


  62. main()
  63. {
  64.         P2M0=0x1B;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
  65.         P3M0=0xE4;                //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
  66.         
  67.         
  68.         while(1)
  69.         {
  70.                 delay_n_ms(4);//系统周期4ms
  71.                
  72.                 Data1=4;//四个数码管显示的数据
  73.                 Data2=5;
  74.                 Data3=6;
  75.                 Data4=7;
  76.                
  77.                 ///////////////////////////////////////////////////////
  78.                 //显示程序模块化,只需要改变Data1/2/3/4的值就可以控制显示内容
  79.                
  80.                 display_time=display_time+1;
  81.                 if(display_time>3)
  82.                 {
  83.                         display_time=0;  //0、1、2、3 四个循环
  84.                 }
  85.                
  86.                 if(display_time==0)//第0次显示第一个数码管
  87.                 {
  88.                         B1=0;B2=1;B3=1;B4=1;        
  89.                         display(Data1);                //显示第1位数据
  90.                 }
  91.                
  92.                 if(display_time==1)//第1次显示第二个数码管
  93.                 {
  94.                         B1=1;B2=0;B3=1;B4=1;        
  95.                         display(Data2);                //显示第2位数据
  96.                 }
  97.                
  98.                 if(display_time==2)//第2次显示第三个数码管
  99.                 {
  100.                         B1=1;B2=1;B3=0;B4=1;        
  101.                         display(Data3);                //显示第3位数据
  102.                 }
  103.                
  104.                 if(display_time==3)//第3次显示第四个数码管
  105.                 {
  106.                         B1=1;B2=1;B3=1;B4=0;        
  107.                         display(Data4);                //显示第4位数据
  108.                 }
  109.                         
  110.                
  111.         }
  112. }
复制代码



回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-30 06:48:23 | 显示全部楼层

这个必须顶顶顶。。。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-11-30 09:00:58 | 显示全部楼层
授人以鱼不如授人以渔。谢谢老师!
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!