跑马灯实验代码
实验报告跑马灯
实验报告一:实验名称跑马灯电路二:实验目的(1)掌握proteus软件的使用方法;(2)调试跑马灯电路的汇编语言;(3)绘制跑马灯原理图,实现电路的实现;三:实验要求跑马灯电路,即实现p1口上的8个发光二极管循环闪亮的电路。
四:实验仪器计算机,keil c51软件,proteus软件。
五:参考程序ORG 0000H ;程序入口AJMP MAIN ;转主程序ORG 30HMAIN:MOV R2,#16 ;将16送给R2MOV A,#0FEH ;将0FEH送给累加器ALOOP:MOV P1,A ;循环,将累加器A的值送给p1LCALL D1 ;长调子程序D1RL A ;累加器循环左移DJNZ R2,LOOP ;R2减1非0则转移到LOOPD1: MOV R4,#10 ;将10送给R4D2: MOV R5,#100 ;将100送给R5D3: MOV R6,#249 ;将249送给R6DJNZ R6,$ ;R6减1不为0,则原地等待DJNZ R5,D3 ;R5减1不为0,则转到D3DJNZ R4,D2 ;R4减1不为0,则转到D2RET ;返回主程序END六:试验步骤(1)进入keil c51系统的操作环境,并建立一个工程,输入汇编程序,对程序进行编译和链接:(2):调试无误后运行程序并检查运行结果,检查正确后生成hex文件:(3):在软件proteus中,绘制电路图,找到此实验需要用到的主要元器件及其符号:1:单片机AT89C51;2:电阻RES 10k;3:电容 CAP 30uF;4:晶振 CRYSTAL ;5;排阻 RESPACK-8;6:开关 BUTTON;7:发光二级管 LED;(4)绘制电路仿真图,然后将生成的hex文件下载到AT89C51中,并开始仿真,结果如下:七:实验结果程序仿真完成后,发光二级管会有规律的从左向右循环闪亮,直到时间结束后才会停下。
EDA实验 跑马灯
实验题目:跑马灯设计一、设计任务:设计8个LED进行花式显示,设计4种显示模式:1、从左到右逐个点亮LED;2、从右到左逐个点亮LED;3、从两边到中间逐个点亮LED;4、从中间到两边逐个点亮LED。
使得四种模式循环切换,由复位键rst控制系统的运行与停止。
二、实验过程⒈设计思路:分析该题目出现的所有状态,用“00000000”表示s0,“10000000”表示s1,“01000000”表示s2,“00100000”表示s3,“00010000”表示s4,“00001000”表示s5,“00000100”表示s6,“00000010”表示s7,“00000001”表示s8,“10000001”表示s9,“01000010”表示s10,“00100100”表示s11,“00011000”表示s12,另外定义了一个中间变量pp,用来表示该种状态的下一个状态为何,用来满足四种状态模式的连接操作。
在程序的结构体中编写两种进程,时序进程和组合进程,它们分别用来控制时钟、复位等时序信息和具体的状态转换关系。
根据状态转换图,对每一种状态编写下一项的确定状态,用pp来引导。
同时在适当的位置,进行pp值的定义变化,分别是“00000000”、“10000000”、“00000001”、“00011000”、“10000001”。
⒉设计方案:将列写出的状态转换图用VHDL语言表达出来,设计好相应的输入输出端口及功能过程,进行设计处理,编译文件,修改其中的错误,再用波形图进行编辑仿真描述,以便检查其功能是否正确,最后下载链接到硬件设备上检查其功能。
⒊设计步骤:(1)用VHDL语言设计实现计数器:运行QuartusII软件,选择菜单File/New Project Wizard...,新建一个项目,选择cyclone系列的芯片;在此项目下新建VHDL文件,编写计数器代码:library ieee;use ieee.std_logic_1164.all;entity test3 isport(clk, reset,stop : in std_logic;qout : buffer std_logic_vector(7 downto 0));end test3;architecture be of test3 istype fsm_st is(s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12);signal current_state, next_state : fsm_st;signal pp : std_logic_vector(1 downto 0);beginreg : process(reset, clk)beginif reset = '1' then current_state <= s0;elsif rising_edge(clk) thencurrent_state <= next_state;end if;end process;com : process(current_state, reset)begincase current_state iswhen s0 => qout <= "00000000";if( reset ='0' and stop='0') then next_state <= s1; pp <= "00"; end if;when s1 => qout <= "10000000";if (pp = "00" and stop='0') then next_state <= s2;elsif (pp = "01" and stop='0')then next_state <= s9; pp <= "10"; end if;when s2 => qout <= "01000000";if (pp = "00" and stop='0')then next_state <= s3;elsif (pp = "01" and stop='0')then next_state <= s1;end if;when s3 => qout <= "00100000";if (pp = "00" and stop='0') then next_state <= s4;elsif (pp = "01" and stop='0')then next_state <= s2;end if;when s4 => qout <= "00010000";if (pp = "00" and stop='0')then next_state <= s5;elsif( pp = "01" and stop='0')then next_state <= s3;end if;when s5 => qout <= "00001000";if( pp = "00" and stop='0')then next_state <= s6;elsif (pp = "01" and stop='0')then next_state <= s4;end if;when s6 => qout <= "00000100";if (pp = "00" and stop='0')then next_state <= s7;elsif( pp = "01" and stop='0')then next_state <= s5;end if;when s7 => qout <= "00000010";if (pp = "00" and stop='0')then next_state <= s8;elsif (pp = "01" and stop='0')then next_state <= s6;end if;when s8 => qout <= "00000001";if (pp = "00" and stop='0')then next_state <= s7; pp <= "01"; end if;when s9 => qout <= "10000001";if (pp = "10" and stop='0')then next_state <= s10;elsif (pp = "11" and stop='0')then next_state <= s1; pp <= "00"; end if;when s10 => qout <= "01000010";if (pp = "10" and stop='0')then next_state <= s11;elsif (pp = "11" and stop='0')then next_state <= s9;end if;when s11 => qout <= "00100100";if (pp = "10" and stop='0')then next_state <= s12;elsif (pp = "11" and stop='0')then next_state <= s10;end if;when s12 => qout <= "00011000";if (pp = "10" and stop='0') then next_state <= s11; pp <= "11"; end if;when others => null;end case;end process;end be;(2)将此文件进行编译.(3)新建一个vector waveform form波形图文件,设置为波形仿真。
单片机 跑马灯实验
void hold(){
n=8;
while(1){
if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯
oldK=K[4];
if(n==-1)n=7;//D0灯亮后点亮D7
while(n>=0){
out=D[n];
n--;
if(delay4(15))break;
}
}
if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯
void hold(){
n=8;
while(1){
if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯
oldK=K[4];
if(n==-1)n=7;//D0灯亮后点亮D7
while(n>=0){
out=D[n];
n--;
if(delay4(15))break;
}
}
if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯
图43键控的流水灯
五、实验思考题
1、采用I/O口作为输出口时要考虑哪些因素?为什么实验装置中LED要串联一个电阻?
当作为输出口时候就是单片机向外发出数据,或者再产生拉电流,单片机的拉电流一般要比灌电流小,基本上就能点亮2,3个LED,功率很有限,所以一般时候必须用驱动芯片来驱动单片机的外围器件。串联电阻是为了保护电路。
while(1){//开机即正序点亮流水灯
forward();
if(P2!=K[0]){
break;
}
}
while(1){
out=AllOff;
if((P2&0x0f)!=0x0f){//检测有键按下
delay10ms();//延时10ms再去检测
网页制作中跑马灯的实现
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句我们看一下下面的几个例子:1、左右弹来弹去的跑马灯代码:<marquee width=400 behavior=alternate direction=left align=middle border=1>弹来弹去跑马灯</marquee>设置behavior=alternate表示双向移动,direction=left表示运动方向向左。
marquee的宽度可以使用绝对象素值,例如width=200等这个值限定了跑马灯滚动的范围。
需要说明的是该效果在Netscape下是看不到的。
2、跑的很快的跑马灯只要在<marquee>标签内加上“scrollamount=30”参数即可。
3、带有超级链接的跑马灯代码:<marquee width=90%><a href=/target=_blank>带有超链接的跑马灯!点我试试?</a> <a href=/target=_blank>还有一条呢!点我试试?</a></marquee>参数用法介绍behavior=scroll, slide, alternate跑马方式:循环绕行,只跑一次就停住,来回往复运动direction=left,right跑马方向:从左向右,从右向左loop=100跑马次数:循环100次,如不写默认为一直循环width=100%,height=200跑马范围:宽为100%,高为200像素scrollamount=20跑马速度:数越大越快scrolldelay=500跑马延时:毫秒数,利用它可实现跃进式滚动hspace=20,vspace=20跑马区域与其它区域间的空白大小bgcolor=#00FFCC跑马区域的背景颜色尽管<marquee>参数不少,但毕竟不能实现复杂的和自定义的特殊跑马灯效果,而且还有浏览器限制,所以我们更多情况下会采用JavaScript来实现跑马灯。
单片机 跑马灯实验精选全文
可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。
所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。
低电平有效输出:P0.0~P0.7-D0~D7。
LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。
按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。
为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。
主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。
跑马灯C语言程序
跑马灯C语言程序在C语言中,跑马灯(Marquee)是一种在控制台或者命令行界面上实现文本滚动的效果。
跑马灯的实现可以使用循环迭代输出字符串的方案,每次输出完一个字符串后,将其从尾部剪切一个字符,然后再将其插入到字符串的首部。
这样不断循环,就能实现字符的滚动效果。
下面是一个简单的跑马灯程序的示例:```c#include <stdio.h>#include <string.h>#include <ctype.h>#include <unistd.h>#define WIDTH 40 // 控制台窗口宽度#define DELAY 200000 // 滚动速度(微秒)for (i = 0; ; i++) {// 输出字符串的截取部分for (j = i % len; j < WIDTH && j < i % len + len; j++) {putchar(pstr[j % len]);}// 输出空格使得字符串在窗口中滚动for ( ; j < WIDTH; j++) {putchar(' ');}putchar('\r');fflush(stdout); // 刷新输出缓存usleep(DELAY); // 暂停一段时间}return 0;}```程序中使用的usleep(DELAY)函数可以让程序在滚动过程中暂停一段时间,以控制滚动速度。
该函数接受一个以微秒为单位的参数,表示暂停的时间长度,其中1秒=1000000微秒。
在while循环内部,程序首先输出跑马灯字符串的一部分,然后输出一些空格,使得字符串向前滚动。
这里注意,当字符串的尾部超出了窗口的宽度时,需要从字符串的起始位置继续输出,因此要对输出字符的下标取模运算。
另外,程序中使用了Windows控制台的回车(CR)特性,即使用putchar('\r')输出CR字符可以让光标回到本行的开头,然后再输出下一次循环迭代的字符。
跑马灯代码大全
跑马灯代码大全实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示:适当的运用<marquee>标签的参数,可以表现出不同的效果,请看下面的几个例子:1、左右弹来弹去的跑马灯实现的方法就是在IE的标签上稍微多加了几个参数产生了更加丰富的变化。
设置behavior=alternate表示双向移动,direction= left 表示运动方向向左。
marquee的宽度可以使用绝对象素值,例如width=200等这个值限定了跑马灯滚动的范围。
需要说明的是该效果在 Netscape下是看不到的。
源码粘贴框:<marquee width=400 behavior=alternate direction=left align=middle>弹来弹去跑马灯!</marquee>2、跑的很快的跑马灯只要在<marquee>标签后面加上“scrollamount=15”即可,修改=后边的数字参数即可限制文字移动的速度。
3、带有超级链接的跑马灯实现的方法很简单,把整个<marquee></marquee>语句包含在超链接中就行,你看看下面的代码就清楚了。
当然你也可以把包含在<marquee></marquee>中的各条内容分别加上不同的链接,这样的跑马灯就可用来发布滚动新闻或是做站点导航了。
如果你想给跑马灯的文字加上颜色,换用不同的字体(默认是宋体,换体就要加代码),只要在文字前加上<FONT face=楷体_GB2312 color=#ff0000 size=3>就行了,你可在“face=”后边换上你喜欢的字体,在“color=”后边换上你喜欢的字颜色,在“size=”后边换上适合的字号,如果想让字体加粗,就再加上<STRONG>。
LED跑马灯实验
LED跑马灯实验初学者可先动手做下面的实验:发光二极管轮流点亮的实验,也就是通常所说的跑马灯实验,首先让我们来完成必须的硬件部分,我们需要焊接上8个发光二极管和8个限流电阻,可以参考下面的原理图和实物图像进行操作,需要注意的是LED是有极性的,引脚长的为正极,引脚短的为负极,负极和电阻一侧连接,如果接错那么相应的那一路可能在实验中不会点亮了,在焊接前要看仔细哦 D2D7D4D3D1D6D5D8R7R2R3R4R5R6R1R812345678STC89C51RC VCC +5V 下面我们来完成软件编程设计,这里我们没有采用高深的编程技巧,而是用了最笨、最直接的向端口送数的办法来实现,一来程序比较简单,没必要玩深沉,而且初学者看起来直观易懂。
ORG 0000H START:MOV P1,#01111111B;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B;最下面第三个的LED点亮 (以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B;完成第一次循环点亮,延时约0.25秒 AJMP START;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 如何精确计算延时子程序的执行时间? 汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要! ;延时子程序,12M晶振延时约253毫秒 DELAY: MOV R4,#2------执行1个机器周期,耗时1微秒 L3: MOV R2 ,#250---执行1个机器周期,耗时1微秒 L1: MOV R3 ,#251---执行1个机器周期,耗时1微秒 L2: DJNZ R3 ,L2---执行2个机器周期,反复执行251次(2x251)=502微秒) DJNZ R2 ,L1-----执行2个机器周期,反复执行250次(1+502+2)*250=126250微秒) DJNZ R4 ,L3-----执行2个机器周期,反复执行2次 (1+1+502+126250+2)*2=253512微秒) RET delay 加上第一条总共延时1+253512=253513微秒 。
PLC控制——跑马灯
实验题目:跑马灯1、实验目的及要求实验目的:用PLC构成跑马灯系统控制要求:要求通过启动按钮SB1使得8盏灯按照L0、L1~L7的顺序亮,每隔1S亮一盏灯;再按L7、L6~L1、L0的顺序灭,每隔1S灭一盏灯;如此循环,直至按下停止按钮SB2,全部灯熄灭,停止工作。
I/O分配表:输入输出启动按钮I0.0L0Q0.0停止按钮I0.1L1Q0.1L2Q0.2L3Q0.3L4Q0.4L5Q0.5L6Q0.6L7Q0.72、实验环境(使用的软硬件)PC机,博图软件3、实验原理(1)移位指令移位指令包括无符号数移位和有符号数移位。
其中无符号数移位包含字左移指令、字右移指令、双字左移指令和双字右移指令;有符号数移位包含整数右移指令和双整数右移指令。
*无符号数移位指令。
1字左移指令当允许输入EN位为高电平“1”时,将执行字左移指令,将IN端指定的内容送入累加器1低字中,并左移N端指定的位数,然后写入OUT端指定的地址中。
②字右移指令当允许输入EN的状态为“1”时,将执行字右移指令。
(2)顺序控制设计法所谓顺序控制,就是按照生产工艺预先规定的顺序,在各个输入信号作用下根据内部状态和时间的顺序,在生产过程中各个执行机构自动地有秩序的进行操作。
一般使用顺序控制设计法,都要画出顺序功能图,顺序功能图的结构有单序列、选择序列和并行序列。
单序列没有分支与合并,选择序列的分支不能同时激活,而并行序列的分支可以同时激活。
顺序功能图的组成元素:4、方案设计(程序流程图)5、程序代码6、实验结果(PLCSIM仿真结果)1、按下起动按钮,跑马灯按照顺序点亮;……………………………………………………经过一段时间全部点亮然后跑马灯按照顺序熄灭……………………………………………………经过一段时间全部熄灭然后又重新按照顺序循环点亮:2、按下停止按钮,系统停止运行:7、实验总结1.通过使用顺序功能图可以找出程序的主体流程,实现主体功能,并利用一些程序来帮助完成所有功能;2.通过本次实验,我熟练使用移位功能。
51单片机走马灯实验报告
微机原理及单片机应用实验实验报告实验跑马灯一、实验内容开关控制输出方式,共四种,开关拨到k1时奇数灯亮,开关拨到k2时偶数灯亮,开关k3时奇数偶数灯轮流亮,开关拨到k4时从左到右依次亮,开关拨到k5时从右到左依次亮。
二、实验步骤①依次L1-L8接入P1.0-P1,7,将P3接入高低电平开关②编程③实现三、实验原理图四.实验程序清单ORG 0000HPX00: MOV P1,#0FFH KEY : MOV A,#0FEHPO00: JB P3.0,PO01JNB P3.0,PO02PO01: MOV A,#055HMOV P1,ALJMP PO00PO02: JB P3.1,PO03JNB P3.1,PO04PO03: MOV A,#0AAHMOV P1,ALJMP PO00PO04: JB P3.2,PO05JNB P3.2,PO06PO05:MOV A,#0FEHK1:MOV P1,AJNB P3.2,LASTAJMP W1W1:RL ASJMP K1C1:MOV R6,#0A0HMOV R7,#0FFHK2:MOV R7,#0FFHK3:DJNZ R7,K3DJNZ R6,K2LJMP W1PO06:JB P3.3,PO07JNB P3.3,PO08PO07:MOV A,#7FHK4:MOV P1,AJNB P3.3, LASTAJMP W2W2: RR ASJMP K4C2: MOV R6,#0A0HMOV R7,#0FFHK5:MOV R7,#0FFHK6:DJNZ R7,K6DJNZ R6,K5LJMP W2PO08:JB P3.4,PO09JNB P3.4,LASTPO09:MOV A,#55HMOV P1,AMOV R6,#0A0HMOV R7,#0FFHK7:MOV R7,#0FFHK8:DJNZ R7,K8DJNZ R6,K7MOV A,#0AAHMOV P1,AMOV R6,#0A0HMOV R7 ,#0FFHK9:MOV R7,#0FFHK10:DJNZ R7,K10DJNZ R6,K9LJMP PO08LAST:MOV P1,#0FFHLJMP PO00END五、实验总结参考8255交通灯实验,加上延时程序以及查询式的跳转方法实现跑马灯。
PIC学习笔记之跑马灯
与PIC单片机的结缘是基于工作之需要,之前未有过相关接触,初接触PIC 单片机的时候,想要在网上搜集相关资料,但觉以汇编编程且具有Proteus仿真的教程资料甚少,遂决定将自己在学习的过程中做的一些成功的仿真案例记下来,虽然不甚精,但于初学者作为参考或还可以吧!因只是相关案例,未涉及相关PIC单片机的资料知识,若有需要请在网上搜索。
实验环境:Proteus编程语言:汇编编程环境:MPLAB单片机:PIC16F877晶振:20MHzProteus仿真电路如图。
跑马灯显示实验端口数据如下表LIST P=16F877INCLUDE P16F877.INCDELAYDATA0 EQU 20H DELAYDATA1 EQU 21H DELAYDATA2 EQU 22H PMD EQU 23HORG 0000HGOTO MAIN DELAY20MS: MOVLW D'250'MOVWF DELAYDATA0 DELAY1 NOPNOPNOPNOPNOPNOPNOPNOPMOVLW D'250'MOVWF D ELAYDATA1 DELAY2 DECFSZ DELAYDATA1GOTO DELAY2DECFSZ DELAYDATA0GOTO DELAY1RETLW 0 DECODE ADDWF PCLRETLW H'00'RETLW H'01'RETLW H'03'RETLW H'07'RETLW H'0F'RETLW H'1F'RETLW H'3F'RETLW H'7F'RETLW H'0FF'RETLW H'0FE'RETLW H'0FC'RETLW H'0F8'RETLW H'0F0'RETLW H'0E0'RETLW H'0C0'RETLW H'80'MAIN:BANKSEL TRISBCLRF TRISBCLRF STATUSLOOP MOVLW D'15'MOVWF P MD LOOP1 MOVF PMD,0CALL DECODEMOVWF PORTBCALL DELAY20MSCALL DELAY20MSDECFSZ PMDGOTO LOOP1GOTO LOOPNOPEND。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
PORTB=PORTA;
}
}
方法2:DIP开关低四位由A口低四位输入,经A口高四位送LED灯低四位输出
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
for(j=0;j<10000;) j++;
}
void main(void)
{
unsigned char i,settime;
unsigned int j;
DDRB=0xFF;
PORTB=0x7F;
DDRA=0xF0;
flag=0;
asm ANDCC #$BF
EnableInterrupts;
i=0;
PORTB|=0x80;
if(PORTB==0xFF)
PORTB=0x7F;
}
}
void interrupt 6 IRQ(void)
{
flag=1;
}
**************************************************************************************************************************************************************
#include "derivative.h" /* derivative-specific definitions */
unsigned char flag;
void delay(unsigned int countert)
{
unsigned int i,j;
for(i=0;i<countert;i++)
DDRB=0xFF;
PORTB=0x7F;
DDRA=0xF0;
PORTA=PORTA|0x80;
flag=0;
asm ANDCC #$BF
EnableInterrupts;
i=0;
j=10;
m=2;
n=4;;
for(;;)
{
if(flag==1)
{
flag=0;
settime=PORTA&0x7f;
二、将PORTA口接8位DIP开关,在PORTB口的小灯上显示其状态。
方法1:DIP开关由A口输入,B口显示
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
unsigned char flag;
const unsigned char patten[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
void delay(unsigned int countert)
{
unsigned int i,j;
for(i=0;i<countert;i++)
j=settime*10;
PORTA=PORTA&0x7f;
}
delay(j);
i++;
PORTB = ~patten[i%8];
void interrupt 6 IRQ(void)
{
flag=1;
}
个人理解的程序。实现功能为:在不按IRQ的时候显示的为所有灯都亮。每按动一下IRQ跑马灯就跑一次。
#include <hidef.h> /* common defines and macros */
三、利用IRQ作为中断源,采用中断方式,按动IRQ键后显示跑马灯。
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specif
unsigned char flag;
const unsigned char patten[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0xቤተ መጻሕፍቲ ባይዱ1};
PORTB=0x7F;
i=0;
j=10;
for(;;)
{
delay(j);
i++;
PORTB = ~patten[i%8];
}
}
方法2:移位
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
*******************************************************************************七、自己设计一种小灯的显示方式。(小灯的显示方式、开关与LED灯的对应关系、中断源的控制方式)
const unsigned char patten[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};//表格应该是没用
void delay(unsigned int countert)
{
unsigned int i,j;
for(i=0;i<countert;i++)
j=10;
for(;;)
{
if(flag==1)
{
flag=0;
settime=PORTA;
j=settime*10;
}
delay(j);
PORTA=PORTA<<4;
}
}
void interrupt 5 XIRQ(void)
{
flag=1;
}
*******************************************************************************
五、利用XIRQ作为中断源,采用中断方式,利用8位DIP开关控制跑马灯的循环速度。
方法同四,只是中断函数不同:
Void interrupt 5 XIRQ(void)
{
flag=1;
}
**************************************************************************************************************************************************************
六、将PORTA口低4位接DIP开关,高4位接LED,将开关的状态显示在LED灯上,重复五
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
void delay(unsigned int countert)
{
unsigned int i,j;
for(i=0;i<countert;i++)
for(j=0;j<10000;) j++;
}
void main(void)
{
unsigned char i;
unsigned int j;
DDRB=0xFF;
PORTB>>=1;
PORTB|=0x80;
if(PORTB==0xFF)PORTB=0x7F;
}
delay(j);
}
}
void interrupt 6 IRQ(void)
{
flag=1;
}
**************************************************************************************************************************************************************
unsigned int j;
DDRB=0xFF;
PORTB=0x7F;
DDRA=0xF0;
flag=0;
asm ANDCC #$BF
EnableInterrupts;
for(;;)
{
if(flag==1)
{
flag=0;
settime=PORTA;
j=settime*10;
}
delay(j);
PORTB>>=1;
for(j=0;j<10000;) j++;
}
void main(void)
{
unsigned char i;
unsigned int j;