本帖最后由 henry144 于 2011-12-15 08:34 编辑
LPC11系列控制ST7920的LCD,整了几天一直没有结果,时间来不及了,耗不下了,希望各位大侠帮忙,指出我的代码错误的地方。
单个命令能准确的显示,多个命令就不对了,多个数据也是乱码。。。。。小弟在此不胜感激啊!
/*******************************************************************************************************/
#include "LPC11xx.h" /* LPC11xx外设寄存器 */
/*********************************************************************************************************
宏定义
*********************************************************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define LCD_EN_H LPC_GPIO2->DATA |=(1<<0)
#define LCD_EN_L LPC_GPIO2->DATA &=~(1<<0)
#define LCD_PSB_H LPC_GPIO2->DATA |=(1<<1)
#define LCD_RS_H LPC_GPIO2->DATA |=(1<<3)
#define LCD_RS_L LPC_GPIO2->DATA &=~(1<<3)
#define LCD_RW_H LPC_GPIO3->DATA |=(1<<2)
#define LCD_RW_L LPC_GPIO3->DATA &=~(1<<2)
/*********************************************************************************************************
全局变量
*********************************************************************************************************/
const unsigned char dis1[]={"1234567890"};
const unsigned char dis2[]={"你好!"};
/*********************************************************************************************************
** Function name: myDelay
** Descriptions: 软件延时
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void Delay_1ms (uint n)
{
uint i,j;
j=0;
i = 0;
for(j=0;j<n;j++)
for(i = 110;i > 0;i--);
}
void Delay_10us (uint n)
{
uint i,j;
j=0;
i = 0;
for(j=0;j<n;j++)
for(i = 1;i > 0;i--);
}
/*********************************************************************************************************
** Function name: GPIOInit
** Descriptions: GPIO初始化
** input parameters: 无
** output parameters: P2.4~P2.11对应D0~D7
** Returned value: 无
*********************************************************************************************************/
void GPIOInit( void )
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 6); /* 初始化GPIO AHB时钟 */
LPC_IOCON->PIO2_0 &= ~0x07; /* 将P2.0-11初始化为GPIO功能 */
LPC_IOCON->PIO2_1 &= ~0x07;
LPC_IOCON->PIO2_3 &= ~0x07;
LPC_IOCON->PIO2_4 &= ~0x07;
LPC_IOCON->PIO2_5 &= ~0x07;
LPC_IOCON->PIO2_6 &= ~0x07;
LPC_IOCON->PIO2_7 &= ~0x07;
LPC_IOCON->PIO2_8 &= ~0x07;
LPC_IOCON->PIO2_9 &= ~0x07;
LPC_IOCON->PIO2_10&= ~0x07;
LPC_IOCON->PIO2_11&= ~0x07;
LPC_GPIO2->DIR |= 0xFFB ; /* 将P2.0-11方向设置为输出 */
LPC_IOCON->PIO3_2 &= ~0x07;
LPC_GPIO3->DIR |= (1 << 2);
}
void write_cmd(uchar cmd)
{
uchar lcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LPC_GPIO2->DIR &=~(0xFF<<4);
do //判忙
{
LCD_EN_H;
Delay_10us(1);
lcdtemp |=LPC_GPIO2->DATA ;
LCD_EN_L;
}
while(lcdtemp&(0x80<<4));
LPC_GPIO2->DIR |= 0xFFB ;
LCD_RW_L;
LPC_GPIO2->DATA =(cmd<< 4);
LCD_EN_H;
Delay_1ms(5);
LCD_EN_L;
}
void write_data(uchar data)
{
uchar lcdtemp=0;
LCD_RS_L;
LCD_RW_H;
LPC_GPIO2->DIR &=~(0xFF<<4);
do //判忙
{
LCD_EN_H;
Delay_10us(1);
lcdtemp=LPC_GPIO2->DATA ;
LCD_EN_L;
}
while(lcdtemp&(0x80<<4));
LPC_GPIO2->DIR |= 0xFFB ;
LCD_RS_H;
LCD_RW_L;
LPC_GPIO2->DATA =(data<< 4);
LCD_EN_H;
Delay_1ms(5);
LCD_EN_L;
}
void lcd_init()
{
LCD_PSB_H; //并行口方式
write_cmd(0x30); //基本指令操作
Delay_1ms(5);
write_cmd(0x02); //地址归位
Delay_1ms(5);
write_cmd(0x0C); //显示开,光标关
Delay_1ms(5);
write_cmd(0x01); //清除LCD的显示内容
}
/*********************************************************************************************************
*********************************************************************************************************/
void main(void)
{
uchar i;
SystemInit(); /* 初始化目标板,切勿删除 */
GPIOInit();
Delay_1ms(100);
lcd_init();
// while (1) {
//write_cmd(0x0E);
write_cmd(0x90);
i=0;
while(dis1!='\0')
{
write_data(dis1);
i++;
}
//}
}
/*********************************************************************************************************
End Of File
*********************************************************************************************************/ |