想实现1602显示Hello,world.但是程序下进去没有反应,芯片是s...
时间:10-02
整理:3721RD
点击:
求大神帮忙看看这个程序为什么实现不了功能呢
头文件:1602.h
#ifndef __1602_H
#define __1602_H
#include "sys.h"
#include "stdlib.h"
#define LCD1602_RS PCout(8)
#define LCD1602_RW PCout(7)
#define LCD1602_E PCout(6)
#define DATAOUT(x) GPIOA->ODR=(GPIOA->ODR&0xff00)|(x&0x00ff);
void lcd1602_Init(void);
void lcd1602_Reset(void);
void Write_com(u8 COM);
void Write_DATA(u8 date);
void lcd162a_Display(u8 dd);
void lcd162a_LocateXY(u8 posx,u8 posy);
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr);
void lcd162a_cls(void);
#endif
.c文件:
#include "1602.h"
#include "sys.h"
#include "delay.h"
#include "stdio.h"
#include "stdlib.h"
void lcd162a_cls(void)
{
Write_com(0x01);
}
void lcd1602_Init(void)
{
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<4;
GPIOA->CRL&=0X00000000;
GPIOA->CRL|=0X33333333;
GPIOA->ODR=0XFF;
GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRH|=0X00000033;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X03C0;
lcd1602_Reset();
lcd162a_cls();
}
void lcd1602_Reset(void)
{
Write_com(0x38);
delay_ms(20);
Write_com(0x38);
delay_ms(20);
Write_com(0x38);
delay_ms(20);
Write_com(0x38);
Write_com(0x08);
lcd162a_cls();
Write_com(0x06);
Write_com(0x0c);
}
void Write_com(u8 COM)
{
delay_ms(2);
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=1;
DATAOUT(COM);
delay_us(2);
LCD1602_E=0;
}
void Write_DATA(u8 date)
{
delay_ms(2);
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=1;
DATAOUT(date);
delay_us(2);
LCD1602_E=0;
}
void lcd162a_Display(u8 dd) //??ê?
{
u8 i=0;
for(i=0;i<16;i++)
{
lcd162a_DispOneChar(i,1,dd++);
dd &=0x7f;
if (dd<32) dd=32;
}
}
void lcd162a_LocateXY(u8 posx,u8 posy) //??ê?1a±ê????
{
u8 temp;
temp=posx & 0xf;
posy &= 0x01;
if(posy) temp |=0x40;
temp |=0x80;
Write_com(temp);
}
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata) //?ú???¨??????ê?
{
lcd162a_LocateXY(x,y);
Write_DATA(Wdata);
}
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr) //??ê?×?·?
{
u8 i,l=0;
while (ptr[l] >31)
{
l++;
};
for (i=0;i<l;i++)
{
lcd162a_DispOneChar(x++,y,ptr);
if ( x == 16 )
{
x = 0;
y ^= 1;
}
}
}
文件名:main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "1602.h"
#include "stdio.h"
u8 *p1="Hello,world.";
int main(void)
{
u8 temp=0;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
lcd1602_Init();
lcd162a_cls();
lcd162a_ePutstr(0,0,p1);
delay_ms(1000);
lcd162a_cls();
while(1)
{
temp &= 0x7f;
if (temp<32)temp=32;
lcd162a_Display( temp++ );
delay_ms(400);
}
}
想实现1602显示Hello,world.但是程序下进去没有反应,芯片是stm32f103rbt6的。
希望大家帮帮忙
头文件:1602.h
#ifndef __1602_H
#define __1602_H
#include "sys.h"
#include "stdlib.h"
#define LCD1602_RS PCout(8)
#define LCD1602_RW PCout(7)
#define LCD1602_E PCout(6)
#define DATAOUT(x) GPIOA->ODR=(GPIOA->ODR&0xff00)|(x&0x00ff);
void lcd1602_Init(void);
void lcd1602_Reset(void);
void Write_com(u8 COM);
void Write_DATA(u8 date);
void lcd162a_Display(u8 dd);
void lcd162a_LocateXY(u8 posx,u8 posy);
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata);
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr);
void lcd162a_cls(void);
#endif
.c文件:
#include "1602.h"
#include "sys.h"
#include "delay.h"
#include "stdio.h"
#include "stdlib.h"
void lcd162a_cls(void)
{
Write_com(0x01);
}
void lcd1602_Init(void)
{
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<4;
GPIOA->CRL&=0X00000000;
GPIOA->CRL|=0X33333333;
GPIOA->ODR=0XFF;
GPIOC->CRH&=0XFFFFFF00;
GPIOC->CRL&=0X00FFFFFF;
GPIOC->CRH|=0X00000033;
GPIOC->CRL|=0X33000000;
GPIOC->ODR|=0X03C0;
lcd1602_Reset();
lcd162a_cls();
}
void lcd1602_Reset(void)
{
Write_com(0x38);
delay_ms(20);
Write_com(0x38);
delay_ms(20);
Write_com(0x38);
delay_ms(20);
Write_com(0x38);
Write_com(0x08);
lcd162a_cls();
Write_com(0x06);
Write_com(0x0c);
}
void Write_com(u8 COM)
{
delay_ms(2);
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=1;
DATAOUT(COM);
delay_us(2);
LCD1602_E=0;
}
void Write_DATA(u8 date)
{
delay_ms(2);
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=1;
DATAOUT(date);
delay_us(2);
LCD1602_E=0;
}
void lcd162a_Display(u8 dd) //??ê?
{
u8 i=0;
for(i=0;i<16;i++)
{
lcd162a_DispOneChar(i,1,dd++);
dd &=0x7f;
if (dd<32) dd=32;
}
}
void lcd162a_LocateXY(u8 posx,u8 posy) //??ê?1a±ê????
{
u8 temp;
temp=posx & 0xf;
posy &= 0x01;
if(posy) temp |=0x40;
temp |=0x80;
Write_com(temp);
}
void lcd162a_DispOneChar(u8 x,u8 y,u8 Wdata) //?ú???¨??????ê?
{
lcd162a_LocateXY(x,y);
Write_DATA(Wdata);
}
void lcd162a_ePutstr(u8 x,u8 y,u8 *ptr) //??ê?×?·?
{
u8 i,l=0;
while (ptr[l] >31)
{
l++;
};
for (i=0;i<l;i++)
{
lcd162a_DispOneChar(x++,y,ptr);
if ( x == 16 )
{
x = 0;
y ^= 1;
}
}
}
文件名:main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "1602.h"
#include "stdio.h"
u8 *p1="Hello,world.";
int main(void)
{
u8 temp=0;
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
lcd1602_Init();
lcd162a_cls();
lcd162a_ePutstr(0,0,p1);
delay_ms(1000);
lcd162a_cls();
while(1)
{
temp &= 0x7f;
if (temp<32)temp=32;
lcd162a_Display( temp++ );
delay_ms(400);
}
}
想实现1602显示Hello,world.但是程序下进去没有反应,芯片是stm32f103rbt6的。
希望大家帮帮忙
顶一下!
主要看下LCD1602的读写时序,延时很重要呢。
延时和读写时序都没有问题啊
实现什么功能呢?可以说清楚点,而且代码那么多 大牛也会没时间看的
提问参考http://bbs.elecfans.com/jishu_426327_1_1.html
谢了 看过后学到了怎么更好的向别人提问 受教了
