51单片机复习程序例举004--HD44780控制的1602LCD

发布者:光子梦境最新更新时间:2017-09-18 来源: eefocus关键字:51单片机  HD44780  1602LCD 手机看文章 扫描二维码
随时随地手机看文章

1、在HD44780控制的1602LCD的显示屏上显示两条字符串 和 两个用户自定义的字符


  1. /****************************************************************************** 

  2.  *  说明:AT89S52芯片,12M晶振 

  3.  *  外设:HD44780控制的1602LCD:两行显示,每行最多显示40个预显示字符中的16个字符 

  4.  *        11条控制指令  

  5.  *  本程序:在HD44780控制的1602LCD上显示2行字符串,按键K1,显示一个用户自定义字符 

  6.  *          循环按键,循环显示 

  7.  ******************************************************************************/  

  8.   

  9. #include  

  10. #include  

  11.   

  12. sbit K1 = P1^4 ;    //按键  

  13.   

  14. sbit RS = P2^0 ;    //对象标志位: = 0(对象是指令或状态位);= 1(对象是数据)  

  15. sbit RW = P2^1 ;    //读写标志位: = 0(写);= 1(读)  

  16. sbit E  = P2^2 ;    //使能位:为 1 时,读写信息,为 负跳变 时,执行指令  

  17. sbit BF = P0^7 ;    //HD44780控制的1602LCD的 忙 状态位(只能通过指令读取)  

  18.   

  19. //用户要显示的字符串  

  20. unsigned char code sys_str1[] = "Dragon_CSU" ;  

  21. unsigned char code sys_str2[] = "Good_Luck" ;  

  22.   

  23. //用户自定义的字符编码方式:在8*8的点阵中选“右上角”的“5列*7行”点阵 存放数据  

  24. unsigned char code user_str[] = {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};/* 自定义字符 ℃ */  

  25.   

  26.   

  27. /****************************************************************************** 

  28.  *  名称:delay1ms() 

  29.  *  功能:延时1ms 

  30.  *  参数:int t 

  31.  *  返回:无 

  32.  ******************************************************************************/  

  33. void delay1ms(int t)  

  34. {  

  35.     unsigned char i ;  

  36.   

  37.     while(t--)  

  38.     {  

  39.         for(i = 0 ; i < 125 ; i++)  

  40.         {  

  41.             ;  

  42.         }  

  43.     }  

  44. }  

  45.   

  46.   

  47.   

  48. /****************************************************************************** 

  49.  *  名称:Busy_Test() 

  50.  *  功能:检测HD44780控制的1602LCD是否处于忙状态 

  51.  *  参数:无                                

  52.  *  返回:bit result  忙则返回 1 , 不忙则返回 0 。 

  53.  ******************************************************************************/  

  54. bit Busy_Test(void)  

  55. {  

  56.     //1、定义变量,存储返回值  

  57.     bit result ;  

  58.   

  59.     //2、读状态位  

  60.     RS = 0 ; RW = 1 ;   

  61.     E = 1 ;  

  62.     _nop_() ; _nop_() ; _nop_() ; _nop_() ;  //延时4个机器周期,给硬件响应,  

  63.                                              //即:使E=1;稳定  

  64.     result = BF ;   //将忙状态位BF的值读给函数要返回的变量  

  65.   

  66.     //3、将时能位E复位到低电平  

  67.     E = 0 ;  

  68.   

  69.     //4、将忙状态位读的结果作为函数的参数返回  

  70.     return result ;  

  71.   

  72. }   

  73.   

  74.   

  75. /****************************************************************************** 

  76.  *  名称:Write_Com() 

  77.  *  功能:向HD44780写控制1602LCD的控制指令 

  78.  *  参数:unsigned char dictate 

  79.  *  返回:无 

  80.  ******************************************************************************/  

  81.  void Write_Com(unsigned char dictate)  

  82.  {  

  83.     //1、检测LCD忙状态,忙,则等待  

  84.     while(Busy_Test() == 1) { ; }  

  85.   

  86.     //2、向HD44780控制的1602LCD写控制指令  

  87.         /*----2.1、操作对象是指令,执行对象:写入----------------------------*/  

  88.             RS = 0 ;  

  89.             RW = 0 ;  

  90.   

  91.         /*----2.2、在E 为 0 时,先将指令数据写到P0口的DB0--DB7数据线上-------*/  

  92.             E = 0 ;  

  93.   

  94.             _nop_() ; //给硬件反应时间,等待E = 0 ;稳定   

  95.             _nop_() ;  

  96.   

  97.             P0 = dictate ;  //将指令先暂时写到数据线上  

  98.   

  99.             _nop_() ; //确保硬件把指令数据写完了  

  100.             _nop_() ;   

  101.             _nop_() ;   

  102.             _nop_() ;   

  103.   

  104.         /*----2.3、在E 为 1 时,将数据线上的指令数据写到DH44780的寄存器里----*/  

  105.             E = 1 ;  

  106.             _nop_(); _nop_(); _nop_(); _nop_(); //等待 E = 1 稳定  

  107.   

  108.         /*----2.4、在E 为 下降沿 时,执行写入的指令--------------------------*/  

  109.             E = 0 ; //从 E = 1 到 E = 0 产生下降沿,HD44780执行指令  

  110.   

  111.  }  

  112.   

  113.   

  114. /****************************************************************************** 

  115.  *  名称:Write_Address() 

  116.  *  功能:通过指令来控制第一个要显示的字符或下一个即将要显示的字符在LCD上的位置 

  117.  *  参数:unsigned char addr  在LCD上要显示的位置 

  118.  *  返回:无 

  119.  ******************************************************************************/  

  120. void Write_Address(unsigned char addr)  

  121. {  

  122.     //向HD44780写指令8:设定DDRAM地址的指令。  

  123.     //即:即将要显示的字符在1602LCD上的指令需要的地址 = 0x80|(字符在LCD屏幕上的位置)  

  124.     Write_Com(0x80|addr) ;  

  125. }  

  126.   

  127. /****************************************************************************** 

  128.  *  名称:Write_Data() 

  129.  *  功能:1、向HD44780控制的1602LCD写要显示的字符数据; 

  130.  *        2、向CGRAM中,对应地址的存储单元写用户自定义的字符数据 

  131.  *  参数:unsigned char char_data 要显示的字符(其实字符的值和它的ASCII码值一样) 

  132.  *  返回:无 

  133.  ******************************************************************************/  

  134. void Write_Data(unsigned char char_data)  

  135. {  

  136.     //1、检测HD44780控制的1602LCD忙状态位,忙,则等待  

  137.     while(Busy_Test() == 1) { ; }  

  138.     //2、向HD44780控制的1602LCD写要显示的字符数据  

  139.         /*----2.1、操作对象是数据,执行对象:写入----------------------------*/  

  140.             RS = 1 ;  

  141.             RW = 0 ;  

  142.   

  143.         /*----2.1、在E 为 0 时,先将字符数据写到P0口的DB0--DB7数据线上-------*/  

  144.             E = 0 ;  

  145.             _nop_() ; _nop_() ; //给硬件反应时间,等待E = 0 ;稳定  

  146.             P0 = char_data ;    //将字符数据先暂时写到数据线上  

  147.             _nop_() ; _nop_() ; _nop_() ; _nop_() ; //确保硬件把字符数据写完了  

  148.   

  149.         /*----2.2、在E 为 1 时,将数据线上的字符数据写到DH44780的寄存器里----*/  

  150.             E = 1 ;  

  151.             _nop_(); _nop_(); _nop_(); _nop_(); //等待 E = 1 稳定  

  152.   

  153.         /*----2.3、在E 为 下降沿 时,执行写入的指令--------------------------*/  

  154.             E = 0 ; //从 E = 1 到 E = 0 产生下降沿,HD44780执行指令  

  155.   

  156. }  

  157.   

  158. /****************************************************************************** 

  159.  *  名称:HD44780_1602LCD_Init() 

  160.  *  功能:对HD44780控制的1602LCD进行初始化 (包含硬件类型,屏显,光标) 

  161.  *  参数:无 

  162.  *  返回:无 

  163.  ******************************************************************************/  

  164. void HD44780_1602LCD_Init(void)  

  165. {  

  166.     //1、首次写指令前,给LCD硬件一段较长的反应时间  

  167.     delay1ms(15) ;  

  168.     //2、显示模式设置  

  169.         /*----1、匹配硬件的设置: 指令6:8位数据线,2行显示,5*7点阵------------*/  

  170.         Write_Com(0x38) ; delay1ms(5) ; //3次写指令,确保硬件匹配成功  

  171.         Write_Com(0x38) ; delay1ms(5) ;   

  172.         Write_Com(0x38) ; delay1ms(5) ;   

  173.   

  174.         /*----2、显示屏、光标、闪烁的设置: 指令4:开显示,开光标,光标闪烁------*/  

  175.         Write_Com(0x0f) ; delay1ms(5) ;  

  176.   

  177.         /*----3、光标、屏幕移动的设置: 指令3:光标右移,屏幕整体不移动----------*/  

  178.         Write_Com(0x06) ; delay1ms(5) ;  

  179.   

  180.     //3、清屏。指令1  

  181.     Write_Com(0x01) ; delay1ms(5) ;    

  182.   

  183. }  

  184.   

  185.   

  186.   

  187. /****************************************************************************** 

  188. =============================================================================== 

  189.                        void main(void)函数部分 

  190. =============================================================================== 

  191. *******************************************************************************/  

  192. void main(void)  

  193. {  

  194.     //1、定义相关变量  

  195.     unsigned char i ;  

  196.   

  197.     //2、对HD44780控制的1602LCD进行初始化  

  198.     HD44780_1602LCD_Init() ;  

  199.   

  200.     //3、在HD44780控制的1602LCD上显示信息  

  201.     while(1)  

  202.     {  

  203.         /*----3.1要显示的字符来源于CGROM的160个字符的库-----------------*/  

  204.         //3.1.1 根据需求选择是否清屏  

  205.         Write_Com(0x01) ; delay1ms(5) ;  

  206.   

  207.         //3.1.2 在显示1602LCD上显示第一个字符串  

  208.             //3.1.2.1 设置在LCD1602上显示字符的开始位置 : 从 第1行 坐标0 开始显示  

  209.             Write_Address(0x00+0) ; delay1ms(5) ;     

  210.   

  211.             //3.1.2.2 显示要显示的字符串  

  212.             i = 0 ;  

  213.             while(sys_str1[i] != '\0')  

  214.             {  

  215.                 Write_Data(sys_str1[i]) ;  

  216.                 i++ ;  

  217.                 delay1ms(100) ;  

  218.             }  

  219.   

  220.         //3.1.3 在显示1602LCD上显示第二个字符串  

  221.             //3.1.3.1 设置在LCD1602上显示字符的开始位置 : 从 第2行 坐标0 开始显示  

  222.             Write_Address(0x40+0) ; delay1ms(5) ;     

  223.   

  224.             //3.1.3.2 显示要显示的字符串  

  225.             i = 0 ;  

  226.             while(sys_str2[i] != '\0')  

  227.             {  

  228.                 Write_Data(sys_str2[i]) ;  

  229.                 i++ ;  

  230.                 delay1ms(100) ;  

  231.             }  

  232.             //3.1.3.3 无按键按下,等待  

  233.             while(K1 == 1) { ; }      

  234.   

  235.         /*----3.2要显示的字符来源于CGRAM的8个用户自己定义的字符---------*/  

  236.             //3.2.1 将用户自定义的字符写入CGRAM中  

  237.                 /*----1、指令7:设定将自定义字符数据存入CGRAM中存储单元的地址------------*/  

  238.                 //指令固定值01、第n个自定义字符、存储第n个自定义字符的数组的首地址(8byte)  

  239.                 Write_Com(0x40) ; // 01 000 000 :  

  240.                 delay1ms(5) ;  

  241.                   

  242.                 /*----2、将用户自定义的字符写入CGRAM中对应地址的存储单元中----------------*/  

  243.                 i = 0 ;  

  244.                 for(i = 0 ; i < 8 ; i++)  

  245.                 {  

  246.                     Write_Data(user_str[i]) ;  

  247.                 }  

  248.                   

  249.             //3.2.2 在HD44780控制的1602LCD屏幕指定位置上显示自定义字符  

  250.                 /*----1、设定在1602LCD屏幕上显示的坐标位置(地址)------------*/   

  251.                 Write_Address(0x40+10) ; //显示在第二行的第十位  

  252.                 delay1ms(5) ;  

  253.   

  254.                 /*----2、将CGROM/CGRAM对应地址中的数据,显示在屏幕对应的位置---*/  

  255.                 Write_Data(0x00) ; //显示CGRAM中8个自定义字符的第1个  

  256.                                    //和显示CGROM中数据不同之处在于:不用和0x80相与  

  257.   

  258.             //3.2.3 无按键按下,等待  

  259.             delay1ms(1000) ;   

  260.             while(K1 == 1) { ; }  

  261.     }             

  262.           

  263. }  

  264.   

  265.   

  266. /****************************************************************************** 

  267.  *  名称: 

  268.  *  功能: 

  269.  *  参数: 

  270.  *  返回: 

  271.  ******************************************************************************/  


