如题,我用stm32f103c8t6来控制qc1602a的显示,但是一直显示不出来,贴出代码帮我看看问题在哪,谢了
#include "stm32f10x.h"
/***********LED下管脚定义及初始化**************/
// 接线说明 端口 接线颜色
// VSS GND 绿
// VDD V3.3 蓝
// V0 GND 红
// RS PB0 灰
// RW PB1 白
// E PB2 黑
// D0 PA0 褐
// D1 PA1 红
// D2 PA2 橙
// D3 PA3 黄
// D4 PA4 绿
// D5 PA5 蓝
// D6 PA6 紫
// D7 PA7 灰
// A V3.3 白
// K GND 黑
/************************************************/
/**********宏定义*****************/
#define uchar unsigned char
#define uint unsigned int
/******定义函数****************/
void LCD_init(void);//初始化函数
void LCD_write_command(uchar command);//写指令函数
void LCD_write_data(uchar dat);//写数据函数
void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
void delay_n40us(uint n);//延时函数
void GPIO_Configuration(void);//管脚初始化
void Data_Transfer(uchar data);//基本输出传输函数
/*********主函数*****************/
int main(void)
{
LCD_init();
LCD_disp_char(0,1,'A');
while(1);
}
//*******初始化函数***************
void LCD_init(void)
{
GPIO_Configuration();
LCD_write_command(0x38);//设置8位格式,2行,5x7
LCD_write_command(0x0c);//整体显示,关光标,不闪烁
LCD_write_command(0x06);//设定输入方式,增量不移位
LCD_write_command(0x01);//清除屏幕显示
delay_n40us(300);//实践证明,我的LCD1602上,用for循环200次就能可靠完成清屏指令。
}
/********写指令函数************/
void LCD_write_command(uchar dat)
{
Data_Transfer(dat);
//LCD_RS=0;//指令
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//LCD_RW=0;//写入
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
//LCD_E=1;//允许
GPIO_SetBits(GPIOB,GPIO_Pin_2);
//LCD_E=0;
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
delay_n40us(300);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
/********写数据函数*************/
void LCD_write_data(uchar dat)
{
Data_Transfer(dat);
//LCD_RS=1;//数据
GPIO_SetBits(GPIOB,GPIO_Pin_0);
//LCD_RW=0;//写入
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
//LCD_E=1;//允许
GPIO_SetBits(GPIOB,GPIO_Pin_2);
//LCD_E=0;
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
delay_n40us(300);
}
/*******显示一个字符函数*********/
void LCD_disp_char(uchar x,uchar y,uchar dat)
{
uchar address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
LCD_write_command(address);
LCD_write_data(dat);
}
/********延时函数***************/
void delay_n40us(uint n)
{
uint i;
uchar j;
for(i=n;i>0;i--)
for(j=0;j<2;j++); //在这个延时循环函数中我只做了2次循环,
} //实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
/**********管脚初始化***********/
void GPIO_Configuration()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, 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_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*显示控制管脚定义初始化*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*********基本输出传输函数*******/
void Data_Transfer(uchar data)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_All);
GPIO_SetBits(GPIOA,data);
}
跪谢了 |