人机接口电路设计方案及编程学课件_第1页
人机接口电路设计方案及编程学课件_第2页
人机接口电路设计方案及编程学课件_第3页
人机接口电路设计方案及编程学课件_第4页
人机接口电路设计方案及编程学课件_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.4 人机接口电路设计及编程5.4 人机接口电路设计及编程5.4.1 键盘电路设计及编程5.4.1 键盘电路设计及编程1. 电路 键盘接口电路如图5-12所示,板上扩展了一个44行列式矩阵键盘接口。 该键盘采用中断扫描方式进行工作,行线选用PORTG47输出,列线选用PORTF58为输入。 行线接上拉电阻保持高电平,并通过“与”门将输出信号与MCU的中断EXINT0连接; 列线接上拉电阻保持高电平。1. 电路 键盘接口电路如图5-12所示,板人机接口电路设计方案及编程学课件2. 编程 (1) I/O口和中断初始化 I/O引脚设置:rPDATE=0X60;rPCONF=0 x2A; 列线POR

2、TF58为输入rPUPF=0 x0; 列线接上拉电阻rPDATG=0 x0; rPCONG=0 x55FF; 行线PORTG47输出, PORTG0作为EXINT0连接rPUPG=0 x0; 行线接上拉电阻2. 编程 (1) I/O口和中断初始化 中断初始化 rINTCON=0 x5; / 非向量模式,IRQ 允许,FIQ 禁止 rINTMOD=0 x0; / 全部IRQ 模式 rINTMSK =(BIT_GLOBAL|BIT_EINT0); /EXINT0允许, 所有中断屏蔽位允许 pISR_EINT0=(unsigned)keyboard_ISR; /指定中断服务程序 中断初始化 (2)

3、程序 将行线PORTG47输出为低电平,当有键盘按下时,该行线被拉为低电平,使得EXINT0输入也为低电平,MCU产生中断。 中断产生后通过对键盘的行和列进行扫描的方法,可以计算出是哪个键按下,并跳到相应的键盘处理程序中去。 (2) 程序void keyboard_ISR(void) char x,y,xrecord,yrecord,temp; rI_ISPC=BIT_EINT0; /clear pending_bit Delay(400); /delay 40ms if(rPDATF&0 x1E0)=0 x1E0) return 0; /no keyboard press,return vo

4、id keyboard_ISR(void) else x=1; y=1; xrecord=(rPDATF&0 x1E0)1); xrecord=xrecord4; while(xrecord!=0 x1)/judge row x=x+1; xrecord=xrecord1; else if(xrecord=0) rPDATG=0X0F;/ no ,return return 0; Delay(200); /delay 20ms rPDATG=0XEF; /input high if(xrecord=0)while(rPDATF&0 x1E0)=0 x1E0) rPDATG=rPDATG4)&0

5、 x0F; while(yrecord!=0 x1) / judge line y=y+1; yrecord=yrecord1; if(yrecord=0) rPDATG=0X0F; /no board press,return return 0; Delay(200); /deLed_Display(x+(y-1)*4-1); Uart_Printf(%3d,x+(y-1)*4-1); Delay(1200);/delay 40ms rPDATG=0X0F; Led_Display(x+(y-1)*4-1);5.4.2 LCD接口电路设计及编程5.4.2 LCD接口电路设计及编程1. LCD

6、接口信号 EV44B0 II现配有160240的单色显示屏,4比特单扫描。EV44B0 II将LCD控制信号线连接到JP6上,与LCD模块相连,其原理如图5-13所示。 在LCD模块上,集成了LCD驱动器和专门的电压转换电路,用以驱动LCD屏幕和适配LCD工作电压。LCD连接器的信号定义如表5-4所示。1. LCD接口信号 EV44B0 II现人机接口电路设计方案及编程学课件1. LCD接口信号 EV44B0 II现配有160240的单色显示屏,4比特单扫描。EV44B0 II将LCD控制信号线连接到JP6上,与LCD模块相连,其原理如图5-13所示。 在LCD模块上,集成了LCD驱动器和专门

