初始化程序没有停下,但一到写数据显示时就忙了。 一个字都显示不出来....
帮忙看看吧
#include "12864.h"
#include "sys.h"
#include "delay.h"
void LCD12864_Init(void)
{
RCC->APB2ENR|=1<<2; //A
RCC->APB2ENR|=1<<3; //B
GPIOA->CRL&=0XFFFFF000;
GPIOA->CRL|=0X00000333;
GPIOB->CRL&=0X00000000;
GPIOB->CRL|=0X33333333;
}
void NOP(void)
{ u8 i; for(i=0; i<100; i++); }
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
u8 lcd_busy(void)
{
u8 result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
NOP();
NOP();
result = GPIOB->IDR&0x80;
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(u8 cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
NOP();
NOP();
LCD_data(cmd); // |0x0000ffff
NOP();
NOP();
LCD_EN = 1;
NOP();
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(u8 dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
LCD_data(dat); // |0x0000ffff
NOP();
NOP();
LCD_EN = 1;
NOP();
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init(void)
{
lcd_wcmd(0x34); //扩充指令操作
delay_ms(5);
lcd_wcmd(0x30); //基本指令操作
delay_ms(5);
lcd_wcmd(0x0C); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay_ms(5);
while(lcd_busy());
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(u8 X,u8 Y)
{
u8 pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
#ifndef __12864_H__
#define __12864_H__
#include "sys.h"
/*
const u8 dis1[] = {"2012年10月13日"};
const u8 dis2[] = {"单片机动手制作"};
const u8 dis3[] = {"强强联合--------"};
const u8 dis4[] = {"--------新兴阳光"};
*/
//#define LCD_data GPIOB->ODR //数据口
#define LCD_data(x) GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF); //Pa0-Pa7输出//数据口
#define LCD_RS PCout(7) //寄存器选择输入
#define LCD_RW PCout(8) //液晶读/写控制
#define LCD_EN PCout(9) //液晶使能控制
void lcd_pos(u8 X,u8 Y);
void lcd_init(void);
void lcd_wdat(u8 dat);
void lcd_wcmd(u8 cmd);
u8 lcd_busy(void);
void NOP(void);
void LCD12864_Init(void);
#endif
#include <stm32f10x_lib.h>
#include "sys.h"
#include "delay.h"
#include "12864.H"
/*********************************************************/
/* */
/* 主程序 */
/* */
/*********************************************************/
const u8 dis1[] = {"2012年10月13日"};
const u8 dis2[] = {"单片机动手制作"};
const u8 dis3[] = {"强强联合--------"};
const u8 dis4[] = {"--------新兴阳光"};
int main(void)
{
u8 i;
Stm32_Clock_Init(9);
delay_init(72);
LCD12864_Init();
delay_ms(10); //延时
lcd_init(); //初始化LCD
delay_ms(10);
lcd_init();
delay_ms(100);
while(1)
{
lcd_pos(0,0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis1 != '\0')
{ //显示字符
lcd_wdat(dis1);
i++;
}
lcd_pos(1,0); //设置显示位置为第二行的第1个字符
i = 0;
while(dis2 != '\0')
{
lcd_wdat(dis2); //显示字符
i++;
}
lcd_pos(2,0); //设置显示位置为第三行的第1个字符
i = 0;
while(dis3 != '\0')
{
lcd_wdat(dis3); //显示字符
i++;
}
lcd_pos(3,0); //设置显示位置为第四行的第1个字符
i = 0;
while(dis4 != '\0')
{
lcd_wdat(dis4); //显示字符
i++;
}
while(1);
}
}
|