c语言流动字体显示的程序,1602字符液晶显示屏程序详解(C语言详细解说)

c语言流动字体显示的程序,1602字符液晶显示屏程序详解(C语言详细解说)_第1张图片

液晶模块和数码管相比,液晶模块会显得更加专业、漂亮。液晶显示屏以其体积小、功耗低、超薄轻巧、显示内容丰富、使用方便等等诸多优点,在电子设备、通讯、家用电器、仪器仪表等低功耗应用系统之中得到越来越广泛的应用了,使得这一些电子设备的人机界面变得越来越直观、越来越形象了,液晶模块现在已经广泛的应用于液晶电视机、电子表、复印机、计算器、便携式电脑、IC卡电话机、掌上型电子玩具、传真机等许多方面。1602的字符型液晶模块(带背光),是现在工控系统之中使用最为广泛的液晶屏之一了。1602采用了标准的16脚接口,其引脚功能如下所示:

第1脚:VSS是电源地,接到GND。

第2脚:VDD接到5V正电源。

第3脚:VL为液晶显示屏对比度的调整端,在接正电源时对比度是最弱的,在接地电源时对比度是最高,对比度在过高时显示会产生“鬼影”,在使用时可以通过一个10K的电位器来调整对比度。

第4脚:RS是寄存器选择,在高电平时选择数据寄存器、在低电平时则选择指令寄存器。

第5脚:RW为读写信号线,在其高电平时进行读操作,低电平时则进行写操作。当RS与RW都共同为低电平时,就可以写入指令或者是显示地址,当RS为低电平,RW为高电平时就可以读忙信号,当RS为高电平、RW为低电平时就可以写入数据了。

第6脚:E端是使能端,当E端由高电平跳变成低电平的时候,液晶模块执行命令。

第7~14脚:D0~D7都为8位双向数据线。

第15脚:BLA的背光电源正极(+5V)的输入引脚。

第16脚:BLK的背光电源负极,接到GND。

c语言流动字体显示的程序,1602字符液晶显示屏程序详解(C语言详细解说)_第2张图片

1602的液晶模块内一般都是带有标准字库的,在内部的字符发生存储器(CGROM)已经是存储了192个5×7的点阵字符,32个5×10的点阵字符。另外还会有字符生成RAM(CGRAM)512字节,供给用户来自定义字符。比如表1所示,这一些字符都有:英文字母的大小写、阿拉伯数字、常用的符号以及日文假名等,每一个字符都会有一个固定的代码,比如:大写的英文字母“A”的代码是01000001B(41H),显示时模块会把地址41H中的点阵字符图形给显示出来,我们就能够看到字母“A”了。

液晶显示模块是一个慢显示器件,所以在执行每一条指令之前都一定要确认模块的忙标志为低电平,表示不忙,否则此指令会失效。要显示字符时需要先输入显示字符地址,也就是说告诉模块在哪里显示字符。

C51程序如下:

[注:使用12M晶振]

[cpp] view plain copy

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

2. #include

3. #define LCM_Data P1

4. #define Busy 0x80 //用于检测LCM状态字中的Busy标识

5. sbit LCM_RW P2^0; //定义引脚

6. sbit LCM_RS P2^1;

7. sbit LCM_E P2^2;

8.

9. void WriteDataLCM(unsigned char WDLCM);

10. void WriteCommandLCM(unsigned char WCLCM,BuysC);

11. unsigned char ReadDataLCM(void);

12. unsigned char ReadStatusLCM(void);

13. void LCMInit(void);

14. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);

15. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);

16. void Delay5Ms(void);

17. void Delay400Ms(void);

18. unsigned char code csdn[] = {"csdn"};

19. unsigned char code net[] = {www.csdn.net};

20. void main(void)

21. {

22. LCMInit(); //LCM初始化

23. Delay5Ms(); //延时片刻(可不要)

24. DisplayListChar(0, 5, csdn);

25. DisplayListChar(1, 0, net);

26. ReadDataLCM();//测试用句无意义

27. while(1);

28. }

29. //写数据

30. void WriteDataLCM(unsigned char WDLCM)

31. {

32. ReadStatusLCM(); //检测忙

33. LCM_Data = WDLCM;

34. LCM_RS = 1;

35. LCM_RW = 0;

36. LCM_E = 0; //若晶振速度太高可以在这后加小的延时

37. LCM_E = 0; //延时

38. LCM_E = 1;

39. }

40. //写指令

41. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测

42. {

43. if (BuysC) ReadStatusLCM(); //根据需要检测忙

44. LCM_Data = WCLCM;

45. LCM_RS = 0;

46. LCM_RW = 0;

47. LCM_E = 0;

48. LCM_E = 0;

49. LCM_E = 1;

50. }

51. //读数据

52. unsigned char ReadDataLCM(void)

53. {

54. LCM_RS = 1;

55. LCM_RW = 1;

56. LCM_E = 0;

57. LCM_E = 0;

58. LCM_E = 1;

59. return(LCM_Data);

60. }

61. //读状态

62. unsigned char ReadStatusLCM(void)

63. {

64. LCM_Data = 0xFF;

65. LCM_RS = 0;

66. LCM_RW = 1;

67. LCM_E = 0;

68. LCM_E = 0;

69. LCM_E = 1;

70. while (LCM_Data & Busy); //检测忙信号

71. return(LCM_Data);

72. }

73. void LCMInit(void) //LCM初始化

74. {

75. LCM_Data = 0;

76. WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号

77. Delay5Ms();

78. WriteCommandLCM(0x38,0);

79. Delay5Ms();

80. WriteCommandLCM(0x38,0);

81. Delay5Ms();

82. WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号

83. WriteCommandLCM(0x08,1); //关闭显示

84. WriteCommandLCM(0x01,1); //显示清屏

85. WriteCommandLCM(0x06,1); // 显示光标移动设置

86. WriteCommandLCM(0x0C,1); // 显示开及光标设置

87. }

88. //按指定位置显示一个字符

89. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)

90. {

91. Y &= 0x1;

92. X &= 0xF; //限制X不能大于15,Y不能大于1

93. if (Y) X |= 0x40; //当要显示第二行时地址码 0x40;

94. X |= 0x80; // 算出指令码

95. WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码

96. WriteDataLCM(DData);

97. }

98. //按指定位置显示一串字符

99. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)

100. {

101. unsigned char ListLength;

102. ListLength = 0;

103. Y &= 0x1;

104. X &= 0xF; //限制X不能大于15,Y不能大于1

105. while (DData[ListLength]>0x20) //若到达字串尾则退出

106. {

107. if (X <= 0xF) //X坐标应小于0xF

108. {

109. DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

110. ListLength++;

111. X++;

112. }

113. }

114. }

115. //5ms延时

116. void Delay5Ms(void)

117. {

118. unsigned int TempCyc = 5552;

119. while(TempCyc--);

120. }

你可能感兴趣的:(c语言流动字体显示的程序)