单片机问题:单片机从ds1302时钟芯片io口读出来的数据是什么进制的,那怎么送到1602液晶显示呢?

给个转化的方法来把 谢谢了 我要详细,再谢谢了
2024-11-16 21:39:35
推荐回答(5个)
回答1:

BCD码(16进制数)。参考下面的程序(取数后送1602显示)
//向LCM中填写 年 数据
void lcm_w_yy(void){
//if(read_clock(0x8d) != yy){
yy = read_clock(0x8d);
lcm_w_test(0,0x83);
lcm_w_word("20");
lcm_w_test(0,0x84);
lcm_w_test(1,(yy/16)+0x30);
lcm_w_test(1,yy%16+0x30);
} //}
/*****************************************************************************/
//向LCM中填写 月 数据
void lcm_w_mo(void){
//if(read_clock(0x89) != mo){
mo = read_clock(0x89);
lcm_w_test(0,0x90);
if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);} //十位消隐
else{lcm_w_test(1,0x20);}//同上
lcm_w_test(1,mo%16+0x30);
lcm_w_test(0,0x91);
lcm_w_word("月");
} //}
/*****************************************************************************/
//星期处理并送入LCM的指定区域
void lcm_w_xq(void){
unsigned char sel;
//if(read_clock(0x8b) != xq){
xq = read_clock(0x8b);
sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel
lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)
if(sel==7) {lcm_w_word("日");} //
if(sel==6) {lcm_w_word("六");} //
if(sel==5) {lcm_w_word("五");} //
if(sel==4) {lcm_w_word("四");} //
if(sel==3) {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。
if(sel==2) {lcm_w_word("二");} //
if(sel==1) {lcm_w_word("一");} //星期一
lcm_w_test(0,0x95);
lcm_w_word("星期");
} //}
/*****************************************************************************/
//向LCM中填写 日 数据
void lcm_w_dd(void){
// if(read_clock(0x87) != dd){
dd = read_clock(0x87);
lcm_w_test(0,0x92);
if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隐
else{lcm_w_test(1,0x20);}//同上
lcm_w_test(1,dd%16+0x30);
lcm_w_test(0,0x93);
lcm_w_word("日 ");

} //}
/*****************************************************************************/
//向LCM中填写 小时 数据
void lcm_w_hh(void){
if(read_clock(0x85) != hh){
hh = read_clock(0x85);
if (hh > 0x07 && hh < 0x22 && w == 0){
Beep();//整点报时音
}
}
lcm_w_test(0,0x88);
lcm_w_test(1,(hh/16)+0x30);
lcm_w_test(1,hh%16+0x30);

}
/*****************************************************************************/
//向LCM中填写 分钟 数据
void lcm_w_mm(void){
if(read_clock(0x83) != mm){
mm = read_clock(0x83);
}
if(w == 0){
days();//节日显示
}
lcm_w_test(0,0x89);
lcm_w_test(1,0x3a); //":"
lcm_w_test(1,(mm/16)+0x30);
lcm_w_test(1,mm%16+0x30);
lcm_w_test(1,0x2e); //"."
}
/*****************************************************************************/
//刷新数据
void updata (void){
lcm_w_mm();//刷新 分
lcm_w_hh();//刷新 小时
lcm_w_dd();//刷新 日
lcm_w_xq();//更新星期值
lcm_w_mo();//刷新 月
lcm_w_yy();//刷新 年
}
/*****************************************************************************/
//向LCM中填写 秒 数据
void lcm_w_ss(void){
unsigned int i=0;
unsigned char a=0,b=0,c=0;
if(read_clock(0x81) != ss){ //判断是否需要更新
ss = read_clock(0x81); //更新数据
lcm_w_test(0,0x8b); //秒值在LCM上的写入位置
lcm_w_test(1,(ss/16)+0x30); //写十位
lcm_w_test(1,ss%16+0x30); //写个位
lcm_w_word(" ");
led_b = ~led_b; //LED闪烁
updata (); //刷新数据
lcm_w_test(0,0x8d); //温度在LCM上的写入位置
i=ReadTemperature();//读温度并送显
a=i/100;
lcm_w_test(1,a+0x30); //显示温度十位
b=i/10-a*10;
lcm_w_test(1,b+0x30); //个位
lcm_w_test(1,0x2e); //"."
c=i-a*100-b*10;
lcm_w_test(1,c+0x30); //小位1位
lcm_w_word("℃"); //度C
} }

回答2:

有好程序可以到 中国电子开发网() 去晒一晒 我一直在那里潜水
我最近也在研究这个程 所以 我简单的看了一下你的程序 你是把DS1302的数据读出来直接就送了显示 像这样
write_datae(shu[read_DS(0x89)/10]);
write_datae(shu[read_DS(0x89)%10]);
我也习惯这样写程序 很好 但是冷不丁的看起来有点复杂 不过效果还是很好的

回答3:

读出来的是BCD码形式的。。

回答4:

http://zhidao.baidu.com/question/255265141.html

回答5:

慢慢看看啦