|
①主程序:/*12MHZ晶振,LCD1602實(shí)時(shí)動(dòng)態(tài)顯示一個(gè)變量(num)二位數(shù),通過(guò)一個(gè)按鍵循環(huán)自加,當(dāng)加到99,就重新回到1*/
#include<LCD.h>
uchar a,b;
uchar dat[2]; //要在【】中加數(shù)組長(zhǎng)度,不然會(huì)出現(xiàn)問(wèn)題。。。。。。。。。
uint num;
sbit s1=P3^0; //獨(dú)立按鍵定義
void delayms(uint z);//聲明毫秒級(jí)延時(shí)函數(shù)
void Keyscan();// 聲明按鍵函數(shù)
void main()
{
num=50;//定義并初始化num=50。
LCD_init(); //初始化LCD602
while(1)
{
Keyscan();
a=num/10; //十位
b=num%10; //個(gè)位
dat[0]=a+0x30; //數(shù)組第一位賦值十位。
dat[1]=b+0x30; //數(shù)組第二位賦值個(gè)位。
Write_Cmd(0x80 | 0x00);//設(shè)置顯示地址0x00,第一行從第一個(gè)字符開(kāi)始顯示 。
/*接下來(lái)依次從首地址開(kāi)始顯示uchar類型字符*/
Write_Dat(dat[0]);
Write_Dat(dat[1]);
delayms(10); //延時(shí)5ms,防止屏幕閃爍
}
}
/*定義毫秒級(jí)延時(shí)函數(shù)*/
void delayms(uint z)//毫秒級(jí)延時(shí)程序
{ uint i,j;
for(i=z;i--;i>0)
for(j=114;j--;j>0);
}
/*定義按鍵函數(shù)函數(shù)*/
void keyscan()
{
if(s1==0)
delayms(5); //按鍵消抖
if(s1==0)
{
if(num<99)
num=num+1;
else
num=0;
}
while(!s1); //按鍵松手檢測(cè),若為0,則在此等待
}
②LCD1602頭文件:
#ifndef _LCD_H_
#define _LCD_H_
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
//uchar x,y,*str,dat,cmd;
void Read_Busy(); //判斷液晶忙?
void Write_Cmd(uchar cmd); //寫入一字節(jié)指令
void Write_Dat(uchar dat); //寫入一字節(jié)數(shù)據(jù)
void LCD_init(); //lcd初始化
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str); //顯示字符串
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat); //顯示一個(gè)字符
#endif //定義結(jié)束
③LCD602頭文件對(duì)應(yīng)的.c程序:
#include<LCD.h>
#include<reg52.h>
sbit RS = P3^5;
sbit RW = P3^6;
sbit EN = P3^4;
//#define uchar unsigned char
//#define uint unsigned int
//判斷液晶忙,如果忙則等待
void Read_Busy()
{
uchar busy;
P0=0xff; //p0置1
RS=0; //數(shù)據(jù),命令選擇端為0,表示數(shù)據(jù)
RW=1; //寫
do
{
EN=1;
busy=P0;
EN=0;
}
while(busy&0x80); //最高位為1,則為忙。
}
//寫LCD1602命令一個(gè)字節(jié)
void Write_Cmd(uchar cmd)
{
Read_Busy();//判斷忙
RS = 0;
RW = 0;
P0 = cmd;
EN = 1;
EN = 0;
}
//寫一個(gè)字節(jié)數(shù)據(jù),一個(gè)字符uchar類型
void Write_Dat(uchar dat)
{
Read_Busy();
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
EN = 0;
}
//lcd1602初始化
void LCD_init()
{
Write_Cmd(0x38);//第一步:顯示模式設(shè)置。設(shè)置16*2顯示 0011 1000
Write_Cmd(0x0f);//第二步:顯示開(kāi)/關(guān)光標(biāo)設(shè)置 0000 1 D C B D=1:開(kāi)顯示 C=1:顯示光標(biāo)反之。B=1:光標(biāo)閃爍B=0;光標(biāo)不閃爍
Write_Cmd(0x01);//第三步:清屏指令 ,以免之前殘留在LCD上的數(shù)據(jù)
Write_Cmd(0x06);//第四步:0000 01NS 。N=1;地址指針加1,光標(biāo)加1.地址指針移位命令,讀或?qū)懸粋(gè)字符后,地址指針加1,且光標(biāo)加1
Write_Cmd(0x80 | 0x00);//第五步:設(shè)置顯示起始地址80H+(00H~0F/ 40H~4FH)。
}
//x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行) *str:需要顯示的字符串
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
if(y)
x |= 0x40;
x |= 0x80;
Write_Cmd(x);
while(*str != '\0')
{
Write_Dat(*str++);
}
}
//x:要顯示的橫坐標(biāo)取值0-40,y:要顯示的行坐標(biāo)取值0-1(0為第一行,1為第二行) dat:需要顯示的數(shù)據(jù)以ASCLL形式顯示
void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
{
if(y)
x |= 0x40;
x |= 0x80;
Write_Cmd(x);
Write_Dat(dat);
}
這是動(dòng)態(tài)顯示的基礎(chǔ)程序,采用模塊化編程,以后可以加更多內(nèi)容,歡迎提出指正和進(jìn)行交流。
|
評(píng)分
-
查看全部評(píng)分
|