89C52控制1602A液晶的计时器
?一、LCD1602A液晶說明。
?
DataSheet說明(技術參數)
①此LCD共16個管腳。每個接口說明如下表。
?
PS:1-2管腳沒什么好說的,就是接電源和地的。
????? 3管腳是偏壓信號,這一管腳一般可以接個滑動變阻器,通過調節滑動變阻器可以控制字符顯示顏色的深淺。
????? 4管腳是數據命令選擇端,當其高電平為命令輸入端,低電平為命令輸入端。
????? 5管腳為讀寫選擇端,當其高電平為讀數據狀態,底電平為寫數據。
????? 6是使能信號(詳細見時序圖(下)),當其為高電平時把數據輸送給液晶,這里需要注意的是當E為高電平時,數據必須是穩定的。
????? 7-14為數據I/O口。
???? ?15-16我們暫時不作考慮。
② RAM映射。
PS:這里可以看出地址00-10和40-50為LCD的顯示區域分別顯示第一行和第二行,而10-27和50-67為非顯示區域,但是可以存放數據。
?③操作時序圖
讀操作
由時序圖和DataSheet說明(技術參數)可看出需輸入
讀狀態:RS=L,RW=H,E=H。輸出D0-D7狀態字。
讀數據:RS=H,RW=H,E=H。輸出D0-D7數據。
寫操作
由時序圖和DataSheet說明(技術參數)可看出需輸入:
寫指令:RS=L,RW=L,D0--D7=指令碼,E=H。輸出:無
寫數據:RS=H,RW=L,D0--D7=指令碼,E=H。輸出:無
PS:狀態字說明:
注意:對控制字每次進行讀寫操作時都必須進行讀寫檢測,確保STA7=0。
④1602A指令說明:
1、顯示模式設置
指令碼:0011 1000??? 功能:設置LCD為16X2顯示,5X7點陣,8位只數據接口。
?????????? 0000 0DCB??? 功能:D1=1 開顯示,D1=0關顯示。C1=1 顯示光標,C1=0 不顯示光標。B=1 光標閃爍,B=0 光標不顯示。
?????????? 0000 01NS??? 功能:N=1 當讀或寫一個字符后指針加一且光標加一。N=0 當讀或寫一個字符后指針減一且光標減一。
???????????????????????????????????????S=1 當寫一個字符,整屏顯示左移(N=1)或者右移(N=0),得到效果是光標不移動而屏幕移動的效果。
? S=0當寫一個字符時,屏幕不移動。
2、數據指針設置:80H+地址碼。 需要注意的是前面要加上一個80H。
3、其他設置:01H:數據指針清0,所有數據顯示清0。
????????????????? 02H:數據指針清0。
?
二:實驗原理圖:
為了更好的讓大家明白第三部分的程序,以下是電路圖:
三、程序源碼:
1 #include<reg52.h> 2 #include<intrins.h> 3 //宏定義 4 #define uchar unsigned char 5 #define uint unsigned int 6 7 //dula wela與本實驗無關、由于外接了數碼管所以為了讓1602有足夠電壓所以需禁用數碼管 8 sbit dula=P2^6; 9 sbit wela=P2^7; 10 //分別定義了1602的使能,數據/命令選擇,讀寫選擇管腳 11 sbit lcden=P3^4; 12 sbit lcdrs=P3^5; 13 sbit lcdrw=P3^6; 14 //讀寫檢測位(詳見狀態字說明) 15 sbit sta7=P0^7; 16 //定義了4個按鈕來實現調整時間的功能(S1:選擇按鈕,S2:上調,S3:下調,S4:計時停止) 17 sbit s1=P3^0; 18 sbit s2=P3^1; 19 sbit s3=P3^2; 20 sbit s4=P3^3; 21 //1602第一行要顯示的數據 22 uchar code string[]={"2013-05-15 THI"}; 23 //1602第二行顯示的數據 24 uchar code string1[]={"00-00-00"}; 25 uchar count,shi,fen,miao,keynum; 26 27 //延時函數 28 void delay(uchar ms) 29 { 30 uint x,y; 31 for(x=ms;x>0;x--) 32 { 33 for(y=110;y>0;y--); 34 } 35 } 36 37 //判斷是否可以對1602進行讀寫操作 38 uchar BusyTest() 39 { 40 bit result; 41 lcdrs=0; 42 lcdrw=1; 43 lcden=1; 44 _nop_(); 45 _nop_(); 46 _nop_(); 47 _nop_(); 48 result=sta7; 49 lcden=0; 50 return result; 51 } 52 53 //向1602寫命令 54 void WriteInstruction(uchar instruction) 55 { 56 while(BusyTest()==1);//可讀寫判斷 57 lcdrs=0; 58 lcdrw=0; 59 lcden=0; 60 61 _nop_(); 62 _nop_(); 63 64 P0=instruction; 65 66 _nop_(); 67 _nop_(); 68 _nop_(); 69 _nop_(); 70 71 lcden=1; 72 73 _nop_(); 74 _nop_(); 75 _nop_(); 76 _nop_(); 77 78 lcden=0; 79 } 80 81 //向1602寫數據 82 void WriteData(uchar Data) 83 { 84 while(BusyTest()==1);//可讀寫判斷 85 lcdrs=1; 86 lcdrw=0; 87 lcden=0; 88 89 _nop_(); 90 _nop_(); 91 92 P0=Data; 93 94 _nop_(); 95 _nop_(); 96 _nop_(); 97 _nop_(); 98 99 lcden=1; 100 101 _nop_(); 102 _nop_(); 103 _nop_(); 104 _nop_(); 105 106 lcden=0; 107 } 108 109 //102初始化 110 void Initiate() 111 { 112 P0=1; 113 dula=0; 114 wela=0; 115 delay(15); 116 WriteInstruction(0x38);//顯示模式設置 117 delay(5); 118 WriteInstruction(0x38);//顯示模式設置 119 delay(5); 120 WriteInstruction(0x38);//顯示模式設置 121 delay(5); 122 WriteInstruction(0x0c);//開顯示,不顯示光標 123 delay(5); 124 WriteInstruction(0x06);//讀寫一個字符后地址指針加1,光標加1 125 delay(5); 126 WriteInstruction(0x01);//數據指針清0,顯示清0 127 delay(5); 128 } 129 130 //顯示時分秒 131 void write_sfm(uchar add,uchar Data) 132 { 133 uchar shi,ge; 134 shi=Data/10; 135 ge=Data%10; 136 WriteInstruction(0x80+0x44+add); //確定起始光標位置。 137 WriteData(0x30+shi); //寫入十位 注:0的字符時0x30 詳細見附件:字符手冊 138 WriteData(0x30+ge); //寫入個位 139 } 140 141 //搜索按下的按鍵,來確定光標的顯示位置 ,一般的邏輯控制沒什么好說的 142 void keyscan() 143 { 144 lcdrs=0; 145 if(s1==0) 146 { 147 delay(5); 148 if(s1==0) 149 { 150 while(!s1); //按鍵去抖 151 keynum++; 152 TR0=0; 153 if(keynum==4) 154 { 155 keynum=1; 156 } 157 if(keynum==1) 158 { 159 WriteInstruction(0x80+0x44+7); 160 } 161 if(keynum==2) 162 { 163 WriteInstruction(0x80+0x44+4); 164 } 165 if(keynum==3) 166 { 167 WriteInstruction(0x80+0x44+1); 168 } 169 170 WriteInstruction(0x0f); 171 } 172 } 173 174 if(s2==0) 175 { 176 delay(5); 177 if(s2==0) 178 { 179 while(!s2); 180 if(keynum==1) 181 { 182 miao++; 183 if(miao==60) 184 { 185 miao=0; 186 } 187 WriteInstruction(0x80+0x44+7); 188 write_sfm(6,miao); 189 } 190 if(keynum==2) 191 { 192 fen++; 193 if(fen==60) 194 { 195 fen=0; 196 } 197 WriteInstruction(0x80+0x44+4); 198 write_sfm(3,fen); 199 } 200 if(keynum==3) 201 { 202 shi++; 203 if(shi==24) 204 { 205 shi=0; 206 } 207 WriteInstruction(0x80+0x44+1); 208 write_sfm(0,shi); 209 } 210 } 211 } 212 213 if(s3==0) 214 { 215 delay(5); 216 if(s3==0) 217 { 218 while(!s3); 219 if(keynum==1) 220 { 221 if(miao==0) 222 { 223 miao=59; 224 } 225 else 226 { 227 miao--; 228 } 229 WriteInstruction(0x80+0x44+7); 230 write_sfm(6,miao); 231 } 232 if(keynum==2) 233 { 234 if(fen==0) 235 { 236 fen=59; 237 } 238 else 239 { 240 fen--; 241 } 242 WriteInstruction(0x80+0x44+4); 243 write_sfm(3,fen); 244 } 245 if(keynum==3) 246 { 247 if(shi==0) 248 { 249 shi=23; 250 } 251 else 252 { 253 shi--; 254 } 255 WriteInstruction(0x80+0x44+1); 256 write_sfm(0,shi); 257 } 258 } 259 } 260 261 if(s4==0) 262 { 263 delay(5); 264 if(s4==0); 265 while(!s4); 266 keynum=0; 267 WriteInstruction(0x0c); 268 TR0=1; 269 } 270 } 271 272 273 void main() 274 { 275 //LCD顯示初始值 276 uchar i; 277 Initiate(); 278 delay(10); 279 i=0; 280 WriteInstruction(0x80+0x01); 281 while(string[i]!='\0') 282 { 283 WriteData(string[i]); 284 i++; 285 delay(10); 286 } 287 WriteInstruction(0x80+0x44); 288 i=0; 289 while(string1[i]!='\0') 290 {291 WriteData(string1[i]); 292 i++; 293 delay(10); 294 } 295 296 //設置定時器 297 TMOD=0x01; 298 TH0=(65536-50000)/256; 299 TL0=(65536-50000)%256; 300 EA=1; 301 ET0=1; 302 TR0=1; 303 304 while(1) 305 { 306 keyscan(); 307 if(count==20) 308 { 309 count=0; 310 miao++; 311 if(miao==60) 312 { 313 miao=0; 314 fen++; 315 if(fen==60) 316 { 317 fen=0; 318 shi++; 319 if(shi==24) 320 { 321 shi=0; 322 } 323 } 324 } 325 write_sfm(6,miao); 326 write_sfm(3,fen); 327 write_sfm(0,shi); 328 } 329 } 330 } 331 332 //計數器50ms 333 void timer0() interrupt 1 334 { 335 TH0=(65536-50000)/256; 336 TL0=(65536-50000)%256; 337 count++; 338 } View Code附:字符手冊:
?
??????????
?
轉載于:https://www.cnblogs.com/hello-jackie/archive/2013/05/25/3085543.html
總結
以上是生活随笔為你收集整理的89C52控制1602A液晶的计时器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串比较函数实现,超简单的面试题,回过
- 下一篇: Android开发中目前流行控件和知识点