2、HD44780控制的1602LCD,各功能函数模块化,程序例举


  1. /****************************************************************************** 

  2.  *  说明:AT89S52芯片,12M晶振 

  3.  *  外设:HD44780控制的1602LCD:两行显示,每行最多显示40个预显示字符中的16个字符 

  4.  *        11条控制指令  

  5.  *  本程序:在HD44780控制的1602LCD上显示2行字符串,按键K1,显示一个用户自定义字符 

  6.  *          循环按键,循环显示 

  7.  ******************************************************************************/  

  8.   

  9. #include  

  10. #include  

  11.   

  12. sbit K1 = P1^4 ;    //按键  

  13.   

  14. sbit RS = P2^0 ;    //对象标志位: = 0(对象是指令或状态位);= 1(对象是数据)  

  15. sbit RW = P2^1 ;    //读写标志位: = 0(写);= 1(读)  

  16. sbit E  = P2^2 ;    //使能位:为 1 时,读写信息,为 负跳变 时,执行指令  

  17. sbit BF = P0^7 ;    //HD44780控制的1602LCD的 忙 状态位(只能通过指令读取)  

  18.   

  19. //用户要显示的字符串  

  20. unsigned char code sys_str0[] = "Dragon_CSU" ;  

  21. unsigned char code sys_str1[] = "Good_Luck" ;  

  22.   

  23. //用户自定义的字符编码方式:在8*8的点阵中选“右上角”的“5列*7行”点阵 存放数据  

  24. unsigned char code user_str0[] = {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};/* 自定义字符 ℃ */  

  25. unsigned char code user_str1[] = {0x1f,0x04,0x04,0x1f,0x04,0x04,0x1f,0x00};/* 自定义字符 王 */  

  26.   

  27.   

  28. /****************************************************************************** 

  29.  *  名称:delay1ms() 

  30.  *  功能:延时1ms 

  31.  *  参数:int t 

  32.  *  返回:无 

  33.  ******************************************************************************/  

  34. void delay1ms(int t)  

  35. {  

  36.     unsigned char i ;  

  37.   

  38.     while(t--)  

  39.     {  

  40.         for(i = 0 ; i < 125 ; i++)  

  41.         {  

  42.             ;  

  43.         }  

  44.     }  

  45. }  

  46.   

  47.   

  48.   

  49. /****************************************************************************** 

  50.  *  名称:Busy_Test() 

  51.  *  功能:检测HD44780控制的1602LCD是否处于忙状态 

  52.  *  参数:无                                

  53.  *  返回:bit result  忙则返回 1 , 不忙则返回 0 。 

  54.  ******************************************************************************/  

  55. bit Busy_Test(void)  

  56. {  

  57.     //1、定义变量,存储返回值  

  58.     bit result ;  

  59.   

  60.     //2、读状态位  

  61.     RS = 0 ; RW = 1 ;   

  62.     E = 1 ;  

  63.     _nop_() ; _nop_() ; _nop_() ; _nop_() ;  //延时4个机器周期,给硬件响应,  

  64.                                              //即:使E=1;稳定  

  65.     result = BF ;   //将忙状态位BF的值读给函数要返回的变量  

  66.   

  67.     //3、将时能位E复位到低电平  

  68.     E = 0 ;  

  69.   

  70.     //4、将忙状态位读的结果作为函数的参数返回  

  71.     return result ;  

  72.   

  73. }   

  74.   

  75.   

  76. /****************************************************************************** 

  77.  *  名称:Write_Com() 

  78.  *  功能:向HD44780写控制1602LCD的控制指令 

  79.  *  参数:unsigned char dictate 

  80.  *  返回:无 

  81.  ******************************************************************************/  

  82.  void Write_Com(unsigned char dictate)  

  83.  {  

  84.     //1、检测LCD忙状态,忙,则等待  

  85.     while(Busy_Test() == 1) { ; }  

  86.   

  87.     //2、向HD44780控制的1602LCD写控制指令  

  88.         /*----2.1、操作对象是指令,执行对象:写入----------------------------*/  

  89.             RS = 0 ;  

  90.             RW = 0 ;  

  91.   

  92.         /*----2.2、在E 为 0 时,先将指令数据写到P0口的DB0--DB7数据线上-------*/  

  93.             E = 0 ;  

  94.   

  95.             _nop_() ; //给硬件反应时间,等待E = 0 ;稳定   

  96.             _nop_() ;  

  97.   

  98.             P0 = dictate ;  //将指令先暂时写到数据线上  

  99.   

  100.             _nop_() ; //确保硬件把指令数据写完了  

  101.             _nop_() ;   

  102.             _nop_() ;   

  103.             _nop_() ;   

  104.   

  105.         /*----2.3、在E 为 1 时,将数据线上的指令数据写到DH44780的寄存器里----*/  

  106.             E = 1 ;  

  107.             _nop_(); _nop_(); _nop_(); _nop_(); //等待 E = 1 稳定  

  108.   

  109.         /*----2.4、在E 为 下降沿 时,执行写入的指令--------------------------*/  

  110.             E = 0 ; //从 E = 1 到 E = 0 产生下降沿,HD44780执行指令  

  111.   

  112.  }  

  113.   

  114.   

  115. /****************************************************************************** 

  116.  *  名称:Write_Address() 

  117.  *  功能:通过指令来控制第一个要显示的字符或下一个即将要显示的字符在LCD上的位置 

  118.  *  参数:unsigned char addr  在LCD上要显示的位置 

  119.  *  返回:无 

  120.  ******************************************************************************/  

  121. void Write_Address(unsigned char addr)  

  122. {  

  123.     //向HD44780写指令8:设定DDRAM地址的指令。  

  124.     //即:即将要显示的字符在1602LCD上的指令需要的地址 = 0x80|(字符在LCD屏幕上的位置)  

  125.     Write_Com(0x80|addr) ;  

  126. }  

  127.   

  128. /****************************************************************************** 

  129.  *  名称:Write_Data() 

  130.  *  功能:1、向HD44780控制的1602LCD写要显示的字符数据; 

  131.  *        2、向CGRAM中,对应地址的存储单元写用户自定义的字符数据 

  132.  *  参数:unsigned char char_data 要显示的字符(其实字符的值和它的ASCII码值一样) 

  133.  *  返回:无 

  134.  ******************************************************************************/  

  135. void Write_Data(unsigned char char_data)  

  136. {  

  137.     //1、检测HD44780控制的1602LCD忙状态位,忙,则等待  

  138.     while(Busy_Test() == 1) { ; }  

  139.     //2、向HD44780控制的1602LCD写要显示的字符数据  

  140.         /*----2.1、操作对象是数据,执行对象:写入----------------------------*/  

  141.             RS = 1 ;  

  142.             RW = 0 ;  

  143.   

  144.         /*----2.1、在E 为 0 时,先将字符数据写到P0口的DB0--DB7数据线上-------*/  

  145.             E = 0 ;  

  146.             _nop_() ; _nop_() ; //给硬件反应时间,等待E = 0 ;稳定  

  147.             P0 = char_data ;    //将字符数据先暂时写到数据线上  

  148.             _nop_() ; _nop_() ; _nop_() ; _nop_() ; //确保硬件把字符数据写完了  

  149.   

  150.         /*----2.2、在E 为 1 时,将数据线上的字符数据写到DH44780的寄存器里----*/  

  151.             E = 1 ;  

  152.             _nop_(); _nop_(); _nop_(); _nop_(); //等待 E = 1 稳定  

  153.   

  154.         /*----2.3、在E 为 下降沿 时,执行写入的指令--------------------------*/  

  155.             E = 0 ; //从 E = 1 到 E = 0 产生下降沿,HD44780执行指令  

  156.   

  157. }  

  158.   

  159. /****************************************************************************** 

  160.  *  名称:HD44780_1602LCD_Init() 

  161.  *  功能:对HD44780控制的1602LCD进行初始化 (包含硬件类型,屏显,光标) 

  162.  *  参数:无 

  163.  *  返回:无 

  164.  ******************************************************************************/  

  165. void HD44780_1602LCD_Init(void)  

  166. {  

  167.     //1、首次写指令前,给LCD硬件一段较长的反应时间  

  168.     delay1ms(15) ;  

  169.     //2、显示模式设置  

  170.         /*----1、匹配硬件的设置: 指令6:8位数据线,2行显示,5*7点阵------------*/  

  171.         Write_Com(0x38) ; delay1ms(5) ; //3次写指令,确保硬件匹配成功  

  172.         Write_Com(0x38) ; delay1ms(5) ;   

  173.         Write_Com(0x38) ; delay1ms(5) ;   

  174.   

  175.         /*----2、显示屏、光标、闪烁的设置: 指令4:开显示,开光标,光标闪烁------*/  

  176.         Write_Com(0x0f) ; delay1ms(5) ;  

  177.   

  178.         /*----3、光标、屏幕移动的设置: 指令3:光标右移,屏幕整体不移动----------*/  

  179.         Write_Com(0x06) ; delay1ms(5) ;  

  180.   

  181.     //3、清屏。指令1  

  182.     Write_Com(0x01) ; delay1ms(5) ;    

  183.   

  184. }  

  185.   

  186. /****************************************************************************** 

  187.  *  名称:Write_User_char() 

  188.  *  功能:将一个用户自定义的字符写入CGRAM中(CGRAM最多写8个字符) 

  189.  *  参数:unsigned char addr_num : 存入CGRAM中的第addr_num个8字节存储块 (0--8) 

  190.  *  参数:unsigned char *str : 指向存放用户自定义字符的数组 

  191.  *  返回:无 

  192.  ******************************************************************************/  

  193.  void Write_User_char(unsigned char addr_num , unsigned charchar *str)  

  194.  {  

  195.     /*----1、定义变量--------------------------------------------------------*/  

  196.     unsigned char i ;  

  197.     unsigned char CGRAM_addr ;  

  198.   

  199.     /*----2、处理地址,CGRAM存储单元有8*8==64个字节,可存入8个自定义字符-----*/  

  200.     //指令7的指令码     01 xxx 000 :第一个 xxx 表示自定义字符存入 第xxx个8字节的存储空间  

  201.     //                                   000 表示第xxx个8字节存储空间的首地址  

  202.     addr_num = _crol_(addr_num,3) ;   

  203.     CGRAM_addr = 0x40 | addr_num ;  

  204.   

  205.     /*----1、指令7:设定将自定义字符数据存入CGRAM中存储单元的地址------------*/  

  206.     //指令固定值01、第n个自定义字符、存储第n个自定义字符的数组的首地址(8byte)  

  207.     Write_Com(CGRAM_addr) ; //  

  208.     delay1ms(5) ;  

  209.       

  210.     /*----2、将用户自定义的字符写入CGRAM中对应地址的存储单元中----------------*/  

  211.     i = 0 ;  

  212.     for(i = 0 ; i < 8 ; i++)  

  213.     {  

  214.         Write_Data(str[i]) ;  

  215.     }  

  216.   

  217.  }  

  218.   

  219. /****************************************************************************** 

  220.  *  名称:Dis_User_char() 

  221.  *  功能:显示自定义字符:在1602LCD屏幕指定位置上显示第num个自定义字符 

  222.  *  参数:unsigned char line , unsigned char x  在屏幕的第line行第x列显示  

  223.  *  参数:unsigned char num     :显示CGRAM中8个自定义字符的第num个 num = 0-->7 

  224.  *  返回:无 

  225.  ******************************************************************************/  

  226. void Dis_User_char(unsigned char line , unsigned char x ,unsigned char num)  

  227. {  

  228. //3.2.2   

  229.     /*----1、设定在1602LCD屏幕上显示的坐标位置(地址)------------*/   

  230.     Write_Address(00x40 * line + x) ; //显示在第line行的第x位  

  231.     delay1ms(5) ;  

  232.   

  233.     /*----2、将CGROM/CGRAM对应地址中的数据,显示在屏幕对应的位置---*/  

  234.     Write_Data(num) ; //显示CGRAM中8个自定义字符的第num个 num = 0-->7  

  235.                        //和显示CGROM中数据不同之处在于:不用和0x80相与  

  236.   

  237. }  

  238.   

  239.   

  240. /****************************************************************************** 

  241.  *  名称:Switch_Screen() 

  242.  *  功能:控制显示屏开关,(不显示光标) 

  243.  *  参数:unsigned char scr_key = 1:开 ; = 0:关 

  244.  *  返回:无 

  245.  ******************************************************************************/  

  246.  void Switch_Screen(unsigned char scr_key)  

  247.  {  

  248.     delay1ms(50) ;  

  249.     if(scr_key == 1)  

  250.     {  

  251.         Write_Com(0x0c) ; //指令4 ,0000 1100 :开屏幕显示 ,无光标  

  252.     }  

  253.   

  254.     if(scr_key == 0)  

  255.     {  

  256.         Write_Com(0x08) ; //指令4 ,0000 1100 :关屏幕显示  

  257.     }  

  258.   

  259.     delay1ms(50) ;  

  260.  }  

  261.   

  262.  /****************************************************************************** 

  263.  *  名称:Switch_Cursor() 

  264.  *  功能:控制光标开关和闪烁 

  265.  *  参数:unsigned char cursor_key  

  266.  *  参数:unsigned char twinkle_key 

  267.  *  返回:无 

  268.  ******************************************************************************/  

  269.  void Switch_Cursor(unsigned char cursor_key , unsigned char twinkle_key)  

  270.  {  

  271.     delay1ms(50) ;  

  272.     if(cursor_key == 1)  

  273.     {  

  274.         if(twinkle_key == 1)  

  275.         {  

  276.             Write_Com(0x0f) ; //指令4 ,0000 1111 :开屏幕显示,开光标,光标闪烁  

  277.         }  

  278.         else  

  279.         {  

  280.             Write_Com(0x0e) ; //指令4 ,0000 1110 :开屏幕显示 ,开光标        

  281.         }  

  282.     }  

  283.   

  284.     if(cursor_key == 0)  

  285.     {  

  286.         Write_Com(0x0c) ; //指令4 ,0000 1100 :开屏幕显示  

  287.     }  

  288.   

  289.     delay1ms(50) ;  

  290.  }  

  291.   

  292. /****************************************************************************** 

  293.  *  名称:Move_Screen() 

  294.  *  功能:控制屏幕整体左右移动 

  295.  *  参数:unsigned char r_l = 1 :右移  ; = 0 :左移 

  296.  *  参数:unsigned char move_bit_num  :屏幕向右或向左移动多少位 

  297.  *  参数:unsigned char move_delay :每移动一位后,延时多少 ms 

  298.  *  返回:无 

  299.  ******************************************************************************/  

  300.  void Move_Screen(unsigned char r_l,unsigned char move_bit_num,unsigned char move_delay)  

  301.  {  

  302.     unsigned char i ;  

  303.     delay1ms(move_delay) ;  

  304.   

  305.     if(r_l == 1) //屏幕整体右移  

  306.     {  

  307.         for(i = 0 ; i < move_bit_num ; i++)  

  308.         {  

  309.             Write_Com(0x1c) ; //指令5 : 0001 1100 屏幕整体右移一位      

  310.             delay1ms(move_delay) ;    

  311.         }  

  312.   

  313.     }  

  314.   

  315.     if(r_l == 0) //屏幕整体左移  

  316.     {  

  317.         for(i = 0 ; i < move_bit_num ; i++)  

  318.         {  

  319.             Write_Com(0x18) ; //指令5 : 0001 1000 屏幕整体左移一位      

  320.             delay1ms(move_delay) ;    

  321.         }  

  322.   

  323.     }  

  324.  }  

  325.   

  326. /****************************************************************************** 

  327.  *  名称:Dis_Str() 

  328.  *  功能:在显示HD44780控制的1602LCD上显示一个字符串 

  329.  *  参数:unsigned char line , unsigned char x 在LCD上显示的位置 

  330.  *  参数:unsigned char *str 要显示的字符串的指针(首地址) 

  331.  *  返回:无 

  332.  ******************************************************************************/  

  333. void Dis_Str(unsigned char line , unsigned char x , unsigned charchar *str)  

  334. {  

  335.     unsigned char i ;  

  336.   

  337.     //1、 设置在LCD1602上显示字符的开始位置 : 从 第line行 坐标x 开始显示  

  338.     Write_Address(00x40 * line + x) ; delay1ms(5) ;    

  339.   

  340.     //2、 显示要显示的字符串  

  341.     i = 0 ;  

  342.     while(str[i] != '\0')  

  343.     {  

  344.         Write_Data(str[i]) ;  

  345.         i++ ;  

  346.         delay1ms(100) ;  

  347.     }  

  348. }  

  349.   

  350. /****************************************************************************** 

  351.  *  名称:Clear_Screen() 

  352.  *  功能:清屏 

  353.  *  参数:无 

  354.  *  返回:无 

  355.  ******************************************************************************/  

  356.  void Clear_Screen(void)  

  357.  {  

  358.     delay1ms(5) ;  

  359.     Write_Com(0x01) ;   

  360.     delay1ms(5) ;   

  361.  }  

  362.   

  363.   

  364. /****************************************************************************** 

  365. =============================================================================== 

  366.                        void main(void)函数部分 

  367. =============================================================================== 

  368. *******************************************************************************/  

  369. void main(void)  

  370. {  

  371.     //1、定义相关变量  

  372. //  unsigned char i ;  

  373.   

  374.     //2、对HD44780控制的1602LCD进行初始化  

  375.     HD44780_1602LCD_Init() ;  

  376.   

  377.     //3、在HD44780控制的1602LCD上显示信息  

  378.     while(1)  

  379.     {  

  380.         /*----3.1要显示的字符来源于CGROM的160个字符的库-----------------*/  

  381.             //3.1.1 根据需求选择是否清屏  

  382.             Clear_Screen() ;  

  383.       

  384.             //3.1.2 在显示1602LCD上显示第一个字符串 从第1行第0位开始显示  

  385.                 Dis_Str(0 , 0 , sys_str0) ;   

  386.       

  387.             //3.1.3 在显示1602LCD上显示第二个字符串 从第2行第0位开始显示  

  388.                 Dis_Str(1 , 0 , sys_str1) ;  

  389.                   

  390.             //3.1.4 无按键按下,等待  

  391.             delay1ms(1000) ;   

  392.             while(K1 == 1) { ; }      

  393.   

  394.         /*----3.2要显示的字符来源于CGRAM的8个用户自己定义的字符---------*/  

  395.             //3.2.1 将用户自定义的字符写入CGRAM中  

  396.             Write_User_char(0 , user_str0) ;  

  397.             Write_User_char(1 , user_str1) ;  

  398.                   

  399.             //3.2.2 在HD44780控制的1602LCD屏幕指定位置上显示自定义字符  

  400.             Dis_User_char(1 , 11 , 0x00) ;  

  401.             Dis_User_char(1 , 13 , 0x01) ;  

  402.   

  403.             //3.2.3 无按键按下,等待  

  404.             delay1ms(1000) ;   

  405.             while(K1 == 1) { ; }  

  406.   

  407.         /*----3.3关闭屏幕------------------------------------------------*/  

  408.             //3.3.1 关闭屏幕  

  409.             Switch_Screen(0) ;  

  410.             //3.3.2 无按键按下,等待  

  411.             delay1ms(1000) ;   

  412.             while(K1 == 1) { ; }  

  413.   

  414.         /*----3.4打开屏幕------------------------------------------------*/  

  415.             //3.4.1 打开屏幕  

  416.             Switch_Screen(1) ;  

  417.             //3.4.2 无按键按下,等待  

  418.             delay1ms(1000) ;   

  419.             while(K1 == 1) { ; }  

  420.   

  421.         /*----3.5打开光标------------------------------------------------*/  

  422.             //3.5.1 打开光标  

  423.             Switch_Cursor(1 , 1) ;  //1,1:打开光标、闪烁 ;1,0:打开、不闪烁  

  424.             //3.5.2 无按键按下,等待  

  425.             delay1ms(1000) ;   

  426.             while(K1 == 1) { ; }  

  427.   

  428.         /*----3.6关闭光标------------------------------------------------*/  

  429.             //3.6.1 关闭光标  

  430.             Switch_Cursor(0 , 0) ;  

  431.             //3.6.2 无按键按下,等待  

  432.             delay1ms(1000) ;   

  433.             while(K1 == 1) { ; }  

  434.   

  435.         /*----3.7屏幕整体左移--------------------------------------------*/  

  436.             //3.7.1 左移16位,每移一位延时500ms  

  437.             Move_Screen(0 , 16 , 500) ;  

  438.             //3.7.2 无按键按下,等待  

  439.             delay1ms(1000) ;   

  440.             while(K1 == 1) { ; }  

  441.   

  442.         /*----3.8屏幕整体右移--------------------------------------------*/  

  443.             //3.8.1 左移16位,每移一位延时500ms  

  444.             Move_Screen(1 , 16 , 500) ;  

  445.             //3.8.2 无按键按下,等待  

  446.             delay1ms(1000) ;   

  447.             while(K1 == 1) { ; }  

  448.     }             

  449.           

  450. }  

  451.   

  452.   

  453. /****************************************************************************** 

  454.  *  名称: 

  455.  *  功能: 

  456.  *  参数: 

  457.  *  返回: 

  458.  ******************************************************************************/  


