本日,偶遽然想起大二时学跑马灯,当时一个个敲代码末了运转出来跑马灯的状况,我如今都还记得,把代码运转到实体上末了显现的结果真是使人愉悦,话不多说,下面我迁就跑马灯制造流程给人人分享一下。
1.问题:
跑马灯
(1)基本请求
采纳8254准确定时,LED的点亮规律为LED8-LED1,每个LED的点亮时候距离由逻辑电平开关K1、K2与K3挑选。K1的时候距离为0.5S,K2的时候距离为1.0S,K3的时候距离为1.5S。当主机键盘按下任意键时住手演示。
(2)设想提醒
采纳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);//初始化 void ISR(void); int i=0,j=0; const unsigned short Port8255Base = 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=150 void init8254(void);// 8254初始化 const unsigned short Port8254Base = 0x280, //计数器1端口地址为p8254Base+1,端口地址为p8254Base+3. counter0=10000; const unsigned char ControlWord8254ch0 = 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(); } //中断效劳顺序,完成跑马灯的流水 void ISR(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初始化 void init8254(void) { PortWriteByte(Port8254Base + 3, ControlWord8254ch0); // 写计数器0掌握字 PortWriteByte(Port8254Base + 3, ControlWord8254ch1); // 写计数器1掌握字 PortWriteByte(Port8254Base , counter0%256); // 写计数器0计数初值低8位 PortWriteByte(Port8254Base , counter0/256); // 写计数器0计数初值高8位 } //8255初始化 void init8255(void) { PortWriteByte(Port8255Base + 3, ControlWord8255); // 写8255掌握字 PortWriteByte(Port8255Base,pdata); }
【引荐课程:C视频教程】
以上就是C言语笔记-基于C言语完成的流水跑马灯的细致内容,更多请关注ki4网别的相干文章!