C语言笔记-基于C语言实现的流水跑马灯

今天,偶忽然想起大二时学跑马灯,当时一个个敲代码最后运行出来跑马灯的状态,我现在都还记得,把代码运行到实体上最后呈现的效果真是令人愉悦,话不多说,下面我将就跑马灯制作流程给大家分享一下。

1.题目:

跑马灯

(1)基本要求

采用8254精确定时,LED的点亮规律为LED8-LED1,每一个LED的点亮时间间隔由逻辑电平开关K1、K2与K3选择。K1的时间间隔为0.5S,K2的时间间隔为1.0S,K3的时间间隔为1.5S。当主机键盘按下任意键时停止演示。

(2)设计提示

立即学习“C语言免费学习笔记(深入)”;

采用8255的A口接LED灯,B口接逻辑电平开关K1、K2与K3。在8254的中断服务程序中完成对灯的控制,主程序检测开关的变化,改变点亮LED灯的时间间隔。

(3)进一步设计要求

LED的点亮规律变为LED8-LED1-LED8


2.分析:

基本原理设计

步骤一:8255采用B口工作在方式0,进行输入,获取开关(注:为了便于进行课设操作,我们采用了K2,K1,K0以此来取代K3,K2,K1,实现的要求完全一致)K2K1K0的值,这里会有三个值,分别是二进制编码的100,010,001,即十进制的4,2,1,分别对应LED灯点亮的时间间隔1.5s,1.0s,0.5s。

步骤二:8254采用工作方式三,产生一个固定频率的方波,去不断触发中断服务程序。在主程序中,获取8255的B口输入值,根据输入值给8254的计数器1写入对应的初始值,在OUT1端就能得到一个固定频率的方波信号,这里我们连接了一个K7所对应的灯,以此来进行验证方波的产生以及通过灯闪烁的频率可以大致判断方波的频率,来对应时间间隔1.5s,1.0s,0.5s。

步骤三:8254产生的方波信号输出,连接到中断接口IR10,用来利用方波信号的频率按照一定的时间间隔来出发中断服务程序。

步骤四:中断服务程序按照8254的方波频率,在一定的时间间隔内被加载执行。在中断服务程序中实现对8255的A口输出的改变,来控制LED7-LED0的闪烁变化,即实现跑马灯。


3.代码实现:

//******************************************************************************************************************/*实验接线:8254:片选信号CS接Y0;GATE0、GATE1级联接+5V;CLK0接1MHz;CLK1接OUT0;OUT1接k5(进行8254的方波显示);8255:片选信号CS接Y1;A口作为输出用排线接LED灯;PB0、PB1、PB2作为输入分别接K0、K1、K2;中断:IR10接OUT1(中断控制程序控制LED灯的闪烁变化);*///******************************************************************************************************************//8255模块的设置void  init(void);//初始化voidISR(void);int i=0,j=0;const unsigned shortPort8255Base = 0x288;  const unsigned char    ControlWord8255 = 0x82;void init8255(void);// 8255初始化//******************************************************************************************************************//关于8254模块的设置//通道0: 控制字00110110 -> 36H,即0x36,CLK0=1MHz,OUT0=0.01s,初值=F(clk)*T(out) 初始值:COUNT0=10000//通道1: 控制字01110110 -> 76H,即0x76,CLK1=OUT0,初值=T1(out)/T1(clk)//当OUT1=0.5s,k3=0,k2=0,k0=1,1 初始值:COUNT1=50//当OUT1=1.0s,k3=0,k2=1,k0=0,2 初始值:COUNT1=100//当OUT1=1.5s,k3=1,k2=0,k0=0,4 初始值:COUNT1=150voidinit8254(void);// 8254初始化const unsigned shortPort8254Base = 0x280,   //计数器1端口地址为p8254Base+1,端口地址为p8254Base+3.counter0=10000;const unsigned charControlWord8254ch0 = 0x36, ControlWord8254ch1 = 0x76;unsigned short  counter1=100;//计数器初值byte   pData; unsigned char pdata=0x80;bool flag=true;//******************************************************************************************************************//主函数void main(){        init();  init8254();// 8254初始化  init8255();//8255初始化  printf("\n start...\n");  while (!_kbhit())  {PortReadByte(Port8255Base + 1, &pData);//写入计数器1的初始值if(pData==1){//k0为1的情况,k2k1k0=001,即时间间隔为0.5秒counter1=50;PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位printf("=switch state:%x  LED灯点亮间隔0.5秒=\n",pData);}if(pData==2){//k1为1的情况,k2k1k0=010,即时间间隔为1.0秒counter1=100;PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位printf("=switch state:%x  LED灯点亮间隔1.0秒=\n",pData);}if(pData==4){//k2为1的情况,k2k1k0=100,即时间间隔为1.5秒counter1=150;PortWriteByte(Port8254Base+1 , counter1%256); // 写计数器1计数初值低8位PortWriteByte(Port8254Base+1 , counter1/256); // 写计数器1计数初值高8位printf("=switch state:%x  LED灯点亮间隔1.5秒=\n",pData);     }   sleep(3000);// delay 1s  EnableIntr(); // 开中断,功能等效于汇编语言指令sti  RegisterLocalISREx(ISR,10); // 加载中断服务程  printf("Wait for the switch state change...\n\n");          }  _getch();   printf("\n Press any key over...\n");       //DisableIntr(); // 开中断,功能等效于汇编语言指令cli   Cleanup();}//中断服务程序,实现跑马灯的流水voidISR(void) {     if(flag) {_asm{ ror  pdata,1  //循环右移指令 } } else {_asm{rol  pdata,1  //循环左移指令} }j++;if(j==7){flag = false;}if(j==14){flag = true;j=0;} PortWriteByte(Port8255Base,pdata); }//机箱的初始化void  init(void){     if(!Startup())// 加载实验平台I/O驱动程序   {  printf("\n\n        ERROR: Open Device Error!请打开实验箱电源\n");   _getch();  exit(0); // return to Windows   }  }//8254初始化voidinit8254(void) {PortWriteByte(Port8254Base + 3, ControlWord8254ch0); // 写计数器0控制字PortWriteByte(Port8254Base + 3, ControlWord8254ch1); // 写计数器1控制字PortWriteByte(Port8254Base , counter0%256); // 写计数器0计数初值低8位PortWriteByte(Port8254Base , counter0/256); // 写计数器0计数初值高8位 }//8255初始化voidinit8255(void){    PortWriteByte(Port8255Base + 3, ControlWord8255); // 写8255控制字  PortWriteByte(Port8255Base,pdata);}