3、AT89S52 + 外设HD44780控制的1602LCD,将驱动控制1602LCD的函数封装成文件

(1)、HD44780控制的1602LCD的库文件


  1. /************************************************************************************************** 

  2.  *  HD44780_1602LCD配置文件:HD44780_1602LCD.c和HD44780_1602LCD.h配套使用 

  3.  *  本程序当时是依据AT89S52单片机开发板写的 

  4.  *  RS R/W E 这三位引脚分别和单片机引脚 P2^0 P2^1 P2^2 相连 

  5.  *  八位数据引脚DB0……DB7分别和单片机的P0端口的P0^0……P0^7相连 (BF位其实就对应DB7引脚和P0^7相连) 

  6.  *  将此文件来驱动1602LCD时,只需更改下面的位定义和数据线的端口号即可 

  7.  *  对于HD44780控制的1602LCD的详细资料和11条指令的描述参考一下连接 

  8.  *  http://blog.csdn.net/dragon12345666/article/details/22819827 

  9.  **************************************************************************************************/  

  10.   

  11.   

  12. #include"HD44780_1602LCD.h"  

  13.   

  14.   

  15. /****************************************************************************** 

  16.  *  名称:dlcd_delay1ms() 

  17.  *  功能:延时1ms 

  18.  *  参数:int t 

  19.  *  返回:无 

  20.  ******************************************************************************/  

  21. void lcd_delay1ms(int t)  

  22. {  

  23.     unsigned char i ;  

  24.   

  25.     while(t--)  

  26.     {  

  27.         for(i = 0 ; i < 125 ; i++)  

  28.         {  

  29.             ;  

  30.         }  

  31.     }  

  32. }  

  33.   

  34.   

  35.   

  36. /****************************************************************************** 

  37.  *  名称:Busy_Test() 

  38.  *  功能:检测HD44780控制的1602LCD是否处于忙状态 

  39.  *  参数:无                                

  40.  *  返回:bit result  忙则返回 1 , 不忙则返回 0 。 

  41.  ******************************************************************************/  

  42. bit Busy_Test(void)  

  43. {  

  44.     //1、定义变量,存储返回值  

  45.     bit result ;  

  46.   

  47.     //2、读状态位  

  48.     RS = 0 ; RW = 1 ;   

  49.     E = 1 ;  

  50.     _nop_() ; _nop_() ; _nop_() ; _nop_() ;  //延时4个机器周期,给硬件响应,  

  51.                                              //即:使E=1;稳定  

  52.     result = BF ;   //将忙状态位BF的值读给函数要返回的变量  

  53.   

  54.     //3、将时能位E复位到低电平  

  55.     E = 0 ;  

  56.   

  57.     //4、将忙状态位读的结果作为函数的参数返回  

  58.     return result ;  

  59.   

  60. }   

  61.   

  62.   

  63. /****************************************************************************** 

  64.  *  名称:Write_Com() 

  65.  *  功能:向HD44780写控制1602LCD的控制指令 

  66.  *  参数:unsigned char dictate 

  67.  *  返回:无 

  68.  ******************************************************************************/  

  69.  void Write_Com(unsigned char dictate)  

  70.  {  

  71.     //1、检测LCD忙状态,忙,则等待  

  72.     while(Busy_Test() == 1) { ; }  

  73.   

  74.     //2、向HD44780控制的1602LCD写控制指令  

  75.         /*----2.1、操作对象是指令,执行对象:写入----------------------------*/  

  76.             RS = 0 ;  

  77.             RW = 0 ;  

  78.   

  79.         /*----2.2、在E 为 0 时,先将指令数据写到P0口的DB0--DB7数据线上-------*/  

  80.             E = 0 ;  

  81.   

  82.             _nop_() ; //给硬件反应时间,等待E = 0 ;稳定   

  83.             _nop_() ;  

  84.   

  85.             P0 = dictate ;  //将指令先暂时写到数据线上  

  86.   

  87.             _nop_() ; //确保硬件把指令数据写完了  

  88.             _nop_() ;   

  89.             _nop_() ;   

  90.             _nop_() ;   

  91.   

  92.         /*----2.3、在E 为 1 时,将数据线上的指令数据写到DH44780的寄存器里----*/  

  93.             E = 1 ;  

  94.             _nop_(); _nop_(); _nop_(); _nop_(); //等待 E = 1 稳定  

  95.   

  96.         /*----2.4、在E 为 下降沿 时,执行写入的指令--------------------------*/  

  97.             E = 0 ; //从 E = 1 到 E = 0 产生下降沿,HD44780执行指令  

  98.   

  99.  }  

  100.   

  101.   

  102. /****************************************************************************** 

  103.  *  名称:Write_Address() 

  104.  *  功能:通过指令来控制第一个要显示的字符或下一个即将要显示的字符在LCD上的位置 

  105.  *  参数:unsigned char addr  在LCD上要显示的位置 

  106.  *  返回:无 

  107.  ******************************************************************************/  

  108. void Write_Address(unsigned char addr)  

  109. {  

  110.     //向HD44780写指令8:设定DDRAM地址的指令。  

  111.     //即:即将要显示的字符在1602LCD上的指令需要的地址 = 0x80|(字符在LCD屏幕上的位置)  

  112.     Write_Com(0x80|addr) ;  

  113. }  

  114.   

  115. /****************************************************************************** 

  116.  *  名称:Write_Data() 

  117.  *  功能:1、向HD44780控制的1602LCD写要显示的字符数据; 

  118.  *        2、向CGRAM中,对应地址的存储单元写用户自定义的字符数据 

  119.  *  参数:unsigned char char_data 要显示的字符(其实字符的值和它的ASCII码值一样) 

  120.  *  返回:无 

  121.  ******************************************************************************/  

  122. void Write_Data(unsigned char char_data)  

  123. {  

  124.     //1、检测HD44780控制的1602LCD忙状态位,忙,则等待  

  125.     while(Busy_Test() == 1) { ; }  

  126.     //2、向HD44780控制的1602LCD写要显示的字符数据  

  127.         /*----2.1、操作对象是数据,执行对象:写入----------------------------*/  

  128.             RS = 1 ;  

  129.             RW = 0 ;  

  130.   

  131.         /*----2.1、在E 为 0 时,先将字符数据写到P0口的DB0--DB7数据线上-------*/  

  132.             E = 0 ;  

  133.             _nop_() ; _nop_() ; //给硬件反应时间,等待E = 0 ;稳定  

  134.             P0 = char_data ;    //将字符数据先暂时写到数据线上  

  135.             _nop_() ; _nop_() ; _nop_() ; _nop_() ; //确保硬件把字符数据写完了  

  136.   

  137.         /*----2.2、在E 为 1 时,将数据线上的字符数据写到DH44780的寄存器里----*/  

  138.             E = 1 ;  

  139.             _nop_(); _nop_(); _nop_(); _nop_(); //等待 E = 1 稳定  

  140.   

  141.         /*----2.3、在E 为 下降沿 时,执行写入的指令--------------------------*/  

  142.             E = 0 ; //从 E = 1 到 E = 0 产生下降沿,HD44780执行指令  

  143.   

  144. }  

  145.   

  146. /****************************************************************************** 

  147.  *  名称:HD44780_1602LCD_Init() 

  148.  *  功能:对HD44780控制的1602LCD进行初始化 (包含硬件类型,屏显,光标) 

  149.  *  参数:无 

  150.  *  返回:无 

  151.  ******************************************************************************/  

  152. void HD44780_1602LCD_Init(void)  

  153. {  

  154.     //1、首次写指令前,给LCD硬件一段较长的反应时间  

  155.     lcd_delay1ms(15) ;  

  156.     //2、显示模式设置  

  157.         /*----1、匹配硬件的设置: 指令6:8位数据线,2行显示,5*7点阵------------*/  

  158.         Write_Com(0x38) ; lcd_delay1ms(5) ; //3次写指令,确保硬件匹配成功  

  159.         Write_Com(0x38) ; lcd_delay1ms(5) ;   

  160.         Write_Com(0x38) ; lcd_delay1ms(5) ;   

  161.   

  162.         /*----2、显示屏、光标、闪烁的设置: 指令4:开显示,开光标,光标闪烁------*/  

  163.         Write_Com(0x0f) ; lcd_delay1ms(5) ;  

  164.   

  165.         /*----3、光标、屏幕移动的设置: 指令3:光标右移,屏幕整体不移动----------*/  

  166.         Write_Com(0x06) ; lcd_delay1ms(5) ;  

  167.   

  168.     //3、清屏。指令1  

  169.     Write_Com(0x01) ; lcd_delay1ms(5) ;    

  170.   

  171. }  

  172.   

  173. /****************************************************************************** 

  174.  *  名称:Write_User_char() 

  175.  *  功能:将一个用户自定义的字符写入CGRAM中(CGRAM最多写8个字符) 

  176.  *  参数:unsigned char addr_num : 存入CGRAM中的第addr_num个8字节存储块 (0--8) 

  177.  *  参数:unsigned char *str : 指向存放用户自定义字符的数组 

  178.  *  返回:无 

  179.  ******************************************************************************/  

  180.  void Write_User_char(unsigned char addr_num , unsigned charchar *str)  

  181.  {  

  182.     /*----1、定义变量--------------------------------------------------------*/  

  183.     unsigned char i ;  

  184.     unsigned char CGRAM_addr ;  

  185.   

  186.     /*----2、处理地址,CGRAM存储单元有8*8==64个字节,可存入8个自定义字符-----*/  

  187.     //指令7的指令码     01 xxx 000 :第一个 xxx 表示自定义字符存入 第xxx个8字节的存储空间  

  188.     //                                   000 表示第xxx个8字节存储空间的首地址  

  189.     addr_num = _crol_(addr_num,3) ;   

  190.     CGRAM_addr = 0x40 | addr_num ;  

  191.   

  192.     /*----1、指令7:设定将自定义字符数据存入CGRAM中存储单元的地址------------*/  

  193.     //指令固定值01、第n个自定义字符、存储第n个自定义字符的数组的首地址(8byte)  

  194.     Write_Com(CGRAM_addr) ; //  

  195.     lcd_delay1ms(5) ;  

  196.       

  197.     /*----2、将用户自定义的字符写入CGRAM中对应地址的存储单元中----------------*/  

  198.     i = 0 ;  

  199.     for(i = 0 ; i < 8 ; i++)  

  200.     {  

  201.         Write_Data(str[i]) ;  

  202.     }  

  203.   

  204.  }  

  205.   

  206. /****************************************************************************** 

  207.  *  名称:Dis_User_char() 

  208.  *  功能:显示自定义字符:在1602LCD屏幕指定位置上显示第num个自定义字符 

  209.  *  参数:unsigned char line , unsigned char x  在屏幕的第line行第x列显示  

  210.  *  参数:unsigned char num     :显示CGRAM中8个自定义字符的第num个 num = 0-->7 

  211.  *  返回:无 

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

  213. void Dis_User_char(unsigned char line , unsigned char x ,unsigned char num)  

  214. {  

  215. //3.2.2   

  216.     /*----1、设定在1602LCD屏幕上显示的坐标位置(地址)------------*/   

  217.     Write_Address(00x40 * line + x) ; //显示在第line行的第x位  

  218.     lcd_delay1ms(5) ;  

  219.   

  220.     /*----2、将CGROM/CGRAM对应地址中的数据,显示在屏幕对应的位置---*/  

  221.     Write_Data(num) ; //显示CGRAM中8个自定义字符的第num个 num = 0-->7  

  222.                        //和显示CGROM中数据不同之处在于:不用和0x80相与  

  223.   

  224. }  

  225.   

  226.   

  227. /****************************************************************************** 

  228.  *  名称:Switch_Screen() 

  229.  *  功能:控制显示屏开关,(不显示光标) 

  230.  *  参数:unsigned char scr_key = 1:开 ; = 0:关 

  231.  *  返回:无 

  232.  ******************************************************************************/  

  233.  void Switch_Screen(unsigned char scr_key)  

  234.  {  

  235.     lcd_delay1ms(50) ;  

  236.     if(scr_key == 1)  

  237.     {  

  238.         Write_Com(0x0c) ; //指令4 ,0000 1100 :开屏幕显示 ,无光标  

  239.     }  

  240.   

  241.     if(scr_key == 0)  

  242.     {  

  243.         Write_Com(0x08) ; //指令4 ,0000 1100 :关屏幕显示  

  244.     }  

  245.   

  246.     lcd_delay1ms(50) ;  

  247.  }  

  248.   

  249.  /****************************************************************************** 

  250.  *  名称:Switch_Cursor() 

  251.  *  功能:控制光标开关和闪烁 

  252.  *  参数:unsigned char cursor_key  

  253.  *  参数:unsigned char twinkle_key 

  254.  *  返回:无 

  255.  ******************************************************************************/  

  256.  void Switch_Cursor(unsigned char cursor_key , unsigned char twinkle_key)  

  257.  {  

  258.     lcd_delay1ms(50) ;  

  259.     if(cursor_key == 1)  

  260.     {  

  261.         if(twinkle_key == 1)  

  262.         {  

  263.             Write_Com(0x0f) ; //指令4 ,0000 1111 :开屏幕显示,开光标,光标闪烁  

  264.         }  

  265.         else  

  266.         {  

  267.             Write_Com(0x0e) ; //指令4 ,0000 1110 :开屏幕显示 ,开光标        

  268.         }  

  269.     }  

  270.   

  271.     if(cursor_key == 0)  

  272.     {  

  273.         Write_Com(0x0c) ; //指令4 ,0000 1100 :开屏幕显示  

  274.     }  

  275.   

  276.     lcd_delay1ms(50) ;  

  277.  }  

  278.   

  279. /****************************************************************************** 

  280.  *  名称:Move_Screen() 

  281.  *  功能:控制屏幕整体左右移动 

  282.  *  参数:unsigned char r_l = 1 :右移  ; = 0 :左移 

  283.  *  参数:unsigned char move_bit_num  :屏幕向右或向左移动多少位 

  284.  *  参数:unsigned char move_delay :每移动一位后,延时多少 ms 

  285.  *  返回:无 

  286.  ******************************************************************************/  

  287.  void Move_Screen(unsigned char r_l,unsigned char move_bit_num,unsigned char move_delay)  

  288.  {  

  289.     unsigned char i ;  

  290.     lcd_delay1ms(move_delay) ;  

  291.   

  292.     if(r_l == 1) //屏幕整体右移  

  293.     {  

  294.         for(i = 0 ; i < move_bit_num ; i++)  

  295.         {  

  296.             Write_Com(0x1c) ; //指令5 : 0001 1100 屏幕整体右移一位      

  297.             lcd_delay1ms(move_delay) ;    

  298.         }  

  299.   

  300.     }  

  301.   

  302.     if(r_l == 0) //屏幕整体左移  

  303.     {  

  304.         for(i = 0 ; i < move_bit_num ; i++)  

  305.         {  

  306.             Write_Com(0x18) ; //指令5 : 0001 1000 屏幕整体左移一位      

  307.             lcd_delay1ms(move_delay) ;    

  308.         }  

  309.   

  310.     }  

  311.  }  

  312.   

  313. /****************************************************************************** 

  314.  *  名称:Dis_Str() 

  315.  *  功能:在显示HD44780控制的1602LCD上显示一个字符串 

  316.  *  参数:unsigned char line , unsigned char x 在LCD上显示的位置 

  317.  *  参数:unsigned char *str 要显示的字符串的指针(首地址) 

  318.  *  返回:无 

  319.  ******************************************************************************/  

  320. void Dis_Str(unsigned char line , unsigned char x , unsigned charchar *str)  

  321. {  

  322.     unsigned char i ;  

  323.   

  324.     //1、 设置在LCD1602上显示字符的开始位置 : 从 第line行 坐标x 开始显示  

  325.     Write_Address(00x40 * line + x) ; lcd_delay1ms(5) ;    

  326.   

  327.     //2、 显示要显示的字符串  

  328.     i = 0 ;  

  329.     while(str[i] != '\0')  

  330.     {  

  331.         Write_Data(str[i]) ;  

  332.         i++ ;  

  333.         lcd_delay1ms(100) ;  

  334.     }  

  335. }  

  336.   

  337. /****************************************************************************** 

  338.  *  名称:Clear_Screen() 

  339.  *  功能:清屏 

  340.  *  参数:无 

  341.  *  返回:无 

  342.  ******************************************************************************/  

  343.  void Clear_Screen(void)  

  344.  {  

  345.     lcd_delay1ms(5) ;  

  346.     Write_Com(0x01) ;   

  347.     lcd_delay1ms(5) ;   

  348.  }  





