#include "stm32f10x.h"
#include "stdio.h"
#define uchar unsigned char
#define lcd_rs (*(volatile unsigned long *) (42220194))// //pc odr5
//#define lcd_rw (*(volatile unsigned long *) (4222019C))// //pc7
//#define lcd_en (*(volatile unsigned long *) (422181a4)) //pb9
//#define lcd_address
uchar table[]={"welcom"};
/*******************************************************************************
* Function Name : Delay
* Description : Inserts a delay time.
* Input : nCount: specifies the delay time length.
* Output : None
* Return : None
*******************************************************************************/
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
/*****************************************************************
** 函 数 名:
** 功 能:
** 参 数:
** 描 述:
** 使用说明
******************************************************************/
void gpio_init()
{
RCC->APB2ENR |=1<<4; //使能PORTC时钟 当外设时钟没有启用时,软件不能读出外设寄存器的数值
RCC->APB2ENR |=1<<3;//portb enable // 时钟外设配置(2种方式)放在最前边
GPIOC->CRL&=0X0F0FFFff;// 先清空pc5 7 其他位设1不影响默认
GPIOC->CRL|=0X30300000; // Pc5 7设置成输chu 50m
GPIOB->CRH&=0X0F0F0F0f;// 先清空pb9 11 13 15 其他位设1不影响默认
GPIOB->CRH|=0X30303030; // Pb9 11 13 15设置成输出 50M 其中pb11 1315为数据口D0 D1 D2
GPIOC->CRH&=0XFF000Ff0;
GPIOC->CRH|=0X00333003; //pc8 11 12 13 分别为数据口D3 D4 D5 D6
GPIOB->CRL&=0XFF0FF0Ff;
GPIOB->CRL|=0X00300300; //PB5为D7 输出 50M
GPIOC->BRR|=1<<7;// lcd_rw=0;//only allow write not read pc7
}
/*****************************************************************
** 函 数 名:
** 功 能:
** 参 数:
** 描 述:
** 使用说明:
******************************************************************/
void write_Fun(uint8_t fun)
{
if(fun&0x01)GPIOB->BSRR|=1<<11;else GPIOB->BRR|=1<<11;
if(fun&0x02)GPIOB->BSRR|=1<<13;else GPIOB->BRR|=1<<13;
if(fun&0x04)GPIOB->BSRR|=1<<15;else GPIOB->BRR|=1<<15;
if(fun&0x08)GPIOC->BSRR|=1<<8;else GPIOC->BRR|=1<<8;
if(fun&0x10)GPIOC->BSRR|=1<<11;else GPIOC->BRR|=1<<11;
if(fun&0x20)GPIOC->BSRR|=1<<12;else GPIOC->BRR|=1<<12;
if(fun&0x40)GPIOC->BSRR|=1<<13;else GPIOC->BRR|=1<<13;
if(fun&0x80)GPIOB->BSRR|=1<<5;else GPIOB->BRR|=1<<5;
}
/*****************************************************************
** 函 数 名:
** 功 能:
** 参 数:
** 描 述:
** 使用说明:
******************************************************************/
void write_dat(uint8_t dat)
{
//lcd_rs=1;
GPIOC->BSRR|=1<<5;
GPIOC->BRR|=1<<7;// lcd_rw=0;//only allow write not read pc7
GPIOB->BRR|=(1<<9); // lcd_en=0; // pb9
// lcd_address[i]=dat&0x80;
Delay(3800);
write_Fun(dat);
GPIOB->BSRR|=1<<9;// lcd_en=1;
Delay(18000);
GPIOB->BRR|=(1<<9); // lcd_en=0; // pb9
}
/*********************************************************************
** 函 数 名:
** 功 能:
** 参 数:
** 描 述:
** 使用说明
**********************************************************************/
void write_com(uint8_t comm)
{
GPIOC->BRR|=1<<5;// lcd_rs =0;
GPIOC->BRR|=1<<7;// lcd_rw=0;//only allow write not read pc7
GPIOB->BRR|=(1<<9);// lcd_en=0;
// lcd_address=comm&0x80;
Delay(3800);
write_Fun(comm);
GPIOB->BSRR|=1<<9;//lcd_en=1;
Delay(12000);
GPIOB->BRR|=(1<<9); // lcd_en=0; // pb9
}
/*****************************************************************
** 函数库说明:
** 版 本:
** 修 改:
** 修改 日期:
** 使用 说明:
** 版本 更新:
******************************************************************/
void Lcd1602_Init()
{
gpio_init();
write_com(0x38);
Delay(25000);
write_com(0x38);
Delay(25000);
write_com(0x08);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*****************************************************************
** 注意:
** PA0与PA1口经过键盘接地,所以需开两个IO的上拉,具体见程序
******************************************************************/
int main(void)
{
uchar i;
// gpio_init();
Lcd1602_Init();
GPIOB->BRR|=1<<5;
write_com(0x80+3);
for(i=0;i<6;i++)
{
write_dat(table[i]);
Delay(3000000);
}
while(1);
}
|