当前位置:首页 > 自行车简易数字里程表设计论文
***********************************************************************/ 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); //关写保护
共分享92篇相关文档