(2)、HD44780控制的1602LCD的头文件


  1. /************************************************************************************************** 

  2.  *  HD44780_1602LCD配置文件:HD44780_1602LCD.h 

  3.  *  本程序当时是依据AT89S52单片机开发板写的 

  4.  *  RS R/W E 这三位引脚分别和单片机引脚 P2^0 P2^1 P2^2 相连 

  5.  *  八位数据引脚DB0……DB7分别和单片机的P0端口的P0^0……P0^7相连 (BF位其实就对应DB7引脚和P0^7相连) 

  6.  *  将此文件来驱动1602LCD时,只需更改下面的位定义和数据线的端口号即可 

  7.  *  对于HD44780控制的1602LCD的详细资料和11条指令的描述参考一下连接 

  8.  *  http://blog.csdn.net/dragon12345666/article/details/22819827 

  9.  **************************************************************************************************/  

  10. #include  

  11. #include  

  12.   

  13. sbit RS = P2^0 ;    //对象标志位: = 0(对象是指令或状态位);= 1(对象是数据)  

  14. sbit RW = P2^1 ;    //读写标志位: = 0(写);= 1(读)  

  15. sbit E  = P2^2 ;    //使能位:为 1 时,读写信息,为 负跳变 时,执行指令  

  16. sbit BF = P0^7 ;    //HD44780控制的1602LCD的 忙 状态位(只能通过指令读取)  

  17.   

  18.   

  19. extern bit Busy_Test(void) ;  

  20. extern void Clear_Screen(void) ;  

  21. //extern void lcd_delay1ms(int t) ;  

  22. extern void Dis_Str(unsigned char line , unsigned char x , unsigned charchar *str) ;  

  23. extern void Dis_User_char(unsigned char line , unsigned char x ,unsigned char num) ;  

  24. extern void HD44780_1602LCD_Init(void) ;  

  25. extern void Move_Screen(unsigned char r_l,unsigned char move_bit_num,unsigned char move_delay) ;  

  26. extern void Switch_Cursor(unsigned char cursor_key , unsigned char twinkle_key) ;  

  27. extern void Switch_Screen(unsigned char scr_key) ;  

  28. extern void Write_Address(unsigned char addr) ;  

  29. extern void Write_Com(unsigned char dictate) ;  

  30. extern void Write_Data(unsigned char char_data) ;  

  31. extern void Write_User_char(unsigned char addr_num , unsigned charchar *str) ;  





