数码管流水灯升级程序理解

  1 /*
  2 该程序的功能:
  3 利用动态扫描和定时器1在数码管上显示出从765432开始,
  4 以1/10秒的速度往下递减直至765398并保持显示此数,,
  5 与此同时利用定时器0以500MS速度进行流水灯从上至下移动,
  6 当数码管上数减到停止时,实验板上流水灯也停止然后全部开始闪烁,
  7 3秒后(用T0定时)流水灯全部关闭、数码管上显示出“HELLO”。到此保持住。
  8 */
  9 #include <reg52.h>
 10 #include <intrins.h>
 11 #define uchar unsigned char
 12 #define uint unsigned int
 13 sbit dula=P2^6;
 14 sbit wela=P2^7;
 15 uchar code table[]={
 16 0x3f,0x06,0x5b,0x4f,
 17 0x66,0x6d,0x7d,0x07,
 18 0x7f,0x6f,0x77,0x7c,
 19 0x39,0x5e,0x79,0x71,
 20 0x76,0x79,0x38,0x3f,0}; //后面几个表示为hello这个字母的编码
 21 uchar temp,t0,t1,bai,shi,ge,flag,flag1;
 22 uint shu;
 23 void init();
 24 void display(uchar,uchar,uchar,uchar,uchar,uchar);
 25 void delay(uint z)
 26 {
 27     uint t1,y;
 28     for(t1=z;t1>0;t1--)
 29         for(y=110;y>0;y--);
 30 }
 31 void main()
 32 {
 33     init();
 34     while(1)
 35     {
 36         if(flag1!=1) //如果标志位flag 不为1 时,也就是数码管换依旧保持着 765398 这个数字
 37             display(7,6,5,bai,shi,ge);
 38         else       // flag1标志位为1时,流水灯也已经闪过三秒,此时显示 hello
 39             display(16,17,18,18,19,20); //直接用写在编码table中的数据 H表示编码中的第16个数,以此类推
 40     }
 41 }
 42
 43 void init()
 44 {
 45     shu=432;  //数的初值
 46     temp=0xfe;
 47     P1=temp;
 48     TMOD=0x11;
 49     TH0=(65536-50000)/256;
 50     TL0=(65536-50000)%256;
 51     TH1=(65536-50000)/256;
 52     TL1=(65536-50000)%256;
 53     EA=1;
 54     ET0=1;
 55     ET1=1;
 56     TR0=1;
 57     TR1=1;
 58 }
 59
 60 void timer0() interrupt 1
 61 {
 62     TH0=(65536-50000)/256;
 63     TL0=(65536-50000)%256;
 64     t0++;
 65     if(flag!=1)       //这个flag 表示如果数码管上的数还没有从432减到398时,执行下面程序
 66         {
 67         if(t0==10)
 68             {
 69                 t0=1;
 70                 temp=_crol_(temp,1);
 71                 P1=temp;
 72             }
 73         }
 74     else   //如果减到了398的时候,开始执行下面的程序
 75         {
 76             if(t0%4==0)      // 表示 每200ms闪烁  led灯闪烁一次   也就说当遇到4的整数倍时,P1口的灯就会变化
 77                 P1=~P1;
 78             if(t0==60)    //表示定时满足3秒时, 50ms * 60 = 3S
 79             {
 80                 TR0=0;    //     当3秒后,定时器0停止计数
 81                 P1=0xff;//P1口全为高电平,关闭流水灯
 82                 flag1=1; //关闭流水灯的同时,使得标志位 flag1 为1
 83             }
 84         }
 85 }
 86
 87 void timer1() interrupt 3
 88 {
 89     TH1=(65536-50000)/256;
 90     TL1=(65536-50000)%256;
 91     t1++;
 92     if(t1==2)
 93         {
 94             t1=0;
 95             shu--;
 96             bai=shu/100;  //取出后三位数
 97             shi=shu%100/10;
 98             ge=shu%10;
 99             if(shu==398)
100                 {
101                     TR0=0;
102                     TH0=(65536-50000)/256; //此处的TH0和TL0表示再次设定初值,定时为3秒;用于满足当数从432减到398这个要求后,流水灯不在流动,并且要闪烁三秒
103                     TL0=(65536-50000)%256;
104                     TR0=1;
105                     flag=1;//用于表示设定初值开始3秒定时的启动
106                     t0=0;    //由于t0中本来就有初值,故而将其复位为0
107                     P1=0xff;//关闭所有的流水灯
108                     TR1=0;     //定时器1停止工作
109                 }
110         }
111 }
112
113 void display(uchar aa,uchar bb,uchar cc,uchar ba,uchar sh,uchar g)
114 {
115         dula=1;
116         P0=table[aa];
117         dula=0;
118         P0=0xff;
119         wela=1;
120         P0=0xfe;
121         wela=0;
122         delay(1);
123
124            dula=1;
125         P0=table[bb];
126         dula=0;
127         P0=0xff;
128         wela=1;
129         P0=0xfd;
130         wela=0;
131         delay(1);
132
133        dula=1;
134         P0=table[cc];
135         dula=0;
136         P0=0xff;
137         wela=1;
138         P0=0xfb;
139         wela=0;
140         delay(1);
141         dula=1;
142         P0=table[ba];
143         dula=0;
144         P0=0xff;
145         wela=1;
146         P0=0xf7;
147         wela=0;
148         delay(1);
149
150         dula=1;
151         P0=table[sh];
152         dula=0;
153         P0=0xff;
154         wela=1;
155         P0=0xef;
156         wela=0;
157         delay(1);
158
159         dula=1;
160         P0=table[g];
161         dula=0;
162         P0=0xff;
163         wela=1;
164         P0=0xdf;
165         wela=0;
166         delay(1);
167 }