7、的电压转换电路,用以驱动LCD屏幕和适配LCD工作电压。LCD连接器的信号定义如表5-4所示。1. LCD接口信号 EV44B0 II现Pin SignalPin SignalPin SignalPin Signal1 VM6 VDD11 VD216 VD72 VRAME7 GND12 VD317 TSPX3 VLINE8 VD413 GND18 TSMX4 VCLK E9 VD014 VD519 TSPY5 GPB1010 VD115 VD620 TSMYPin SignalPin Sig2. 编程 显示缓冲区与LCD象素对应关系图如图5-14所示。2. 编程 显示缓冲区与LCD象素对应关系

8、图人机接口电路设计方案及编程学课件 (1) LCD 初始化程序 通常采用S3C44B0X的PORTC口和PPORTD口作为LCD驱动接口,因此需要设置它们工作在第3功能状态,设置I/O口控制寄存器的语句如下: rPDATC=0 x8400; rPCONC=0 x5F5FFFFF; rPUPC=0 x33ff;/should be enabled rPCOND=0 xaaaa; rPUPD=0 xff; (1) LCD 初始化程序 LCD初始化程序如下:void Lcd_MonoInit(void)/160 x240 1bit/1pixel LCD#define MVAL_USED 0rLCDC

9、ON1=(0)|(15)|(MVAL_USED7) |(0 x38)|(0 x310)|(CLKVAL_MONO12);/disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,rLCDCON2=(LINEVAL)|(HOZVAL10)|(1021); /LINEBLANK=10 LCD初始化程序如下:rLCDSADDR1=(0 x022) 1); / monochrome, LCDBANK, LCDBASEUrLCDSADDR2=M5D(U32)frameBuffer1+(SCR_X SIZE*LCD_YSIZE/8)1)|(MVAL21)|(129);rLCDSAD

10、DR3= (LCD_XSIZE/16)|(SCR_X SIZE-LCD_XSIZE)/16)9);rLCDCON1=(1)|(15)|(MVAL_USED7)|(0 x38)| (0 x310)|(CLKVAL_MONO12);/enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk, rLCDSADDR1=(0 x027)|(U32)f(2) LCD 显示程序 LCD 显示程序如下:#define frameBuffer1 0 xc400000extern unsigned char *Buf;void displaylcd(void) unsigned int *pb

