OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5145|回复: 11

MINI板上实现LCD1602

[复制链接]

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-4-23 20:34:54 | 显示全部楼层 |阅读模式
坚持学习!就能成功!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2013-3-30
在线时间
0 小时
发表于 2013-4-23 22:01:09 | 显示全部楼层
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-23 22:11:02 | 显示全部楼层
怎么了回复【2楼】wolfyesheng:
---------------------------------
怎么了
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-23 22:13:20 | 显示全部楼层
按图接的
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2013-3-30
在线时间
0 小时
发表于 2013-4-23 22:20:31 | 显示全部楼层
回复【4楼】1501697860:
---------------------------------
看不清那图,想请教下!你整理好拿给大家分享下啦
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-24 07:58:33 | 显示全部楼层
好的,LCD1602的PIN接發:1   GND 2   3.3V  3   VO(一般接地就可以了) 4   RS 5   RW 6   LCD CS    7到14 8個PIN接數據線 15     3.3V 16     GND
有問題請聯繫!多謝!
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-25 17:43:23 | 显示全部楼层

#include "stm32f10x.h"
#include "1602.h"
#include "sys.h"
#include "delay.h"

//typedef unsigned char BYTE;
//typedef unsigned char BOOL;
void LCD_Init(void)
{     
     GPIO_InitTypeDef  GPIO_InitStructure;
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
 //參覃彸扢离?籵IO諳
 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 
                        
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //垀衄GPIO峈肮珨濬倰傷諳
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //芢侺怀堤
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //怀堤腔郔湮?薹峈50HZ
 GPIO_Init(GPIOA, &GPIO_InitStructure);   //場宎趙GPIOA傷諳
 GPIO_Init(GPIOB, &GPIO_InitStructure);   //場宎趙GPIOB傷諳

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11|GPIO_Pin_12 |GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //垀衄GPIO峈肮珨濬倰傷諳
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  //芢侺怀堤
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //怀堤腔郔湮?薹峈50HZ
 GPIO_Init(GPIOB, &GPIO_InitStructure);   //場宎趙GPIOB傷諳

  //GPIO_WriteBit(GPIOA,0xffff);
  //GPIO_WriteBit(GPIOB,0xffff);
  GPIO_Write(GPIOA,0XFFFF);  //蔚GPIOA 16跺傷諳?窒离峈詢萇?
  GPIO_Write(GPIOB,0XFFFF);  //蔚GPIOB 16跺傷諳?窒离峈詢萇

    lcd_wcmd(0x38);          //16*2珆尨ㄛ5*7萸淝ㄛ8弇杅擂
 delay_us(200);
 lcd_wcmd(0x0c);          //珆尨羲ㄛ壽嫖梓
 delay_us(200);
 lcd_wcmd(0x06);          //痄雄嫖梓
 delay_us(200);
 lcd_wcmd(0x01);          //?壺LCD腔珆尨囀?
 delay_us(200); 

}


  unsigned char lcd_bz(void)
 {                         // 聆彸LCD疆繕袨怓
 unsigned char result;
 LCD_RS(0);  //0;
 LCD_RW(1);  //1;
 LCD_EN(1);  //1;
 delay_us(1);
 
 result = (GPIO_ReadInputData(GPIOB) & 0x8000)>>8;
 LCD_EN(0); // 0;
 return result;
 }
/******************************迡韜鍔*************************************************/ 
void lcd_wcmd(int cmd)
 {                          // 迡?硌鍔杅擂善LCD
 while(lcd_bz());
 LCD_RS(0); // 0;
 LCD_RW(0); // 0;
 LCD_EN(0); // 0;
 delay_us(1);
 //NOP();
 GPIOB->BSRR = cmd<<8 & 0xff00;  //蔚杅擂冞善P0諳
    GPIOB->BRR = ((~cmd)<<8) & 0xff00;
 //NOP();
 //NOP();
 delay_us(1);
 LCD_EN(1); // 1;
 //NOP();
 //NOP();
 delay_us(1);
 LCD_EN(0); // 0; 
 }
/******************************扢离弇离*************************************************/  
 void lcd_pos(unsigned char pos)
 {                          //扢隅珆尨弇离
 lcd_wcmd(pos | 0x80);
 }

