自行车简易数字里程表设计论文 联系客服

发布时间 : 星期二 文章自行车简易数字里程表设计论文更新完毕开始阅读5807ef8d52ea551810a68798

***********************************************************************/ void write_data(uchar dat) {

i =0; e=0; rs=1; rw=0; P0=dat;

delay_uint(3); e=1;

delay_uint(25); e=0; }

/******************************************************************** * 名称 : write_sfm2(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示\,调用该函数如下

write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void write_sfm2(uchar hang,uchar add,uint date) {

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); write_data(0x30+date/10); write_data(0x30+date); }

/******************************************************************** * 名称 : write_sfm4(uchar hang,uchar add,uchar date)

* 功能 : 显示2位十进制数,如果要让第一行,第五个字符开始显示\,调用该函数如下

write_sfm1(1,5,23)

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void write_sfm4(uchar hang,uchar add,uint date) {

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); write_data(0x30+date/10000); write_data(0x30+date/1000); write_data('.');

write_data(0x30+date/100); write_data(0x30+date/10); write_data(0x30+date); write_data('k'); write_data('m'); }

void write_sfm7(uchar hang,uchar add,uint date) {

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); write_data(0x30+date/100000); write_data(0x30+date/100000); write_data(0x30+date/10000); write_data(0x30+date/1000); write_data('.');

write_data(0x30+date/100); write_data(0x30+date/10); write_data('k'); write_data('m'); }

/***********************lcd1602上显示两位十进制数************************/

void write_sfm1(uchar hang,uchar add,uchar date) {

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); write_data(0x30+date % 10); }

/******************************************************************** * 名称 : write_string(uchar hang,uchar add,uchar *p) * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示\cd ef\,调用该函数如下

write_string(1,5,\cd ef;\

* 输入 : 行,列,需要输入1602的数据 * 输出 : 无

***********************************************************************/ void write_string(uchar hang,uchar add,uchar *p) {

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); while(1) {

if(*p == '\\0') break; write_data(*p); p++; } }

/***********************lcd1602上显示两位十进制数************************/ void write_sfm2_ds1302(uchar hang,uchar add,uchar date)

{

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); write_data(table_num[date / 16]); write_data(table_num[date % 16]); }

/*****************控制光标函数********************/

void write_guanbiao(uchar hang,uchar add,uchar date) {

if(hang==1)

write_com(0x80+add); else

write_com(0x80+0x40+add); if(date == 1)

write_com(0x0f); //显示光标并且闪烁 else

write_com(0x0c); //关闭光标 }

/******************************************************************** * 名称 : init_1602()

* 功能 : 初始化1602液晶 * 输入 : 无 * 输出 : 无

***********************************************************************/ void init_1602() //1602初始化 {

write_com(0x38); write_com(0x0c); write_com(0x06); delay_uint(1000);

write_string(1,0,\00:00\

write_string(2,0,\\}

// E309R

/*************写一个数据到对应的地址里***************/

void write_ds1302(uchar add,uchar dat) {

rst = 1; //把复位线拿高

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

{ //低位在前 clk = 0; //时钟线拿低开始写数据

io = add & 0x01; add >>= 1; //把地址右移一位

clk = 1; //时钟线拿高

}

for(i=0;i<8;i++) {

clk = 0; //时钟线拿低开始写数据

io = dat & 0x01;

dat >>= 1; //把数据右移一位

clk = 1; //时钟线拿高 }

rst = 0; //复位线合低

clk = 0; io = 0; }

/*************从对应的地址读一个数据出来***************/ uchar read_ds1302(uchar add) {

uchar value,i;

rst = 1; //把复位线拿高

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

{ //低位在前 clk = 0; //时钟线拿低开始写数据

io = add & 0x01; add >>= 1; //把地址右移一位

clk = 1; //时钟线拿高

}

for(i=0;i<8;i++) {

clk = 0; //时钟线拿低开始读数据

value >>= 1; if(io == 1)

value |= 0x80;

clk = 1; //时钟线拿高 }

rst = 0; //复位线合低

clk = 0; io = 0;

return value; //返回读出来的数据 }

/*************把要的时间 年月日 都读出来***************/ void read_time() {

miao = read_ds1302(read_add[0]); //读秒

fen = read_ds1302(read_add[1]); //读分

shi = read_ds1302(read_add[2]);

//读时

ri = read_ds1302(read_add[3]); //读日

yue = read_ds1302(read_add[4]); //读月

nian = read_ds1302(read_add[5]); //读年

week = read_ds1302(read_add[6]); //读星期 }

/*************把要写的时间 年月日 都写入ds1302里***************/ void write_time() {

write_ds1302(0x8e,0x00); //打开写保护

write_ds1302(write_add[0],miao); //写秒

write_ds1302(write_add[1],fen); //写分

write_ds1302(write_add[2],shi); //写时

write_ds1302(write_add[3],ri); //写日

write_ds1302(write_add[4],yue); //写月

write_ds1302(write_add[5],nian); //写星期

write_ds1302(write_add[6],week); //写年

write_ds1302(0x8e,0x80); //关闭写保护 }

/*************把数据保存到ds1302 RAM中**0-31*************/

void write_ds1302ram(uchar add,uchar dat) {

add <<= 1; //地址是从第二位开始的 add &= 0xfe; //把最低位清零 是写的命令 add |= 0xc0; //地址最高两位为 1 write_ds1302(0x8e,0x00); write_ds1302(add,dat); write_ds1302(0x8e,0x80); }

/*************把数据从ds1302 RAM读出来**0-31*************/

uchar read_ds1302ram(uchar add) {

add <<= 1; //地址是从第二位开始的

add |= 0x01; //把最高位置1 是读命令 add |= 0xc0; //地址最高两位为 1 return(read_ds1302(add)); }

/*************初始化ds1302时间***************/ void init_ds1302() {

uchar i;

rst = 0; //第一次读写数据时要把IO品拿低 clk = 0; io = 0;

i = read_ds1302ram(30); if(i != 3) {

i = 3;

write_ds1302ram(30,i);

write_ds1302(0x8e,0x00); //打开写保护

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

write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允许ds1302工作

write_ds1302(0x8e,0x80); //关写保护