初级会员

- 积分
- 104
- 金钱
- 104
- 注册时间
- 2013-11-7
- 在线时间
- 5 小时
|
5金钱
#define DATA_PORT_OUT(DataValue) {GPIO_Write(GPIOC,(GPIO_ReadOutputData(GPIOC)&0xff00)|(DataValue&0x00FF));}
void DataIO_INPIUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//数码管的段选信号端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void DataIO_OUTIUT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//数码管的段选信号端
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void CheckBusy(void)
{
uint8_t temp;
DataIO_INPIUT();
RS_STE;
RW_CLR;
E_CLR;
RW_STE;
RS_CLR;
do
{
E_CLR;
E_STE; //高电平才能送数据
delay_ms(2);
temp=DATA_PORT_IN&0x00ff;
E_CLR;
}
while(temp&0x80);
DataIO_OUTIUT();
}
参考部分例程函数:
void WriteByteToLcd(uint8_t dat)
{
CheckBusy();
RS_CLR;
RW_STE;
E_CLR;
RS_STE;
RW_CLR;
DATA_PORT_OUT(dat);
E_STE;
delay_ms(2);
E_CLR;
delay_ms(2);
}
void WriteComToLcd(uint8_t com)
{
CheckBusy();
RS_STE;
RW_STE;
E_CLR;
RS_CLR;
RW_CLR;
DATA_PORT_OUT(com);
E_STE;
delay_ms(2);
E_CLR;
delay_ms(2);
}
void WriteToLCD(uint8_t fg,uint8_t byte)
{
if(fg==0)
{
WriteComToLcd(byte);
}
else
{
WriteByteToLcd(byte);
}
}
我在LcdInit()函数中调用了 WriteToLCD(uint8_t fg,uint8_t byte)函数会出现问题,为了试验问题,我把LcdInit函数屏蔽掉了,只调用 WriteToLCD(0x0,0x30),然后把在调用 WriteToLCD函数前全部拉高的管脚拉低,例如拉低GPIO_ResetBits(GPIOC,GPIO_Pin_12),PSB管脚;始终不能拉低,但是去掉WriteToLCD(0x0,0x30)后,就可以正常的把这个管脚拉低,因为液晶屏初始化都是需要调用WriteToLCD函数的,用了这个函数,其他功能管脚像PSB管脚一样的高低电平都不能控制了,这是什么原因,有没有大侠遇到过类似的问题的?很急啊,求帮助一些,灰常感谢!!!!!!!
|
最佳答案
查看完整内容[请看2#楼]
谢谢原子哥帮顶,问题已经找到了,我在宏定义的时候定义了#define DATA_PORT_IN (GPIO_ReadOutputData(GPIOC)&0x00ff) 导致程序在执行的时候死在while中,while的判断语句与读取的寄存器值进行与操作。设置为#define DATA_PORT_IN GPIO_ReadOutputData(GPIOC) 屏幕就可以正常显示了
|