(3)、整个程序主函数部分所在文件


  1. /****************************************************************************** 

  2.  *  说明:AT89S52芯片,12M晶振 

  3.  *  外设:HD44780控制的1602LCD:两行显示,每行最多显示40个预显示字符中的16个字符 

  4.  *        11条控制指令  

  5.  *  本程序:在HD44780控制的1602LCD上显示2行字符串,按键K1,显示用户自定义字符 

  6.  *          开关屏幕、光标,屏幕显示左右移动,循环按键,循环显示 

  7.  ******************************************************************************/  

  8.   

  9. #include   

  10. #include   

  11.   

  12. #include "HD44780_1602LCD.h"  

  13.   

  14.   

  15. sbit K1 = P1^4 ;    //按键  

  16.   

  17. //用户要显示的字符串  

  18. unsigned char code sys_str0[] = "Dragon_CSU" ;  

  19. unsigned char code sys_str1[] = "Good_Luck" ;  

  20.   

  21. //用户自定义的字符编码方式:在8*8的点阵中选“右上角”的“5列*7行”点阵 存放数据  

  22. unsigned char code user_str0[] = {0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};/* 自定义字符 ℃ */  

  23. unsigned char code user_str1[] = {0x1f,0x04,0x04,0x1f,0x04,0x04,0x1f,0x00};/* 自定义字符 王 */  

  24.   

  25.   

  26. /****************************************************************************** 

  27.  *  名称:delay1ms() 

  28.  *  功能:延时1ms 

  29.  *  参数:int t 

  30.  *  返回:无 

  31.  ******************************************************************************/  

  32. void delay1ms(int t)  

  33. {  

  34.     unsigned char i ;  

  35.   

  36.     while(t--)  

  37.     {  

  38.         for(i = 0 ; i < 125 ; i++)  

  39.         {  

  40.             ;  

  41.         }  

  42.     }  

  43. }  

  44.   

  45.   

  46. /****************************************************************************** 

  47. =============================================================================== 

  48.                        void main(void)函数部分 

  49. =============================================================================== 

  50. *******************************************************************************/  

  51. void main(void)  

  52. {  

  53.     //1、定义相关变量  

  54. //  unsigned char i ;  

  55.   

  56.     //2、对HD44780控制的1602LCD进行初始化  

  57.     HD44780_1602LCD_Init() ;  

  58.   

  59.     //3、在HD44780控制的1602LCD上显示信息  

  60.     while(1)  

  61.     {  

  62.         /*----3.1要显示的字符来源于CGROM的160个字符的库-----------------*/  

  63.             //3.1.1 根据需求选择是否清屏  

  64.             Clear_Screen() ;  

  65.       

  66.             //3.1.2 在显示1602LCD上显示第一个字符串 从第1行第0位开始显示  

  67.                 Dis_Str(0 , 0 , sys_str0) ;   

  68.       

  69.             //3.1.3 在显示1602LCD上显示第二个字符串 从第2行第0位开始显示  

  70.                 Dis_Str(1 , 0 , sys_str1) ;  

  71.                   

  72.             //3.1.4 无按键按下,等待  

  73.             delay1ms(1000) ;   

  74.             while(K1 == 1) { ; }      

  75.   

  76.         /*----3.2要显示的字符来源于CGRAM的8个用户自己定义的字符---------*/  

  77.             //3.2.1 将用户自定义的字符写入CGRAM中  

  78.             Write_User_char(0 , user_str0) ;  

  79.             Write_User_char(1 , user_str1) ;  

  80.                   

  81.             //3.2.2 在HD44780控制的1602LCD屏幕指定位置上显示自定义字符  

  82.             Dis_User_char(1 , 11 , 0x00) ;  

  83.             Dis_User_char(1 , 13 , 0x01) ;  

  84.   

  85.             //3.2.3 无按键按下,等待  

  86.             delay1ms(1000) ;   

  87.             while(K1 == 1) { ; }  

  88.   

  89.         /*----3.3关闭屏幕------------------------------------------------*/  

  90.             //3.3.1 关闭屏幕  

  91.             Switch_Screen(0) ;  

  92.             //3.3.2 无按键按下,等待  

  93.             delay1ms(1000) ;   

  94.             while(K1 == 1) { ; }  

  95.   

  96.         /*----3.4打开屏幕------------------------------------------------*/  

  97.             //3.4.1 打开屏幕  

  98.             Switch_Screen(1) ;  

  99.             //3.4.2 无按键按下,等待  

  100.             delay1ms(1000) ;   

  101.             while(K1 == 1) { ; }  

  102.   

  103.         /*----3.5打开光标------------------------------------------------*/  

  104.             //3.5.1 打开光标  

  105.             Switch_Cursor(1 , 1) ;  //1,1:打开光标、闪烁 ;1,0:打开、不闪烁  

  106.             //3.5.2 无按键按下,等待  

  107.             delay1ms(1000) ;   

  108.             while(K1 == 1) { ; }  

  109.   

  110.         /*----3.6关闭光标------------------------------------------------*/  

  111.             //3.6.1 关闭光标  

  112.             Switch_Cursor(0 , 0) ;  

  113.             //3.6.2 无按键按下,等待  

  114.             delay1ms(1000) ;   

  115.             while(K1 == 1) { ; }  

  116.   

  117.         /*----3.7屏幕整体左移--------------------------------------------*/  

  118.             //3.7.1 左移16位,每移一位延时500ms  

  119.             Move_Screen(0 , 16 , 500) ;  

  120.             //3.7.2 无按键按下,等待  

  121.             delay1ms(1000) ;   

  122.             while(K1 == 1) { ; }  

  123.   

  124.         /*----3.8屏幕整体右移--------------------------------------------*/  

  125.             //3.8.1 左移16位,每移一位延时500ms  

  126.             Move_Screen(1 , 16 , 500) ;  

  127.             //3.8.2 无按键按下,等待  

  128.             delay1ms(1000) ;   

  129.             while(K1 == 1) { ; }  

  130.     }             

  131.           

  132. }  

  133.   

  134.   

  135. /****************************************************************************** 

  136.  *  名称: 

  137.  *  功能: 

  138.  *  参数: 

  139.  *  返回: 

  140.  ******************************************************************************/  



