研究了一下,如何用atmega 16单片机,来驱动字符型液晶显示芯片,现把研究心得写出来:
我手里的这个rt1601液晶显示模块,使用的是s6a0069显示芯片。
各个引脚简单说明一下:
控制和数据引脚配置如下:
-------------------------------
portd_0 - rs
portd_1 - r/w
portd_2 - e
porta - data bus
------------------------------
lcd.h
1#ifndef_lcd_h_
2#define_lcd_h_
3/*****************************************
4rs-portd_0
5r/w-portd_1
6e-portd_2
7db-porta
8******************************************/
9voidlcd_set_rs(void);
10voidlcd_clear_rs(void);
11voidlcd_set_rw(void);
12voidlcd_clear_rw(void);
13voidlcd_set_e(void);
14voidlcd_clear_e(void);
15voidlcd_checkbf(void);
16//writecommand
17voidlcd_write_cmd(unsignedcharbycmd);
18//writedata
19voidlcd_write_data(unsignedcharbydata);
20voidlcd_delay_5ms(void);
21voidlcd_delay_500ms(void);
22voidlcd_portinit(void);
23
24//applicationinterface
25voidlcd_init(void);
26voidlcd_display(char*pstrtext);
27
28#endif
29
lcd.c
这里是液晶驱动的实现部分,对外开放两个接口:lcd_init, lcd_display。(我这个模块,是两行显示的,共16个字符)
1#include“lcd.h”
2#include
3#include
4
5/*****************************************
6rs-portd_0
7r/w-portd_1
8e-portd_2
9db-porta
10******************************************/
11
12
13voidlcd_set_rs(void)
14{
15portd“=(1《《0);
16
17return;
18}
19
20voidlcd_clear_rs(void)
21{
22portd&=~(1《《0);
23
24return;
25}
26
27voidlcd_set_rw(void)
28{
29portd”=(1《《1);
30
31return;
32}
33
34voidlcd_clear_rw(void)
35{
36portd&=~(1《《1);
37
38return;
39}
40
41voidlcd_set_e(void)
42{
43portd“=(1《《2);
44
45return;
46}
47
48voidlcd_clear_e(void)
49{
50portd&=~(1《《2);
51
52return;
53}
54
55voidlcd_checkbf(void)
56{
57ddra=0x00;//input
58
59lcd_clear_rs();
60lcd_set_rw();
61lcd_set_e();
62while(pina&0x80)
63{
64;
65}
66lcd_clear_e();
67
68ddra=0xff;//output
69
70return;
71}
72
73//writecommand
74voidlcd_write_cmd(unsignedcharbycmd)
75{
76lcd_checkbf();
77
78lcd_clear_rs();
79lcd_clear_rw();
80lcd_set_e();
81porta=bycmd;
82lcd_clear_e();
83
84return;
85}
86
87//writedata
88voidlcd_write_data(unsignedcharbydata)
89{
90lcd_checkbf();
91
92lcd_set_rs();
93lcd_clear_rw();
94lcd_set_e();
95porta=bydata;
96lcd_clear_e();
97
98return;
99}
100
101voidlcd_delay_5ms(void)
102{
103unsignedinti=5552;
104while(i--)
105{
106;
107}
108
109return;
110}
111
112voidlcd_delay_500ms(void)
113{
114unsignedchari=5;
115unsignedcharj=0;
116
117while(i--)
118{
119j=7269;
120while(j--)
121{
122;
123}
124}
125
126return;
127}
128
129//portinit
130voidlcd_portinit(void)
131{
132portd=0x00;
133ddrd=0xff;//output
134ddra=0xff;
135
136return;
137}
138
139//lcdinit
140voidlcd_init(void)
141{
142lcd_portinit();
143
144lcd_delay_500ms();
145
146lcd_write_cmd(0x38);//functionset.8bitdatalength,2-line,5*8font
147lcd_delay_5ms();
148lcd_write_cmd(0x0c);//displayon/offcontrol.displayon,cursoroff,blinkoff
149lcd_delay_5ms();
150lcd_write_cmd(0x01);//displayclear.
151lcd_delay_5ms();
152lcd_write_cmd(0x06);//entrymodeset.incrementmode,entireshiftoff
153
154return;
155}
156
157voidlcd_display(char*pstrtext)
158{
159unsignedchari=0;
160
161lcd_write_cmd(0x80”0x00);//1lineposition
162while(*pstrtext!=0x00)
163{
164if(i==8)
165{
166lcd_write_cmd(0x80“0x40);//2lineposition
167}
168
169lcd_write_data(*(pstrtext++));
170i++;
171}
172
173return;
174}
175
176
client端调用如下:
1//icc-avrapplicationbuilder:2008-6-48:41:19
2//target:m16
3//crystal:4.0000mhz
4#include
5#include
6#include”lcd.h“
7
8voidmain(void)
9{
10lcd_init();
11lcd_display(”rt1601demobywf“);
12
13while(1)
14{
15;
16}
17
18return;
19}
HTCM8拆解 做工非常精湛拆解需要暴力进行
广东顺德发布涉及机器人等产业的十大产业园建设规划
Holtek新增BS45F3340/BS45F3345/BS45F3346成员
蚁利全息装配式展柜特点
AlphaFold2的技术细节和局限与意义
如何用ATmega 16单片机驱动字符型液晶显示芯片
可调稳压电源制作图解
LED连接方式与恒流二极管的小功率LED驱动电路设计的详细方法分析
京东叮咚PLAY体验 增加的不止是屏幕仍具备广阔可能
2020全球人工智能技术大会将登陆杭州未来科技城
高通推出全球首款商用5G PC平台 高通拟2020年发布下一代处理器
安科瑞智慧消防管理云平台
PCB电路中信号振铃是怎么产生的
基于EXB841的IGBT推挽驱动电路原理
威迈斯IPO上市:新能源产业架构完善,长期发展面持续向好
秋田微创业板IPO已进入问询阶段
灵动为MM32F5系列配套打造全新的开发平台 MindSDK
nutsdb的研究以及一些心得体会分享
基于EEMBC组织的公共基准数据的数据和文档
2nm芯片有望破冰吗 台积电2nm芯片什么时候量产