STM32加上LCM12864R 串行连接 液晶显示问题。。急求解答。。急

有时想起 2014-05-15 03:22:55
现在显示不出数据啊。。求指教 哪里有问题。。串行连接 PSB--PC9,CS----PC7,SDA--PC6,SCLK---PC8.
程序如下


//----------------头文件声明--------------------
#include"stm32f10x_lib.h" //包含所有的头文件
#include<stdio.h>
#define UP 1
#define DOWN 0
//----------------函数声明--------------------
void RCC_Configuration(void);
void GPIO_Configuration(void);
void LCD_GPIO_Config(void);
void send_bit(u8 byte);
void write_command(u8 command);
void write_data(const u8 Data);
void write_zi( u8 *S);
void write_character(u8 address,const u8 *p);
void lcd_pos(u8 X,u8 Y);
void LCD_init(void);
void display_adc(void);
void delay_ms(u16 dly);

const unsigned char table1[]=" ADC值:";
const unsigned char table2[]="电压值:";
u16 adc=5,adc1=9;
u8 qian,bai,shi,ge;
u8 ADC_0,ADC_1,ADC_2,ADC_3,ADC_4;
/*液晶端口定义*/
#define LCD_CS(a) if (a) \
GPIO_SetBits(GPIOC,GPIO_Pin_7);\
else \
GPIO_ResetBits(GPIOC,GPIO_Pin_7)

#define LCD_SID(a) if (a) \
GPIO_SetBits(GPIOC,GPIO_Pin_6);\
else \
GPIO_ResetBits(GPIOC,GPIO_Pin_6)

#define LCD_SCLK(a) if (a) \
GPIO_SetBits(GPIOC,GPIO_Pin_8);\
else \
GPIO_ResetBits(GPIOC,GPIO_Pin_8)

#define LCD_PSB(a) if (a) \
GPIO_SetBits(GPIOC,GPIO_Pin_9);\
else \
GPIO_ResetBits(GPIOC,GPIO_Pin_9)

#define PA1 GPIOA->BSRR
#define PA0 GPIOA->BRR

#define GPIOA_ODR_A (GPIOA_BASE+0x0C)
#define GPIOA_IDR_A (GPIOA_BASE+0x08)
#define GPIOB_ODR_A (GPIOB_BASE+0x0C)
#define GPIOB_IDR_A (GPIOB_BASE+0x08)
#define GPIOC_ODR_A (GPIOC_BASE+0x0C)
#define GPIOC_IDR_A (GPIOC_BASE+0x08)
#define GPIOD_ODR_A (GPIOD_BASE+0x0C)
#define GPIOD_IDR_A (GPIOD_BASE+0x08)
#define GPIOE_ODR_A (GPIOE_BASE+0x0C)
#define GPIOE_IDR_A (GPIOE_BASE+0x08)

#define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x2000000+((Addr&0xfffff)<<5)+(BitNum<<2)))

#define PAout(n) BitBand(GPIOA_ODR_A,n)
#define PAin(n) BitBand(GPIOA_IDR_A,n)
#define PBout(n) BitBand(GPIOB_ODR_A,n)
#define PBin(n) BitBand(GPIOB_IDR_A,n)
#define PCout(n) BitBand(GPIOC_ODR_A,n)
#define PCin(n) BitBand(GPIOC_IDR_A,n)
#define PDout(n) BitBand(GPIOD_ODR_A,n)
#define PDin(n) BitBand(GPIOD_IDR_A,n)
#define PEout(n) BitBand(GPIOE_ODR_A,n)
#define PEin(n) BitBand(GPIOE_IDR_A,n)
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
LCD_GPIO_Config();
LCD_init();
GPIOD->CRH = 0x44444444;
GPIOD->CRL = 0x34433344; //2 3管脚 输出模式 最大速度50MHZ,通用推挽输出
while(1)
{
display_adc();
}
}


void delay_ms(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=60000;j>0;j--);
}

