原子老师 是不是在51里的时序 放到STM32里 延时就得增加相应的倍数啊! 还有你看看我 的IO定义 和 写指令 写数据 这几个函数写的对不对 ?除了红色部分就是时序问题了。我看你的AVR的代码了 真没看懂 !
#include <stm32f10x_lib.h>
#include<delay.h>
#include<sys.h>
#include<usart.h>
#define RS (1<<2) //P24 PC2
#define RW (1<<0) //P25 PC0
#define EN (1<<13) //P26 PC13
u8 i;
//设置使能脚为1或者0
#define LCD_RS(x) GPIOC->ODR=(GPIOC->ODR&~RS)|(x?RS:0)
#define LCD_RW(x) GPIOC->ODR=(GPIOC->ODR&~RW)|(x?RW:0)
#define LCD_EN(x) GPIOC->ODR=(GPIOC->ODR&~EN)|(x?EN:0)
u8 dis1[] = "书山有路勤为径,";
u8 dis2[] = "学海无涯苦作舟,";
u8 dis3[] = "咬定青山不放松,";
u8 dis4[] = "立根原在破岩中.";
void delay1(u8 ms)
{
while(ms--)
{
u8 j;
for(j=0;j<250;j++)
{
delay_us(5);
}
}
}
u8 lcd_busy()
{
u8 result;
LCD_RS(0);
LCD_RW(1);
LCD_EN(1);
delay_us(5);
//result = (bit)(P3&0x80);
result=(GPIOB->ODR)&(0X80<<8);
LCD_EN(0);
return(result);
}
void lcd_wcmd(u8 cmd)
{
while(lcd_busy());
LCD_RS(0);
LCD_RW(0);
LCD_EN(0);
delay_us(5);
delay_us(5);
//P3 = cmd;
GPIOB->ODR=0XFF00&(cmd<<8);
delay_us(5);
LCD_EN(1);
delay_us(5);
LCD_EN(0);
}
void lcd_wdat(u8 dat)
{
while(lcd_busy());
LCD_RS(1);
LCD_RW(0);
LCD_EN(0);
//P3 = dat;
GPIOB->ODR=0XFF00&(dat<<8);
delay_us(5);
LCD_EN(1);
delay_us(5);
LCD_EN(0);
}
void lcdinit()
{
RCC->APB2ENR|=1<<3;
RCC->APB2ENR|=1<<4;
GPIOC->CRL&=0XFFFFF0F0;
GPIOC->CRL|=0X00000303;
GPIOC->ODR|=5<<0;
GPIOC->CRH&=0XFF0FFFFF;
GPIOC->CRH|=0X00300000;
GPIOC->ODR|=1<<13;
GPIOB->CRH&=0X000000000;
GPIOB->CRH|=0X333333333;
GPIOB->ODR|=0XFFFF;
lcd_wcmd(0x34); //??????
delay1(5);
lcd_wcmd(0x30); //??????
delay1(5);
lcd_wcmd(0x0C); //???,???
delay1(5);
lcd_wcmd(0x01); //??LCD?????
delay1(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 ;
lcd_wcmd(pos);
}
void display()
{
lcd_pos(0,0); //????????????1???
i = 0;
while(dis1 != '\0')
{ //????
lcd_wdat(dis1);
i++;
lcd_wcmd(0x06); //??LCD?????
delay1(25);
}
lcd_pos(1,0); //????????????1???
i = 0;
while(dis2 != '\0')
{
lcd_wdat(dis2); //????
i++;
lcd_wcmd(0x06); //??LCD?????
delay1(25);
}
lcd_pos(2,0); //????????????1???
i = 0;
while(dis3 != '\0')
{
lcd_wdat(dis3); //????
i++;
lcd_wcmd(0x06); //??LCD?????
delay1(25);
}
lcd_pos(3,0); //????????????1???
i = 0;
while(dis4 != '\0')
{
lcd_wdat(dis4); //????
i++;
lcd_wcmd(0x06); //??LCD?????
delay1(25);
}
}
int main()
{
Stm32_Clock_Init(9);
delay_init(72);
lcdinit();
display();
while(1);
}
|