为什么LCD1602可以显示字符,但没法显示时钟芯片的数据呀
proteus吧
全部回复
仅看楼主
level 2
为什么LCD1602可以显示字符,但没法显示时钟芯片的数据呀?而且仿真LCD1602一直显示警告忙,加了忙检测就一个数不显示。
#include<reg52.h>
#define uchar signed char
sbit TSCLK = P2^0;//串行时钟输入端
sbit TIO= P2^1;//双向输入线(数据线)
sbit TRST = P2^2;//使能端
sbit LCD_RS = P1^0;
sbit LCD_RW = P1^1;
sbit LCD_EN = P1^2;
uchar code DispStr1[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2d};
uchar code DispStr2[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xdf,0x43};
void write_DS1302(uchar cmd,uchar dat)//写一个字节
{
uchar i ;
TRST = 0;//拉低使能端
TSCLK = 0;//拉低数据总线
TRST = 1;//使能端产生上升沿
for(i = 0; i < 8; i ++)//写命令
{
TSCLK =0;
TIO =cmd&0x01;//最低位先传
TSCLK =1;//数据总线产生上升沿,数据被DS1302读走
cmd >>= 1;//右移1位
}
for(i = 0;i<8;i ++)//写数据
{
TSCLK = 0;
TIO = dat & 0x01;//最低位先传
TSCLK = 1;//数据总线产生上升沿,数据被DS1302读走
dat >>= 1;//右移1位
}
TRST =0;//拉低使能端,关闭读写功能
}
uchar read_DS1302(uchar cmd)//读取数据
{
uchar i,dat;
TRST = 0;//拉低使能端
TSCLK = 0;//拉低数据总线
TRST = 1;//使能端产生上升沿
for(i = 0; i < 8; i ++)//传命令
{
TSCLK = 0;
TIO = cmd&0x01;//最低位先传
TSCLK =1;//数据总线产生上升沿,数据被DS1302读走
cmd >>= 1;//右移1位
}
for(i = 0;i < 8; i ++)//读数据
{
TSCLK = 0;//拉低数据总线
dat >>= 1;
if(TIO)
{
dat |= 0x80;
}
TSCLK =1;//数据总线产生上升沿,数据被DS1302读走
}
TRST = 0;//拉低使能端,关闭读写功能
return dat;
}
uchar dat_to_BCD(uchar dat)//数据转BCD码
{
uchar dat1,dat2;
dat1 = dat / 10;
dat2 = dat % 10;
dat2 = dat2 + dat1 * 16;
return dat2;
}
uchar BDD_to_dat(uchar dat)//BCD码转数据
{
uchar dat1,dat2;
dat1 = dat /16;
dat2 = dat%16;
dat2 = dat2 + dat1*10;
return dat2;
}
void DelayMs(uchar n)
{
uchar j;
while (n--)//11.0592MHz--113
{
for (j = 0; j < 113; j++);
}
}
void DelaySec(uchar n)
{
uchar j;
while (n--)//11.0592MHz--113
{
for (j = 0; j < 5; j++)
DelayMs(200);
}
}
void Delay4Us(void)
{
//11.0592MHZ
}
void LCD_Busy()
{
bit busy=1;
while(busy)
{
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
busy=(bit)(P0&0x80);
DelaySec(100);
}
LCD_EN=0;
}
void LCD_Wcmd(uchar cmd)
{
LCD_Busy();
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 1;
P0= cmd;
Delay4Us();
LCD_EN = 0;
}
void LCD_Wdat(uchar dat)
{
LCD_Busy();
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 1;
P0= dat;
Delay4Us();
LCD_EN = 0;
}
void LCD_Init()
{
DelayMs(10);
LCD_Wcmd(0x38); //2行,8位数据,5*7点阵
DelayMs(10);
LCD_Wcmd(0x0c); //开显示,关光标
DelayMs(10);
LCD_Wcmd(0x06); //光标移动
DelayMs(10);
LCD_Wcmd(0x01); //清显示
DelayMs(10);
}
void LCD_Write_String(uchar x, uchar y, uchar* s)
{
if(y == 0)
{
LCD_Wcmd(0x80+x);
}
else
{
LCD_Wcmd(0xC0+x);
}
while(*s)
{
LCD_Wdat(*s);
s++;
}
}
//输入字符,x为横坐标,y为纵坐标
void LCD_Write_Char(uchar x, uchar y, uchar c)
{
if(y == 0)
{
LCD_Wcmd(0x80+x);
}
else
{
LCD_Wcmd(0xC0+x);
}
LCD_Wdat(c);
}
void main()
{
uchar sec,min,hour;
P0 =0xff;
P1 =0xff;
DelayMs(100);
LCD_Init();
write_DS1302(0x8e,0);//清除写保护
write_DS1302(0x80,dat_to_BCD(25));//30秒
write_DS1302(0x82,dat_to_BCD(30));//15分
write_DS1302(0x84,dat_to_BCD(12));//19时
write_DS1302(0x8e,0x80);//开写保护
while(1)
{
write_DS1302(0x8e,0);//清除写保护
sec = BDD_to_dat(read_DS1302(0x81));//读秒寄存器(进行BCD码转换)
min = BDD_to_dat(read_DS1302(0x83));//读分寄存器
hour = BDD_to_dat(read_DS1302(0x85));//读时寄存器
write_DS1302(0x8e,0x80); //开写保护
LCD_Write_Char(0,0,DispStr1[hour/10]);
DelayMs(1);
LCD_Write_Char(1,0,DispStr1[hour%10]);
DelayMs(1);
LCD_Write_Char(2,0,DispStr1[10]);
DelayMs(1);
LCD_Write_Char(3,0,DispStr1[min/10]);
DelayMs(1);
LCD_Write_Char(4,0,DispStr1[min%10]);
DelayMs(1);
LCD_Write_Char(5,0,DispStr1[10]);
DelayMs(1);
LCD_Write_Char(6,0,DispStr1[sec/10]);
DelayMs(1);
LCD_Write_Char(7,0,DispStr1[sec%10]);
DelayMs(1);
LCD_Write_Char(0,1,DispStr2[0]);
DelayMs(1);
LCD_Write_Char(1,1,'-');
}
}
2021年11月17日 12点11分 1
level 5
私聊我
2021年11月18日 00点11分 2
1