登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 数码管的动态显示

[复制链接]
发表于 2021-1-14 17:24:04 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 89系列单片机
学习安排: .
开始时间: 2021-01-13
结束时间:
本帖最后由 邢之舟 于 2021-1-18 22:24 编辑

接着学校点亮的单个数码管,在家做多个数码管的动态显示。这个动态显示就是应用视觉残留原理来实现不能同时显示的发光管同时点亮,类似的方法曾经在电子设计大赛里,做流水灯的时候用过。当时是做波浪特效,现在就是多个数码管依次点亮。
每个数码管的库。做成了一个字符型数组。

  1. unsigned char code Ledchar[]=
  2.                 {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  3.                 0x7F,0x6F,0x77,0x7c,0x39,0x5E,0x79,0x71};
复制代码



然后就是先设定1ms的定时器。

  1.     TMOD=0x01;
  2.     TH0=0xFC;TL0=0x66;
  3.     TR0=1;
复制代码

每一毫秒进入一次,重置定时器,刷新一遍数码管。

  1.                 if(1==TF0)
  2.                 {
  3.                         TF0=0;
  4.                         TH0=0xFC;TL0=0x66;
  5.                         count+=1;        
  6.                         P2+=4;
  7.                         if(0x00==P2)P0=Numtemp[0];
  8.                         if(0x04==P2)P0=Numtemp[1];
  9.                         if(0x08==P2)P0=Numtemp[2];
  10.                         if(0x0C==P2)P0=Numtemp[3];
  11.                         if(0x10==P2)P0=Numtemp[4];
  12.                         if(0x14==P2)P0=Numtemp[5];
  13.                         if(0x18==P2)P0=Numtemp[6];
  14.                         if(0x1C==P2)P0=Numtemp[7];
  15.                         if(0x20==P2){P2=0x00;}        
  16.                 }
复制代码
每一秒钟更新一遍数码管的数。存放在临时变量数组Numtemp里。
  1.                 if(1000==count)
  2.                 {
  3.                         second+=1;
  4.                         count=0;
  5.                         Numtemp[0]=Ledchar[second%10];
  6.             Numtemp[1]=Ledchar[(second/10)%10];
  7.             Numtemp[2]=Ledchar[(second/100)%10];
  8.             Numtemp[3]=Ledchar[(second/1000)%10];
  9.             Numtemp[4]=Ledchar[(second/10000)%10];
  10.             Numtemp[5]=Ledchar[(second/100000)%10];
  11.             Numtemp[6]=Ledchar[(second/1000000)%10];
  12.             Numtemp[7]=Ledchar[(second/10000000)%10];
复制代码



就是大概的思路。


好懒~~不想说~~~
 楼主| 发表于 2021-1-14 17:27:50 | 显示全部楼层
但是写到这里并不能正常显示。
于是楼主就开始查错了。


好懒~~不想说~~~
 楼主| 发表于 2021-1-14 17:45:47 | 显示全部楼层
随后就是在数码管刷新区疯狂加注释符。还把if语句改成了switch语句,最后发现是P2递增的问题。
Ps.为了写自己改代码的过程,就一直把代码往前撤销。结果不小心在代码上输入的东西没办法撤销回去了。现在改好的代码要重新写了,嘤嘤嘤。


好懒~~不想说~~~
 楼主| 发表于 2021-1-15 17:19:55 | 显示全部楼层
这是改好后已经消影的代码
  1. #include<reg51.h>
  2. unsigned int count=0;
  3. unsigned char i=0;
  4. unsigned char code Ledchar[]=
  5.                 {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  6.                 0x7F,0x6F,0x77,0x7c,0x39,0x5E,0x79,0x71};
  7. unsigned char Numtemp[8]={0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  8. unsigned long second = 0;
  9. void main ()
  10. {
  11.         TMOD=0x01;
  12.         TH0=0xFC;TL0=0x66;
  13.         TR0=1;
  14.         while (1)
  15.         {
  16.                 if(1==TF0)
  17.                 {
  18.                         TF0=0;
  19.                         TH0=0xFC;TL0=0x66;
  20.                         count+=1;       
  21.                         if(1000<=count)
  22.                                 {
  23.                                         second+=1;
  24.                                         count=0;
  25.                                         Numtemp[0]=Ledchar[second%10];
  26.                                         Numtemp[1]=Ledchar[(second/10)%10];
  27.                                         Numtemp[2]=Ledchar[(second/100)%10];
  28.                                         Numtemp[3]=Ledchar[(second/1000)%10];
  29.                                         Numtemp[4]=Ledchar[(second/10000)%10];
  30.                                         Numtemp[5]=Ledchar[(second/100000)%10];
  31.                                         Numtemp[6]=Ledchar[(second/1000000)%10];
  32.                                         Numtemp[7]=Ledchar[(second/10000000)%10];
  33.                                 }
  34.                         P0=0x00;
  35.                         switch(i)
  36.                         {
  37.                                 case 0 : P2=0x00;i++;P0=Numtemp[0];break;
  38.                                 case 1 : P2=0x04;i++;P0=Numtemp[1];break;
  39.                                 case 2 : P2=0x08;i++;P0=Numtemp[2];break;
  40.                                 case 3 : P2=0x0C;i++;P0=Numtemp[3];break;
  41.                                 case 4 : P2=0x10;i++;P0=Numtemp[4];break;
  42.                                 case 5 : P2=0x14;i++;P0=Numtemp[5];break;
  43.                                 case 6 : P2=0x18;i++;P0=Numtemp[6];break;
  44.                                 case 7 : P2=0x1C;i=0;P0=Numtemp[7];break;
  45.                         }       
  46.                 }
  47.         }
  48. }
复制代码




好懒~~不想说~~~
 楼主| 发表于 2021-1-15 22:31:54 | 显示全部楼层
做完消影,动态显示依然不完美的就是在刷新读秒的时候抖动。
这个抖动是由于进入读秒程序
  1.                         if(1000<=count)
  2.                                 {
  3.                                         second+=1;
  4.                                         count=0;
  5.                                         Numtemp[0]=Ledchar[second%10];
  6.                                         Numtemp[1]=Ledchar[(second/10)%10];
  7.                                         Numtemp[2]=Ledchar[(second/100)%10];
  8.                                         Numtemp[3]=Ledchar[(second/1000)%10];
  9.                                         Numtemp[4]=Ledchar[(second/10000)%10];
  10.                                         Numtemp[5]=Ledchar[(second/100000)%10];
  11.                                         Numtemp[6]=Ledchar[(second/1000000)%10];
  12.                                         Numtemp[7]=Ledchar[(second/10000000)%10];
  13.                                 }
复制代码
的运行,导致占用了数码管刷新时间,从而导致了数码管刷新时间的跳动而产生了抖动。
所以我们引入单片机的定时器中断来解决“该刷新数码管但是程序却在刷新秒数从而导致刷新不及时产生抖动”的问题,让刷新数码管打断更新秒数。
引进定时器中断这一先进方法后的程序如下
  1. #include<reg51.h>
  2. unsigned int count=0;
  3. unsigned char i=0;
  4. unsigned char code Ledchar[]=
  5.                 {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  6.                 0x7F,0x6F,0x77,0x7c,0x39,0x5E,0x79,0x71};
  7. unsigned char Numtemp[8]={0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  8. unsigned long second = 0;
  9. void main ()
  10. {       
  11.         TMOD=0x01;
  12.         TH0=0xFC;TL0=0x66;
  13.         TR0=1;
  14.         EA=1;//打开总中断开关
  15.         ET0=1;//打开定时器0中断
  16.         while (1)
  17.         {
  18.                         if(1000<=count)
  19.                                 {
  20.                                         second+=1;
  21.                                         count=0;
  22.                                         Numtemp[0]=Ledchar[second%10];
  23.                                         Numtemp[1]=Ledchar[(second/10)%10];
  24.                                         Numtemp[2]=Ledchar[(second/100)%10];
  25.                                         Numtemp[3]=Ledchar[(second/1000)%10];
  26.                                         Numtemp[4]=Ledchar[(second/10000)%10];
  27.                                         Numtemp[5]=Ledchar[(second/100000)%10];
  28.                                         Numtemp[6]=Ledchar[(second/1000000)%10];
  29.                                         Numtemp[7]=Ledchar[(second/10000000)%10];
  30.                                 }
  31.                 }
  32. }
  33. void intT0() interrupt 1
  34. {
  35.                         TH0=0xFC;TL0=0x66;
  36.                         count+=1;       
  37.                         P0=0x00;
  38.                         switch(i)
  39.                         {
  40.                                 case 0 : P2=0x00;i++;P0=Numtemp[0];break;
  41.                                 case 1 : P2=0x04;i++;P0=Numtemp[1];break;
  42.                                 case 2 : P2=0x08;i++;P0=Numtemp[2];break;
  43.                                 case 3 : P2=0x0C;i++;P0=Numtemp[3];break;
  44.                                 case 4 : P2=0x10;i++;P0=Numtemp[4];break;
  45.                                 case 5 : P2=0x14;i++;P0=Numtemp[5];break;
  46.                                 case 6 : P2=0x18;i++;P0=Numtemp[6];break;
  47.                                 case 7 : P2=0x1C;i=0;P0=Numtemp[7];break;
  48.                         }
  49. }
复制代码





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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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