11、uffer,temp_data; int i; pbuffer =(U32*) frameBuffer1;(2) LCD 显示程序 LCD 显示程序如下: for(i = 0; i (4800/4) ;i+) temp_data = (Bufi*4+3 24) + (Bufi*4+2 16) + (Bufi*4+1 8) +(Bufi*4); pbufferi = temp_data; Delay(10); for(i = 0; i (4800/4) ;i(3) LCD 清屏程序 LCD 清屏程序如下:void clrscreen(void)int i,j;unsigned int *pbuf

12、fer;pbuffer =(U32*) frameBuffer1;for (i=0;i4800/4;i+) pbufferi =0;/(0 x0FFFFFFFF); (3) LCD 清屏程序 LCD 清屏程序如下:5.4.3 触摸屏电路设计及编程1. 触摸屏的工作原理 触摸屏按其工作原理的不同分为表面声波屏、电容屏、电阻屏和红外屏几种。 常见的又数电阻触摸屏。如图5-15 所示,电阻触摸屏的屏体部分是一块与显示器表面非常配合的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理、光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许

13、多细小(小于千分之一英寸)的透明隔离点把它们隔开绝缘。 5.4.3 触摸屏电路设计及编程1. 触摸屏的工作原理人机接口电路设计方案及编程学课件 如图5-16所示,当手指或笔触摸屏幕时(图c),平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层(顶层)接通X 轴方向的5V 均匀电压场(图a),使得检测层(底层)的电压由零变为非零,控制器侦测到这个接通后,进行A/D 转换,并将得到的电压值与5V 相比即可得触摸点的X 轴坐标为(原点在靠近接地点的那端): Xi=LxVi/V(即分压原理)同理得出Y 轴的坐标,这就是所有电阻触摸屏共同的最基本原理。 如图5-16所示,当手指或笔触摸

14、屏幕时(图人机接口电路设计方案及编程学课件2.触摸屏电路控制 触摸屏的控制采用专用芯片,专门处理是否有笔或手指按下触摸屏,并在按下时分别给两组电极通电,然后将其对应位置的摸拟电压信号经过A/D 转换送回处理器 .2.触摸屏电路控制 触摸屏的控制采用专用芯 我们选取 GPG 口与 ADS7843 接口。共运用了 PG2PG7 口共 6 条口线。你也可以选择其它的 I/O 口,但注意不要与 I/O 口上已经设定的功能(例如串口)相冲突。参考电路图如下:按照下图用导线将两个模块连接起来。如图5-17所示。 我们选取 GPG 口与 ADS7843 接人机接口电路设计方案及编程学课件3. 编程(1) P

15、CONG 寄存器配置 按照以上电路来设置,PG6和PG5输入,PG4PG2输出,PG7作为中断EINT7且加内部上拉电阻,初始化语句如下: rPCONG=0 x015f; rPUPG &=0 x80; 3. 编程(1) PCONG 寄存器配置(2) ADS7843 编程 ADS7843的控制字如表5-5所示,其中S为数据传输起始标志位,该位必为。 A2A0进行通道选择。 MODE用来选择A/D转换的精度,1-选择位,-选择12位。 SER/DFR选择参考电压的输入模式。 (2) ADS7843 编程人机接口电路设计方案及编程学课件 PD1和PD0选择省电模式:00-为省电模式允许,在两次A/D

16、转换之间掉电,且中断允许;01同00,只是不允许中断;10保留;11禁止省电模式。 A0A2 用来进行开关切换,如表5-6所示。 PD1和PD0选择省电模式:00-为省SER/DFR1 时,A0A2 输入设置 SER/DFR1 时,A0A2 输入设置 我们采用固定参考电压模式,因此 SER/DFR1。 程序中首先探测 PENIRQ 是否为低电平,如果为高则认为触摸屏没有接触;如果探测到 PENIRQ 为低电平,则认为有接触。 利用软件模拟 DIN、DOUT、DCLK上的 3 线串行传输的时序,将读取 X 坐标数值或 Y 坐标数值的控制字串行送入 ADS7843,并串行读出坐标值。 我们采用固定

17、参考电压模式,因此 SER/ 检测 PENIRQ #define TOUCH_MSR_Y 0 x9c; /读 Y 轴坐标命令#define TOUCH_MSR_X 0 xdc; /读 X 轴坐标命令if(rPDATG&0 x80)=0) /PENIRQ 电平为低/TouchState.pressed=1;_State.Pressed=1; /说明已经按下temp=TOUCH_MSR_X;_State.x=ReadTouch(temp);temp=TOUCH_MSR_Y;_State.y=ReadTouch(temp); 检测 PENIRQ #define TOUCH_MS 送控制字并读取结果子

18、程序int ReadTouch(unsigned char command)unsigned char temp,i,ack,j,k;ack=0;/PG7-PENIRQ,PG6-BUSY,PG5CS,PG3-DCLK,PG2-DINrPDATG&=0 xe7;/cs 置低;dclk 置低temp=0 x80; 送控制字并读取结果子程序int ReadTouch(ufor(i=0;i1;/移位for(i=0;i8;i+)/发送 1 个字节 while(temp=(rPDATG&0 x40)=0); 等待 BUSY 变低 rPDATG&=0 xdf;/din 清零 /再 1 个时钟以后开始接收数据

19、 rPDATG|=0 x08;/置高 dclk delay(2); rPDATG&=0 xf7;/清零 dclk delay(2); while(temp=(rPDATG&0 x40)=for(i=0;i7;i+)取得前 7 位坐标数据(高位在前)rPDATG|=0 x08;/置高 dclkif(temp=rPDATG&0 x20)/取得 din 上的 1 位数据ack+=1;ack=ack1;delay(2);rPDATG&=0 xf7;/清零 dclkdelay(2);rPDATG|=0 x08;/置高 dclkfor(i=0;i7;i+)取得前 7 位坐标数据(高if(temp=rPDA

20、TG&0 x20)/接收最后 1 位ack+=1;delay(2);rPDATG&=0 xf7;/清零 dclkrPDATG|=0 x10;/置高 csreturn ack;/返回接收结果if(temp=rPDATG&0 x20)/接收最后 4.触摸屏与显示器的配合 ADS7843 送回控制器的X 与Y 值仅是对当前触摸点的电压值的A/D 转换值,它不具有实用价值。 这个值的大小不但与触摸屏的分辨率有关,而且也与触摸屏与LCD 贴合的情况有关。而且,LCD 分辨率与触摸屏的分辨率一般来说是不一样,坐标也不一样。 因此,如果想得到体现LCD 坐标的触摸屏位置,还需要在程序中进行转换。 4.触摸屏

21、与显示器的配合 ADS7843 假设LCD 分辨率是320240,坐标原点在左上角;触摸屏分辨率是900900,坐标原点在左上角,则转换公式如下: xLCD=320*(x-x2)/(x1-x2); yLCD=240*(y-y2)/(y1-y2); 假设LCD 分辨率是320240,坐标 如果坐标原点不一致,比如LCD 坐标原点在右下角,而触摸屏原点在左上角,则还可以进行如下转换: xLCD=320-320*(x-x2)/(x1-x2); yLCD=240-240*(y-y2)/(y1-y2); 最后得到的值,便可以尽可能得使LCD 坐标与触摸屏坐标一致,这样,更具有实际意义。 如果坐标原点不一

22、致,比如LCD 坐标原点在右下角,而5.4.4 8段数码管电路设计及编程1.电路设计 系统使用了一个8段数码LED,如图2-18所示。该数码管是共阳极的,低电平信号使LED点亮。 CPU数据总线DATA(07)经74LS573驱动器对数码管进行驱动。其片选信号由CPU的nGCS3信号选通,而8段的内容则由CPU低8位数据线决定。 口地址为0 x6000000。 5.4.4 8段数码管电路设计及编程1.电路设计人机接口电路设计方案及编程学课件2. 编程8段数码管显示程序如下:void Led_Display(unsigned char data) unsigned char * ledbuffe

23、r = (unsigned char *) 0 x6000000 switch(data) case 0: *ledbuffer=0 x12; break; . case 0 xf: *ledbuffer=0 x68; break; 2. 编程8段数码管显示程序如下:5.5 串行接口电路设计及编程5.5 串行接口电路设计及编程5.5.1 串行电路接口 串行接口电路如图5-19所示。系统提供两个RS232标准串行接口(DB9),UART0/l可与PC或MODOM进行串行通信。 PORTC1015分别作为nRTS1、nCTS1、TXD1、RXD1、nRTS0和nCTS0信号,PE1和PE2作为TX

24、D0和RXD0信号。 两个接口则采用两片MAX2322C作为电平转换器。5.5.1 串行电路接口 串行接口电路如人机接口电路设计方案及编程学课件 5.5.2 编程1. I/O接口配置初始化 对PORTC和PORTE初始化语句如下: rPCONC = 0 x0f000000|rPCONC; rPUPC = 0 x3000;/设置内部上拉 rPCONE = (rPCONE&0 xfc3)|0 xeb; rPUPE = 0 x6;2. UART初始化 对 UART 口进行初始化设置程序如下: 5.5.2 编程1. I/O接口配置初始化static int UartNum=0;void myUart_

25、Init(int whichuart, int baud) /设置串口波特率等初始化工作。if(whichuart=0) UartNum=0; rUFCON0=0 x0; /不使用 FIFO rUMCON0=0 x0; /不使用自动流控制 rULCON0=0 x3; /不采用红外线传输模式,无奇偶校验 位,1 个停止位, /8个数据位static int UartNum=0; rUCON0=0 x245; /发送中断为电平方式,接收中断为 边沿方式,禁止超时 /中断,允许产生错误状态中断,禁止回 送模式,禁止中 /止信号,传输模式为中断请求模式,接 收模式也为中断 /请求模式。 rUBRDIV

26、0=(int)(MCLK/16./baud + 0.5)-1); /根据波特率计算 UBRDIV0 的值 rUCON0=0 x245; else if(whichuart=1)UartNum=1;rUFCON1=0 x0;rUMCON1=0 x0;rULCON1=0 x3;rUCON1=0 x245;rUBRDIV1 = ( (int)(MCLK/16./baud + 0.5) -1 );else if(whichuart=1)3.字符发送程序#define WrUTXH0(ch)(*(volatile unsigned char*)0 xld00020)=(unsigned char)(ch

27、)#define WrUTXH0(ch)(*(volatile unsigned char*)0 xld04020)=(unsigned char)(ch)Void myUart_SendByte(char ch) if(UartNum=0) if(ch=“n”) while(!(rUTRSTAT0&0 x2); /等待,直到发送缓冲区为空 Delay(10); /超级中断的响应速度较慢 WrUTXH0(“r”); /发送回车符 while(!(rUTRSTAT0&0 x2); /等待,知道发送缓冲区为空 Delay(10); WrUTXH0(ch); /发送字符 3.字符发送程序 else

28、if(ch=“n”) while(!(rUTRSTAT1&0 x2); Delay(10); /因为超级终端响应较慢 rUTXH1=“r”; While(!(rUTRSTAT1&0 x2); /等待THR空。 Delay(10); WrUTXH1(ch); else字符接受程序#define RdURXH0()(*(volatile unsigned char*)(0 xld00027)#define RdURXH1()(*(volatile unsigned char*)(0 xld04027)Char Uart_Getch(void) if(whichUart=0) /串口0 while(

29、!(rUTRSTAT0&0 x1); /读出接收到的数据(一直到读完) return RdURXH0(); /URXH0:UART0接收缓冲寄存器 else /串口1 while(!(rUTRSTAT1&0 x1); /Receive data ready return rURXH1; 字符接受程序5.6 C接口电路设计及编程5.6 C接口电路设计及编程5.6.1 EEPROM芯片介绍5.6.1 EEPROM芯片介绍 目前,通用存储器芯片多为EEPTOM,其常用的协议主要有两线串行连接协议(C)和三线串行连接协议。 带C总线接口的EEPROM有许多型号,其中AT24Cxx系列使用十分普遍,产品

30、包括AT2401/02/04/08/16等,其容量(字节数页)分别为1288/2568/5128/10248/20488,适用于25V的低电压操作,具有低功耗和高可靠性等优点。 目前,通用存储器芯片多为EEPTOM,其常用的协议主 AT24系列存储器芯片采用CMOS工艺制造,内置有高压泵,可在单电压供电条件下工作。其标准封装为8引脚DIP封装形式,如图5-20所示。 AT24系列存储器芯片采用CMOS工艺人机接口电路设计方案及编程学课件 1. SCL 串行时钟。遵循ISO/IEC7816同步协议;漏极开路,需接上拉电阻;在该引脚的上升沿,系统将数据输入到每个EEPROM器件,在下降沿输出。 2

31、. SDA 双向串行数据线,漏极开路,需接上拉电阻,可与其它开路器件“线或”。 1. SCL3. A0、A1、A2 器件/页面寻址地址输入端。在AT24C01/02中,引脚被硬连接。其他AT24Cxx均可接寻址地址线。4. WP 读/写保护。接低电平时可对整片空间进行读/写;接高电平时不能对受保护区进行读/写。5. VCC/GND +5V的工作电压。3. A0、A1、A25.6.2 EEPROM读写操作1. AT24C04结构与应用简述 AT24C04由输入缓冲器和EEPROM阵列组成。 由于EEPROM的半导体工艺特性写入时间为510 ms,如果从外部直接写入EEPROM,则每写一个字节都要

32、等候510ms,成批数据写入时就要等候更长时间。具有SRAM输入缓冲器的EEPROM器件,其写入操作变成对SRAM缓冲器的装载。装载完后启动一个自动写入逻辑将缓冲器中的全部数据一次写入EEPROM阵5.6.2 EEPROM读写操作1. AT24C04 对缓冲器的输人称为页写,缓冲器的容量 称为页写字节数。AT24C04的页写字节数为8,占用最低3位地址。当写入不超过页写字节数时,对EEPROM器件的写入操作与对SRAM的写入操作相同;当超过页写字节数时,应等候510 ms后再启动一次写操作。 由于EEPROM器件缓冲区容量较小(只占据最低3位),且不具备溢出进位检测功能,所以,从非零地址写入8

33、个字节数或从零地址写入超过8个字节数会形成地址翻卷,导致写入出错。 对缓冲器的输人称为页写,缓冲器的容量 2. 设备地址(DADDR) AT24C04xx的器件地址是1010。2. 设备地址(DADDR)3. AT24Cxx的数据操作格式 在IIC总线中,对AT24C04内部存储单元读写,除了要给出器件的设备地址(DADDR)外,还须指定读写的页面地址(PADDR)。两者组成操作地址(OPADDR)如下: 1010 A2 A1 R/W (“”为无效) 系统中引脚A2A1A0为000,因此,系统可寻址AT24C04全部页面,共4K位。按照AT24C04器件手册读写地址(ADDR1010 A2 A

34、1R/W)中的数据操作格式如下:3. AT24Cxx的数据操作格式(1) 写入操作格式 任意写一个字节到地址ADDR_W,其时序图如图5-21所示,写入操作格式为: START_C OPADDR_W ACK ADDR_W ACK data ACK STOP_C(1) 写入操作格式人机接口电路设计方案及编程学课件 从地址ADDR_W起连续写人n个字节(同一页面),其时序图如图5-22所示,写人格式为: START_C OPADDR_W ACK ADDR_W ACK data1 ACK data2 ACK.datan ACK STOP_C 从地址ADDR_W起连续写人n个字节(同人机接口电路设计方

35、案及编程学课件(2) 读出操作格式 从任意地址ADDR_R读一个字节的时序图如图5-23所示,读出操作格式为: START_C OPADDR_W ACK ADDR_R ACK OPADDR_R ACK data STOP_C(2) 读出操作格式人机接口电路设计方案及编程学课件 从地址ADDR_R起连续读出n个字节(同一页面),其时序图如图5-24所示,读出操作格式为: START_C OPADDR_R ACK data1 ACK data2 ACK . datan ACK STOP_C 从地址ADDR_R起连续读出n个字节(同人机接口电路设计方案及编程学课件 在读任意地址操作中,除了发送读地址

36、外,还要发送页面地址(PADDR); 因此,在连续读出72个字节操作前,要进行1个字节PADDR写入操作,然后重新启动读操作。 注意,读操作完成后没有ACK。 在读任意地址操作中,除了发送读地址外,还5.6.3 编程1. I/O 端口 IIC 功能设置 我们采用PF0口和PF1口工作在第2功能模式下,分别作为 IIC总线的SCL和SDA与24LC04B相连。 因此,需要设置PF0和PF1工作在第2功能模式下。采用以下语句: rPCONF |= 0 xa; /PF0:IICSCL, PF1:IICSDA rPUPF |= 0 x3; /pull-up disable5.6.3 编程1. I/O

37、端口 IIC 功能设置2. IIC中断使能 由于是采用中断的方式了解每个字节的传输是否成功。 因此需要定义中断处理程序入口,并且使能中断。采用以下语句实现: pISR_IIC= (unsigned)IIC_Int; /将 IIC 中断处理程序指针指向 IIC_Int rINTMSK= (BIT_GLOBAL|BIT_IIC); /使能中断2. IIC中断使能3. 初始化 IIC 接口 对 IICCON 进行设置: rIICCON = (17) | (06 ) | (15) | (0 xf ); /使能 ACK的产生, IICCLK=MCLK/16, 使能发送/接收中断,清除 pending 位

38、以便响应 /中断,Tx clock(64MHz/16)/(15+1) = 250KHz3. 初始化 IIC 接口4. 向24LC04B中写入数据子程序 #define IICBUFSIZE 0 x20 U8 _iicDataIICBUFSIZE; /写数据缓存 volatile int _iicDataCount; /数据长度 volatile int _iicStatus; volatile int _iicMode; int _iicPt;4. 向24LC04B中写入数据子程序 void Wr24LCxx(U32 slvAddr,U32 addr,U8 data) _iicMode=WRD

39、ATA; /写数据模式 _iicPt=0; _iicData0=(U8)addr; /字节写入模式,数据格式 参考教材内容 _iicData1=data; _iicDataCount=2; rIICDS=0 xa0; /控制字节 rIICSTAT=0 xf0; /主设备发送模式,产生起 始条件,使能发送/接收 while(_iicDataCount != -1); _iicMode=POLLACK; void Wr24LCxx(U32 slvAddr,U32 while(1) rIICDS=slvAddr; _iicStatus=0 x100; rIICSTAT=0 xf0; /MasTx,S

40、tart rIICCON=0 xaf; /resumes IIC operation. while(_iicStatus=0 x100); if(!(_iicStatus&0 x1) break; / 成功接收到 ACK rIICSTAT=0 xd0; /产生停止条件 rIICCON=0 xaf;/释放 IIC 操作 Delay(1); /等待,直到停止条件起作用,写入成功 while(1)5. 从24LC04B读出数据子程序void Rd24LCxx(U32 slvAddr,U32 addr,U8 *data)_iicMode=SETRDADDR;_iicPt=0;_iicData0=(U8

41、)addr;_iicDataCount=1;rIICDS=slvAddr;rIICSTAT=0 xf0;/MasTx,Start5. 从24LC04B读出数据子程序while(_iicDataCount != -1);_iicMode=RDDATA;_iicPt=0;_iicDataCount=1;rIICDS=slvAddr;rIICSTAT=0 xb0; /MasRx,StartrIICCON=0 xaf; /resumes IIC operation.while(_iicDataCount != -1);*data=_iicData1;while(_iicDataCount != -1)

42、;6. IIC中断处理子程序void _irq IIC_Int (void)U32 iicSt, i ;rI_ISPC=BIT_IIC; /清除 pending 位iicSt=rIICSTAT; /读入 IIC 总线单前状态,以 便进行各种错误处理if(iicSt&0 x8) / when bus arbitration is failed.if(iicSt&0 x4) / when a slave address is matched with IICADDif(iicSt&0 x2) / when a slave address is 0000000bif(iicSt&0 x1) / wh

43、en ACK isnt received6. IIC中断处理子程序switch(_iicMode) /根据当前操作模式进行相应处理case POLLACK: /等待 ACK 模式_iicStatus=iicSt; /读入 IICSTAT,第 0 位表示是否 接收到 ACKbreak;case RDDATA: /读数据模式if(_iicDataCount -)=0) /只要读取 1 字节数据_iicData_iicPt+=rIICDS;rIICSTAT=0 x90; /停止主设备读取模式rIICCON=0 xaf; /释放 IIC 操作Delay(1); /等待直到停止条件起作用break;sw

44、itch(_iicMode) /根据当前操作模式 _iicData_iicPt+=rIICDS; /未读完所有数据最后一个字节不能产生 ACKif(_iicDataCount)=0) /如果读完了所有数据(最后一个字节)rIICCON=0 x2f; / 产生 NOACK.释放 IIC 操作elserIICCON=0 xaf; / 产生 ACK 释放 IIC 操作break;case WRDATA: /写数据模式if(_iicDataCount-)=0) /如果数据写完rIICSTAT=0 xd0; /停止主设备发送传输rIICCON=0 xaf; /恢复 IIC 操作Delay(1); /等待

45、,直到停止条件起效break; _iicData_iicPt+=rIICDS;rIICDS=_iicData_iicPt+; /_iicData0 has dummy.for(i=0;i10;i+); /for setup time until rising edge of IICSCLrIICCON=0 xaf;/释放 IIC 总线操作break;case SETRDADDR:/设置读地址模式/Uart_Printf(S%d,_iicDataCount);rIICDS=_iicData_iicPt+; if(_iicDataCount-)=0)break; /IIC operation is

46、 stopped because of IICCON4rIICDS=_iicData_iicPt+for(i=0;i10;i+); /for setup time until rising edge of IICSCLrIICCON=0 xaf;/释放 IIC 总线操作break;default:break;if(_iicDataCount-)=0)5.7 其他接口电路设计及编程5.7 其他接口电路设计及编程5.7.1 定时器编程 让定时器0的 TOUT0引脚输出频率为16K,占空比为 30的 PWM 脉冲调制波形;定时约0.5秒后产生定时中断。5.7.1 定时器编程 让定时器01. 定时器初

47、始化(1) I/O 口设置 采用以下语句对 PE 口的工作方式进行设置,使之工作在定时器输出状态: rPCONE=0 xaaa8; /Tout0/1/2/3/4, RxD0, TxD0 rPUPE |=0 xf8;(2) 定时器时钟源频率设置 通过以下语句来设置定时器的时钟源:rTCFG0=0 x1010101; / 预分频值为 1rTCFG1=0 x01; / 分割比例=1/4经过设置后,定时器时钟源频率 = (MCLK/1)/41. 定时器初始化(3) 设置输出波形频率 通过以下语句来设置输出波形的频率: rTCNTB0=1000; 经过设置,输出 PWM 波形的频率为 MCLK/4000

48、; 由于系统采用的 MCLK64M,因此,PWM 波形频率为 16K。(4) 设置占空比 通过以下语句来设置输出波形的占空比: rTCMPB0=300; 针对实验要求:300/100030(3) 设置输出波形频率(5) 设置定时器控制寄存器、启动定时器 rTCON=0 xaaaa0a; /自动重载模式,关闭反转功能,手动更 新,关闭死区rTCON=0 x999909; /启动 PWM 操作 定时器启动后,可以采用示波器观察 TOUT0输出波形,是否满足要求。(5) 设置定时器控制寄存器、启动定时器2. 定时器中断主程序 参考程序如下:volatile int variable0;void Te

49、st_TimerInt(void) rINTMSK=(BIT_GLOBAL|BIT_TIMER0) pISR_TIMER0=(int)Timer0Done; /修改中断处理函数的指针 rTCFG0=0 x00f; /dead zone=0, pre0=0 xf /设定时钟源频率 rTCFG1=0 x04; /all interrupt, mux0=1/32 rTCNTB0=0 xffff; /(1/(64MHz/15/32)*0 xffff=0.49s2. 定时器中断主程序rTCON=0 x02;/手动更新 timer0 的设置rTCON=0 x01;/T0=one shot,启动定时器whi

50、le(variable0=0);/等待中断发生rTCON=0 x0;/停止定时器rINTMSK=BIT_GLOBAL; /关闭中断rTCON=0 x02;3. 定时中断服务程序void _irq Timer0Done(void)rI_ISPC=BIT_TIMER0;/清中断 pending 位variable0+; /更新变量3. 定时中断服务程序5.7.2 实时日历时钟RTC1. 电路 如图5-25为 32.768KHZ 晶振的电路连接示例:5.7.2 实时日历时钟RTC1. 电路人机接口电路设计方案及编程学课件2. 编程(1) 实时时钟初始化初始化示例程序如下:#define TESTYE

51、AR 0 x99#define TESTMONTH 0 x12#define TESTDAY 0 x31#define TESTDATE 0 x06 /星期五#define TESTHOUR 0 x23#define TESTMIN 0 x59#define TESTSEC 0 x302. 编程void Rtc_Init(void)rRTCCON = 0 x01; /读写使能, 1/32768, Normal(merge), No resetrBCDYEAR = TESTYEAR;rBCDMON = TESTMONTH;rBCDDAY = TESTDAY; / SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7void Rtc_Init(void) rBCDDATE = TESTDATE;rBCDHOUR = TESTHOUR;rBCDMIN = TESTMIN;rBCDSEC = TESTSEC;rRTCCON = 0 x00; /读写禁止 以上程序对控制寄存器进行了设置,并更新了 RTC 日期时间寄存器,从此刻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论