找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32单片机LCD1602 IO乱口理合驱动程序

[复制链接]
ID:640600 发表于 2020-10-30 23:52 | 显示全部楼层 |阅读模式
自己空闲的时间写了一下LCD1602的乱并口然后把各个IO口进行数据理合来输出控制LCD1602  有改善的请提出来
实验平台用的是野火指南者的STM32F103VET6的开发板

制作出来的实物图如下:
IMG_20201030_234237.jpg IMG_20201030_234216.jpg IMG_20201030_234202.jpg

单片机源程序如下:
  1. /*****************************************************************
  2. * @attention 注意: 本程序是LCD1602的乱口的数据传输的驱动适用于任意口的IO口
  3.         * IO口一定要先初始化 不然无法使用
  4.         *
  5. **********************************************************************/
  6. #include "lcd1602_luan.h"

  7. //  sbit RS=P3^5;
  8. //  sbit RW=P3^6;
  9. //  sbit EN=P3^4;
  10. //uchar  tab1[]="2020-09-30 wek:3";//第一行显示0123456789abcdef共16个字符
  11. //uchar  tab2[]="    V temp:  . C"; //第二行显示时钟的模板

  12. uint8_t  tab1_LUAN[]="C0:3.3V C1:3.3V ";//第一行显示0123456789abcdef共16个字符
  13. uint8_t  tab2_LUAN[]="C2:3.3V C3:3.3V "; //第二行显示时钟的模板
  14. uint8_t  tab3_LUAN[]="C4: . V C5: . V ";//第一行显示0123456789abcdef共16个字符
  15. uint8_t  tab4_LUAN[]="                "; //第二行显示时钟的模板

  16. uint8_t  tab5_LUAN[]="                ";//第一行显示0123456789abcdef共16个字符
  17. uint8_t  tab6_LUAN[]="Temper:  .      "; //第二行显示时钟的模板

  18. uint8_t  tab7_LUAN[]="    :  :     :  ";//第一行显示0123456789abcdef共16个字符
  19. uint8_t  tab8_LUAN[]="   Temper:  .   "; //第二行显示时钟的模板



  20. //数据处理函数
  21. /********************************************************************
  22. 函数功能:把一个BYTE输入到LCD的数据引脚。
  23. 入口参数:dat:要写入LCD的数据。
  24. 返    回:无。
  25. 备    注:无。
  26. ********************************************************************/
  27. /*
  28. void SetLcdData(uint8_t dat)
  29. {
  30.     LCD_D0=((dat>>0)&0x01);
  31.     LCD_D1=((dat>>1)&0x01);
  32.     LCD_D2=((dat>>2)&0x01);
  33.     LCD_D3=((dat>>3)&0x01);
  34.     LCD_D4=((dat>>4)&0x01);
  35.     LCD_D5=((dat>>5)&0x01);
  36.     LCD_D6=((dat>>6)&0x01);
  37.     LCD_D7=((dat>>7)&0x01);
  38. }
  39. */
  40. /**///////////////////////Pino Electronics////////////////////////**/
  41. void SetLcdData(uint8_t dat)
  42. {
  43.     LCD_D0=((dat>>0)&0x01);
  44.     LCD_D1=((dat>>1)&0x01);
  45.     LCD_D2=((dat>>2)&0x01);
  46.     LCD_D3=((dat>>3)&0x01);
  47.     LCD_D4=((dat>>4)&0x01);
  48.     LCD_D5=((dat>>5)&0x01);
  49.     LCD_D6=((dat>>6)&0x01);
  50.     LCD_D7=((dat>>7)&0x01);
  51. }


  52. /********************************************************************
  53. 函数功能:从LCD的数据引脚读取一个BYTE。
  54. 入口参数:无。
  55. 返    回:dat:从LCD读取的数据。
  56. 备    注:无。
  57. ********************************************************************/
  58. /*
  59. uint8_t GetLcdData(void)
  60. {
  61.         u8 dat=0;
  62.         if(LCD_D0) dat|=0x01;
  63.         if(LCD_D1) dat|=0x02;
  64.         if(LCD_D2) dat|=0x04;
  65.         if(LCD_D3) dat|=0x08;
  66.         if(LCD_D4) dat|=0x10;
  67.         if(LCD_D5) dat|=0x20;
  68.         if(LCD_D6) dat|=0x40;
  69.         if(LCD_D7) dat|=0x80;
  70.         return dat;
  71. }*/
  72. /**///////////////////////Pino Electronics////////////////////////**/

  73. /********************************************************************
  74. 函数功能:设置光标位置和AC寄存器地址。
  75. 入口参数:line:光标所在的行数,0表示第一行,1表示第二行;
  76.                                         index:光标所在的列数,0表示第一列。
  77. 返    回:无。
  78. 备    注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
  79. ********************************************************************/
  80. /*
  81. void Lcd1602SetAC(u8 line, u8 index)
  82. {
  83.         u8 base;
  84.         if (line==1)
  85.                 base=0xC0;
  86.         else if(line==0)
  87.                 base=0x80;
  88.         else
  89.                 return;
  90.         Lcd1602WriteCmd(base+index);                        //设置RAM地址
  91. }
  92. */
  93. /**///////////////////////Pino Electronics////////////////////////**/


  94. void LCD1602_LUAN_Write_com(uint8_t com)
  95. {                          
  96.         RS_LUAN=0;        RW_LUAN=0; EN_LUAN=0;  
  97. //        P0=com;
  98.         SetLcdData(com);
  99.         EN_LUAN=1;
  100.         delay_ms(5);//必要的延时
  101.         EN_LUAN=0;           //下降沿,LCD1602开始工作
  102. }

  103. void LCD1602_LUAN_Write_data(uint8_t date)
  104. {                        
  105.         RS_LUAN=1;        RW_LUAN=0; EN_LUAN=0;  
  106. //        P0=date;
  107.         SetLcdData(date);
  108.         EN_LUAN=1;                //先拉高
  109.         delay_ms(5);//必要的延时
  110.         EN_LUAN=0;       //下降沿,开始写入有效数据
  111. }

  112. void LCD1602_LUAN_Init(void)
  113. {   
  114.       
  115.         LCD1602_LUAN_Write_com(0x38);  //16*2显示,5*7点阵,8位数据
  116.         LCD1602_LUAN_Write_com(0x0c);  //显示开,关光标;0x08为关显示
  117.         LCD1602_LUAN_Write_com(0x06);  //自动右移光标,0x04为左移光标
  118.         LCD1602_LUAN_Write_com(0x80);  //16*2显示,5*7点阵,8位数据
  119.         LCD1602_LUAN_Write_com(0x01);  //清除LCD的显示内容
  120. }
  121.         
  122. void lcd1602_LUAN_dis1(void)        //显示模板函数
  123. {
  124.         uint8_t i;        //定义一个变量i
  125.         LCD1602_LUAN_Write_com(0x80); //定义第一行
  126.          for(i=0;i<16;i++)         //从数组1调用16个字符
  127.          {
  128.                  LCD1602_LUAN_Write_data(tab1_LUAN[i]);  //调用第一行数组数据
  129.                  delay_ms(5); //延时5毫秒
  130.          }

  131.          LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
  132.          for(i=0;i<16;i++)//从数组调用16个字符
  133.          {
  134.                 LCD1602_LUAN_Write_data(tab2_LUAN[i]); //从数组2调用16个字符
  135.                  delay_ms(5); //延时5毫秒
  136.          }
  137. }
  138.         
  139.         
  140. void lcd1602_LUAN_dis2(void)        //显示模板函数
  141. {
  142.         uint8_t i;        //定义一个变量i
  143.         LCD1602_LUAN_Write_com(0x80); //定义第一行
  144.          for(i=0;i<16;i++)         //从数组1调用16个字符
  145.          {
  146.                  LCD1602_LUAN_Write_data(tab3_LUAN[i]);  //调用第一行数组数据
  147.                  delay_ms(5); //延时5毫秒
  148.          }

  149.          LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
  150.          for(i=0;i<16;i++)//从数组调用16个字符
  151.          {
  152.                 LCD1602_LUAN_Write_data(tab4_LUAN[i]); //从数组2调用16个字符
  153.                  delay_ms(5); //延时5毫秒
  154.          }
  155. }
  156.         
  157.         
  158. void lcd1602_LUAN_dis3(void)        //显示模板函数
  159. {
  160.         uint8_t i;        //定义一个变量i
  161.         LCD1602_LUAN_Write_com(0x80); //定义第一行
  162.          for(i=0;i<16;i++)         //从数组1调用16个字符
  163.          {
  164.                  LCD1602_LUAN_Write_data(tab7_LUAN[i]);  //调用第一行数组数据
  165.                  delay_ms(5); //延时5毫秒
  166.          }
  167.         LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
  168.          for(i=0;i<16;i++)//从数组调用16个字符
  169.          {
  170.                 LCD1602_LUAN_Write_data(tab8_LUAN[i]); //从数组2调用16个字符
  171.                 delay_ms(5); //延时5毫秒
  172.          }
  173. }
  174.         
  175.         
  176. //        /******************LCD1602显示时间*********************/

  177. //        void lcd1602_dis2()         //显示时间
  178. //        {
  179. //        LCD1602_dw(2,7,shi/10) ;          //第二行 的第8位装秒的十位
  180. //        LCD1602_dw(2,8,shi%10) ;         //第二行 的第9位装秒的个位        
  181. //        LCD1602_Write_com(0x80+0x40+9);//第二行 的第10个位置
  182. //        LCD1602_Write_data(':');//送一个:        
  183. //        LCD1602_dw(2,10,fen/10) ;          //第二行 的第14位装秒的十位
  184. //        LCD1602_dw(2,11,fen%10) ;         //第二行 的第15位装秒的个位
  185. //        LCD1602_Write_com(0x80+0x40+12);//第二行 的第13个位置
  186. //        LCD1602_Write_data(':');//送一个:
  187. //        LCD1602_dw(2,13,miao/10) ;          //第二行 的第14位装秒的十位
  188. //        LCD1602_dw(2,14,miao%10) ;         //第二行 的第15位装秒的个位
  189. //        }

  190. void LCD1602_LUAN_GPIO_Init(void)
  191. {
  192.         
  193.         GPIO_InitTypeDef GPIO_InitStructure;  //声明一个结构体变量,用来初始化GPIO
  194.         RCC_APB2PeriphClockCmd(LED_PORT_RCC_LUAN,ENABLE);//* 开启GPIO时钟
  195.         /*  配置GPIO的模式和IO口 */
  196.         GPIO_InitStructure.GPIO_Pin=LED_PIN1_LUAN;          //选择你要设置的IO口---E端口
  197.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//选择你要设置的IO模式
  198.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置速度
  199.         GPIO_Init(LED_PORT1_LUAN,&GPIO_InitStructure);                /* 初始化GPIO ---E端口*/
  200.         /************配置端口F***************/
  201.         GPIO_InitStructure.GPIO_Pin=LED_PIN2_LUAN;          //选择你要设置的IO口---F端口
  202.         GPIO_Init(LED_PORT2_LUAN,&GPIO_InitStructure);                /* 初始化GPIO ----F端口*/


  203. }





  204. /************************************************************
  205. 使用


  206. void main(void)
  207. {
  208.         LCD1602_GPIO_Init();
  209.     LCD1602_Init();
  210.     lcd1602_dis1();
  211. }


  212. **********************************************************/




  213. /********************************************************************
  214. 函数功能:设置光标位置和AC寄存器地址。
  215. 入口参数:line:光标所在的行数,0表示第一行,1表示第二行;
  216.                                         index:光标所在的列数,0表示第一列。
  217.                                         date :数字  数字变为对应字符需要 |0x30即可 +0x30
  218. 返    回:无。
  219. 备    注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
  220. 特定位置显示特定数值
  221. ********************************************************************/
  222. void Lcd1602_LUAN_SetAC_Date(u8 line, u8 index,u8 date)
  223. {
  224.         u8 base;
  225.         if (line==1)
  226.                 base=0xC0;
  227.         else if(line==0)
  228.                 base=0x80;
  229.         else
  230.                 return;
  231.         LCD1602_LUAN_Write_com(base+index);                        //设置RAM地址
  232.         LCD1602_LUAN_Write_data(date);               //输入要显示的数据
  233. }


  234. /*********************************************************
  235. 特定位置显示特定数值
  236. ************************************************************/


  237. //第一行的界面设置函数
  238. /********************************************************************
  239. 函数功能:设置光标位置和AC寄存器地址。第一行的界面设置函数
  240. 入口参数:                        index:光标所在的列数。
  241.                                         date :数字  数字变为对应字符需要 |0x30即可 +0x30
  242. 返    回:无。
  243. 备    注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
  244. 特定位置显示特定数值
  245. ********************************************************************/
  246. void LCD1602_LUAN_Display_line1(u8 index,u8 date)
  247. {
  248.         LCD1602_LUAN_Write_com(0x80+index);                        //设置RAM地址
  249.         LCD1602_LUAN_Write_data(date);               //输入要显示的数据        
  250.         delay_ms(5); //延时5毫秒
  251. }

  252. //第二行的界面设置函数
  253. /********************************************************************
  254. 函数功能:设置光标位置和AC寄存器地址。第二行的界面设置函数
  255. 入口参数:                        index:光标所在的列数。
  256.                                         date :数字  数字变为对应字符需要 |0x30即可 +0x30
  257. 返    回:无。
  258. 备    注:1602屏可显示两行,每行16个字符,地址分别为00H-0FH,40H-4FH。
  259. 特定位置显示特定数值
  260. ********************************************************************/
  261. void LCD1602_LUAN_Display_line2(u8 index,u8 date)
  262. {
  263.         LCD1602_LUAN_Write_com(0xC0+index);                        //设置RAM地址
  264.         LCD1602_LUAN_Write_data(date);               //输入要显示的数据        
  265.         delay_ms(5); //延时5毫秒
  266. }





  267. //自己做的稳定的不会闪烁的界面1
  268. void LCD1602_LUAN_Interface_1(void)
  269. {
  270.         //第一行
  271.         LCD1602_LUAN_Display_line1(0,'C');
  272.         LCD1602_LUAN_Display_line1(1,'0');
  273.         LCD1602_LUAN_Display_line1(2,':');        
  274.         LCD1602_LUAN_Display_line1(4,'.');
  275.         LCD1602_LUAN_Display_line1(6,'V');
  276.         LCD1602_LUAN_Display_line1(7,' ');
  277.         
  278.         LCD1602_LUAN_Display_line1(8,'C');
  279.         LCD1602_LUAN_Display_line1(9,'1');
  280.         LCD1602_LUAN_Display_line1(10,':');        
  281.         LCD1602_LUAN_Display_line1(12,'.');
  282.         LCD1602_LUAN_Display_line1(14,'V');
  283.         LCD1602_LUAN_Display_line1(15,' ');
  284.         
  285.         //第2行
  286.         LCD1602_LUAN_Display_line2(0,'C');
  287.         LCD1602_LUAN_Display_line2(1,'2');
  288.         LCD1602_LUAN_Display_line2(2,':');        
  289.         LCD1602_LUAN_Display_line2(4,'.');
  290.         LCD1602_LUAN_Display_line2(6,'V');
  291.         LCD1602_LUAN_Display_line2(7,' ');
  292.         
  293.         LCD1602_LUAN_Display_line2(8,'C');
  294.         LCD1602_LUAN_Display_line2(9,'3');
  295.         LCD1602_LUAN_Display_line2(10,':');        
  296.         LCD1602_LUAN_Display_line2(12,'.');
  297.         LCD1602_LUAN_Display_line2(14,'V');
  298.         LCD1602_LUAN_Display_line2(15,' ');
  299.                         
  300. }

  301. //自己做的稳定的不会闪烁的界面2
  302. void LCD1602_LUAN_Interface_2(void)
  303. {
  304.         uint8_t i=0;
  305.         //第一行
  306.         LCD1602_LUAN_Display_line1(0,'C');
  307.         LCD1602_LUAN_Display_line1(1,'4');
  308.         LCD1602_LUAN_Display_line1(2,':');        
  309.         LCD1602_LUAN_Display_line1(4,'.');
  310.         LCD1602_LUAN_Display_line1(6,'V');
  311.         LCD1602_LUAN_Display_line1(7,' ');
  312.         
  313.         LCD1602_LUAN_Display_line1(8,'C');
  314.         LCD1602_LUAN_Display_line1(9,'5');
  315.         LCD1602_LUAN_Display_line1(10,':');        
  316.         LCD1602_LUAN_Display_line1(12,'.');
  317.         LCD1602_LUAN_Display_line1(14,'V');
  318.         LCD1602_LUAN_Display_line1(15,' ');
  319.         
  320.         //第2行
  321.         /*
  322.         LCD1602_Display_line1(0,'C');
  323.         LCD1602_Display_line1(1,'2');
  324.         LCD1602_Display_line1(2,':');        
  325.         LCD1602_Display_line1(4,'.');
  326.         LCD1602_Display_line1(6,'V');
  327.         LCD1602_Display_line1(7,' ');
  328.         
  329.         LCD1602_Display_line1(8,'C');
  330.         LCD1602_Display_line1(9,'3');
  331.         LCD1602_Display_line1(10,':');        
  332.         LCD1602_Display_line1(12,'.');
  333.         LCD1602_Display_line1(14,'V');
  334.         LCD1602_Display_line1(15,' ');
  335.         */
  336.         //第2行
  337.         LCD1602_LUAN_Write_com(0x80+0x40); //定义第二行
  338.          for(i=0;i<16;i++)//从数组调用16个字符
  339.          {
  340.                 LCD1602_LUAN_Write_data(tab4_LUAN[i]); //从数组2调用16个字符
  341.                 delay_ms(5); //延时5毫秒
  342.          }
  343. }

  344. //自己做的稳定的不会闪烁的界面3
  345. void LCD1602_LUAN_Interface_3(void)
  346. {
  347.                 //第一行
  348.         LCD1602_LUAN_Display_line1(0,'C');
  349.         LCD1602_LUAN_Display_line1(1,'0');
  350.         LCD1602_LUAN_Display_line1(2,':');        
  351.         LCD1602_LUAN_Display_line1(4,'.');
  352.         LCD1602_LUAN_Display_line1(6,'V');
  353.         LCD1602_LUAN_Display_line1(7,' ');
  354.         
  355.         LCD1602_LUAN_Display_line1(8,'C');
  356.         LCD1602_LUAN_Display_line1(9,'1');
  357.         LCD1602_LUAN_Display_line1(10,':');        
  358.         LCD1602_LUAN_Display_line1(12,'.');
  359.         LCD1602_LUAN_Display_line1(14,'V');
  360.         LCD1602_LUAN_Display_line1(15,' ');
  361.         
  362.         //第2行
  363.         LCD1602_LUAN_Display_line2(0,'C');
  364.         LCD1602_LUAN_Display_line2(1,'2');
  365.         LCD1602_LUAN_Display_line2(2,':');        
  366.         LCD1602_LUAN_Display_line2(4,'.');
  367.         LCD1602_LUAN_Display_line2(6,'V');
  368.         LCD1602_LUAN_Display_line2(7,' ');
  369.         
  370.         LCD1602_LUAN_Display_line2(8,'C');
  371.         LCD1602_LUAN_Display_line2(9,'3');
  372.         LCD1602_LUAN_Display_line2(10,':');        
  373.         LCD1602_LUAN_Display_line2(12,'.');
  374.         LCD1602_LUAN_Display_line2(14,'V');
  375.         LCD1602_LUAN_Display_line2(15,' ');

  376. }
复制代码

全部资料51hei下载地址:
LCD1602实验乱口.7z (356.21 KB, 下载次数: 17)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2020-11-1 04:08 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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