【推荐课程:C视频教程】

以上就是C语言笔记-基于C语言实现的流水跑马灯的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1433075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 08:53:18
下一篇 2025年12月17日 08:53:29

相关推荐

  • C/C++函数如何返回多个值?(代码示例)

    有时我们需要从通过一个函数返回多个值,不幸的是c++/c ++不允许这样做;但我们可以通过一些巧妙的方法来达到这种效果。下面本篇文章就来给大家介绍c/c++从函数中返回多个值的方法,希望对大家有所帮助。【视频教程推荐:c语言教程、c++教程】 方法一:通过使用指针: 在函数调用时,传递带有地址的参数…

    2025年12月17日 好文分享
    000
  • C++中如何避免内存泄漏?

    内存泄漏会造成系统内存的浪费,严重会导致系统崩溃等后果。那么如何避免内存泄漏?下面本篇文章就来给大家介绍一些c++++中的内存泄漏,了解如何避免内存泄漏,希望对大家有所帮助。【视频教程推荐:c++教程】 内存泄漏 内存泄漏是指因为某些原因(疏忽或错误)导致程序中己动态分配的内存未能释放或无法释放的情…

    2025年12月17日
    000
  • 在C++中对象如何作为参数传递和返回?(代码示例)

    在c++++中,我们可以将类的对象作为参数传递,还可以像传递和返回其他变量一样从函数中返回它们;且不需要特殊的关键字或头文件。下面本篇文章就来带大家了解一下,希望对大家有所帮助。 1、将对象作为参数传递 要将对象作为参数传递,我们将对象名作为参数写入,同时调用函数,方法与对其他变量执行是相同的。 基…

    2025年12月17日
    000
  • Perl和C++的区别是什么?Perl和C++的简单比较

    perl和c++++都是一种通用编程语言,那么它们之间有什么区别?下面本篇文章就来带大家简单比较一下perl和c++,了解perl和c++之间的区别,希望对大家有所帮助。 什么是Perl? Perl是一种通用的高级解释和动态编程语言。Perl最初是为文本处理开发的,例如从指定的文本文件中提取所需信息…

    2025年12月17日
    000
  • C#是什么,能做些什么?

    C#是由C和C++衍生出来的一种安全的、稳定的、简单的、优雅的面向对象编程语言,它专为公共语言基础结构所设计,提供了大量的功能支持与接入使得功能开发更加简单,我们可以使用C#语言来开发软件或者是网站。 C#语言是由微软公司发布的一种面向对象且运行在.NET Framework和.NET Core上的…

    2025年12月17日
    000
  • C#中常用的运算符有哪些

    c#中常用的运算符有:条件运算符,as运算符用于强制转换,is运算符判断变量是否是特定类型,typeof 运算符返回calss类型以及sizeof 运算符返回栈中值类型所需的长度 C#语言中提供了许多运算符,这些运算符可以帮助我们在表达式中进行数学,索引或者是函数调用等运算,接下来将在文章中为大家详…

    2025年12月17日
    000
  • C中scanf()和gets()之间的区别(代码示例)

    scanf()函数 它用于从标准输入(键盘)读取输入(字符,字符串,数字数据)。 它用于读取输入,直到遇到空格,换行符或文件结束(EOF)。 例如,请参阅以下代码: #include int main() { char str[20]; printf(“enter somethingn”); sca…

    2025年12月17日
    000
  • C++中动态内存分配与命名空间介绍

    本篇文章给大家带来的内容是介绍c++++中的动态内存分配与命名空间,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、C++中的动态内存分配  ● 通过new关键字进行动态内存申请  ● C++中的动态内存申请时基于类型进行的  ● delete关键用于内存释放 C语言其实是不支持…

    好文分享 2025年12月17日
    000
  • .net和c#有什么区别

    有的人可能会认为.net和c#之间没有太大的区别,但是实际上它们是两个并不相同,本篇文章我们就来给大家介绍一下关于.net和c#之间的区别。 什么是.net? .NET是微软公司下的一个开发平台,.NET核心就是.NET Framwork(.NET框架)是.NET程序开发和运行的环境,在这个平台下可…

    2025年12月17日
    000
  • C#与.net有什么关系

    .net与c#的关系有c#是一种针对与.net编写的编程语言,与c++的语法十分相似。而.net是一个开发框架,而且.net中存在的特性c#不一定存在。 经常会有人将.net与C#混淆,认为它们是一样的,其实他们还是有一定的区别的。.net是一个抽象的平台概念而C#是一种编程语言。接下来在文章中将具…

    2025年12月17日
    000
  • 在C,C ++和C#中的Int是什么

    int,“integer”的缩写,是编译器内置的基本变量类型,用于定义包含整数的数字变量。其他数据类型包括  float  和  double。 C,C ++,C#和许多其他编程语言将int识别为数据类型。  在C ++中,以下是如何声明整数变量: int a = 7; Int的局限性 只有整数可以…

    2025年12月17日
    000
  • C#中复制构造函数是什么

    通过从另一个对象复制变量或将一个对象的数据复制到另一个对象来创建对象的构造函数称为复制构造函数。下面我们来简单了解一下,希望对大家有所帮助。 复制构造函数是一个参数化构造函数,包含相同类类型的参数。它的主要用途是将新实例初始化为现有实例的值。通常,C#不提供对象的复制构造函数,但是如果要在程序中创建…

    2025年12月17日
    000
  • 什么是C#中的多态性?

    多态性是一种概念,其中方法可以定义不止一次。但每次,函数都会传递一组不同的参数,下面我们来通过一个案例来讲解一下什么是C#中的多态性。【推荐阅读:什么是C#中的继承?】 步骤1)第一步是更改Tutorial类的代码,在此步骤中,我们将以下代码添加到Tutorial.cs文件中。 代码说明: 1.第一…

    2025年12月17日
    000
  • C#中的数据类型是什么?C#中的四种数据类型解释

    C#语言带有一组基本数据类型。这些数据类型用于构建应用程序中使用的值。我们来探索C#中可用的基本数据类型。对于每个示例,我们将仅修改Program.cs文件中的main函数。【推荐阅读:C#视频教程】 1.整数 Integer数据类型用于处理数字。在这种情况下,数字是整数,如10,20或30.在C#…

    2025年12月17日 好文分享
    000
  • c#是什么?有什么用?

    c#是什么?有什么用?本篇文章就给大家介绍c#的功能,让大家了解c#程序结构,c#的简单使用。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 c#的简单介绍: C#是一种现代通用的面向对象编程语言,由Microsoft开发并经欧洲计算机制造商协会(ECMA)和国际标准组织(ISO)…

    2025年12月17日
    000
  • C#与.net框架之间的关系是什么?C#程序的开发工具

    c#与.net框架之间的关系是什么?本篇文章就给大家介绍c#与.net框架之间的关系,让大家了解适合c#开发的工具有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 C#与.net框架之间的关系是什么? C#是.Net框架的一部分,可以用于编写.Net应用程序。我们来了解一下.…

    好文分享 2025年12月17日
    000
  • c#如何使用?c#的基本语法

    c#如何使用?本篇文章就给大家介绍c#的基本语法,通过简单的示例来介绍c#的使用。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 通过之前的文章【c#是什么?有什么用?】,我们知道C#是一种面向对象的编程语言。 在面向对象的编程方法中,程序是由各种对象组成的,这些对象在通过操作相互…

    2025年12月17日
    000
  • C++是什么

    c++kquote>C++是一种中级语言,它是由Bjarne Stroustrup于1979 年在贝尔实验室开始设计开发的;C++进一步扩充和完善了C语言,是一种面向对象的程序设计语言。 本文操作环境:Windows7系统、Dell G3电脑、C++版。 现如今,C++是比较火热的编程语言,但…

    2025年12月17日
    000
  • C#和C ++的区别是什么

    C#和C++的区别是:1、C#代码首先会被编译为CLR,然后由.NET框架解析,它是在虚拟机上执行,会自动进行内存管理,不支持使用指针;2、C++将会直接被编译为机器代码,允许使用指针,需要手动组织管理内存。 C#和C ++都是一种编程语言,它们都具有C语言的一些功能;那么它们之间有什么区别?本篇文…

    2025年12月17日
    000
  • c#之解决百度地图api APP SN校验失败问题(代码实例)

    本篇文章给大家介绍在使用c#调用百度地图api时遇到的sn校验失败问题的解决方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所助。 在使用c#调用百度地图Web服务api遇到的签名(sn校验)问题,在此记录一下,(ip白名单校验的请忽略) 1.首先获取ak与sk,这个两个东西可以从控制…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信