/******************************扢离弇离*************************************************/ 
 void lcd_wdat(int dat)
 {                          //迡?趼睫珆尨杅擂善LCD
 while(lcd_bz());
 LCD_RS(1); //= 1;
 LCD_RW(0); //= 0;
 LCD_EN(0); //= 0;
 
 GPIOB->BSRR = dat<<8 & 0xff00;    ////P0 = dat
    GPIOB->BRR = ((~dat)<<8) & 0xff00;
 delay_us(1);
 //NOP();
 //NOP();
 LCD_EN(1);// = 1;
 delay_us(1);
 //NOP();
 //NOP();
 LCD_EN(0);// = 0;
 }



/**************************1602.H*******************************/
#ifndef __1602_H
#define __1602_H 
 

#define RS  GPIO_Pin_1 //PB1;            
#define RW  GPIO_Pin_2 //PB2;
#define EN  GPIO_Pin_0 //PB0;


#define    LCD_RS(x)  x ? GPIO_SetBits(GPIOB, RS): GPIO_ResetBits(GPIOB, RS)
#define    LCD_RW(x)  x ? GPIO_SetBits(GPIOB, RW): GPIO_ResetBits(GPIOB, RW)
#define    LCD_EN(x)  x ? GPIO_SetBits(GPIOB, EN): GPIO_ResetBits(GPIOB, EN)

 

void LCD_Init(void);
void lcd_wcmd(int cmd);
unsigned char lcd_bz(void);
void lcd_pos(unsigned char pos);
void lcd_wdat(int dat);
#endif


/**************************MAIN*******************************/
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "1602.h"
unsigned char dis1[] = {"   WELCOME  TO   "};
unsigned char dis2[] = {" tony.chen       "};
unsigned char dis3[] = {"   study STM32   "};
unsigned char dis4[] = {" thank you       "};

main()
{
 unsigned char i;
  SystemInit();     //炵苀奀笘場宎趙峈72M   SYSCLK_FREQ_72MHz
 delay_init(72);       //晊奀滲杅場宎趙  
 NVIC_Configuration();   //扢离NVIC笢剿煦郪2:2弇?梩蚥珂撰ㄛ2弇砒茼蚥珂撰
  LED_Init();


 LCD_Init();               // 場宎趙LCD
     delay_ms(10);
    while(1)             
   {
      lcd_wcmd(0x06);            //砃衵痄雄嫖梓
      lcd_pos(0);                //扢离珆尨弇离峈菴珨俴腔菴1跺趼睫
      i = 0;
     while(dis1[ i ] != '\0')
     {                           //珆尨趼睫"WLCOME  TO"
       lcd_wdat(dis1[ i ]);
       i++;
       delay_us(20000);                //諷秶謗趼眳潔珆尨厒僅
     }
      lcd_pos(0x40);             //扢离珆尨弇离峈菴媼俴菴1跺趼睫
      i = 0;
     while(dis2[ i ] != '\0')
     {
       lcd_wdat(dis2[ i ]);      //珆尨趼睫" WWW.PRECHIN.COM  "
       i++;
       delay_us(20000);               //諷秶謗趼眳潔珆尨厒僅
     }
      delay_us(800);                //諷秶礿隱奀潔

      lcd_wcmd(0x01);            //?壺LCD腔珆尨囀?
      delay_us(1);
      lcd_wcmd(0x04);            //砃酘痄雄嫖梓
    
      lcd_pos(15);               //扢离珆尨弇离峈菴珨俴腔菴16跺趼睫
      i = 0;
     while(dis3[ i ] != '\0')
     {                           //珆尨趼睫"WLCOME  TO"
       lcd_wdat(dis3[ i ]);
       i++;
       delay_us(20000);              //諷秶謗趼眳潔珆尨厒僅
     }
      lcd_pos(0x4F);             //扢离珆尨弇离峈菴媼俴腔菴16跺趼睫
      i = 0;
     while(dis4[ i ] != '\0')
     {
       lcd_wdat(dis4[ i ]);      //珆尨趼睫" WWW.PRECHIN.COM  "
       i++;
       delay_us(20000);               //諷秶謗趼眳潔珆尨厒僅
     }
      delay_us(8000);                //諷秶礿隱奀潔

      lcd_wcmd(0x01);            //?壺LCD腔珆尨囀?
   LED0=!LED0;
      delay_us(1000);                //諷秶謗?蛌遙奀潔
          
    }
 }

不好意思,出現的是亂碼,DEBUG中!



 

坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-25 20:43:30 | 显示全部楼层

/********************************************************************************
*  描述:                LCD1602 滚动显示                                       *
* 显示方式:                                                                   *
* 1、从左到右逐字显示,闪动二次,清屏。                                        *
* 2、再从右到左逐字显示,闪动二次,清屏。                                      *
* 3、周期性地重复上述显示方式。                                                *                           
********************************************************************************/
 
#include "stm32f10x_lib.h"

/********************************硬件接口定义*********************************/
#define RS  GPIO_Pin_1 //P2^6;            
#define RW  GPIO_Pin_2 //P2^5;
#define EN  GPIO_Pin_0 //P2^7;

/********************************宏定义*********************************/
#define    LCD_RS(x)  x ? GPIO_SetBits(GPIOB, RS): GPIO_ResetBits(GPIOB, RS)
#define    LCD_RW(x)  x ? GPIO_SetBits(GPIOB, RW): GPIO_ResetBits(GPIOB, RW)
#define    LCD_EN(x)  x ? GPIO_SetBits(GPIOB, EN): GPIO_ResetBits(GPIOB, EN)

/******************************** 变量定义 ---------------------------------------------------------*/
GPIO_InitTypeDef GPIO_InitStructure;     //GPIO
ErrorStatus HSEStartUpStatus;

 
typedef unsigned char BYTE;
typedef unsigned char BOOL;

BYTE dis1[] = {"   WELCOME  TO   "};
BYTE dis2[] = {" tony.chen       "};
BYTE dis3[] = {"   study STM32   "};
BYTE dis4[] = {" thank you       "};

/*********************************声明函数 -----------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void NOP(void);
 

 
/*******************************************延时函数**********************************/
void NOP()
{ vu16 i;
  for(i=0; i<100; i++);
}

/*******************************************延时函数**********************************/
void delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

/******************************测忙*************************************************/ 
 BOOL lcd_bz()
 {                         // 测试LCD忙碌状态
 BOOL result;
 LCD_RS(0);  //0;
 LCD_RW(1);  //1;
 LCD_EN(1);  //1;
 NOP();
 NOP();
 result = (GPIO_ReadInputData(GPIOB) & 0x8000)>>8;
 LCD_EN(0); // 0;
 return result;
 }
/******************************写命令*************************************************/ 
 lcd_wcmd(int cmd)
 {                          // 写入指令数据到LCD
 while(lcd_bz());
 LCD_RS(0); // 0;
 LCD_RW(0); // 0;
 LCD_EN(0); // 0;
 NOP();
 NOP();
 GPIOB->BSRR = cmd<<8 & 0xff00;  //将数据送到P0口
    GPIOB->BRR = ((~cmd)<<8) & 0xff00;
 NOP();
 NOP();
 LCD_EN(1); // 1;
 NOP();
 NOP();
 LCD_EN(0); // 0; 
 }
/******************************设置位置*************************************************/  
 lcd_pos(BYTE pos)
 {                          //设定显示位置
 lcd_wcmd(pos | 0x80);
 }

/******************************设置位置*************************************************/ 
 lcd_wdat(int dat)
 {                          //写入字符显示数据到LCD
 while(lcd_bz());
 LCD_RS(1); //= 1;
 LCD_RW(0); //= 0;
 LCD_EN(0); //= 0;
 
 GPIOB->BSRR = dat<<8 & 0xff00;    ////P0 = dat
    GPIOB->BRR = ((~dat)<<8) & 0xff00;
 NOP();
 NOP();
 LCD_EN(1);// = 1;
 NOP();
 NOP();
 LCD_EN(0);// = 0;
 }
 
 lcd_init()
 {                        //LCD初始化设定
 lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据
 delay(20000);
 lcd_wcmd(0x0c);          //显示开,关光标
 delay(20000);
 lcd_wcmd(0x06);          //移动光标
 delay(20000);
 lcd_wcmd(0x01);          //清除LCD的显示内容
 delay(20000);
 }

 
main()
{
 BYTE i;

#ifdef DEBUG
debug();  //在线调试使用
#endif
 
 RCC_Configuration();      //系统时钟配置函数
 
 NVIC_Configuration();     //NVIC配置函数
   //启动GPIO模块时钟
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);
 //把调试设置普通IO口
 GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE); 
                        
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO为同一类型端口
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //输出的最大频率为50HZ
 GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口
 GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; //所有GPIO为同一类型端口
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //输出的最大频率为50HZ
 GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口


 GPIO_Write(GPIOA,0xffff);  //将GPIOA 16个端口全部置为高电平
 GPIO_Write(GPIOB,0xffff);  //将GPIOB 16个端口全部置为高电

  lcd_init();               // 初始化LCD
     delay(10);
    while(1)             
   {
      lcd_wcmd(0x06);            //向右移动光标
      lcd_pos(0);                //设置显示位置为第一行的第1个字符
      i = 0;
     while(dis1[ i ] != '\0')
     {                           //显示字符"WLCOME  TO"
       lcd_wdat(dis1[ i ]);
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      lcd_pos(0x40);             //设置显示位置为第二行第1个字符
      i = 0;
     while(dis2[ i ] != '\0')
     {
       lcd_wdat(dis2[ i ]);      //显示字符" WWW.PRECHIN.COM  "
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      delay(80000);                //控制停留时间

      lcd_wcmd(0x01);            //清除LCD的显示内容
      delay(1);
      lcd_wcmd(0x04);            //向左移动光标
    
      lcd_pos(15);               //设置显示位置为第一行的第16个字符
      i = 0;
     while(dis3[ i ] != '\0')
     {                           //显示字符"WLCOME  TO"
       lcd_wdat(dis3[ i ]);
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      lcd_pos(0x4F);             //设置显示位置为第二行的第16个字符
      i = 0;
     while(dis4[ i ] != '\0')
     {
       lcd_wdat(dis4[ i ]);      //显示字符" WWW.PRECHIN.COM  "
       i++;
       delay(2000000);                //控制两字之间显示速度
     }
      delay(800000);                //控制停留时间

      lcd_wcmd(0x01);            //清除LCD的显示内容
      delay(100000);                //控制两屏转换时间
          
    }
 }

 

 

/*******************************************************************************
*                           配置RCC
*******************************************************************************/
void RCC_Configuration(void)
{  
 //复位RCC外部设备寄存器到默认值
  RCC_DeInit();

  //打开外部高速晶振
  RCC_HSEConfig(RCC_HSE_ON);

   //等待外部高速时钟准备好
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)   //外部高速时钟已经准别好
  {           
    //开启FLASH的预取功能
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    //FLASH延迟2个周期
    FLASH_SetLatency(FLASH_Latency_2);
  
  //配置AHB(HCLK)时钟=SYSCLK
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
 
   //配置APB2(PCLK2)钟=AHB时钟
    RCC_PCLK2Config(RCC_HCLK_Div1);

    //配置APB1(PCLK1)钟=AHB 1/2时钟
    RCC_PCLK1Config(RCC_HCLK_Div2);

     //配置PLL时钟 == 外部高速晶体时钟*9  PLLCLK = 8MHz * 9 = 72 MHz
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    //使能PLL时钟
    RCC_PLLCmd(ENABLE);

   //等待PLL时钟就绪
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

  //配置系统时钟 = PLL时钟
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

   //检查PLL时钟是否作为系统时钟
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}


/*******************************************************************************
*                             NVIC配置函数
*******************************************************************************/
void NVIC_Configuration(void)
{
 NVIC_InitTypeDef NVIC_InitStructure;
#ifdef  VECT_TAB_RAM 
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif

 
       /* 开启定时器2 */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

 

#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif
 
 

坚持学习!就能成功!
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-25 21:04:42 | 显示全部楼层
上面的程序PZ三合一开发板的程序,可以用,但是入门很难,我已经移植到了MINI板上,有兴趣的朋友可以研究下,我想研究,但是JTAG有问题,仿真不了,悲惨啊!
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2013-3-30
在线时间
0 小时
发表于 2013-4-25 21:26:54 | 显示全部楼层
谢谢分享啦
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
 楼主| 发表于 2013-4-28 10:26:10 | 显示全部楼层
回复【10楼】wolfyesheng:
---------------------------------
http://www.openedv.com/posts/list/14819.htm
上面是已经DEBUG好的代码,你看看吧,提点意见,多谢!你实现了吗?
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

3

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-1-13
在线时间
45 小时
发表于 2018-1-27 18:02:55 | 显示全部楼层
发整个工程文件出来 老铁
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 18:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表