初级会员

- 积分
- 79
- 金钱
- 79
- 注册时间
- 2016-8-13
- 在线时间
- 9 小时
|
5金钱
在做串口测试LCD的程序,接口定义见#define,但是在用J-LINK下载之后,液晶屏只有背光亮,数据端进不去,编译没有错误不知道什么原因,希望有人能稍微看下。
液晶屏略有特殊,带字库,然后起始需要同步信号,5位高电平同步信号后跟一个低电平跟0/1(取决数据/命令方向)跟0,然后后16位每个8位中的高四位传输数据,低四位为零。
#include "stm32f10x.h"
#include "stm32_eval.h"
#include <stdio.h>
#define SID GPIOE_Pin_11
#define CS GPIOE_Pin_7
#define SCLK GPIOD_Pin_14
#define PSB GPIO_ResetBits(GPIOD,GPIO_Pin_9)
static u8 fac_us=0;//ms延时倍乘数
static u16 fac_ms=0;
void IO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//使能PORTB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_11; //端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure); //根据设定参数初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_14; //端口配置, 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure); //根据设定参数初始
}
void DelayInit()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8
fac_us=SystemCoreClock/8000000; //为系统时钟的1/8
fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数
}
void DelayUs(unsigned long nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{ GPIO_SetBits(GPIOE,GPIO_Pin_12);
//SID = 1;
}
else
{
GPIO_ResetBits(GPIOE,GPIO_Pin_12);
//SID = 0;
}
GPIO_ResetBits(GPIOD,GPIO_Pin_14);
GPIO_SetBits(GPIOD,GPIO_Pin_14);
//SCLK = 0;
//SCLK = 1;
}
}
void write_com(unsigned char cmdcode)
{GPIO_SetBits(GPIOE,GPIO_Pin_7);
//CS = 1;
sendbyte(0xf8);
sendbyte(cmdcode & 0xf0);
sendbyte((cmdcode << 4) & 0xf0);
DelayUs(20);
}
void write_data(unsigned char Dispdata)
{
GPIO_SetBits(GPIOE,GPIO_Pin_7);
//CS = 1;
sendbyte(0xfa);
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
DelayUs(20);
}
void lcdinit()
{
DelayUs(200000);
write_com(0x30);
DelayUs(500);
write_com(0x0c);
DelayUs(500);
}
void L12864_num(unsigned char hang,unsigned char lie,char sign)
{
switch(hang)
{
case 1: write_com(0x80+lie);break;
case 2: write_com(0x90+lie);break;
case 3: write_com(0x88+lie);break;
case 4: write_com(0x98+lie);break;
default:break;
}
write_data(sign+48);
}
void L12864_char(unsigned char hang,unsigned char lie,char sign)
{
switch(hang)
{
case 1: write_com(0x80+lie);break;
case 2: write_com(0x90+lie);break;
case 3: write_com(0x88+lie);break;
case 4: write_com(0x98+lie);break;
default:break;
}
//write_data(00);
write_data(sign);
}
void L12864_string(unsigned char hang,unsigned char lie,unsigned char *p)
{
switch(hang)
{
case 1: write_com(0x80+lie);break;
case 2: write_com(0x90+lie);break;
case 3: write_com(0x88+lie);break;
case 4: write_com(0x98+lie);break;
default:break;
}
while(*p>0)
{
write_data(*p);
p++;
}
}
int main(void)
{
DelayInit();
IO_Init();
DelayUs(100);
lcdinit(); //LCD初始化
DelayUs(100);
L12864_string(1,0,"串行口传输方式:");
L12864_string(2,0,"Today is LED-234");
L12864_num(3,3,9);
}
|
|