#include <string.h>
#include "ds1302.h"
#include "menu.h"
#include "lcd12864.h"
#define uchar unsigned char
#define uint unsigned int
sbit led=P3^7
uchar temp,keyval
uchar usern=0 //用户序号
//struct mlist *nuser
uchar disdat[16]
void displaykey()
{
keyval=0xff
P1=0xfe
temp=P1
temp&=0xf0
if(temp!=0xf0)//判断是否有键盘按下,真 为有
{
delay(50)
temp=P1
temp=temp&0xf0
if(temp!=0xf0)//判断是否有键盘按下,真 为有
{
temp=P1
switch (temp)
{
case 0xee:keyval='0'break
case 0xde:keyval='1'break
case 0xbe:keyval='2'break
case 0x7e:keyval='3'break
default: break
}
}
}
while((P1&0xf0) != 0xf0)
//判断第二行键盘
P1=0xfd
temp=P1
temp=temp&0xf0
if(temp!=0xf0)
{
delay(50)
temp=P1
temp=temp&0xf0
if(temp!=0xf0)//判断是否有键盘按下,真早段缺 为有
{
temp=P1
switch (temp)
{
case 0xed:keyval='4'break
case 0xdd:keyval='5'break
case 0xbd:keyval='6'break
case 0x7d:keyval='7'break
default: break
}
}
}
while((P1&0xf0) != 0xf0)
//判断第三行键盘
P1=0xfb
temp=P1
temp=temp&0xf0
if(temp!=0xf0)
{
delay(50)
temp=P1
temp=temp&0xf0
if(temp!=0xf0)//判断是否有键盘按下,真 为有
{
temp=P1
switch (temp)
{
case 0xeb:keyval='8'break
case 0xdb:keyval='9'break
case 0xbb:keyval='a'break
case 0x7b:keyval='b'燃拍break
default:break
}
}
}
while((P1&0xf0) != 0xf0)
//判断第四行键盘
P1=0xf7
temp=P1
temp=temp&0xf0
if(temp!=0xf0)
{
delay(50)
temp=P1
temp=temp&0xf0
if(temp!=0xf0)//判断是否有键盘按下,真 为有
{
temp=P1
switch (temp)
{
case 0xe7:keyval='c'break
case 0xd7:keyval='d'break
case 0xb7:keyval='e'break
case 0x77:keyval='f'break
default:break
}
}
}
while((P1&0xf0) != 0xf0)
}
void distime(void)
{
uchar *cal="年月日"陆辩
disdat[0]='2'
disdat[1]='0'
disdat[2]='0'+TIME[6]/16 //年
disdat[3]='0'+(TIME[6]&0x0f)
disdat[4]=cal[0]
disdat[5]=cal[1]
disdat[6]='0'+TIME[4]/16 //月
disdat[7]='0'+(TIME[4]&0x0f)
disdat[8]=cal[2]
disdat[9]=cal[3]
disdat[10]='0'+TIME[3]/16 //日
disdat[11]='0'+(TIME[3]&0x0f)
disdat[12]=cal[4]
disdat[13]=cal[5]
disdat[14]=0
displaystr(1,2,disdat)
disdat[0]='0'+TIME[2]/16 //时
disdat[1]='0'+(TIME[2]&0x0f)
disdat[2]=':'
disdat[3]='0'+TIME[1]/16 //分
disdat[4]='0'+(TIME[1]&0x0f)
disdat[5]=':'
disdat[6]='0'+TIME[0]/16 //秒
disdat[7]='0'+(TIME[0]&0x0f)
disdat[8]=0
displaystr(4,4,disdat)
}
void init_timer(void)
{
TMOD=0x20
TH1=0xfd
TL1=0xfd
TR1=1
SCON=0x40
}
main()
{
uchar num
InitLCD()//初始LCD
Ds1302Init()
init_timer()
ClearScreen(0)
delay(200)
num=0
while(1)
{
Ds1302ReadTime()
distime()
displaykey()
delay(200)
}
}
通用的写法都是:voidmain。main在C语言中整个程序的入口函数,固定的。
main在汇编中只是一个标号,一般是放在主程序的入口,前面是初始化程序,标号名称随意但御乱首个必须是字母,acall和判拆宴lcall都是子程序调用acall是兼容8048的指令,两字长,寻址范围小,Lcall是8051才有的指令,三字长,寻址范围64K,8048是8051的原始型号。掘银
/******************************************************************************************************************************//* smally 2008.5.20 南阳师范学院*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^7
sbit lcden=P2^6
sbit rtscl=P2^1
sbit rtsda=P2^2
sbit da_18b20=P2^0
uchar code table[]="0123456789"
uchar table1[8]
uchar convert_begin
uint t_click,tp
//*****************************************/
/如坦/1602 *** 作相关函数
//缺岁*****************************************/
void wait() //上电后延时 *** 作,等待各芯片准备好 //avoid error
{
uint i=60000
while(i>0)i--
}
void delay()// *** 作之间的时间间隔
{
uchar i=200
while(i>0)i--
}
void write_com(uchar com) //写命令到1602
{
lcdrs=0
P0=com
lcden=1
delay()
lcden=0
}
void write_dat(uchar dat) //写数据到1602
{
lcdrs=1
P0=dat
lcden=1
delay()
lcden=0
}
void init_1602()//初始渣扮桐化1602
{
lcden=0
write_com(0x01)delay()
write_com(0x80)delay()
write_com(0x38)delay()
write_com(0x0c)delay()
write_com(0x06)delay()
}
//**********************************************
//over
//**********************************************
//********************************************/
//ds1307相关 *** 作函数//传送与接收数据都是先高位
//********************************************/
void rt_delay() // *** 作延时,等待信号稳定
{
uchar i=10
while(i>0)i--
}
void init_1307() //初始化1307
{
rtscl = 1rt_delay()rtsda = 1rt_delay()
}
void start_1307() // 开始信号
{
rtsda = 1rtscl = 1rt_delay()rtsda = 0rt_delay()
}
void stop_1307() // 结束信号
{
rtsda = 0rtscl = 1rt_delay()rtsda = 1rt_delay()
}
void write_1307(uchar d ) //写1307
{
uchar i,jrtscl = 0
for(i = 0i <8i++)
{
rtsda = (d >>7)
rtscl = 1
rt_delay()
d = d <<1
rtscl = 0
}
rtsda = 1
rtscl = 1
while((rtsda == 1) &&(j <255))j++
rtscl=0
}
uchar read_1307(uchar b) //读1307
{
uchar d ,i
rtsda = 1rtscl = 0
for(i = 0i <8i++)
{
rtscl = 1
rt_delay()
d = d <<1
d = d | rtsda
rtscl=0
}
rtsda = b
rt_delay()
rtscl = 0
rtscl = 1
return d
}
read_8byte_1307()
{
uchar i
start_1307( )
write_1307( 0xd0 )
write_1307( 0x00 )
stop_1307( )
for(i = 0i <8i++)
{
start_1307()
write_1307(0xd1)
table1[i]=read_1307(1)
stop_1307()
}
}
//**********************************************
//over
//**********************************************
//**********************************************
//18b20 *** 作相关函数
//**********************************************
void reset_time_18b20() //延时640us
{
uint i
i=80
while(i>0)i--
}
void wrbyte(uchar b) //写一个字节
{
uchar i,j
bit btmp
for(j=1j<=8j++)
{
btmp=b&0x01
b=b>>1
if(btmp)
{
da_18b20=0
i++i++
da_18b20=1
i=40 //写1时,15us内拉高数据线,总时间时隙不低于60us
while(i>0)i--
}
else
{
da_18b20=0
i=40 //写0时,拉低至少60us
while(i>0)i--
da_18b20=1
}
}
}
bit rdbit()//读取18b20的一位
{
uchar i
uchar b
da_18b20=0
i++i++i++i++i++
da_18b20=1
i=10 //上升沿15us后读有效
while(i>0)i--
b=da_18b20
i=30
while(i>0)i--///总时间不低于60us
return(b)
}
uchar rdbyte() //读取18b20的一字节
{
uchar i,j,byte
for(i=1i<=8i++)
{
j=rdbit()
byte=(j<<7)|(byte>>1)
}
return(byte)
}
uchar init_18b20() //初始化18b20
{
uint j=0
da_18b20=0
reset_time_18b20()
da_18b20=1
while((da_18b20==1)&&(j<250))j++
if(da_18b20) return 0
else
{
while(!da_18b20)
return 1
}
}
void restore()
{
if(t_click==0)
{
if(init_18b20())
{
ET0=0
while(ET0) ////////// *** 作命令时关闭中断,以免影响时序
wrbyte(0xcc)//////////skip rom命令
wrbyte(0x44)//////////convert 命令
ET0=1 ////////// *** 作命令后再打开中断
convert_begin=1
}
}
}
void read_18b20()
{
uchar tplsb,tpmsb
if(t_click>100)
{
convert_begin=0t_click=0
if(init_18b20())
{
ET0=0
while(ET0) ////////// *** 作命令时关闭中断,以免影响时序
wrbyte(0xcc)//////////skip rom命令
wrbyte(0xbe)//////////读暂存器
tplsb=rdbyte()
tpmsb=rdbyte()
ET0=1 ////////// *** 作命令后再打开中断
tp=tpmsb*256+tplsb
}
}
}
//**********************************************
//over
//**********************************************
//**********************************************
//1602显示函数
//**********************************************
void display()
{
uint nian
write_com(0x80)delay()
write_dat('D')delay()write_dat('a')delay()
write_dat('t')delay()write_dat(':')delay()
//显示日期信息
nian=table1[7]/16*10+table1[7]%16
write_dat('2')delay()
write_dat(table[(table1[6]/100)])delay()
write_dat(table[(table1[6]%100/10)])delay()
write_dat(table[(table1[6]%10)])delay()
//间隔符号'-'
write_dat('-')delay()
//显示月份
write_dat(table[table1[5]/16%2])delay()
write_dat(table[table1[5]%16])delay()
//间隔符号'-'
write_dat('-')delay()
//显示日期
write_dat(table[table1[4]/16%4])delay()
write_dat(table[table1[4]%16])delay()
//星期
write_dat(' ')delay()
write_dat(table[table1[3]%16])delay()
//LCD第二行
write_com(0x80+0x40)delay()
write_dat('T')delay()write_dat('i')delay()
write_dat('m')delay()write_dat(':')delay()
//显示小时
write_dat(table[table1[2]/16%4])delay()
write_dat(table[table1[2]%16])delay()
//间隔符号'-'
write_dat('-')delay()
//显示分钟
write_dat(table[table1[1]/16%8])delay()
write_dat(table[table1[1]%16])delay()
//间隔符号'-'
write_dat('-')delay()
//显示秒
write_dat(table[table1[0]/16%8])delay()
write_dat(table[table1[0]%16])delay()
//显示温度
write_dat(' ')delay()
if((tp>>11)==0)
{write_dat('+')delay()
write_dat(table[(tp>>4)/10])delay()
write_dat(table[(tp>>4)%10])delay()
}
else
{write_dat('-')delay()
write_dat(table[((~(tp-1))>>4)/10])delay()
write_dat(table[((~(tp-1))>>4)%10])delay()
}
}
//**********************************************
//over
//**********************************************
//**********************************************
//main主函数
//**********************************************
void main()
{
TMOD=0x01
TH0=(65536-1000)/256
TL0=(65536-1000)%256 //定时器初始化
EA=1
ET0=1
TR0=1
wait()//上电前预热
init_1602()
init_1307()
if(init_18b20())
{
ET0=0
while(ET0) ////////// *** 作命令时关闭中断,以免影响时序
wrbyte(0xcc)//////////skip rom命令
wrbyte(0x4E)//////////写暂存器命令
wrbyte(0x01)//////////设置上限温度
wrbyte(0x00)//////////设置下限温度
wrbyte(0x1f)//////////设置分辨率TM/R1/R0/1/1/1/1/1
wrbyte(0x43)//////////复制暂存器
ET0=1 ////////// *** 作命令后再打开中断
}
start_1307()
write_1307(0xd0)
write_1307(0x00)
write_1307(0x00)
write_1307(0x59)
write_1307(0x12)
write_1307(0x05)
write_1307(0x03)
write_1307(0x07)
write_1307(0x09)
stop_1307()
while(1)
{
restore()
read_18b20()
read_8byte_1307()
display()
}
}
//****************************************************************
//over
//***************************************************************
//***************************************************************
//中断服务子程序
//***************************************************************
void time0() interrupt 1 using 1
{
TH0=(65536-1000)/256
TL0=(65536-1000)%256
if(convert_begin)t_click++
}
//****************************************************************
//over
//****************************************************************
//**********************************************that's alll*******************************************************************//
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)