void RCC_Configuration(void)
{
//----------使用外部RC晶振-----------
RCC_DeInit(); //初始化为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟
// while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
//FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK

// while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
// while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); //使能APB2外设的GPIOD的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
}

// /*******************************************************************************
// * Function Name : GPIO_Configuration
// * Description : 初始化GPIO外设
// * Input : None
// * Output : None
// * Return : None
// *******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Configure USARTx_Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USARTx_Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);

}
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIO的外设时钟*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE);
/*选择要用的GPIO引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void send_bit(u8 byte)
{
u8 x;
for(x=0;x<8;x++)
{
if((byte<<x)&0x80)
{
LCD_SID(UP);
}
else
{
LCD_SID(DOWN);
}
LCD_SCLK(DOWN);
LCD_SCLK(UP);
}
delay_ms(5);
}
/********************************************************/
/********************************************************/
/*写指令函数*/
void write_command(u8 command)
{
LCD_CS(UP);
send_bit(0xf8);
send_bit((u32)command&0xf0);
send_bit(((u32)command<<4)&0xf0);
delay_ms(5);
LCD_CS(DOWN);
}
/********************************************************/
/********************************************************/
/*液晶写数据功能函数函数*/
void write_data(const u8 Data)
{
LCD_CS(UP);
send_bit(0xfa);
send_bit((u32)Data&0xf0);
send_bit(((u32)Data<<4)&0xf0);
delay_ms(5);
LCD_CS(DOWN);
}
/********************************************************/
/********************************************************/
/* 显示字符串 */
void write_zi( u8 *S)
{
while(*S!='\0')
{
write_data(*S);
S++;
delay_ms(5);
}
}
/********************************************************/
/********************************************************/
/*在指定位置写入字符串*/
void write_character(u8 address,const u8 *p)
{
write_command(address);
delay_ms(5);
while(*p!='\0')
{
write_data(*p);
p++;
delay_ms(5);
}
}

/********************************************************/

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;
write_command(pos);
}
/********************************************************/
/*LCD 初始化设定*/
void LCD_init(void)
{
LCD_PSB(DOWN);
write_command(0x30); //设置8位数据接口模式,基本指令操作模式
delay_ms(1);
write_command(0x0c); //开显示,关光标,反白关
delay_ms(1);
write_command(0x01); //写入空格清屏
delay_ms(1);
write_command(0x06); //游标及显示右移一位
delay_ms(1);
}

void display_adc(void)
{
qian=adc/1000;
bai=adc%1000/100;
shi=adc%100/10;
ge=adc%10;

ADC_0=adc1/10000;
ADC_1=adc1%10000/1000;
ADC_2=adc1%1000/100;
ADC_3=adc1%100/10;
ADC_4=adc1%10;

write_character(0x80,table1);
delay_ms(10);

lcd_pos(0,4);
write_data(qian+0x30);
write_data(bai+0x30);
write_data(shi+0x30);
write_data(ge+0x30);

write_character(0x88,table2);
delay_ms(10);

lcd_pos(2,4);
write_data(ADC_0+0x30);
write_zi(".");
write_data(ADC_1+0x30);
write_data(ADC_2+0x30);
write_data(ADC_3+0x30);
write_data(ADC_4+0x30);
}
...全文
578 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
caraso 2016-10-13
  • 打赏
  • 举报
回复
咦?STM32可以跑WINCE吗?LZ好像结帖了,能分享一下解决经验吗?
spirrow 2016-10-10
  • 打赏
  • 举报
回复
控制引脚怎么不一样
xvg2389 2014-05-21
  • 打赏
  • 举报
回复
挺复杂啊!!!!!!!!!
zhujinqiang 2014-05-20
  • 打赏
  • 举报
回复
先验证下12864液晶是好的。 然后在网上找个STM32开发板的12864例子跑下试试。
zhxianbin 2014-05-16
  • 打赏
  • 举报
回复
看datasheet 吧,或者网上找个试试
有时想起 2014-05-16
  • 打赏
  • 举报
回复
求解啊============

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