[ZLG-MCU] EasyARM615的LCD问题,急急急!请高手们拉小弟一把!!

[复制链接]
 楼主| 耄耄耄 发表于 2008-4-18 16:23 | 显示全部楼层 |阅读模式
我用的是EasyARM615,编译环境IAR,昨天我写了一段程序,程序的作用如下:系统默认初始显示值为30,用户根据自己的要求在一段时间内通过按下KEY2和KEY3来改变默认值,按下key2为加1,按下key3为减1,按后刷新显示屏,按下KEY4为设定完毕,此时,按下KEY2和KEY3不会改变设定值。可设定的范围在10到50之间,如果设定时间内无按键操作,显示值将衡定为为30。程序如下:<br />#include&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&quot;hw_ints.h&quot;<br />#include&nbsp;&quot;sysctl.h&quot;<br />#include&nbsp;&quot;I2CINT.H&quot;<br />#include&nbsp;&quot;PCF8576.H&quot;<br />#include&nbsp;&quot;LCD_TH3144.H&quot;<br />#include&nbsp;&quot;hw_adc.h&quot;<br />#include&nbsp;&quot;gpio.h&quot;<br />#include&nbsp;&quot;adc.h&quot;<br />#include&nbsp;&quot;debug.h&quot;<br /><br />#define&nbsp;KEY&nbsp;GPIO_PIN_4<br />#define&nbsp;KEY2&nbsp;GPIO_PIN_5<br />#define&nbsp;KEY3&nbsp;GPIO_PIN_5<br />#define&nbsp;KEY4&nbsp;GPIO_PIN_4<br />void&nbsp;Go2Jtag(void)//防止jtag死锁<br />{<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);<br />&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTD_BASE,KEY,GPIO_DIR_MODE_IN);<br />&nbsp;&nbsp;if(GPIOPinRead(GPIO_PORTD_BASE,KEY)==0)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;delay(unsigned&nbsp;int&nbsp;n)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;软件延迟函数<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(;n&gt0;n--)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt1000;i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />int&nbsp;SetTemp=30;//设定初始显示值<br /><br /><br />void&nbsp;PlusOne(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定显示值加1中断函数<br />{<br />&nbsp;&nbsp;int&nbsp;SetTempH;//十位数<br />&nbsp;&nbsp;int&nbsp;SetTempL;//个位数<br />&nbsp;&nbsp;GPIOPinIntClear(GPIO_PORTD_BASE,KEY2);//清除中断<br />&nbsp;&nbsp;if(SetTemp&gt50)//如果设定显示值已经大于50,显示“错误”<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D1&nbsp;=&nbsp;HexToSeg(0xe);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SetTemp++;<br />&nbsp;&nbsp;&nbsp;&nbsp;SetTempH=SetTemp/10;<br />&nbsp;&nbsp;&nbsp;&nbsp;SetTempL=SetTemp%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D1&nbsp;=&nbsp;HexToSeg(SetTempH);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D2&nbsp;=&nbsp;HexToSeg(SetTempL)+LCD_DP;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D3&nbsp;=&nbsp;HexToSeg(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D4&nbsp;=&nbsp;HexToSeg(0);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Update();//到这里有问题了!!!!!!!!!!!!!!!问题见最后<br />}<br />void&nbsp;SubOne(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定初始值减1中断函数<br />{<br />&nbsp;&nbsp;int&nbsp;SetTempH;//SetTemp的十位数<br />&nbsp;&nbsp;int&nbsp;SetTempL;//SetTemp个位数<br />&nbsp;&nbsp;GPIOPinIntClear(GPIO_PORTB_BASE,KEY3);//清除中断<br />&nbsp;&nbsp;if(SetTemp&lt10)//如果设定值已经小于10,显示“错误”<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D1&nbsp;=&nbsp;HexToSeg(0xe);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SetTemp--;<br />&nbsp;&nbsp;&nbsp;&nbsp;SetTempH=SetTemp/10;<br />&nbsp;&nbsp;&nbsp;&nbsp;SetTempL=SetTemp%10;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D1&nbsp;=&nbsp;HexToSeg(SetTempH);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D2&nbsp;=&nbsp;HexToSeg(SetTempL)+LCD_DP;<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D3&nbsp;=&nbsp;HexToSeg(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Seg.D4&nbsp;=&nbsp;HexToSeg(0);<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Update();();//到这里有问题了!!!!!!!!!!!!!!!问题见最后<br /><br />}<br /><br />void&nbsp;StopWatingForInt(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//退出等待加减中断<br />{<br />&nbsp;&nbsp;GPIOPinIntClear(GPIO_PORTA_BASE,KEY4);//清除中断<br />&nbsp;&nbsp;GPIOPinIntDisable(GPIO_PORTD_BASE,KEY2);//禁能中断<br />&nbsp;&nbsp;GPIOPinIntDisable(GPIO_PORTB_BASE,KEY3);<br />}<br /><br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;I2CInit(100000,&nbsp;1);<br />&nbsp;&nbsp;if(PCF8576_Ini(MODE_E,&nbsp;NOGLITTER)!=1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;初始化PCF8576驱动<br />&nbsp;&nbsp;{&nbsp;while(1);&nbsp;}<br />&nbsp;&nbsp;Lcd_Seg.D1&nbsp;=&nbsp;HexToSeg(3);&nbsp;&nbsp;&nbsp;&nbsp;//显示初值<br />&nbsp;&nbsp;Lcd_Seg.D2&nbsp;=&nbsp;HexToSeg(0)+LCD_DP;<br />&nbsp;&nbsp;Lcd_Seg.D3&nbsp;=&nbsp;HexToSeg(0);<br />&nbsp;&nbsp;Lcd_Seg.D4&nbsp;=&nbsp;HexToSeg(0);<br />&nbsp;&nbsp;Lcd_Update();&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Go2Jtag();<br />&nbsp;&nbsp;SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br />&nbsp;&nbsp;SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);<br />&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTD_BASE,KEY2,GPIO_DIR_MODE_IN);<br />&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTB_BASE,KEY3,GPIO_DIR_MODE_IN);<br />&nbsp;&nbsp;GPIODirModeSet(GPIO_PORTA_BASE,KEY4,GPIO_DIR_MODE_IN);<br />&nbsp;&nbsp;GPIOIntTypeSet(GPIO_PORTD_BASE,KEY2,GPIO_FALLING_EDGE);<br />&nbsp;&nbsp;GPIOIntTypeSet(GPIO_PORTB_BASE,KEY3,GPIO_FALLING_EDGE);<br />&nbsp;&nbsp;GPIOIntTypeSet(GPIO_PORTA_BASE,KEY4,GPIO_FALLING_EDGE);<br />&nbsp;&nbsp;GPIOPortIntRegister(GPIO_PORTD_BASE,PlusOne);//注册中断处理程序函数<br />&nbsp;&nbsp;GPIOPortIntRegister(GPIO_PORTB_BASE,SubOne);<br />&nbsp;&nbsp;GPIOPortIntRegister(GPIO_PORTA_BASE,StopWatingForInt);<br />&nbsp;&nbsp;GPIOPinIntEnable(GPIO_PORTD_BASE,KEY2);<br />&nbsp;&nbsp;GPIOPinIntEnable(GPIO_PORTB_BASE,KEY3);<br />&nbsp;&nbsp;GPIOPinIntEnable(GPIO_PORTA_BASE,KEY4);<br />&nbsp;&nbsp;delay(10000);//等待时间<br />}<br />可是当我按下key2后,程序执行到ISR(任何一个)的Lcd_Update()就走不下去了,我在调试的时候,发现这是由于在执行Lcd_Update()中的ISendByte(PCF8576,&nbsp;drive)函数即器件的选择与控制时出现了问题:似乎因控制PCF8576的数据一直都没有传送完成而停留在了while(I2C_state&nbsp;!=&nbsp;STATE_IDLE)这一循环语句上。这是为什么阿?<br />
zlgmcu 发表于 2008-4-18 16:41 | 显示全部楼层

程序太大,没有仔细看,还是参考光盘例程吧

停在while(I2C_state&nbsp;!=&nbsp;STATE_IDLE)循环,会不会是I2C速率太快了?
 楼主| 耄耄耄 发表于 2008-4-18 17:13 | 显示全部楼层

还是有问题

谢谢您的提醒,可是为什么在主函数中的Lcd_Update()能够正常执行呢?
 楼主| 耄耄耄 发表于 2008-4-19 12:29 | 显示全部楼层

......

我发现只要是在中断服务子程序里,&nbsp;对LCD的操作都会停在while(I2C_state&nbsp;!=&nbsp;STATE_IDLE),这是怎么回事啊?
 楼主| 耄耄耄 发表于 2008-4-19 12:36 | 显示全部楼层

拜托了。。。。

请各位高手帮帮忙解决好吗?很急啊.........
 楼主| 耄耄耄 发表于 2008-4-20 16:51 | 显示全部楼层

谢谢

问题已经解决了,我用查询方式替代中断方式解决了这个问题,还是要谢谢zlgmcu&nbsp;的帮助,谢谢您!
hydang 发表于 2011-12-1 23:08 | 显示全部楼层
我在我的PC机上为什么不能通过编译,打不开头文件“Fatal Error[Pe005]: could not open source file "hw_types.h" C:\Program Files\IAR Systems\Embedded Workbench 4.0 Kickstart\My projoct\project3.c 1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

30

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部