请选择 进入手机版 | 继续访问电脑版

智凡单片机论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 52|回复: 0

LCD1602在STM8S105上的成功移植

[复制链接]

80

主题

80

帖子

288

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
288
发表于 2019-6-17 20:41:28 | 显示全部楼层 |阅读模式
  1. lcd.h文件内容


  2. #ifndef _LCD_H_
  3. #define _LCD_H_
  4. #include "stm8s.h"

  5. #define LCD_RS_1  GPIO_WriteHigh(GPIOC, GPIO_PIN_2)//PC.2置1
  6. #define LCD_RS_0  GPIO_WriteLow(GPIOC, GPIO_PIN_2)//PC.2置0
  7. #define LCD_RW_1  GPIO_WriteHigh(GPIOC, GPIO_PIN_1)//PC.1
  8. #define LCD_RW_0  GPIO_WriteLow(GPIOC, GPIO_PIN_1)
  9. #define LCD_EN_1  GPIO_WriteHigh(GPIOE, GPIO_PIN_5)//PE.5
  10. #define LCD_EN_0  GPIO_WriteLow(GPIOE, GPIO_PIN_5)
  11. #define LCD_DATA_OUT(data)  GPIO_Write(GPIOB, (u8)data)//数据写入PB->ODR



  12. uint8_t Lcd_Busy(void);
  13. void Lcd_Init(void);
  14. void Set_Lcd_Envir(void);
  15. void Lcd_Write_Cmd(uint8_t cmd);
  16. void Lcd_Write_Data(uint8_t data);
  17. void Lcd_Set_Pos(uint8_t row,uint8_t col);
  18. void Lcd_Disp_String(char str[]);
  19. void Lcd_Disp_Num(signed int num);
  20. void Lcd_Disp_Decimal(uint32_t num,uint8_t dot);
  21. int Lcd_Convert(int Lcd_In_Dat);

  22. char* itoa1(signed int value ,char * string ,int radix) ;


  23. #endif


  24. lcd.c文件内容


  25. #include "lcd.h"
  26. #include "delay.h"
  27. #include


  28. void Lcd_Init(void)
  29. {
  30.   Set_Lcd_Envir();//环境设置
  31.   Delay_ms(200);
  32.   Lcd_Write_Cmd(0x38);
  33.   Delay_ms(10);
  34.   Lcd_Write_Cmd(0x38);
  35.   Delay_ms(5);
  36.   Lcd_Write_Cmd(0x38);
  37.   Delay_ms(5);
  38.   Lcd_Write_Cmd(0x08);
  39.   Delay_ms(5);
  40.   Lcd_Write_Cmd(0x06);
  41.   Delay_ms(5);
  42.   Lcd_Write_Cmd(0x01);
  43.   Delay_ms(6);
  44.   Lcd_Write_Cmd(0x0c);
  45.   Delay_ms(5);
  46. }


  47. void Set_Lcd_Envir(void)
  48. {
  49.   //////////////////8位数据位//////////////////////////////
  50.   GPIO_Init(GPIOB, GPIO_PIN_ALL, GPIO_MODE_OUT_OD_HIZ_FAST);    //高速推开漏输出高阻态  “这里设置要注意要不然读不出忙标志位”
  51.   ///////////////////控制脚////////////////////////////////
  52.   GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);//E 控制端
  53.   GPIO_Init(GPIOC, (GPIO_Pin_TypeDef)(GPIO_PIN_1|GPIO_PIN_2), GPIO_MODE_OUT_PP_HIGH_FAST);//RW  和RS控制端
  54.   //这里的强制类型转换(GPIO_Pin_TypeDef)时为了解除其警告。
  55.   //警告原因看其库可知stm库使用的不是结构型的而是联合型的
  56. }


  57. uint8_t Lcd_Busy(void)
  58. {
  59. // GPIO_Write(GPIOB, 0xFF);//这是向端口先写入1以便读取器端口值(这是是在51电片机才需要此步操作)
  60.   LCD_RS_0;
  61.   Delay_us(1);
  62.   LCD_RW_1;
  63.   Delay_us(1);
  64.   do
  65.   {
  66.     LCD_EN_0;
  67.     Delay_us(200);
  68.     LCD_EN_1;
  69.     Delay_us(200);
  70.   }

  71.   while(((uint8_t)GPIOB->IDR) & 0x80);
  72.   LCD_EN_0;
  73.   return (uint8_t)0;
  74. }

  75. void Lcd_Write_Cmd(uint8_t cmd)
  76. {
  77.   while(Lcd_Busy());//等待LCD1602空闲
  78.   LCD_RS_0;    //对同一个寄存器两次写入,中间延时一会
  79.   Delay_us(1);
  80.   LCD_RW_0;
  81.   Delay_us(1);
  82.   LCD_EN_0;
  83.   Delay_us(300);//产生脉冲
  84.   LCD_DATA_OUT(cmd);
  85.   LCD_EN_1;
  86.   Delay_us(300);//必要的延时
  87.   LCD_EN_0;    //下降沿,开始写入有效命令
  88. }

  89. void Lcd_Write_Data(uint8_t data)
  90. {
  91.   while(Lcd_Busy());//等待LCD1602空闲
  92.   LCD_RS_1;
  93.   Delay_us(1);
  94.   LCD_RW_0;
  95.   Delay_us(1);
  96.   LCD_DATA_OUT(data);
  97.   LCD_EN_1;//先拉高
  98.   Delay_us(300); //很重要的延时,经调试,延时300us以上才可以
  99.   LCD_EN_0;       //下降沿,开始写入有效数据
  100. }


  101. void Lcd_Set_Pos(uint8_t row,uint8_t col)
  102. {
  103. if(row==1) Lcd_Write_Cmd(col | 0x80);
  104. else Lcd_Write_Cmd(col | 0xC0);
  105. }

  106. void Lcd_Disp_String(char str[])
  107. {
  108.     uint8_t i=0;
  109. while(str[i] != '\0')
  110. {
  111.     Lcd_Write_Data(str[i]);
  112.     ++i;
  113. }
  114. }

  115. void Lcd_Disp_Num(signed int num)
  116. {

  117.    char  str[9];

  118.   // char * str;


  119. // str=IntToStr(num);

  120.   itoa1(num ,str ,10);
  121.    Lcd_Disp_String(str);//显示字符串
  122. }

  123. void Lcd_Disp_Decimal(uint32_t num,uint8_t dot)
  124. {
  125.    uint8_t i=0,j,k=0,wei,q;
  126.    char str[10];
  127.    if(num>=10000000)wei=8;
  128.    else if(num>=1000000)wei=7;
  129.    else if(num>=100000)wei=6;
  130.    else if(num>=10000)wei=5;
  131.    else if(num>=1000) wei=4;
  132.    else if(num>=100)wei=3;
  133.    else if(num>=10) wei=2;
  134.    else wei=1;
  135.    for(i=wei;i>0;i--)
  136.    {   q=1;
  137.        j=1; //i=1时,q=1,得到个位
  138.     for(;j
  139.     str[k++]=num/q +'0';
  140.     num %= q;
  141.    }
  142.    str[k] = '\0'; //添加字符串结束标志
  143.    for(i=8;i>0;i--)
  144.    {   if((str[i]>='0')&&(str[i]<='9')) break;
  145.    }
  146.    str[i+2]='\0';   //添加字符串结束符
  147.    for(j=0;j
  148.    {
  149.      str[i+1]=str[i];
  150.    }
  151.    str[i+1]='.';       //插入小数点
  152.    Lcd_Disp_String(str);//显示浮点小数
  153. }


  154. int Lcd_Convert(int Lcd_In_Dat)
  155. {
  156.   int i,Lcd_Out_Dat=0, temp=0;
  157.   for(i=0; i<8; i++)
  158.   {
  159.     temp=(Lcd_In_Dat >> i)&0x01;
  160.     Lcd_Out_Dat |= (temp<<(7-i));
  161.   }
  162.   return Lcd_Out_Dat;
  163.   }




  164. char* itoa1(signed int value ,char * string ,int radix)
  165. {
  166. if (value < 0)
  167. {
  168. *string = '-';
  169. value = abs(value);
  170. itoa1(value,string+1,radix);
  171. return string ;
  172. }

  173. if (value%radix == 0 && value/radix == 0) return string;

  174. string = itoa1(value/radix,string,radix);
  175. if (value % radix >10) *string ='A'+value%radix-10;
  176. else *string = '0' + value%radix;

  177. *(string+1) = NULL;

  178. return string+1;

  179. }
复制代码


回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|智凡单片机论坛

GMT+8, 2019-8-25 15:38 , Processed in 0.083694 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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