关键字:51单片机  HD44780  1602LCD 引用地址:51单片机复习程序例举004--HD44780控制的1602LCD

上一篇:单片机复习笔记005 -- DS1302时钟芯片
下一篇:51单片机复习004 -- HD44780控制的1602LCD

推荐阅读最新更新时间:2024-03-16 15:37

51单片机最小系统的构成与绘制
一、51单片机最小系统构成 51单片机最小系统是一个最基本的硬件配置,通常由一个51单片机、晶体振荡器、电源、外部芯片(如LCD屏幕、键盘、LED等)以及必要的电路组成。其主要功能是提供一种简单的方式来开始使用和学习51单片机,使其能够进行基本的输入、输出、计算和控制其具体构成如下: 1、51单片机芯片:51单片机是一种基于哈佛结构的8位微控制器,具有强大的输入输出能力、易于编程、稳定可靠等特点。目前市面上流行的有AT89C51、AT89S51、STC89C51等。 2、晶体振荡器:晶体振荡器是提供时钟信号的重要组成部分,一般为11.0592MHz,它能够提供稳定的时钟信号,保证51单片机的正常工作。 3、电源:为51单片机最
[单片机]
<font color='red'>51单片机</font>最小系统的构成与绘制
51单片机8位数码管电子时钟仿真图及源代码
利用8位数码管显示时间,原理与4位数码管显示的基本一样 仿真图: 程序源代码: 本程序已经通过在线软件仿真和硬件制作. org 0000h ;程序开始入口地址 sjmp main ;跳转至主程序 org 000bh ;T0中断入口地址 ljmp inti0 ;跳转至T0中断程序 org 001bh ;T1中断入口地址 ljmp inti1 ;跳转至T1中断程序 org 0030h main:mov tmod,#11h ;设T0、T1为模式1 mov ie,#8ah ;开T0、T1允许中断 mov th0,#4ch ;赋T0 50ms初值 mov tl0,#00h mov th1,#4ch ;赋T1 50ms初值 mov t
[单片机]
<font color='red'>51单片机</font>8位数码管电子时钟仿真图及源代码
51单片机课程设计:基于MQ-3的酒精浓度报警器
本程序用于将MQ-3上读取到的模拟信号转换为对应的数字信号,经51单片机处理后,在数码管显示,同时具有报警功能,当检测值高于预警值,蜂鸣器报警。除了可以检测MQ-3酒精浓度模块的AD值,也适用于MQ系列的其他模块,原理基本都相同,都是将读取到的AD值转换为数字信号,程序修改后,如果接线方法正确,可以在吉林农业大学51开发板上完美运行,相关工程文件以及开发板对应的电路图见最下方附件。 关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。 /*************************
[单片机]
51单片机串口通讯详解
串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。 由于大部分51单片机不支持在线调试功能,所以串口作为一种有效的调试功能,所以在51单片机程序开发时,无法进行在线调试,不妨可以多采用串口来进行调试。 1.串口配置 51单片机配置除了需要配置2个8位寄存器SCON、PCON外,还要配置定时器1的控制寄存器TMOD,因为串口在进行收发需要使用定时器来采样。 (1)状态控制寄存器 SCON SCON 是一个逐位定义的 8 位寄存器,用于控制串行通信的方式选择、接收和发送,指 示串口的状态,SCO
[单片机]
<font color='red'>51单片机</font>串口通讯详解
一种基于C8051单片机的SPWM波形实现方案
1 引言   正弦脉宽调制(SPWM)技术已在交流调速、直流输电、变频电源等领域得到广泛应用,为了提高整个系统的控制效果,高性能SPWM脉冲形成技术一直是人们不断探索的问题。采用模拟电路和数字电路等硬件电路来产生SPWM波形是一种切实可行的方法,但是这种实现方法控制电路复杂、抗干扰能力差、实时调节较困难。近年来,人们提出了由单片机、DSP等微控制器来实现SPWM波形的数字控制方法 ,由于微控制器内部集成了很多控制电路,比如定时器、PWM电路、可编程计数器阵列等,所以使得这种实现SPWM的方法具有控制电路简单、运行速度快、控制精度高、抗干扰能力强等优点。本文介绍了一种利用C8051单片机实现输出频率可变SPWM波形的方法,并将由C
[单片机]
一种基于C80<font color='red'>51单片机</font>的SPWM波形实现方案
8051单片机教程第五课:延时程序分析
上一次课中,我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。 DELAY:MOVR7,#250;(6) D1:MOVR6,#250;(7) D2:DJNZR6,D2;(8) DJNZR7,D1;(9) RET;(10) MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一个人的手上传到另一个人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOVR7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中被省略了(注意:并不是每一条传递指令都会省的,事实上大部份数据传递指令都会有传递者
[单片机]
80<font color='red'>51单片机</font>教程第五课:延时程序分析
51单片机的Printf使用方法
昨天在群里面有一个网友提到51单片机使用printf为什么编译通过了,但是没有效果 。这里将我的笔记翻出来共享一下,这个实验本身没有太大的意义,主要是记录51单片机应该如何使用Printf函数。 实验名称:串口通信之单片机和PC计算梯形面积 MCU型号:STC12C5A60S2(12T模式) 晶振 :11.0592MHZ 实验内容:利用单片机和PC机串口通信的工作方式1(波特率可变),(已经晶振为11.0592MHZ)设置波特率为9600B/S,结合定时器1的工作方式2(TH1=0xfd,TL1=0xfd),输入梯形的上底、下底、高,输出梯形面积 效果图: 参考程序: /* 文件名:串口通信值单片机和PC机计算梯
[单片机]
<font color='red'>51单片机</font>的Printf使用方法
51单片机数码管动态扫描驱动的设计
数码管由于发光亮度强,指示效果好,非常适合于电梯楼层等数值显示应用中。对于一位数码管,可以采用静态显示,但实际应用中都是需要显示多位数值,数码管模块也只能动态显示,因此笔者在这里简单分析一下数码管动态扫描驱动的实现。 1. 数码管原理概述 数码管由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。数码管根据内部接法又可分成共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管(如下图SM*10501),共阴数
[单片机]
<font color='red'>51单片机</font>数码管动态扫描驱动的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved