把程序下载进去没有任何显示,程序如下:#include<stm32f4xx.h>
#define uint unsigned int
#define uchar unsigned char
void Delay(uint z);
//我用的是 D.8 D.9 D.10 D.11
#define RS GPIO_Pin_11
#define RW GPIO_Pin_12
#define EN GPIO_Pin_13
#define CS1 GPIO_Pin_14
#define CS2 GPIO_Pin_15
/*-- 文字: 欢 --*/
/*-- 宋体9; 此字体下对应的点阵为:宽x高=12x12 --*/
/*-- 宽度不是8的倍数,现调整为:宽度x高度=16x12 --*/
uchar huan[] = {0x02,0x00,0xFA,0x00,0x0B,0xE0,0x8C,0x20,0x58,0x40,0x51,0x00,
0x21,0x00,0x21,0x00,0x52,0x80,0x52,0x80,0x84,0x40,0x08,0x20,};
void RCC_Configuration(void) //推挽输出模式 ,管脚配置,不多解释,库函数有
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = RS|RW|EN|CS1|CS2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
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_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
/*写指令函数*/
void LCD_write_cmmand(uchar cmd)
{
GPIO_ResetBits(GPIOB,RS);
GPIO_ResetBits(GPIOB,RW);
GPIO_ResetBits(GPIOB,EN);
GPIO_Write(GPIOD, cmd);
Delay(5);
GPIO_SetBits(GPIOB,EN);
Delay(5);
GPIO_ResetBits(GPIOB,EN);
}
/*写数据函数*/
void LCD_write_data(uchar dat)
{
GPIO_SetBits(GPIOB,RS);
GPIO_ResetBits(GPIOB,RW);
GPIO_ResetBits(GPIOB,EN);
GPIO_Write(GPIOD, dat);
Delay(5);
GPIO_SetBits(GPIOB,EN);
Delay(5);
GPIO_ResetBits(GPIOB,EN);
}
void set_page(uchar page) //设置页,要那一页直接是那个数字就行了
{ //总共有8页,一页是8行点阵点,即128*8
page = 0xb8 | page; //页得首地址为0xB8 1011 1XXX
LCD_write_cmmand(page);
}
void set_line(uchar startline) //设置显示的起始行
{
startline = 0xc0 | startline; //起始行地址为0xc0
LCD_write_cmmand(startline); //设置从哪一行开始,共0--63 11XX XXXX
}
void set_column(uchar column) //设置显示的列
{
column = column & 0x3f; //列的最大值为64,因为分成两个屏了
column = 0x40 | column; //列的首地址为0x40; 01XX XXXX
LCD_write_cmmand(column); //设置列位置
}
void setonoff(uchar onoff) //显示开关函数,1为开,0为关
{
onoff = 0x3e | onoff; //0x3e是关显示,0x3f是开显示0011 111X onoff只能为0或者1;
LCD_write_cmmand(onoff);
}
void selectscreen(uchar screen) //选屏
{
switch(screen)
{
case 0: //全屏
GPIO_ResetBits(GPIOB,CS1);
GPIO_ResetBits(GPIOB,CS2);
break;
case 1: //选左半屏
GPIO_ResetBits(GPIOB,CS1);
GPIO_SetBits(GPIOB,CS2);
break;
case 2: //选右半屏
GPIO_SetBits(GPIOB,CS1);
GPIO_ResetBits(GPIOB,CS2);
break;
default:
break;
}
}
void clearscreen(uchar screen) //清屏
{
uchar i,j;
selectscreen(screen);
LCD_write_cmmand((0xb8)+0);
LCD_write_cmmand((0x40)+0);
for(i=0;i<8;i++) //控制页数0--7,共8页
{
set_page(i);
for(j=0;j<64;j++) //控制列数0-63,共64列
{
LCD_write_data(0x00); //写入0,地址指针自加1
}
}
}
/*LCD初始化函数*/
void LCD_init() //lcd的初始化
{
// LCD_busy(); //忙检测
Delay(100);
selectscreen(0); //两个屏都选
setonoff(0); //关显示
selectscreen(0); //选屏
setonoff(1); //开显示
clearscreen(0); //清屏
set_line(0); //开始行为0
// set_column(0); //开始列为0
// set_page(0); //开始页为0
}
/*显示函数*/
void display(uchar ss,uchar page,uchar column,uchar *p)
{
uchar i;
selectscreen(ss); //选屏
Delay(2);
set_page(page); //写上半页
set_column(column); //控制列
for(i=0;i<16;i++) //控制16列的数据输出,因为一个汉字是16*16点阵的
{
LCD_write_data(p[i]); //汉字的上半部分
//LCD_write_data(*p);
}
set_page(page+1); //写下半页
set_column(column); //控制列
for(i=0;i<16;i++) //控制16列数据的输出
{
LCD_write_data(p[i+16]); //汉字的下半部分
}
}
/*主函数*/
void main()
{
LCD_init(); //lcd初始化
// clearscreen(0);
// set_line(0);
while(1)
{
display(0,0,4,huan); //欢
}
}
/*延时函数*/
void Delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
|