原创 ATmega16_App_V1.0开发板范例4:LCD1602八线制驱动实验(ICC)

2009-11-5 17:33 3684 7 7 分类: MCU/ 嵌入式
一、程序结构
attachimg.gif 程序结构
下载 (10.62 KB)

2009-11-3 17:18


二、仿真效果
attachimg.gif 点击看大图
下载 (145.5 KB)

2009-11-3 17:18


三、程序源码
1、main.c



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

  2. Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)

  3. Project : 范例4:LCD1602八线制驱动实验(ICC)

  4. Clock F : 内部8M

  5. Software : ICCAVR7.14C

  6. Author : 林夕依然

  7. Version : 09.11.03

  8. Updata : 09.04.28 增加了proteus仿真模型,调试通过。

  9. 09.08.02 优化程序,不会再出现乱码,清屏指令后加延时

  10. comments :

  11. 1、八线制:PB0-PB7为数据线,PD3/PD4/PD6控制LCD1602B的RS,RW,EN。

  12. 2、模块化编程。

  13. *******************************************************************************/

  14. #include <iom16v.h>

  15. #include "LCD1602.h"



  16. void main(void)

  17. {

  18. Port_init();//端口初始化

  19. LCD_init(); //LCD初始化

  20. LCD_clear();//清屏

  21. LCD_write_str(0,0,"abcdefghijklmnop");

  22. LCD_write_str(0,1,"ABCDEFGHIJKLMNOP");

  23. delay_ms(2000);

  24. LCD_clear();//清屏



  25. while (1)

  26. {

  27. uchar i="0",j=0;

  28. uchar *p="I love ATmega16!";

  29. uchar *q="I love China!";



  30. LCD_write_str(0,0,"09.11.03-15:27");

  31. LCD_write_str(0,1,"2009-03-27");

  32. delay_ms(2000);

  33. LCD_clear();//清屏



  34. LCD_write_str(0,0,"605987969@qq.com");

  35. LCD_write_str(0,1,"bbs.armavr.com");

  36. delay_ms(2000);

  37. LCD_clear();//清屏



  38. LCD_write_str(0,0,"ATmega16_App_PCB");

  39. LCD_write_str(0,1,"linxiyiran");

  40. delay_ms(2000);

  41. LCD_clear();//清屏



  42. while (*p)

  43. {

  44. LCD_write_char(i,0,*p);

  45. i++;

  46. p++;

  47. delay_ms(100);

  48. }



  49. while (*q)

  50. {

  51. LCD_write_char(j,1,*q);

  52. j++;

  53. q++;

  54. delay_ms(100);

  55. }



  56. delay_ms(2000);

  57. LCD_clear();//清屏

  58. }

  59. }
