基于凌阳单片机的1602液晶显示.docx

上传人:b****5 文档编号:4646083 上传时间:2022-12-07 格式:DOCX 页数:14 大小:18.94KB
下载 相关 举报
基于凌阳单片机的1602液晶显示.docx_第1页
第1页 / 共14页
基于凌阳单片机的1602液晶显示.docx_第2页
第2页 / 共14页
基于凌阳单片机的1602液晶显示.docx_第3页
第3页 / 共14页
基于凌阳单片机的1602液晶显示.docx_第4页
第4页 / 共14页
基于凌阳单片机的1602液晶显示.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

基于凌阳单片机的1602液晶显示.docx

《基于凌阳单片机的1602液晶显示.docx》由会员分享,可在线阅读,更多相关《基于凌阳单片机的1602液晶显示.docx(14页珍藏版)》请在冰豆网上搜索。

基于凌阳单片机的1602液晶显示.docx

基于凌阳单片机的1602液晶显示

基于DS1302和18B20的1602液晶显示部分

T

E

T

i

:

1

1

0

3

2

3

3

2

.

3

C

1

1

0

3

2

3

//包含凌阳单片机寄存器的头文件

#include"SPCE061A.H"

//语法宏定义

#defineucharunsignedchar

#defineuintunsignedint

//内部寄存器驱动程序

#defineWRITE_SECOND0x80

#defineWRITE_MINUTE0x82

#defineWRITE_HOUR0x84

#defineWRITE_DAY0x86

#defineWRITE_MONTH0x88

#defineWRITE_YEAR0x8c

#defineREAD_SECOND0x81

#defineREAD_MINUTE0x83

#defineREAD_HOUR0x85

#defineREAD_DAY0x87

#defineREAD_MONTH0x89

#defineREAD_YEAR0x8D

#defineWRITE_PROTECT0x8E

//由于凌阳单片机的接口不能简单的宏定义,只能用相关的寄存器控制,假如是使用一下借口

//位定义1302芯片的接口,数据输出端DATA定义在IOA0引脚

//位定义1302芯片的接口,复位端口RST定义在IOA1引脚

//位定义1302芯片的接口,时钟输出端口SCLK定义在IOA2引脚

//1602液晶芯片的接口的宏定义

//寄存器选择位,将RS位定义为IOA3引脚

//读写选择位,将RW位定义为IOA4引脚

//使能信号位,将E位定义为IOA5引脚

//忙碌标志位,将BF位定义为IOB0引脚

//数据总线引脚,将数据总线引脚DATABUS定义为IOA[7--14]引脚

ucharREAD_BF()

{

uchara;

a=*P_IOB_Data&0x0001;

returna;

}

voidWRITE_DATA(uchara)

{

if(1==a)

*P_IOA_Data=*P_IOA_Data|0x0001;

if(0==a)

*P_IOA_Data=*P_IOA_Data&0x0001;

}

voidWRITE_SCLK(uchara)

{

if(1==a)

*P_IOA_Data=*P_IOA_Data|0x0003;

else

*P_IOA_Data=*P_IOA_Data&0x0003;

}

voidWRITE_RST(uchara)

{

if(1==a)

*P_IOA_Data=*P_IOA_Data|0x0002;

else

*P_IOA_Data=*P_IOA_Data&0x0002;

}

voidWRITE_RS(uchara)

{

if(1==a)

*P_IOA_Data=*P_IOA_Data|0x0004;

else

*P_IOA_Data=*P_IOA_Data&0x0004;

}

voidWRITE_RW(uchara)

{

if(1==a)

*P_IOA_Data=*P_IOA_Data|0x0005;

else

*P_IOA_Data=*P_IOA_Data&0x0005;

}

voidWRITE_E(uchara)

{

if(1==a)

*P_IOA_Data=*P_IOA_Data|0x0006;

else

*P_IOA_Data=*P_IOA_Data&0x0006;

}

voidWRITE_DATABUS(uchara)

{

*P_IOA_Data=*P_IOA_Data|a;

}

//以下是DS1302芯片的操作程序

uchardigit[10]={"0123456789"};//定义字符数组显示数字

//函数功能:

延时若干微秒

//入口参数:

n

voiddelaynus(ucharn)

{

uchari;

for(i=0;i

}

//函数功能:

向1302写一个字节数据

//入口参数:

x

voidWrite1302(uchardat)

{

uchari;

WRITE_SCLK(0);//拉低SCLK,为脉冲上升沿写入数据做好准备

delaynus

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续写8个二进制位数据

{

WRITE_DATA(dat&0x01);//取出dat的第0位数据写入1302

delaynus

(2);//稍微等待,使硬件做好准备

WRITE_SCLK

(1);//上升沿写入数据

delaynus

(2);//稍微等待,使硬件做好准备

WRITE_SCLK(0);//重新拉低SCLK,形成脉冲

dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位

}

}

//函数功能:

根据命令字,向1302写一个字节数据

//入口参数:

Cmd,储存命令字;dat,储存待写的数据

voidWriteSet1302(ucharCmd,uchardat)

{

WRITE_RST(0);//禁止数据传递

WRITE_SCLK(0);//确保写数居前SCLK被拉低

WRITE_RST

(1);//启动数据传输

delaynus

(2);//稍微等待,使硬件做好准备

Write1302(Cmd);//写入命令字

Write1302(dat);//写数据

WRITE_SCLK

(1);//将时钟电平置于已知状态

WRITE_RST(0);//禁止数据传递

}

//函数功能:

从1302读一个字节数据

//入口参数:

x

ucharRead1302(void)

{

uchari,dat;

delaynus

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续读8个二进制位数据

{

dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位

if(*P_IOA_Data&0x0001==1)//如果读出的数据是1

dat|=0x80;//将1取出,写在dat的最高位

WRITE_SCLK

(1);//将SCLK置于高电平,为下降沿读出

delaynus

(2);//稍微等待

WRITE_SCLK(0);//拉低SCLK,形成脉冲下降沿

delaynus

(2);//稍微等待

}

returndat;//将读出的数据返回

}

//函数功能:

根据命令字,从1302读取一个字节数据

//入口参数:

Cmd

ucharReadSet1302(ucharCmd)

{

uchardat;

WRITE_RST(0);//拉低RST

WRITE_SCLK(0);//确保写数居前SCLK被拉低

WRITE_RST

(1);//启动数据传输

Write1302(Cmd);//写入命令字

dat=Read1302();//读出数据

WRITE_SCLK

(1);//将时钟电平置于已知状态

WRITE_RST(0);//禁止数据传递

returndat;//将读出的数据返回

}

//函数功能:

1302进行初始化设置

voidInit_DS1302(void)

{

WriteSet1302(WRITE_PROTECT,0x00);//根据写状态寄存器命令字,写入不保护指令

WriteSet1302(WRITE_SECOND,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒

WriteSet1302(WRITE_MINUTE,((0/10)<<4|(0%10)));//根据写分寄存器命令字,写入分

WriteSet1302(WRITE_HOUR,((12/10)<<4|(12%10)));//根据写时寄存器命令字,写入小时

WriteSet1302(WRITE_DAY,((01/10)<<4|(01%10)));//根据写日寄存器命令字,写入日

WriteSet1302(WRITE_MONTH,((06/10)<<4|(06%10)));//根据写月寄存器命令字,写入月

WriteSet1302(WRITE_YEAR,((10/10)<<4|(10%10)));//根据写你年寄存器命令字,写入年

}

//函数功能:

延时1ms

//(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

voiddelay1ms()

{

unsignedchari;

unsignedcharj;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

//函数功能:

延时若干毫秒

//入口参数:

n

voiddelaynms(unsignedcharn)

{

unsignedchari;

for(i=0;i

delay1ms();

}

//函数功能:

判断液晶模块的忙碌状态

//返回值:

result。

result=1,忙碌;result=0,不忙

ucharBusyTest(void)

{

ucharresult;

WRITE_RS(0);//根据规定,RS为低电平,RW为高电平时,可以读状态

WRITE_RW

(1);

WRITE_E

(1);//E=1,才允许读写

delaynms(20);//空操作四个机器周期,给硬件反应时间

result=READ_BF();//将忙碌标志电平赋给result

WRITE_E(0);//将E恢复低电平

returnresult;

}

//函数功能:

将模式设置指令或显示地址写入液晶模块

//入口参数:

dictate

voidWriteInstruction(uchardictate)

{

while(BusyTest()==1);//如果忙就等待

WRITE_RS(0);//根据规定,RS和R/W同时为低电平时,可以写入指令

WRITE_RW(0);

WRITE_E(0);//E置低电平(根据表8-6,写指令时,E为高脉冲,

//就是让E从0到1发生正跳变,所以应先置"0"

delaynms(10);//空操作两个机器周期,给硬件反应时间

WRITE_DATABUS(dictate);//将数据送入P0口,即写入指令或地址

delaynms(20);//空操作四个机器周期,给硬件反应时间

WRITE_E

(1);//E置高电平

delaynms(20);//空操作四个机器周期,给硬件反应时间

WRITE_E(0);//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

//函数功能:

指定字符显示的实际地址

//入口参数:

x

voidWriteAddress(ucharx)

{

WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"

}

//函数功能:

将数据(字符的标准ASCII码)写入液晶模块

//入口参数:

y(为字符常量)

voidWriteData(uchary)

{

while(BusyTest()==1);

WRITE_RS

(1);//RS为高电平,RW为低电平时,可以写入数据

WRITE_RW(0);

WRITE_E(0);//E置低电平(根据表8-6,写指令时,E为高脉冲,

//就是让E从0到1发生正跳变,所以应先置"0"

WRITE_DATABUS(y);//将数据送入P0口,即将数据写入液晶模块

delaynms(20);//空操作四个机器周期,给硬件反应时间

WRITE_E

(1);//E置高电平

delaynms(20);//空操作四个机器周期,给硬件反应时间

WRITE_E(0);//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

//函数功能:

对LCD的显示模式进行初始化设置

voidLcdInitiate(void)

{

delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);//显示模式设置:

16×2显示,5×7点阵,8位数据接口

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x38);//连续三次,确保初始化成功

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x0c);//显示模式设置:

显示开,无光标,光标不闪烁

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x06);//显示模式设置:

光标右移,字符不移

delaynms(5);//延时5ms ,给硬件一点反应时间

WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除

delaynms(5);//延时5ms ,给硬件一点反应时间

}

//以下是1302数据的显示程序

//函数功能:

显示秒

//入口参数:

x

voidDisplaySecond(ucharx)

{

uchari,j;//i,j分别储存秒的十位,个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x4E);//写显示地址,将在第2行第15列开始显示

WriteData(digit[i]);//将百位数字的字符常量写入LCD

WriteData(digit[j]);//将十位数字的字符常量写入LCD

delaynms(50);//延时1ms给硬件一点反应时间

}

//函数功能:

显示分钟

//入口参数:

x

voidDisplayMinute(ucharx)

{

uchari,j;//i,j分别储存分钟的十位,个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x4B);//写显示地址,将在第2行第12列开始显示

WriteData(digit[i]);//将百位数字的字符常量写入LCD

WriteData(digit[j]);//将十位数字的字符常量写入LCD

delaynms(50);//延时1ms给硬件一点反应时间

}

//函数功能:

显示小时

//入口参数:

x

voidDisplayHour(unsignedcharx)

{

uchari,j;//i,j分别储存秒的十位,个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x48);//写显示地址,将在第2行第9列开始显示

WriteData(digit[i]);//将百位数字的字符常量写入LCD

WriteData(digit[j]);//将十位数字的字符常量写入LCD

delaynms(50);//延时1ms给硬件一点反应时间

}

//函数功能:

显示日

//入口参数:

x

voidDisplayDay(ucharx)

{

uchari,j;//i,j分别储存秒的十位,个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x0E);//写显示地址,将在第1行第15列开始显示

WriteData(digit[i]);//将百位数字的字符常量写入LCD

WriteData(digit[j]);//将十位数字的字符常量写入LCD

delaynms(50);//延时1ms给硬件一点反应时间

}

//函数功能:

显示月

//入口参数:

x

voidDisplayMonth(ucharx)

{

uchari,j;//i,j分别储存秒的十位,个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x0B);//写显示地址,将在第1行第12列开始显示

WriteData(digit[i]);//将百位数字的字符常量写入LCD

WriteData(digit[j]);//将十位数字的字符常量写入LCD

delaynms(50);//延时1ms给硬件一点反应时间

}

//函数功能:

显示年

//入口参数:

x

voidDisplayYear(ucharx)

{

uchari,j;//j,k,l分别储存温度的百位、十位和个位

i=x/10;//取十位

j=x%10;//取个位

WriteAddress(0x08);//写显示地址,将在第1行第9列开始显示

WriteData(digit[i]);//将百位数字的字符常量写入LCD

WriteData(digit[j]);//将十位数字的字符常量写入LCD

delaynms(50);//延时1ms给硬件一点反应时间

}

//函数功能:

液晶显示年月日以及时间

voiddisplaytime()

{

unsignedcharsecond,minute,hour,day,month,year;//分别储存秒、分、小时,日,月,年

unsignedcharReadValue;//储存从1302读取的数据

WriteAddress(0x03);//写Date的显示地址,将在第1行第4列开始显示

WriteData('T');//将字符常量写入LCD

WriteData('i');//将字符常量写入LCD

WriteData('m');//将字符常量写入LCD

WriteData('e');//将字符常量写入LCD

WriteData(':

');//将字符常量写入LCD

WriteAddress(0x0A);//写年月分隔符的显示地址,显示在第1行第11列

WriteData('-');//将字符常量写入LCD

WriteAddress(0x0D);//写月日分隔符的显示地址,显示在第1行第14列

WriteData('-');//将字符常量写入LCD

WriteAddress(0x4A);//写小时与分钟分隔符的显示地址,显示在第2行第11列

WriteData(':

');//将字符常量写入LCD

WriteAddress(0x4D);//写分钟与秒分隔符的显示地址,显示在第2行第14列

WriteData(':

');//将字符常量写入LCD

while

(1)

{

ReadValue=ReadSet1302(READ_SECOND);//从秒寄存器读数据

second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化

DisplaySecond(second);//显示秒

ReadValue=ReadSet1302(READ_MINUTE);//从分寄存器读

minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化

DisplayMinute(minute);//显示分

ReadValue=ReadSet1302(READ_HOUR);//从小时寄存器读

hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化

DisplayHour(hour);//显示小时

ReadValue=ReadSet1302(READ_DAY);//从日寄存器读

day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化

DisplayDay(day);//显示日

ReadValue=ReadSet1302(READ_MONTH);//从月寄存器读

month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化

DisplayMonth(month);//显示月

ReadValue=ReadSet1302(READ_YEAR);//从年寄存器读

year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);//将读出数据转化

DisplayYear(year);//显示年

}

}

//函数功能:

主函数

voidmain(void)

{

*P_IOA_Dir=0xffff;//可知IOA[0--5],和IOA[7--14这六个引脚都是输出控制引脚

*P_IOA_Attrib=0xffff;

*P_IOB_Dir=0x0000;//将IOB0设置成带下拉电阻的输入

*P_IOB_Attrib=0x0000;

*P_IOB_Buffer=0x0000;

LcdInitiate();//将液晶初始化

Init_DS1302();//将1302初始化

displaytime();//显示时间

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1