原文地址:https://www.cnblogs.com/wises/p/9539581.html

时间: 2024-07-31 09:32:08

数码管流水灯升级程序理解的相关文章

3. 戏说VHDL之入门游戏一:流水灯

一.   流水灯 1.1流水灯原理 流水灯是每个学电子的入门“游戏” ,示意图如图1,其原理极其简单,但是可玩性却极强,可以就8个LED写出不同花样的程序.在1.2中我们列出两个不同思路的代码作为VHDL的入门例程. 图1 流水灯电路图 1.2 流水灯例程 这里提供两个不同的代码. 第一个代码的思路是先对系统时钟分频,产生1s信号(即变量count取值到25000000,这样分频时间=20ns*25000000*2=1s),然后使用移位操作符指令进行操作.该指令是在VHDL93中引入的,包括sl

20180805 玩玩FPGA开发,学学Verilog,学学基本操作,制作流水灯

20180805 玩玩FPGA开发,学学Verilog,学学基本操作,制作流水灯 我毕业设计做的就是FPGA,但是什么都没有学.校外毕设老师对我非常无奈,不过还好,校内的指导老师送了我一个很久很久的开发板,配套的教程是2010年的竞赛教程,教程里的截图很显然的win7风格--下面是老师送的开发板上的照片,能玩的地方有:小灯和数码管,还有一个VGA的输出接口.(家里没有VGA线,懒得买,所以就不玩这个了) 图:老师送的板子和下载线 一.开发环境搭建 这点没什么可说的,就是下载一个ISE14.7(板

永远的流水灯(Verilog)

1. 为了更好地学习FPGA和深入理解Verilog语法,首先从最简单的流水灯做起.虽然简单,但是也包含了不少知识.通过这次实验项目,可以了解开发软件的使用及Verilog的编程方法,熟悉模块化设计的方法. 2. 该项目主要实现的功能为: (1)10位的流水灯 (2)中间两个led灯每隔100ms闪烁一次 (3)两边的led灯每隔100ms流动一下,从中间向两边流水. 3.  具体实现如下 (1)首先定义一个时间计数寄存器counter,每当达到预定的100ms时,计数寄存器就清零,否则的话寄存

Qt利用代码实现流水灯的效果

用代码实现流水灯的效果 其实很想实现这种流水灯的效果了,看起来挺酷的,用处也很多,只是开始没有思路不知道怎么去实现,于是在我的超市收银项目中就采用了图片加载的方式进行显示,效果如下图所示: 由于是动态图片,显示的时候就要用到QMovie进行加载,简单的代码如下所示: QMovie *move = new QMovie(":/images/splash.gif"); QLabel *label = new QLabel("",0); label->setWind

四位流水灯Led_4

流水灯实验是我们学习开发板或语言的入门程序,通过流水灯这个可视化的实验,会增加我们对学习语言的乐趣, 会让我们觉得其实语言也是可以玩出花样的,接下来呈上代码,大家可以下到自己的板子里试试,. //Led_4.v module Led_4(clk,rst,led); input clk; input rst; output [3:0] led; reg [3:0] led; always @(posedge clk or negedge rst) begin if(!rst) begin led

第一个FPGA工程—LED流水灯

这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始入门FPGA开发了. 1.1.1.电路说明 1.1.2.新建工程 第一步:从开始菜单启动Quartus II 13.1(64 bit) ,如下图. 第二步:菜单栏选择File->New Project Wizard,新建工程. 第三步:弹出新建工程对话框,点击Next,下一步. 第三步:如下图,依次

51单片机第一弹---流水灯

转行搞硬件..acm算是走到头了,毕竟电子是自己专业的特色.. 初撸单片机,买的板子是STC89C52(某宝58大洋淘来的..) 郭天祥新概念的那本书(好像有点不配套不过凑活着弄了也..) 说一下容易犯的错误吧. 1.串口驱动搞了1个多小时..一直安装不上,后来跟着教程做的 2.书上写的控制LED端口的是P1 ,但实际上买的这快板子是P2 ,最开始搞了半天老是点不亮灯,后来一想会不会端口错了,换成0试试?换了不行,又换了2..亮了(这是个问题,以后要找学长问问,怎么根据开发板看出来每个模块的端口

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c 1 /*----------------------------------------------- 2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 4 周期,即晶振频率要小于12MHZ) 5 ---------------------------------------

一步步玩pcduino3--mmc下的裸机流水灯

第一部分是玩pcduino3下的裸机,这个过程可以让我们更好的理解嵌入式系统,熟悉我们使用的这个平台. 首先介绍下开发环境: 虚拟机:VMware? Workstation 10.0.2 build-1744117 系统:Linux slackware 3.2.29-smp #2 SMP 交叉编译器:arm-linux-gnueabihf-    版本号:gcc version 4.8.2 20130805 (prerelease) (crosstool-NG linaro-1.13.1-4.8