2、LCD1602.c



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

  2. Platform : ATmega16_App_V1.0开发板(http://bbs.armavr.com)

  3. function :功能函数集

  4. Clock F : 内部8M

  5. Software : ICCAVR7.14C

  6. Author : 林夕依然

  7. Version : 09.11.03

  8. comments :

  9. 1、两种方式实现延时

  10. ********************************/

  11. #include <iom16v.h>

  12. #include <macros.h>

  13. #include "LCD1602.h"

  14. #define uchar unsigned char

  15. #define uint unsigned int



  16. #define RS_CLR PORTD &= ~(1 << PD3)

  17. #define RS_SET PORTD |= (1 << PD3)



  18. #define RW_CLR PORTD &= ~(1 << PD4)

  19. #define RW_SET PORTD |= (1 << PD4)



  20. #define EN_CLR PORTD &= ~(1 << PD6)

  21. #define EN_SET PORTD |= (1 << PD6)



  22. //us延时函数

  23. void delay_us(uint n) //8*0.125=1us

  24. {

  25. int i,j;

  26. for(j=0;j<8;j++)

  27. {

  28. for (i=0;i<n;i++)

  29. NOP();

  30. }

  31. }



  32. //ms延时函数

  33. void delay_ms(uint i)

  34. {

  35. while(i--)

  36. {

  37. uint j;

  38. for(j=1;j<=1332;j++)

  39. ;

  40. }

  41. }



  42. //端口初始化

  43. void Port_init(void)

  44. {

  45. PORTA=0XFF;

  46. DDRA =0X00;

  47. PORTB=0XFF;

  48. DDRB =0X00;

  49. PORTC=0X7F;

  50. DDRC =0X80;

  51. PORTD=0XFF;

  52. DDRD =0X00;

  53. }



  54. //显示屏初始化函数

  55. void LCD_init(void)

  56. {

  57. DDRB = 0xFF; //I/O口方向设置

  58. DDRD|=(1<<PD3)|(1<<PD4)|(1<<PD6);

  59. delay_ms(15); //上电延时一段时间,使供电稳定

  60. Write_Instruction(0x38); //8bit interface,2line,5*7dots

  61. delay_ms(5);

  62. Write_Instruction(0x38);

  63. delay_ms(5);

  64. Write_Instruction(0x38);



  65. Write_Instruction(0x08); //关显示,不显光标,光标不闪烁

  66. Write_Instruction(0x01); //清屏

  67. delay_ms(5);



  68. Write_Instruction(0x04); //写一字符,整屏显示不移动

  69. //Write_Instruction(0x05); //写一字符,整屏右移

  70. //Write_Instruction(0x06); //写一字符,整屏显示不移动

  71. //Write_Instruction(0x07); //写一字符,整屏左移

  72. delay_ms(5);



  73. //Write_Instruction(0x0B); //关闭显示(不显示字符,只有背光亮)

  74. Write_Instruction(0x0C); //开显示,光标、闪烁都关闭

  75. //Write_Instruction(0x0D); //开显示,不显示光标,但光标闪烁

  76. //Write_Instruction(0x0E); //开显示,显示光标,但光标不闪烁

  77. //Write_Instruction(0x0F); //开显示,光标、闪烁均显示

  78. }



  79. //控制LCD写时序

  80. void LCD_en_write(void) //EN端产生一个高电平脉冲,控制LCD写时序

  81. {

  82. EN_SET;

  83. delay_us(20);

  84. EN_CLR;

  85. delay_us(20);

  86. }



  87. //清屏函数

  88. void LCD_clear(void)

  89. {

  90. Write_Instruction(0x01);

  91. delay_ms(5);

  92. }



  93. //写指令函数

  94. void Write_Instruction(uchar command)

  95. {

  96. RS_CLR;

  97. RW_CLR;

  98. EN_SET;

  99. PORTB=command;

  100. LCD_en_write();//写入指令数据

  101. }



  102. //写数据函数

  103. void Write_Data(uchar Wdata)

  104. {

  105. RS_SET;

  106. RW_CLR;

  107. EN_SET;

  108. PORTB=Wdata;

  109. LCD_en_write();//写入数据

  110. }



  111. //字符显示初始地址设置

  112. void LCD_SET_XY(uchar X,uchar Y)

  113. {

  114. uchar address;

  115. if(Y==0)

  116. address=0x80+X;//Y=0,表示在第一行显示,地址基数为0x80

  117. else

  118. address=0xc0+X;//Y非0时,表时在第二行显示,地址基数为0XC0

  119. Write_Instruction(address);//写指令,设置显示初始地址

  120. }



  121. //在第X行Y列开始显示,指针*S所指向的字符串

  122. void LCD_write_str(uchar X,uchar Y,uchar *s)

  123. {

  124. LCD_SET_XY(X,Y);//设置初始字符显示地址

  125. while(*s)//逐次写入显示字符,直到最后一个字符"/0"

  126. {

  127. Write_Data(*s);//写入当前字符并显示

  128. s++;//地址指针加1,指向下一个待写字符

  129. }

  130. }



  131. //在第X行Y列开始显示Wdata所对应的单个字符

  132. void LCD_write_char(uchar X,uchar Y,uchar Wdata)

  133. {

  134. LCD_SET_XY(X,Y);//写地址

  135. Write_Data(Wdata);//写入当前字符并显示

  136. }
3、LCD1602.h



  1. #define uchar unsigned char

  2. #define uint unsigned int



  3. void delay_us(uint n);

  4. void delay_ms(uint i);

  5. void Port_init(void);

  6. void LCD_init(void);

  7. void LCD_en_write(void);

  8. void LCD_clear(void);

  9. void Write_Instruction(uchar command);

  10. void Write_Data(uchar Wdata);

  11. void LCD_SET_XY(uchar X,uchar Y);

  12. void LCD_write_str(uchar X,uchar Y,uchar *s);

  13. void LCD_write_char(uchar X,uchar Y,uchar Wdata);

四、完整项目文件


https://static.assets-stash.eet-china.com/album/old-resources/2009/11/5/22210bff-a72a-443a-9ee3-f7727baca0c4.rar

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条