📄 lcd.lst
字号:
ARM COMPILER V0.07, lcd 26/11/04 11:06:08 PAGE 1
ARM COMPILER V0.07, COMPILATION OF MODULE lcd
OBJECT MODULE PLACED IN lcd.OBJ
COMPILER INVOKED BY: C:\KEIL\ARM\BIN\CA.EXE lcd.c TABS(4)
stmt level source
1 #include "lcd.h"
2 #include "lpc210x.h"
3
4 void lcd_wait(){
5 1 int loop=2800; //more than enough
6 1 //busy loop
7 1 while(loop--);
8 1 }
9 void lcd_wait_s(){
10 1 int loop=50; //more than enough
11 1 //busy loop
12 1 while(loop--);
13 1 }
14 void lcd_out_data4(unsigned char val){
15 1 IOCLR |= (LCD_DATA);
16 1 IOSET |= (val<<4);
17 1 }
18
19 void lcd_write_nibbles(unsigned char val){
20 1
21 1 //higher-order byte
22 1 lcd_en_set();
23 1 lcd_wait_s(); /////////
24 1 lcd_out_data4((val>>4)&0x0F);
25 1 lcd_wait_s(); /////////
26 1 lcd_en_clr();
27 1
28 1 lcd_wait();
29 1
30 1 //lower-order byte
31 1 lcd_en_set();
32 1 lcd_wait_s(); /////////
33 1 lcd_out_data4((val)&0x0F);
34 1 lcd_wait_s(); /////////
35 1 lcd_en_clr();
36 1
37 1 lcd_wait();
38 1 }
39
40 void lcd_write_control(unsigned char val){
41 1 lcd_rs_clr();
42 1 lcd_write_nibbles(val);
43 1 }
44
45 void lcd_init(){
46 1
47 1 PINSEL0 &= (~LCD_GPIO_SEL0);
48 1 PINSEL1 &= (~LCD_GPIO_SEL1);
49 1 /* we only work on OUTPUT so far */
50 1 IODIR |= LCD_IOALL;
51 1
52 1 /* IO init complete, init LCD */
53 1
54 1 /* init 4-bit ops*/
55 1 lcd_rs_clr();
56 1 lcd_rw_clr();
57 1 lcd_en_clr();
58 1
59 1
ARM COMPILER V0.07, lcd 26/11/04 11:06:08 PAGE 2
60 1 //wait VDD raise > 4.5V
61 1 lcd_wait();
62 1
63 1 //dummy inst
64 1 lcd_write_nibbles(0x30);
65 1 lcd_write_nibbles(0x30);
66 1 lcd_write_nibbles(0x30);
67 1
68 1 //FUNCTION SET
69 1 //001DL N F XX
70 1 //DL=1: 8bit
71 1 //DL=0: 4bit
72 1 //N=0: 1 line display
73 1 //N=1: 2 line display
74 1 //F=0: 5x7 dots
75 1 //F=1: 5x10 dots
76 1
77 1 //our case:
78 1 //0010 1000
79 1 lcd_en_set();
80 1 lcd_out_data4(0x2);
81 1 lcd_en_clr();
82 1 lcd_wait();
83 1
84 1 lcd_write_nibbles(0x28);
85 1
86 1 //LCD ON
87 1 lcd_write_nibbles(0x0E);
88 1
89 1 //Clear Display
90 1 lcd_write_nibbles(0x01);
91 1
92 1 //Entry mode
93 1 lcd_write_nibbles(0x06);
94 1
95 1 }
96
97 void lcd_putchar(unsigned char c){
98 1
99 1 lcd_rs_set();
100 1 lcd_write_nibbles(c);
101 1 }
102
103 void lcd_print(unsigned char* str){
104 1 int i;
105 1 for (i=0;i<16 && str[i]!=0;i++){
106 2 lcd_putchar(str[i]);
107 2 }
108 1 }
109
110 // driver taken from UC51 //
111
112 /******************* internal Track XY cursor for NLs ***********************/
113 //static signed char lcd_pos_x, lcd_pos_y;
114 signed char lcd_pos_x, lcd_pos_y;
115
116
117 /************************ lcd_setxy **************************/
118 static void lcd_setxy(void){ //reentrant { // local function!
119 1 //uchar date;
120 1 char date;
121 1
122 1 if(lcd_pos_x>19){ // Ensure that all is inside the visible rectangle
123 2 lcd_pos_x=-1;
124 2 lcd_pos_y++;
125 2 }
ARM COMPILER V0.07, lcd 26/11/04 11:06:08 PAGE 3
126 1 if(lcd_pos_y>3){
127 2 lcd_pos_y=0;
128 2 lcd_pos_x=-1;
129 2 }else if(lcd_pos_y<0){
130 2 lcd_pos_y=3;
131 2 lcd_pos_x=-1;
132 2 }
133 1
134 1 switch(lcd_pos_y){ // Here for a 4x40 Display
135 2 // case 1: date=64; break;
136 2 // case 2: date=20; break;
137 2 // case 3: date=84; break;
138 2 case 1: date=0x40; break;
139 2 case 2: date=0x14; break;
140 2 case 3: date=0x54; break;
141 2 default: date=0;
142 2 }
143 1 date|=128;
144 1
145 1 if(lcd_pos_x>0) date+=lcd_pos_x;
146 1 lcd_write_control(date);
147 1
148 1 }
149
150 /*********************** lcd_gotoxy() *************************/
151 void lcd_gotoxy(char nx,char ny){// reentrant{
152 1 lcd_pos_x=nx;
153 1 lcd_pos_y=ny;
154 1 lcd_setxy();
155 1 }
156 ///******************** lcd_clear() ****************/
157 void lcd_clear(void){
158 1 lcd_write_control(1);
159 1 lcd_pos_x=0;
160 1 lcd_pos_y=0;
161 1 }
162
163 // EOF
164
165
166
ARM COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -