找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3796|回复: 1
收起左侧

单片机控制LCD1602显示电压和角度值的代码

[复制链接]
ID:391664 发表于 2018-8-30 16:23 | 显示全部楼层 |阅读模式
LCD1602

单片机源程序如下:
  1. #include "include.h"

  2. //LCD1602

  3. /********IO引脚定义***********************************************************/
  4. sbit LCD_RS=P1^0;//定义引脚
  5. sbit LCD_RW=P1^1;
  6. sbit LCD_E=P1^2;

  7. /********宏定义***********************************************************/
  8. #define LCD_Data P0
  9. #define Busy    0x80 //用于检测LCD状态字中的Busy标识

  10. /********数据定义*************************************************************/
  11. //unsigned char code uctech[] = {"MCU218"};

  12. /***********主函数开始********************************************************/       
  13. /*
  14. void main(void)
  15. {
  16.         Delay400Ms();         //启动等待,等LCD讲入工作状态
  17.         LCDInit();                 //初始化
  18.         Delay5Ms();         //延时片刻(可不要)

  19.         DisplayListChar(0, 0, uctech);
  20.         DisplayOneChar(4, 1, 'a');
  21.         ReadDataLCD();        //测试用句无意义
  22.         while(1);
  23. }
  24. */

  25. /***********写数据********************************************************/       
  26. void WriteDataLCD(unsigned char WDLCD)
  27. {
  28.         ReadStatusLCD(); //检测忙
  29.         LCD_Data = WDLCD;
  30.         LCD_RS = 1;
  31.         LCD_RW = 0;
  32.         LCD_E = 0;                 //若晶振速度太高可以在这后加小的延时
  33.         LCD_E = 0;                 //延时
  34.         LCD_E = 1;
  35. }

  36. /***********写指令********************************************************/       
  37. void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
  38. {
  39.         if (BuysC) ReadStatusLCD(); //根据需要检测忙
  40.         LCD_Data = WCLCD;
  41.         LCD_RS = 0;
  42.         LCD_RW = 0;
  43.         LCD_E = 0;
  44.         LCD_E = 0;
  45.         LCD_E = 1;
  46. }

  47. /***********读数据********************************************************/       
  48. unsigned char ReadDataLCD(void)
  49. {
  50.         LCD_RS = 1;
  51.         LCD_RW = 1;
  52.         LCD_E = 0;
  53.         LCD_E = 0;
  54.         LCD_E = 1;
  55.         return(LCD_Data);
  56. }

  57. /***********读状态*******************************************************/       
  58. unsigned char ReadStatusLCD(void)
  59. {
  60.         LCD_Data = 0xFF;
  61.         LCD_RS = 0;
  62.         LCD_RW = 1;
  63.         LCD_E = 0;
  64.         LCD_E = 0;
  65.         LCD_E = 1;
  66.         while (LCD_Data & Busy); //检测忙信号
  67.         return(LCD_Data);
  68. }

  69. /***********初始化********************************************************/       
  70. void LCDInit(void)
  71. {
  72.         LCD_Data = 0;
  73.         WriteCommandLCD(0x38,0);         //三次模式设置,不检测忙信号
  74.         Delay5Ms();
  75.         WriteCommandLCD(0x38,0);
  76.         Delay5Ms();
  77.         WriteCommandLCD(0x38,0);
  78.         Delay5Ms();

  79.         WriteCommandLCD(0x38,1);         //显示模式设置,开始要求每次检测忙信号
  80.         WriteCommandLCD(0x08,1);         //关闭显示
  81.         WriteCommandLCD(0x01,1);         //显示清屏
  82.         WriteCommandLCD(0x06,1);         //显示光标移动设置
  83.         WriteCommandLCD(0x0C,1);         //显示开及光标设置
  84. }

  85. /***********按指定位置显示一个字符*******************************************/       
  86. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  87. {
  88.         Y &= 0x1;
  89.         X &= 0xF;                                 //限制X不能大于15,Y不能大于1
  90.         if (Y) X |= 0x40;                 //当要显示第二行时地址码+0x40;
  91.         X |= 0x80;                         //算出指令码
  92.         WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
  93.         WriteDataLCD(DData);
  94. }

  95. /***********按指定位置显示一串字符*****************************************/       
  96. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  97. {
  98.         unsigned char ListLength;

  99.         ListLength = 0;
  100.         Y &= 0x1;
  101.         X &= 0xF;                                 //限制X不能大于15,Y不能大于1
  102.         while (DData[ListLength]>=0x20){ //若到达字串尾则退出
  103.                    if (X <= 0xF){                 //X坐标应小于0xF
  104.                      DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
  105.                      ListLength++;
  106.                      X++;
  107.             }
  108.           }
  109. }

  110. /***********短延时********************************************************/       
  111. void Delay5Ms(void)
  112. {
  113.         unsigned int TempCyc = 5552;
  114.         while(TempCyc--);
  115. }

  116. /***********长延时********************************************************/       
  117. void Delay400Ms(void)
  118. {
  119.         unsigned char TempCycA = 5;
  120.         unsigned int TempCycB;
  121.         while(TempCycA--)
  122.         {
  123.                   TempCycB=7269;
  124.                   while(TempCycB--);
  125.         }
  126. }

  127. //显示AD转换值
  128. void display_AD_value(unsigned int result)
  129. {

  130.         int i=0;
  131.         unsigned int temp=0;
  132.         unsigned char str[3];
  133.         unsigned int j=100;
  134.         unsigned char k=0;

  135.         DisplayOneChar(0, 0, 'U');        //显示单个字符
  136.         DisplayOneChar(1, 0, '=');        //显示单个字
  137.         DisplayOneChar(6, 0, 'V');        //显示单个字符
  138.        
  139.        
  140.         for(i=0; i<=2; i++)
  141.         {
  142.                 temp=result/j;
  143.                 result=result-j*temp;
  144.                 str[i]=(unsigned char)(temp+0x30);
  145.                 j/=10;
  146.         }
  147.         for(k=0,i=0; i<4; k++,i++)
  148.         {
  149.                 if(i==0)       
  150.                         DisplayOneChar(k+2, 0, str[i]);        //显示单个字符
  151.                 else if(i==1)       
  152.                         DisplayOneChar(k+2, 0, '.');        //显示单个字符
  153.                 else
  154.                 {
  155.                         DisplayOneChar(k+2, 0, str[i-1]);        //显示单个字符       
  156.                 }
  157.                
  158.         }

  159. }

  160. //显示电机转动角度
  161. void display_motor_rotaition(unsigned int result)
  162. {

  163.         int i=0;
  164.         unsigned int temp=0;
  165.         unsigned char str[4];
  166.         unsigned int j=1000;
  167.         unsigned char k=0;
  168.        
  169.         DisplayOneChar(0, 1, 'A');        //显示单个字符
  170.         DisplayOneChar(1, 1, 'n');        //显示单个字
  171.         DisplayOneChar(2, 1, 'g');        //显示单个字符
  172.         DisplayOneChar(3, 1, '=');        //显示单个字符
  173.         DisplayOneChar(9, 1, 'd');        //显示单个字符
  174.         DisplayOneChar(10, 1, 'u');        //显示单个字符
  175.         for(i=0; i<=3; i++)
  176.         {
  177.                 temp=result/j;
  178.                 result=result-j*temp;
  179.                 str[i]=(unsigned char)(temp+0x30);
  180.                 j/=10;
  181.         }
  182.         for(k=0,i=0; i<5; k++,i++)
  183.         {
  184.                 if(i==4)       
  185.                         DisplayOneChar(k+4, 1, str[i-1]);        //显示单个字符
  186.                 else if(i==3)       
  187.                         DisplayOneChar(k+4, 1, '.');        //显示单个字符
  188.                 else
  189.                 {
  190.                         DisplayOneChar(k+4, 1, str[i]);        //显示单个字符       
  191.                 }
  192.                
  193.         }

  194. }

复制代码

所有资料51hei提供下载:
LCD1602.rar (8.88 KB, 下载次数: 12)
回复

使用道具 举报

ID:1 发表于 2018-8-30 17:04 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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