已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京邮电大学基于单片机的电子琴和音乐播放器设计实验报告 学院:信息与通信工程学院指导老师:葛顺明摘要电子琴是现代电子科技与音乐结合的产物,是一种新型的键盘乐器。它在现代音乐扮演着重要的角色,单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本文的主要内容设计为一个基于PIC32MX795F512L单片机的电子琴与音乐播放器,利用单片机上的按键来选择相应功能,利用键盘按键来选择弹奏某一音调或播放某首曲子。能够实时将数据传至液晶屏显示。根据单片机的工作原理,通过硬件电路制作和软件编译,设计出一个能够自由弹奏乐曲及流畅播放内置音乐的电子琴与音乐播放器。该系统主要由液晶显示模块、键盘模块、喇叭模块组成。设计利用MPLAB软件对源程序进行编译和调试。关键词: PIC32MX795F512L单片机,模块一 实验目的1.通过学习使用单片机PIC32,使学生增进对单片机的感性认识,加深对单片机理论方面的理解。2.使学生掌握单片机的内部功能模块的功能和应用,如定时器/计数器、中断、I/O口等。3使学生理解和掌握单片机应用系统的软件硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。二 实验分工本次实验我的队友主要负责的部分是XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX过程期间出现的问题是由我们两个人共同查阅资料完成的,整体合作协调很好,完成的较为顺利。三功能简介1.设计一个电子琴。所能实现的功能如下:(1).能够实现舒适化菜单,由按键选择菜单中的两个功能:播放乐曲和弹奏乐曲,并实现其功能;(2).播放乐曲:又初始化菜单选择进入,进入后屏幕提示”SONGPLAYING”,同时事先在程序中存入了8首不同的乐曲,可以一次通过键盘的按键来选择播放各首乐曲。在播放曲目中设置了暂停键,按下即暂停,不按下则继续播放循环播放。(3).自行弹奏:设计键盘上的13个键能够发出低音部5,6,7,中音部1,2,3,4,5,6,7,高音部1,2,3总共14个音,要求按下按键发声,松开延时一段时间停止,中间再换按其他键则发另一音调的声音。(4).走马灯:设计了4个蓝光走马灯配合播放音乐和演奏时闪烁。2当系统扫描到有键被按下,则快速检测出是哪一个键被按下,然后单片机的定时器被启动,发出一定频率的脉冲,该频率的脉冲输入到蜂鸣器后,就会发出相应的音调如果在前一个按下的键发声的同时另一个键被按下,则启动中断系统,前面键的发音停止,转到后按的发音程序,发出后按的键的音调。 四实验原理4.1 音频脉冲的产生一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。若要产生音频脉冲,只要算出某一音频的周期(1/频率),再将此周期除以2,即为半周期的时间。利用定时器计时半周期时间,每当计时终止后就将相应的端口反相,然后重复计时再反相。就可在各对应的引脚上得到此频率的脉冲。我们小组利用PIC32MX795F512L的80M主频,运用delay函数,改变delay的时间以产生不同频率的方法产生不同音阶。由于主频较高,没有一个音符的频率可以参考,于是我们小组是利用自己的乐理知识将每个音校正。 每个音与delay时间对应如下表所示:音符Delay音符Delay中音Do8876高音Re2446中音Re7476高音Mi1936中音Mi6456高音Fa1666中音Fa5886高音So1186中音So5036高音La766中音La4036高音Xi376中音Xi3236高音Do186高音Do30064.2音乐节拍的产生每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表1-2为节拍与节拍码的对照表。如果1拍为0.4s,1/4拍是0.1s,只要设定延时时间就可求得节拍的时间。假设1/4拍为1DELAY,那么1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY,其余的节拍就是它的倍数,表1-3为1/4和1/8拍的时间设定。本小组的节拍是由while函数实现的,在每个节拍delay的时间中播放对应的音符,1/8为1,1/4为2,以此类推。而while循环的时间为节拍*310,这是我们经过反复试验确定的最佳的节拍延时。五方案设计5.1硬件设计输出模块:LCD RT1602C5.1.1电路设计框图PIC32MX795F512L芯片输出模块:喇叭输入模块:4*4键盘输出模块:走马灯5.1.2 硬件概述本电路是由PIC32MX795F512L单片机为控制核心,具有键盘输入、液晶显示屏输出和三极管驱动的喇叭构成的简易电子琴电路。1.单片机PIC32MX795F512L型号单片机具有USB、CAN 和以太网的高性能32 位闪存,其所拥有的主要资源有: 80MHz的主频,1.56DMIPS/MHz,总线32位; USB 2.0 接口; 2个带1024缓存的CAN 2.0接口; 8通道DMA通道; 5级流水线,哈佛架构; 1个以太网接口; 512K的Flash,外加12k的启动Flash; 128K的RAM; 可编程中断向量控制器; 16个10位AD转换器; UART/SPI/IIC等串行通信方式; 带JTAG调试口,具有休眠功能,节省能耗。2.输入模块(键盘)一个简易的电子琴需要键盘15个按键,选择用4*4行列式键盘完成输入。4*4行列式键盘又称为矩阵键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是44个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。而键盘应具有以下几个基本功能:(1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。抖动的持续时间与键的质量相关,一般为520mm。所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。去抖问题可通过软件延时或硬件电路解决。(2)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。常用的方法有行扫描法和线反转法两种。行扫描法的基本思想是,由程序对键盘逐行扫描,通过检测到的列输出状态来确定闭合键,为此,需要设置入口、输出口一个,该方法在微机系统中被广泛使用。本实验采用扫描法。(3)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。RE0RG14RG1RD3RE1 RD4 RE3 RE23.输出模块(显示屏)采用型号为RT1602C的液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字、图形,显示多样,清晰可见, 与传统的阴极射线管相比,液晶显示屏具有占用空间小、低功耗、低辐射、无闪烁、降低视觉疲劳等优点。字符型液晶屏是一种用5*7点阵图形来显示字符的液晶显示器,根据显示的容量可以分为1行16个字、2行16个字、2行20个字等,最常用的为2行16个字。型号为RT1602C的液晶显示屏就是2行16个字。它有16个管脚,分别有电源地、电源正、偏压信号、读写控制、使能控制、I/O接口、背光控制等功能。它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。VO为显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高。为了简化电路以及获得最好的显示效果,将VO端口直接接地。R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。GND接电源,VDD接正电源。RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。源代码中write_cmd函数为向LCD写入指令的函数,因此会有RS=0;write_date函数为向LCD写入数据的函数,因此会有RS=1。E端为使能端,当E端由高电平跳变成低电平,也就是下降沿时,LCD模块进行命令执行。BL1和BL2为设置LCD背光,分别接了电源与地。DOD7八个为数据I/O口,按照表格内的接法相连。脚号符号引脚功能以及接法脚号符号引脚功能以及接法1GND电源地9D2RF132VDD电源正10D3RB123V0显示偏压信号11D4RB134RS数据/命令控制 RA712D5RB145R/W读/写控制 RA613D6RB86E使能信号 RF414D7 RB97D0数据I/O RF515BL1背光源正8D1RF1216BL2背光源负4.输出模块(喇叭)将一固定端口通过三极管PNP放大再连接喇叭构成我们的输出音频模块。喇叭一端接电源一端接发射极,当有方波送入时,喇叭便发出相应频率的响声。5.输出模块(走马灯)将四个发光二极管与四个端口相连,另外一端通过小电阻接地,通过控制四个端口依次为高电平使得四个灯依次点亮,实现走马灯的效果。5.2 软件设计5.2.1程序流程图开始判断LCD按键SW3SW1播放功能弹奏功能键盘扫描键盘扫描根据按键值在相应数组中寻找对应键值的音符频率根据按键值含有七首曲子的二维数组中寻找对应键值的曲目相应曲目节拍与音调通过同一参数一一对应喇叭播放对应音符喇叭播放相应曲子结束5.2.2 各模块具体软件实现1.键盘模块运用行扫描的方式来判断是否有键按下及按下的是哪一键。首先令行都为输出并置为零,列为输入且都为高电位,则只要有一列为低就是有键按下。再依次令每一行为低电平其他行为高电平,检查每一列是否为低电平,行和列均为低电平所对应的交汇处即为按键按下的地方。#include KEYBOARD.h/时延函数void delay(uint ms)uint x,y;for(x=ms;x0;x-)for(y=10;y0;y-);uchar keyboard() /判断按下哪一键while(1)delay(100); /将R行全部设置为输出为低电平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /将C列全部设置为输入为高电平1PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 );PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 );delay(1);/第一列R0=0;R1=1;R2=1;R3=1; /第一行if(C0=0) /第一列delay(10);if(C0=0) return 1; if(C1=0)delay(10);if(C1=0) return 2;if(C2=0)delay(10);if(C2=0) return 3;if(C3=0)delay(10);if(C3=0) return 4;/第二列R0=1;R1=0;R2=1;R3=1;if(C0=0)delay(10);if(C0=0)return 5;if(C1=0)delay(10);if(C1=0) return 6;if(C2=0)delay(10);if(C2=0) return 7;if(C3=0)delay(10);if(C3=0) return 8;/第三列R0=1;R1=1;R2=0;R3=1;if(C0=0)delay(10);if(C0=0) return 9;if(C1=0)delay(10);if(C1=0) return 10;if(C2=0)delay(10);if(C2=0) return 11;if(C3=0)delay(10);if(C3=0) return 12;/第四列R0=1;R1=1;R2=1;R3=0;if(C0=0)delay(10);if(C0=0)return 13;if(C1=0)delay(10);if(C1=0) return 14;if(C2=0)delay(10);if(C2=0)return 15;if(C3=0)delay(10);if(C3=0) return 16;uchar presskey() /判断是否有键按下delay(100); /将R行全部设置为输出为低电平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /将C列全部设置为输入为高电平1PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 ); PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 ); delay(1); R0=0;R1=0;R2=0;R3=0; if(C0=0)delay(10);if(C0=0)return 1;if(C1=0)delay(10);if(C1=0) return 1 ;if(C2=0)delay(10);if(C2=0)return 1;if(C3=0)delay(10);if(C3=0) return 1; return 0;2.LCD模块(本模块为组员xx主要编写,此处不再叙述)3.喇叭播放模块通过将不同频率的方波输送到喇叭的端口来使其发出声音。在弹奏时,若一直按着按键,就会一直发出相应键值的音调。在播放音乐时,首先通过键盘选择一首乐曲,通过同一参数将节拍和音调结合,在第一个音调的节拍长度中播放第一个音,直到节拍结束,令Tone_Index加1,继续下一个音的相应节拍中的发声,以此类推,直到播完一首曲子。同时我们还通过设置中断实现了暂停的功能,只要按下单片机上的SW2,就可以暂停音乐的播放。while(1) if(FY=0) / 若没有松开按键,则等待,等待期间弹奏该音符 while ( presskey()=1) k= keyboard(); uint x=tabk; d(x); SPK=!SPK; if (h=499) h=1; run (h); h+; else k= keyboard(); while (1) if (SongkTone_Index=-1) Tone_Index=0; uint ms=310*LenkTone_Index; while(ms-) int x=2600+tabSongkTone_Index; d(x); SPK=!SPK; if (h=499) h=1; run (h); h+; ; Tone_Index+; d(); void _ISR(_CHANGE_NOTICE_VECTOR, ipl2) ChangeNotice_Handler(void) /读取D端口的bit7的数据,放到全局变量dummy缓存中 dummy = PORTReadBits(IOPORT_D, BIT_7); /清空中断标志位,目的是使其能产商第二次中断 mCNClearIntFlag(); /按钮按着则灯一直亮 if(dummy = BIT_7) /D端口的bit1位清0,即LED2灯灭 PORTClearBits(IOPORT_D, BIT_1); / turn off LED2 LCD_Initialize(); /初始化LCD LCD_ShowString(0,0,2.SONGS PLAY); else /D端口的bit1位置1,即LED2灯亮 PORTSetBits(IOPORT_D, BIT_1); / turn on LED2 while( PORTReadBits(IOPORT_D, BIT_7)=0) LCD_Initialize(); /初始化LCD LCD_ShowString(0,0,PAUSE); d(); 4.走马灯模块通过控制四个端口依次为高电平使得四个灯依次点亮,实现走马灯的效果。由于系统主频较快,因此每一个灯亮的时间为100个系统周期,这样才能看清依次的变化。#include lighting.h#define uchar unsigned charvoid run (int h) PORTSetPinsDigitalOut(IOPORT_A, BIT_10 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_4 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_5 ); PORTSetPinsDigitalOut(IOPORT_G, BIT_13 ); if(h0)&(h99)&(h199)&(h299)&(h500) L1=0;L2=0;L3=0;L4=1; ;六实验问题及心得体会6.1出现的问题1.定时器小学期的前五天我和我的队友四处搜集关于PIC单片机的资料,综合老师课上提供的数据手册使用说明,得知单片机有五个定时器,按理说依照说明在我们发声的部分正确书写代码就可以提供出我们相应音色的频率,并且我们发出声音的模块想要频率为1MHz的定时器来完成,这样无论从计数的计算上还是程序的编写上都十分方便,但是在读说明书和函数说明中出现了很多问题,很多地方不很清晰,英文版说明也给阅读带来了一定的障碍,经过三番五次向老师询问,写出的代码编译时总是不能完好通过,所以最终无奈之下我们放弃了这一方法,仅仅使用延时函数及自己的乐理知识来校准的每一个音,增加了不少工作量,而没有好好运用定时器也是这次小学期试验的一个遗憾,在以后的学习中一定会加深认识定时器并尽量学会应用。2.显示屏的调试显示屏的调试是我们班整体遇到的最大的问题,直到验收前一天显示屏还没有达到很好的效果。刚开始拿到硬件连接之后,我们的显示屏连背光都没有亮,经检查连接无误后想可能是显示屏本身出了问题,正好班上其他同学的显示屏也都存在着一定的错误,于是我们集体换了一批显示屏。新的显示屏拿来后背光是亮了,但是依旧没有字显示,经过代码的各种调试与更改终于能实现一行字的显示,但在我们想实现按键显示屏做出相应变化的功能时,发现显示屏根本没有变化,于是又回去调试它。经过老师的直到我们发现成功显示的那一句代码是放在设置主频之前的,而在主频之下我们的LCD代码就失效了,我们短暂的成功只是偶然性的。于是这次我们就先设置好主频,然后回去更改LCD 中延时的长度,经过多次尝试后终于能显示出字并实现刷新显示了。这之后又出现一个小问题,就是字符串不是一下子全显示出来,而是有那种渐变的效果,思考一下发现是延时太长,于是改短写数据的延时后问题迎刃而解。LCD调试是个漫长需要耐心的工作,一旦成功,就会发现这一切努力都没有白费。3.喇叭的调试在网上查阅关于喇叭的连接方法和注意事项之后我们将喇叭焊在了板子上,第一次测验时随意取了一个机器频率测试是否能够正常发声,可是没有成功,喇叭没有声音而且变烫,我们迅速停止调试检查问题,发现三极管损坏,于是我们又换了一个PNP管并重新设计电路,采用共集放大电路并将喇叭一端接电源,此时喇叭发出了声音,但频率很低,我们又回去调整了频率和延时才得到了较为满意的结果。4.键盘的调试小学期的第二天就在网上查阅资料弄懂了键盘的扫描输入原理,后来通过几天的修改将代码程序写好之后测试时是成功的,但是又过了几天待全部发声代码编写完成再次测试的时候有两个键按下时发声频率不正确,一个键按下后不论怎样调试频率没有变化,另一个键发声和相邻的键始终保持一致,后来通过不断地改代码调试发现第一个键出了问题,另一个键的接头接触不良,我们换了一个接口后差强解决了相邻键发声相同的问题。6.2实验感悟这次小学期是我和队友第一次接触单片机,对单片机之前没有任何接触和认识,所以刚上手时非常困惑,一来是不清楚单片机究竟什么构造和具有什么功能,二来不清楚选作哪个题目,于是第一天和第二天我和室友大致扫视了一遍数据手册,又通过上网查阅相关资料对于单片机有了一个大致的了解,之后去网上搜索各种单片机设计题目,因为我们两个人之前都懂一些音乐乐理,对音乐很感兴趣所以挑了这个电子琴发声器的题目,初次编写代码时一头雾水,不知从何下手,后来渐渐弄懂了电子琴发声的原理,通过开题报告做了流程图和模块分解,再加上老师的分析,开始尝试分模块编写代码。编写代码后调试过程中耗费了很长时间,不断修改代码编译通过之后上机调试中又出现各种各样的问题,有的问题像LCD和发声问题花了好长时间调整修改,过程中很痛苦,但是每当问题解决看到成品时心情都是非常的愉悦。最后在验收前四天我们把基本功能全部能够实现了,为了丰富我们的成果,我找了四只蓝色发光二极管,在原有代码上补充了一个跑马灯类似的函数,让声音发出来的同时四只小灯泡循环一次闪亮,给我们的电子琴增加了一点绚丽的效果。6.1实验总结 总体来说这次小学期我们圆满完成了电子琴所涉及的所有功能,对于单片机有了第一次的尝试和理解,唯一遗憾的是对于定时器的掌握和使用还是存在问题。在小学期过程中尤其感谢葛顺明老师的悉心指导,尤其是在小学期前半阶段,总是有各种问题麻烦老师,有的时候都不好意思去问,但是葛老师还是每次都认真的解答我们的问题,这次实验的成功离不开老师的指导和帮助。对于我们存在的问题,在大三大四阶段还会进一步学习和注意,进一步深入了解单片机。六参考文献1 PIC单片机实用教程-基础篇 北京航空航天大学出版社 李学海2 PIC32系列手册七程序源代码Keyboard.h:*#include #include #define R0 PORTGbits.RG1#define R1 PORTDbits.RD3#define R2 PORTEbits.RE0#define R3 PORTGbits.RG14#define C0 PORTEbits.RE1#define C1 PORTDbits.RD4#define C2 PORTEbits.RE3#define C3 PORTEbits.RE2#define uchar unsigned char#define uint unsigned intuchar keyboard();void delay(uint ms);uchar presskey();keyboard.c*#include KEYBOARD.h/时延函数void delay(uint ms)uint x,y;for(x=ms;x0;x-)for(y=10;y0;y-);uchar keyboard()while(1)delay(100); /将R行全部设置为输出为低电平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /将C列全部设置为输入为高电平1PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 );PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 );delay(1);/第一列R0=0;R1=1;R2=1;R3=1; /第一行if(C0=0) /第一列delay(10);if(C0=0) return 1; if(C1=0)delay(10);if(C1=0) return 2;if(C2=0)delay(10);if(C2=0) return 3;if(C3=0)delay(10);if(C3=0) return 4;/第二列R0=1;R1=0;R2=1;R3=1;if(C0=0)delay(10);if(C0=0)return 5;if(C1=0)delay(10);if(C1=0) return 6;if(C2=0)delay(10);if(C2=0) return 7;if(C3=0)delay(10);if(C3=0) return 8;/第三列R0=1;R1=1;R2=0;R3=1;if(C0=0)delay(10);if(C0=0) return 9;if(C1=0)delay(10);if(C1=0) return 10;if(C2=0)delay(10);if(C2=0) return 11;if(C3=0)delay(10);if(C3=0) return 12;/第四列R0=1;R1=1;R2=1;R3=0;if(C0=0)delay(10);if(C0=0)return 13;if(C1=0)delay(10);if(C1=0) return 14;if(C2=0)delay(10);if(C2=0)return 15;if(C3=0)delay(10);if(C3=0) return 16;uchar presskey()delay(100); /将R行全部设置为输出为低电平0; PORTSetPinsDigitalOut(IOPORT_G, BIT_14 | BIT_1 ); PORTSetPinsDigitalOut(IOPORT_D, BIT_3 ); PORTSetPinsDigitalOut(IOPORT_E, BIT_0 );PORTClearBits(IOPORT_G, BIT_14 | BIT_1 ); PORTClearBits(IOPORT_D, BIT_3); PORTClearBits(IOPORT_E, BIT_0); delay(1); /将C列全部设置为输入为高电平1PORTSetBits(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetBits(IOPORT_D, BIT_4 ); PORTSetPinsDigitalIn(IOPORT_E, BIT_1 | BIT_2 | BIT_3); PORTSetPinsDigitalIn(IOPORT_D, BIT_4 ); delay(1); R0=0;R1=0;R2=0;R3=0; if(C0=0)delay(10);if(C0=0)return 1;if(C1=0)delay(10);if(C1=0) return 1 ;if(C2=0)delay(10);if(C2=0)return 1;if(C3=0)delay(10);if(C3=0) return 1; return 0;LCD.c*/-/ 名称: LCD1602.c液晶控制与显示程序/-#include #include LCD.h/*- LCD RS-RG13 RWRG12 ERG14-*/void Delay_1ms(void) /1ms延时函数 unsigned int i; for (i=0;i1000;i+); void Delay_nms(unsigned int n) /N ms延时函数 unsigned int j=0; for (j=0;jn;j+) Delay_1ms(); /* 写LCD命令*/void Write_LCD_Command(INT8U cmd) PORTClearBits(IOPORT_A, BIT_7); /RS=0; PORTClearBits(IOPORT_A, BIT_6); /RW=0; PORTFbits.RF5 = (cmd)%2; PORTFbits.RF12 = (cmd/2)%2; PORTFbits.RF13 = (cmd/2)/2)%2; PORTBbits.RB12 = (cmd/2)/2)/2)%2; PORTBbits.RB13 = (cmd/2)/2)/2)/2)%2; PORTBbits.RB14 = (cmd/2)/2)/2)/2)/2)%2; PORTBbits.RB8 = (cmd/2)/2)/2)/2)/2)/2)%2; PORTBbits.RB9 =(cmd/2)/2)/2)/2)/2)/2)/2)%2; Delay_nms(50); PORTSetBits(IOPORT_F, BIT_4); /E=1;Delay_nms(50); PORTClearBits(IOPORT_F, BIT_4); /E=0; Delay_nms(50); /LCD忙等待/* void Write_LCD_Data(INT8U dat) 写LCD命令*/void Write_LCD_Data(INT8U dat) PORTSetBits(IOPORT_A, BIT_7); /RS=1; PORT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中国加热型挡风玻璃行业市场前景预测及投资价值评估分析报告
- 2026年中国焖锅行业市场前景预测及投资价值评估分析报告
- 2025广西百色田林县事业单位定向招聘2020-2022届服务期满“三支一扶”人员12人考试笔试备考试题及答案解析
- 2025黑龙江鸡西市邮政管理局招聘公益岗位就业人员1人笔试考试备考题库及答案解析
- 2026上海松江区教育系统第一批教师招聘742人考试笔试参考题库附答案解析
- 2025江苏苏州市健康养老产业发展集团有限公司下属子企业招聘4人(第五批)笔试考试参考试题及答案解析
- 老年痴呆护理要点
- 耐药菌感染防控策略探讨
- 抗生素临床使用核心原则培训
- 2025年办公楼装修合同协议
- 【MOOC】《创业团队建设与管理》(首都经济贸易大学)章节期末慕课答案
- MOOC 食品营养学-福建农林大学 中国大学慕课答案
- 人教版高中物理必修一导学案(全册)
- 变电运维管理规定(试行)第3分册组合电器运维细则
- 《小英雄雨来》整本书阅读教学设计
- 气箱脉冲袋式除尘器说明书
- 比较思想政治教育学11
- 病人欠费催缴通知单
- GB/T 23180-2008饲料添加剂2%d-生物素
- GB/T 16857.901-2020产品几何技术规范(GPS)坐标测量机的验收检测和复检检测第901部分:配置多影像探测系统的坐标测量机
- GB/T 12624-2006劳动防护手套通用技术条件
评论
0/150
提交评论