深圳網(wǎng)站開發(fā)公司西安網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣
一、實驗?zāi)康?#xff1a;
(1)學(xué)習(xí)lcd 1602的編程與使用、
(2)機械式復(fù)位開關(guān)button軟件消抖的方法。
二、實驗內(nèi)容:
1、必做:先顯示開機畫面,:在1602顯示器上,分兩行分別居中顯示字符“ ?AHAU? CHINA? ” 和 "? I LOVE YOU? "。然后從右向左移動直至消失。其中1602的rs、rw、en引腳分別使用單片機的P1.0、P1.1、P1.2引腳,數(shù)據(jù)引腳接單片機的P0口。
要求:(1)將兩行字符存儲在數(shù)組中。
(2)將lcd1602的基本操作都寫到一個頭文件中,供主函數(shù)文件調(diào)用。在主函數(shù)文件中,只處理與顯示內(nèi)容有關(guān)的業(yè)務(wù)。
提高版:兩行逐個顯示,兩行字符全部出現(xiàn)后整體靜態(tài)顯示1秒左右,然后閃爍3次,最后從右向左移動直至消失。
2、接上1題(必做,按鍵button與lcd1602):當(dāng)兩行字符左移消失以后,在lcd1602的第一行居中顯示:“a:?”,其中?為a的值,隨按鍵變化。
其中無符號字節(jié)型變量a初值為0,其值實時顯示在lcd 1602上。當(dāng)復(fù)位開關(guān)S1(設(shè)置)按下時,a的值閃爍顯示;S2(增加)每按一次,a增1;直至a增為 9,再按一次S2,a 歸 0;S3(減少)按鍵每按一次,a 自減 1; 如此反復(fù),并將 a 的值實時送至lcd 1602以閃爍的形式顯示出來“a:?”,其中?為a的值,并閃爍顯示。當(dāng)按下S4(確認(rèn))時,a的值確定并不再閃爍。
其中S1、S2、S3、S4均為復(fù)位開關(guān)(button),即輕按接通、釋放后自動復(fù)位斷開。S1、S2、S3、S4與單片機的接口請遵照學(xué)習(xí)板電路的設(shè)置(見學(xué)習(xí)板電路原理圖)。
要求:
(1)使用開關(guān)需要進行軟件消抖(軟件消抖方法在教材5.6.1和5.6.2中有介紹);
(2)注意lcd 1602基本操作的時序。
main.c
#include "lcd1602.h"
#include "Delay.h"unsigned char code date[]=" AHAU CHINA " ;
unsigned char code time[]=" I LOVE YOU ";void char_writer() // 寫入兩行待顯示字符數(shù)組
{uchar i,j;for(i=0;i<16;i++) // 寫入第一行待顯示字符數(shù)組{write_data(date[i]);}write_command(0x80+0x40); // 更改地址到第二行for(j=0;j<16;j++) // 寫入第二行待顯示字符數(shù)組{write_data(time[j]);}
}void main()
{lcd_initial(); // 1602初始化char_writer(); // 寫入兩行待顯示字符數(shù)組while(1) {write_command(0x18); // 字符左移消失0001 1000Delay(50);}
}
Delay.c
#include "Delay.h"void delay(unsigned int j) // 延時函數(shù),此處使用晶振為11.0592MHz
{unsigned char i = 250;for(;j>0;j--){while(--i);i = 249;while(--i);i = 250;}
}
Delay.h
#ifndef __DELAY_H
#define __DELAY_H#include <reg51.h>
#include <intrins.h>void Delay(unsigned int j);
#endif
lcd1602.h
#ifndef __LCD1602_H
#define __LCD1602_H#include <reg51.h>
#include <intrins.h>#define out P0 //數(shù)據(jù)到LCDtypedef unsigned int uint;
typedef unsigned char uchar;sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P1^2;void check_busy();
void write_command( uchar com );
void write_data(uchar dat);
void lcd_initial();
void string(uchar ad, uchar *s);#endif
lcd1602.c
#include "lcd1602.h"
#include "Delay.h"void check_busy() //檢查忙標(biāo)志位
{uchar dt;do{dt = 0xff;E = 0;RS = 0;RW = 1;E = 1;dt = out;}while(dt&0x80);E = 0;
}void write_command(uchar com) //寫命令函數(shù)
{check_busy();E = 0;RS = 0;RW = 0;out = com;E = 1;_nop_();E = 0;Delay(1);
}void write_data(uchar dat) // 寫顯示數(shù)據(jù)函數(shù)
{check_busy();E = 0;RS = 1;RW = 0;out = dat;E = 1;_nop_();E = 0;Delay(1);
}void lcd_initial() //液晶顯示器初始化函數(shù)
{write_command(0x38);write_command(0x0C);write_command(0x05);write_command(0x01);Delay(1);
}void string(uchar ad, uchar *s) //輸出顯示字符串的函數(shù)
{write_command(ad);while(*s > 0){write_data(*s++);Delay(100);}
}