|
本帖最后由 gw168sh 于 2011-3-14 12:41 编辑
昨天下午没事,把以前写的8952时钟给修改 了一下
用2051+LCD屏+DS1302 做了个时钟
昨天拍了照,忘记把相片弄出来了,
另外请教个问题
编译后16进制的程序有4K,2051只有2kflash rom,是不是写进去的是2进制呀,2进制会小点?
程序如下:
#include <REG52.H>
sbit LCD_DATA = P1^2;//=14-2051,14脚
sbit LCD_CLK = P1^3;//=15
sbit LCD_CS1 = P1^4;//=16
sbit clock_clk=P3^4;//=8
sbit clock_dat=P3^2;//=6
sbit clock_rst=P3^3;//=7
sbit ks5=P3^0;//=2
sbit ks4=P3^1;//=3
sbit keyshi=P3^5;//zhishi=9
sbit keyfen=P3^7;//=11
void init2();
sbit a0 = ACC ^ 0;//为了编程方便定义的位变量
sbit a1 = ACC ^ 1;
sbit a2 = ACC ^ 2;
sbit a3 = ACC ^ 3;
sbit a4 = ACC ^ 4;
sbit a5 = ACC ^ 5;
sbit a6 = ACC ^ 6;
sbit a7 = ACC ^ 7;
unsigned char code digi[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x58,0x5e,0x79,0x71,0x76,0x37,0x6b,0x6e,0x48};
//0,1,2,3,4,5,6,7,8,9,A,b,c,d,E,F,H,17,18,y,20
unsigned char lcd_data[3],dat, i,set,in,d,e,t,s;
unsigned int num1;
void delay_ms(unsigned int a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 100; i++);
}
}
void LCD_init(void)
{
LCD_CS1=0;
LCD_DATA=0;
LCD_CLK=0;
LCD_CS1=1;
delay_ms(100);
LCD_CLK=1;
}
void LCD_write_char(unsigned char dat)
{
unsigned int i;
for(i=8;i>0;i--)
{
LCD_DATA=0;
if (dat&0x01) LCD_DATA=1;
LCD_CLK=0;
delay_ms(3);
LCD_CLK=1;
delay_ms(3);
dat=dat >> 1;
}
}
void LCD_LED_ON(void)
{
LCD_CS1=0;
LCD_write_char(0x05); // 背光ON
LCD_CS1=1;
delay_ms(3);
}
void LCD_OFF(void)
{
LCD_CS1=0;
LCD_write_char(0x01); // 关显示
LCD_CS1=1;
delay_ms(3);
}
/**************读出一个字节,时序***************/
unsigned char clock_read(void) //读出一个字节,时序
{
clock_clk=1; clock_clk=0; a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/****************************************************
ds1302程序
写入一个字节,
****************************************************/
void clock_write(unsigned char dd) //写入一个字节,DS1302时序
{
ACC=dd;
clock_clk=0;clock_dat=a0; clock_clk=1;
clock_clk=0;clock_dat=a1; clock_clk=1;
clock_clk=0;clock_dat=a2; clock_clk=1;
clock_clk=0;clock_dat=a3; clock_clk=1;
clock_clk=0;clock_dat=a4; clock_clk=1;
clock_clk=0;clock_dat=a5; clock_clk=1;
clock_clk=0;clock_dat=a6; clock_clk=1;
clock_clk=0;clock_dat=a7; clock_clk=1;
}
/******************** 向reg2写入date数据*/
void write_clock(unsigned char reg2, unsigned char date)//向reg2写入date数据
{
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_write(reg2);
clock_write(date);
clock_rst=0;
}
/****从reg1寄存器读数据***/
unsigned char read_clock(unsigned char reg1)//从reg1寄存器读数据
{
unsigned char dd=0;
clock_clk=0;
clock_rst=0;
clock_rst=1;
clock_write(reg1);
dd=clock_read();
clock_rst=0;
return(dd);
}
void display_lcd1(unsigned int num) //显示
{
lcd_data[0] = digi[num%10];
lcd_data[1] = digi[(num%100)/10];
lcd_data[2] = 0x40;
LCD_CS1=0;
LCD_write_char(0x08); //写数据
for(i=0;i<3;i++) LCD_write_char(lcd_data);
LCD_CS1=1;
delay_ms(3);
}
void display_lcd2(unsigned int num) //显示
{
lcd_data[0] = 0x40;
lcd_data[1] = digi[num%10];
lcd_data[2] = digi[(num%100)/10];
LCD_CS1=0;
LCD_write_char(0x08); //写数据
for(i=0;i<3;i++) LCD_write_char(lcd_data);
LCD_CS1=1;
delay_ms(3);
}
void key()
{
if(ks5==0)
{
delay_ms(30);
if(ks5==0)
{
while(ks5==0);
set++;
if(set==1) {keyfen=0;keyshi=1;}
if(set==2) {keyfen=1;keyshi=0;}
if(set==3)
{set=0;
keyfen=1;
keyshi=1;
}
}
}
switch(set)
{
case 1:
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
t=(d*10)+e;
display_lcd1(t);
if(ks4==0)
{
delay_ms(30);
if(ks4==0)
{
while(ks4==0);
write_clock(0x8e,0x0);//取消写保护
write_clock(0x80,0x80);//停止时钟
d=read_clock(0x83);
if(d==0x09) {d=0x0f;}//d=9 d=15
if(d==0x19){d=0x1f;}//d=
if(d==0x29){d=0x2f;}
if(d==0x39){d=0x3f;}
if(d==0x49){d=0x4f;}
d++;
if(d==0x5a){d=0x00;}
write_clock(0x82,d);// 写分钟
write_clock(0x80,0x01);//启动时钟
write_clock(0x8e,0x80);//写保护
delay_ms(20);
//d=0;
}
}
//else
break;
case 2:
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
t=(d*10)+e;
display_lcd2(t);
if(ks4==0)
{
delay_ms(30);
if(ks4==0)
{
while(ks4==0);
write_clock(0x8e,0x0);//取消写保护
write_clock(0x80,0x80);//停止时钟
d=read_clock(0x85);
if(d==0x09) {d=0x0f;}//d=9 d=15
if(d==0x19){d=0x1f;}//d=
d++;
if(d==0x24){d=0x00;}
write_clock(0x84,d);// 写小时
write_clock(0x80,0x01);//启动时钟
write_clock(0x8e,0x80);//写保护
delay_ms(30);
}
}
//else
break;
}
}
/////////////////////////
void show(void)//显示和闪烁函数
{
//unsigned char d,e,t;
//d=read_clock(0x81);//读秒
/**P0 = Tab_Num[ d ];//秒十位
wei2=1;
delay(250);
wei2=0;
P0 = Tab_Num[ e ];//秒各位
wei1=1;
delay(250);
wei1=0; */
d=read_clock(0x83);//读分钟
e=d;
d=d>>4;
e=e&0x0f;
t=(d*10)+e;
display_lcd1(t);
delay_ms(1000);
d=read_clock(0x85);//读小时
e=d;
d=d>>4;
e=e&0x0f;
t=(d*10)+e;
display_lcd2(t);
delay_ms(1000);
// d=read_clock(0x87);//读日
//d=read_clock(0x89);//读月
// delay_ms(50);
//d=read_clock(0x8d);//读年
//d=read_clock(0x8b);//读年
}
/*--------------------时钟的初始化---------------------------*/
void Init_1302(void)//如果不满意现在的表,可以初始化调整,写入程序之后,再把初始化屏蔽掉
{
write_clock(0x8e,0x00);//close_protect
delay_ms(30);
write_clock(0x8c,0x08);//year 08年
delay_ms(30);
write_clock(0x88,0x6);//month 06
delay_ms(30);
write_clock(0x86,0x25);//date 25
delay_ms(30);
write_clock(0x84,0x08);//hour 8
delay_ms(30);
write_clock(0x82,0x0a);//minute 40
delay_ms(30);
write_clock(0x80,0x01);//second 41
delay_ms(30);
write_clock(0x8a,0x03);//week_day 3
delay_ms(30);
write_clock(0x90,0xaa);//supply_power
delay_ms(30);
write_clock(0x8e,0x80);//protect
delay_ms(30);
}
void main(void)
{
set=0;
ks5=1;
ks4=1;
LCD_init();
LCD_LED_ON(); // 背光ON
in=0;
keyshi=1;
keyfen=1;
delay_ms(10);
while(1)
{
LCD_LED_ON();
//Init_1302();//DS1302寄存器初始化
key();
if(set==0)
{
show();
}
} // *** while(1) end ***
} // *** main() end ***
|
|