标题:
利用24c02存储数字达到断电保护LCD1602显示程序问题
[打印本页]
作者:
jinguanglong
时间:
2019-12-24 22:03
标题:
利用24c02存储数字达到断电保护LCD1602显示程序问题
1602断电后再送电不能实现,请各位大佬帮忙指点一下小弟,错在哪里?
#include<reg52.h> //头文件
#include<intrins.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar code table[]="I LOVE DIANZI"; //定义编码
uchar code table1[]=" ABCD "; //定义编码
uchar code table2[]="DIANZI LOVE I"; //定义编码
uchar code table3[]=" DCBA "; //定义编码
uchar num,sec,sce,tcnt;
sbit key1 = P3^0; //按键一
sbit key2 = P3^1; //按键二
sbit key3 = P3^2; //按键三
sbit key4 = P3^3; //按键四
/* sbit key5 = P3^4;
sbit key6 = P3^5;
sbit key7 = P3^6;
sbit key8 = P3^7;*/
sbit sda = P2^0; //24c02数据
sbit scl = P2^1; //24c02时钟
bit write = 0; //写24c02的标志
/*sbit led1 = P0^0;
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3; */
sbit lcdrs = P2^6; //1602数据/命令
sbit lcdwr = P2^5; //1602写/读
sbit lcden = P2^7; //1602使能
void delay1s(uint z) //延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay() //延时
{;;}
void at_start() //24c02开始
{
sda = 1;
delay();
scl = 1;
delay();
sda = 0;
delay();
}
void at_stop() //24c02结束
{
sda = 0;
delay();
scl = 1;
delay();
sda = 1;
delay();
}
void at_respons() //24c02应答
{
uchar i;
scl = 1;
delay();
while((sda==1)&&(i<255))i++;
scl = 0;
delay();
}
void at_init() //24c02初始化
{
sda = 1;
delay();
scl = 1;
delay();
}
void at_write_byte(uchar date) //24c02写一个字节
{
uchar i,temp;
temp =date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl = 1;
delay();
sda = CY;
delay();
scl = 1;
delay();
}
scl = 0;
delay();
sda = 1;
delay();
}
uchar at_read_byte() //24c02读一个字节
{
uchar i,k;
scl = 0;
delay();
sda = 1;
delay();
for(i=0;i<8;i++)
{
scl = 1;
delay();
k = (k<<1)|sda;
scl = 0;
delay();
}
return k;
}
void at_write_add(uchar address,uchar date) //24c02任意地址写字节
{
at_start();
at_write_byte(0xa0);
at_respons();
at_write_byte(address);
at_respons();
at_write_byte(date);
at_respons();
at_stop();
delay1s(5);
}
uchar at_read_add(uchar address) //24c02任意地址读字节
{
uchar date;
at_start();
at_write_byte(0xa0);
at_respons();
at_write_byte(address);
at_respons();
at_start();
at_write_byte(0xa1);
at_respons();
date=at_read_byte();
at_stop();
delay1s(5);
return date;
}
bit lcd_busy() //1602忙标志
{
bit result;
lcdrs = 0;
lcdwr = 1;
lcden = 1;
delay();
delay();
delay();
result=(bit)(P0&0x80);
lcden = 0;
return(result);
}
void lcd_send_com(uchar com) //1602命令
{
while(lcd_busy());
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay1s(5);
lcden = 1;
delay1s(5);
lcden = 0;
}
void lcd_send_data(uchar date) //1602写数据
{
while(lcd_busy());
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay1s(5);
lcden=1;
delay1s(5);
lcden=0;
}
void lcd_init() //1602初始化
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
lcd_send_com(0x38);
lcd_send_com(0x0c);
lcd_send_com(0x06);
lcd_send_com(0x01);
}
uchar keyscan() //键查询
{
if(key1==0)
{
delay1s(5);
if(key1==0)
{
return 1;
/* lcd_send_com(0x80);
for(num = 0;num<13;num++)
{
lcd_send_data(table[num]);
delay1s(5);
}*/
}
while(!key1);
}
else if(key2==0)
{
delay1s(5);
if(key2==0)
{
return 2;
}
while(!key2);
}
else if(key3==0)
{
delay1s(5);
if(key3==0)
{
return 3;
}
while(!key3);
}
else if(key4==0)
{
delay1s(5);
if(key4==0)
{
return 4;
}
while(!key4);
}
return 0;
}
void displaychar(uchar n) //1602显示
{
switch(n)
{
case 1:
lcd_send_com(0x80);
for(num = 0;num<13;num++)
{
lcd_send_data(table[num]);
delay1s(5);
} break;
case 2:
lcd_send_com(0x80+40);
for(num = 0;num<11;num++)
{
lcd_send_data(table1[num]);
delay1s(5);
} break;
case 3:
lcd_send_com(0x80);
for(num = 0;num<11;num++)
{
lcd_send_data(table2[num]);
delay1s(5);
} break;
case 4:
lcd_send_com(0x80+40);
for(num = 0;num<11;num++)
{
lcd_send_data(table3[num]);
delay1s(5);
} break;
default: break;
}
}
void main() //主程序
{
at_init();
lcd_init();
sec=at_read_add(23); //将24c02读数据赋值给sec
lcd_send_com(0x80); //指针位置
lcd_send_data(sec); //1602写数据
while(1)
{
displaychar(keyscan()); //1602显示内容
sec= keyscan(); //将按键返回值赋值给sec
at_write_add(23,sec);delay1s(5); //将在24c02存储器23位存储数据sec的值
}
}
作者:
zhy123654
时间:
2019-12-25 17:36
先问下你的板子有没有这个功能
作者:
jinguanglong
时间:
2019-12-27 20:27
板子上有24c02.按照调试程序可以用电脑读24c02中写入字符
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1