你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM8驱动LCD1602的小问题

[复制链接]
Misaya 提问时间:2015-10-28 20:02 /
最近因为接了一个老师的项目,要用STM8单片机做一个小玩意,其中用到了LCD1602.但做了好久,就是做不通。吧代码贴出来,希望大家帮我看看到底是哪里不对。

#include<STM8S103F3P.H>
#define uchar unsigned char
#define uint unsigned int
_Bool LCD1602_RS @PA_ODR:1;
_Bool LCD1602_RW @PA_ODR:2;  
_Bool LCD1602_E @PA_ODR:3;
void Lcd1602_Delay1ms(uint c)
{
uchar a,b;
for (; c>0; c--)
{
   for (b=199;b>0;b--)
   {
     for(a=1;a>0;a--);
   }      
}
     
}
void init_stm8(void)
{
     PA_DDR=0x07;
     PA_CR1=0x07;
     PA_CR2=0x00;

     PB_DDR=0xff;
     PB_CR1=0xff;
     PB_CR2=0x00;
}
void LcdWriteData(uchar dat)   //写入数据
{
LCD1602_E = 0;   //使能清零
LCD1602_RS = 1;   //选择写入数据
LCD1602_RW = 0;   //选择写入
PB_ODR = dat; //由于4位的接线是接到P0口的高四位,所以传送
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
PB_ODR = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
void LcdWriteCom(uchar com)   //写入命令
{
LCD1602_E = 0;  //使能清零
LCD1602_RS = 0;  //选择写入命令
LCD1602_RW = 0;  //选择写入
PB_ODR = com; //由于4位的接线是接到P0口的高四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
// Lcd1602_Delay1ms(1);
PB_ODR = com << 4; //发送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}


void main(void)
{
unsigned char i;
init_stm8();
LcdWriteCom(0x32);  //将8位总线转为4位总线
LcdWriteCom(0x28);  //在四位线下的初始化
LcdWriteCom(0x0c);  //开显示不显示光标
LcdWriteCom(0x06);  //写一个指针加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //设置数据指针起点

LcdWriteData(123);

while(1)
{
}   
}



程序检查没有任何错误,接线也没有任何问题,但LCD就是一点反应都没有。老师也看不出是哪里不对。希望有人能帮看一下到底是哪里的问题
收藏 评论4 发布时间:2015-10-28 20:02

举报

4个回答
peter001 回答时间:2015-10-28 20:51:01
顶一下,,注意上电延时
加拿大 回答时间:2015-10-29 09:22:40
注意设置读写延时
黑夜之狼 回答时间:2015-11-13 11:03:32
还没用过STM8来驱动1602,我发一份STM32驱动代码给LZ参考下吧,注意读写忙检测,也就是延
  1. #include "lcd1602.h"
  2. #include "delay.h"

  3. void GPIO_Configuration(void)
  4. {
  5.         GPIO_InitTypeDef        GPIO_InitStructure;
  6.        
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD,ENABLE);//使能PB,PD端口时钟

  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  10.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  11.         GPIO_Init(GPIOD, &GPIO_InitStructure);                                //初始化GPIOD0~7

  12.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13;
  13.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出
  14.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
  15.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                //初始化GPIB15,14,13
  16. }

  17. /* 等待液晶准备好 */
  18. void LCD1602_Wait_Ready(void)
  19. {
  20.         u8 sta;
  21.        
  22.         DATAOUT(0xff);
  23.         LCD_RS_Clr();
  24.         LCD_RW_Set();
  25.         do
  26.         {
  27.                 LCD_EN_Set();
  28.                 delay_ms(5);        //延时5ms,非常重要
  29.                 sta = GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_7);//读取状态字
  30.                 LCD_EN_Clr();
  31.         }while(sta & 0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止
  32. }

  33. /* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
  34. void LCD1602_Write_Cmd(u8 cmd)
  35. {
  36.         LCD1602_Wait_Ready();
  37.         LCD_RS_Clr();
  38.         LCD_RW_Clr();
  39.         DATAOUT(cmd);
  40.         LCD_EN_Set();
  41.         LCD_EN_Clr();
  42. }

  43. /* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
  44. void LCD1602_Write_Dat(u8 dat)
  45. {
  46.         LCD1602_Wait_Ready();
  47.         LCD_RS_Set();
  48.         LCD_RW_Clr();
  49.         DATAOUT(dat);
  50.         LCD_EN_Set();
  51.         LCD_EN_Clr();
  52. }

  53. /* 清屏 */
  54. void LCD1602_ClearScreen(void)
  55. {
  56.         LCD1602_Write_Cmd(0x01);
  57. }

  58. /* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
  59. void LCD1602_Set_Cursor(u8 x, u8 y)
  60. {
  61.         u8 addr;
  62.        
  63.         if (y == 0)
  64.                 addr = 0x00 + x;
  65.         else
  66.                 addr = 0x40 + x;
  67.         LCD1602_Write_Cmd(addr | 0x80);
  68. }

  69. /* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针 */
  70. void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
  71. {
  72.         LCD1602_Set_Cursor(x, y);
  73.         while(*str != '\0')
  74.         {
  75.                 LCD1602_Write_Dat(*str++);
  76.         }
  77. }

  78. /* 初始化1602液晶 */
  79. void LCD1602_Init(void)
  80. {
  81.         LCD1602_Write_Cmd(0x38);        //16*2显示,5*7点阵,8位数据口
  82.         LCD1602_Write_Cmd(0x0c);        //开显示,光标关闭
  83.         LCD1602_Write_Cmd(0x06);        //文字不动,地址自动+1
  84.         LCD1602_Write_Cmd(0x01);        //清屏
  85. }
复制代码
时问题

基于战舰STM32的1602液晶驱动程序.zip

下载

2.61 MB, 下载次数: 29, 下载积分: ST金币 -1

csg123 回答时间:2018-7-30 14:14:20
谢谢指导
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版