?? lcd1602+at24c04存儲(chǔ)3組數(shù)據(jù)實(shí)驗(yàn).c
字號(hào):
/********************************************************************************
* 程序名稱:IC2總線存儲(chǔ),AT24C04+LCD1602應(yīng)用演練
* 實(shí)驗(yàn)對(duì)象:WK-S802學(xué)習(xí)板
* 程序原名:喇叭自動(dòng)點(diǎn)膠機(jī)(改),筆者自行開發(fā)的工業(yè)應(yīng)用!
* 功 能:
LCD1602顯示、AT24C02存儲(chǔ)參數(shù)、K1/K2/K3按鍵調(diào)節(jié)三組參數(shù)并存儲(chǔ)(防斷電)
K4啟動(dòng)實(shí)驗(yàn),注意觀察三個(gè)LED按順序變化的亮滅時(shí)間.(每個(gè)參數(shù)可調(diào)最大數(shù)199),
三組參數(shù)決定P20/P21/P22的LED燈顯示亮滅時(shí)間。
* 重要提示:
根據(jù)屏幕提示000=0.00S(秒)如你把任一參數(shù)調(diào)整到050,其實(shí)是0.5秒;
你可以自行把程序菜單修改一下,如直接顯示0.00S那就更好。
********************************************************************************/
#include<reg52.h>
#include<24c02.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]=" Model WK-S801 "; uchar code table2[]=" www.mcusy.cn ";
uchar code table3[]="SETUP: 000=0.00s"; uchar code table4[]=".00 > .00 > .00 ";
uchar code table5[]=" Working ... ";
sbit rs=P2^5;
sbit lcdRW=P2^6;
sbit lcden=P2^7;
sbit k1=P3^2; //功能鍵
sbit k2=P3^3; //加1
sbit k3=P3^4; //減1
sbit k4=P3^5; //啟動(dòng)...
sbit D0=P2^0; //LED0
sbit D1=P2^1; //LED1
sbit D2=P2^2; //LED2
uint time1,st,time2,count,count1,count2;//三個(gè)設(shè)定參數(shù),必須用uint定義
uchar num,tt1,tt2,stt,k0num,k1num;//設(shè)定變量
//-------------1MS延時(shí)子函數(shù)(防抖和時(shí)基公用)
void delay_t(uint z)
{
uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
//-------------LCD設(shè)置參數(shù)
void write_com(uchar com) //寫命令函數(shù)
{
rs=0;P0=com;delay(1);lcden=1;delay(1);lcden=0;
}
void write_date(uchar date) //寫數(shù)據(jù)函數(shù)
{
rs=1;P0=date;delay(1);lcden=1;delay(1);lcden=0;
}
//-------------初始化函數(shù)
void init()
{
uchar num; //顯示字符的個(gè)數(shù)
write_com(0x38); //顯示模式為16*2、5*7
write_com(0x0c); //顯示并關(guān)閉光標(biāo)閃爍
write_com(0x06); //光標(biāo)加一
write_com(0x01); //清屏
write_com(0x80); //數(shù)據(jù)指針指向第一行/
for(num=0;num<16;num++)
{
write_date(table1[num]);//顯示"Mmodel WK-S801“
delay(130); //每個(gè)字出來的時(shí)間間隔
}
write_com(0x80+0x40); //數(shù)據(jù)指針指向第二行/
for(num=0;num<16;num++)
{
write_date(table2[num]);//顯示”www.mcusy.cn“
delay(150); //每個(gè)字出來的時(shí)間間隔
}
delay(1000);
write_com(0x01); //數(shù)據(jù)指針指向第一行/
write_com(0x80); //數(shù)據(jù)指針指向第一行/
for(num=0;num<16;num++)
{
write_date(table5[num]);//顯示”Working ...“
delay(1);
}
}
//-------------三個(gè)數(shù)據(jù)地址/數(shù)據(jù)
void write_time_s(uchar add,uchar date)
{
uchar bai,shi,ge;
bai=date/100;
shi=date%100/10; //分離三個(gè)數(shù)據(jù)
ge=date%10;
write_com(0x80+0x40+add-1);//確定地址
write_date(0x30+bai); //百位從0開始顯示
write_date(0x30+shi); //十位從0開始顯示
write_date(0x30+ge); //個(gè)位從0開始顯示
}
//-------------鍵盤調(diào)試(使用K1/K2/K3按鍵調(diào)三個(gè)數(shù)據(jù))
void keyscan()
{
if(k1==0) //如果設(shè)置鍵被按下
{
delay(10);
if(k1==0)//重測(cè)設(shè)置鍵
{
delay(10);
while(!k1);//松手檢測(cè)
k1num++;
if(k1num==1)
{
//-----以下為保持設(shè)置菜單顯示
write_com(0x80); //數(shù)據(jù)指針指向第一行/
for(num=0;num<16;num++)
{
write_date(table3[num]);//SETUP: 000=0.00s
delay(1);
}
write_com(0x80+0x40);//數(shù)據(jù)指針指向第二行/
for(num=0;num<16;num++)
{
write_date(table4[num]);//.00 > .00 > .00
delay(1);
}
//-----以下為保持設(shè)置好的數(shù)據(jù)顯示
write_time_s(1,tt1);
write_com(0x80+0x40+2);
write_time_s(7,stt);
write_com(0x80+0x40+8);
write_time_s(13,tt2);
write_com(0x80+0x40+14);
write_com(0x80+0x40+2);//指向第二行第1位
write_com(0x0f);//光標(biāo)閃爍
}
if(k1num==2)
{
write_com(0x80+0x40+8);//指向第二行第7位
}
if(k1num==3)
{
write_com(0x80+0x40+14);//指向第二行第13位
}
if(k1num==4)
{
k1num=0;
write_com(0x0c);//顯示并關(guān)閉光標(biāo)閃爍
}
}
}
if(k1num!=0)//若k1num的值確實(shí)不為0,被按下,處理設(shè)定
{
if(k2==0)//如果加1鍵被按下
{
delay(10);
if(k2==0)
delay(10);
if(k2!=0)
{
if(k1num==1)//如果在T1的位置上
{
tt1++;
write_add(0xA0,tt1);//第一個(gè)數(shù)據(jù)存入24C02的0xA0
if(tt1==200)
tt1=0;
time1=tt1*10;//10等于分秒為單位
write_time_s(1,tt1);
write_com(0x80+0x40+2);
}
if(k1num==2)//如果在ST的位置上
{
stt++;
write_add(0xA2,stt);//第二個(gè)數(shù)據(jù)存入24C02的0xA2
if(stt==200)
stt=0;
st=stt*10;
write_time_s(7,stt);
write_com(0x80+0x40+8);
}
if(k1num==3)//如果在T2的位置上
{
tt2++;
write_add(0xA4,tt2);//第三個(gè)數(shù)據(jù)存入24C02的0xA4
if(tt2==200)
tt2=0;
time2=tt2*10;
write_time_s(13,tt2);
write_com(0x80+0x40+14);
}
}
}
if(k3==0)//如果減1鍵被按下
{
delay(10);
if(k3==0)
delay(10);
if(k3!=0)
{
if(k1num==1)//如果在T1的位置上
{
if(tt1==0)
tt1=200;
tt1--;
write_add(0xA0,tt1);//第一個(gè)數(shù)據(jù)存入24C02的0xA0
time1=tt1*10;
write_time_s(1,tt1);
write_com(0x80+0x40+2);
}
if(k1num==2)//如果在ST的位置上
{
if(stt==0)
stt=200;
stt--;
write_add(0xA2,stt);//第二個(gè)數(shù)據(jù)存入24C02的0xA2
st=stt*10;
write_time_s(7,stt);
write_com(0x80+0x40+8);
}
if(k1num==3)//如果在T2的位置上
{
if(tt2==0)
tt2=200;
tt2--;
write_add(0xA4,tt2);//第三個(gè)數(shù)據(jù)存入24C02的0xA4
time2=tt2*10;
write_time_s(13,tt2);
write_com(0x80+0x40+14);
}
}
}
}
}
//----------主函數(shù)---------------------------------------------------------
void main()
{
lcdRW=0;tt1=0;stt=0;tt2=0;
init();delay(10);init_I2C();delay(10);//初始化及I2C初始化
tt1=read_add(0xA0);stt=read_add(0xA2);tt2=read_add(0xA4);//讀取三個(gè)存儲(chǔ)的數(shù)據(jù)
while(1)
{
keyscan();
if(k4==0) //啟動(dòng)鍵是否按下?
{
k1num=0;
delay(10);
if(k4==0) //重測(cè)
delay(10);
while(!k4); //松開啟動(dòng)按鍵?
//-------------------------------處理動(dòng)作和調(diào)用存儲(chǔ)延時(shí)--------------------------------
D0=0;//LED0點(diǎn)亮
//以下為前延時(shí),加入time1=tt1*10為的是開機(jī)檢測(cè)按鍵后把實(shí)際數(shù)據(jù)存入time1
time1=tt1*10;delay_t(time1);
D0=1;//LED0熄滅
delay(10);
D1=0;//LED1點(diǎn)亮
//以下為噴膠時(shí)間,加入st=stt*10為的是開機(jī)檢測(cè)按鍵后把實(shí)際數(shù)據(jù)存入st
st=stt*10;delay_t(st);
D1=1;//LED1熄滅
delay(10);
D2=0;//LED2點(diǎn)亮
//以下為后延時(shí),加入time2=tt2*10為的是開機(jī)檢測(cè)按鍵后把實(shí)際數(shù)據(jù)存入time2
time2=tt2*10;delay_t(time2);
D2=1;//LED2熄滅
delay(10);
write_com(0x80+0x40); //數(shù)據(jù)指針指向第二行/
for(num=0;num<16;num++)
{
write_date(table5[num]);//“Working ...”
delay(1);
}
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -