登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 51单片机之数码管静态及动态显示

[复制链接]
发表于 2023-1-23 16:59:32 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 51单片机数码管的静态及动态显示
开始时间: 2023-01-01
结束时间: 2023-01-01
本帖最后由 郑中源 于 2023-1-23 17:02 编辑





一、静态数码管显示
有了点灯的基础后,我们就能很快理解如何操作数码管 1.png
如图,我们的板子上有六个数码管,每个数码管由8个led小灯组成,可以理解为原来排成一排的灯现在有了摆放的图案,摆成了“8”这个数字和它右下角的点
那么比如让最左边的数码管亮起的话,你只需要按照原理图对应一下,点亮八个中的哪几个灯能得到你想要的数字,然后像写点灯程序那样写入程序就好。
值得注意的是,由于74HC138每次只能让LEDSx(x=1~6)中一个为低电平,所以静态状态下,只能由一个数码管是亮的。
以下是我的程序,效果是让第六个数码管显示6,Nixietube函数中第一个数字代表第几个数码管,第二个数字代表显示几(提前设置好一个数组,P0口自动对应里面的十六进制数字)。
  1. #include <stdio.h>
  2. #include <STC12C5A60S2.H>
  3. void Nixietube(unsigned char position,unsigned char number);
  4. void main(){
  5.         P11=0;
  6.         Nixietube(6,6);
  7.         while(1){
  8.         }
  9. }

  10. void Nixietube(unsigned char position,unsigned char number){
  11.         unsigned char Nixie[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
  12.         switch(position){
  13.                 case 1:P22=0;P21=0;P20=0;break;
  14.                 case 2:P22=0;P21=0;P20=1;break;
  15.                 case 3:P22=0;P21=1;P20=0;break;
  16.                 case 4:P22=0;P21=1;P20=1;break;
  17.                 case 5:P22=1;P21=0;P20=0;break;
  18.                 case 6:P22=1;P21=0;P20=1;break;        
  19.          
  20.                
  21.         }
  22.         P0=Nixie[number];
  23.         
  24. }
复制代码
二、动态数码管显示(即让不同的数码管同时显示)
有了前面的基础,动态数码管也不是很难了,我们很快就能猜到加个延时就可以,延时不能太长,同时也不能不加,不然单片机的速度太快,数据传输会有误,每次显示完之后让P0全为1,以避免数据传输太快造成的错误。
程序如下:延时函数的赫兹根据晶振自行调整,由于人眼的余晖效应,不是同时发生的事会让你觉得同时,以达到目的。
  1. #include <stdio.h>
  2. #include <STC12C5A60S2.H>
  3. #include <intrins.h>
  4. void Nixietube(unsigned char position,unsigned char number);
  5. void Delay(unsigned char xms);
  6. void main(){
  7.         P11=0;
  8.         while(1){
  9.         Nixietube(4,4);
  10.         Nixietube(5,5);       
  11.         Nixietube(6,6);
  12.         }
  13. }

  14. void Nixietube(unsigned char position,unsigned char number){
  15.         unsigned char Nixie[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x98};
  16.         switch(position){
  17.                 case 1:P22=0;P21=0;P20=0;break;
  18.                 case 2:P22=0;P21=0;P20=1;break;
  19.                 case 3:P22=0;P21=1;P20=0;break;
  20.                 case 4:P22=0;P21=1;P20=1;break;
  21.                 case 5:P22=1;P21=0;P20=0;break;
  22.                 case 6:P22=1;P21=0;P20=1;break;       
  23.           
  24.                
  25.         }
  26.         P0=Nixie[number];
  27.         Delay(1);
  28.         P0=0xFF;   
  29.        
  30. }
  31. void Delay(unsigned char xms)                //@11.0592MHz
  32. {
  33.         unsigned char i, j;
  34.         while(xms--){
  35.         _nop_();
  36.         _nop_();
  37.         _nop_();
  38.         i = 11;
  39.         j = 190;
  40.         do
  41.         {
  42.                 while (--j);
  43.         } while (--i);
  44. }
  45. }
复制代码

end.
2.png
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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