本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
不知道什么原因,时间以及闹钟都可以正常显示,但是光标却不停地闪,原本是要光标在调整时间时更方便,但是在main函数却编程了一个Bug。这是为什么呢?要怎么该?请大家多多指教~谢谢!!
附上仿真图:
程序如下:
// Program to make a digital clock with integrated AlARM and digital thermometer
#include<reg51.h>
#define port P1
//#define cont_port P3
#define dataport P0
#define m_sec 10
sbit rs=P2^0;
sbit en=P2^2;
sbit rw=P2^1;
sbit dig_hr1=port^5;
sbit dig_min1=port^6;
sbit start=port^1;
sbit am_pm=port^2;
sbit alarm_set=port^7;
sbit alarm=port^3;
//sbit wr= P3^2;
//sbit rd= P3^3;
//sbit intr= P3^4;
int hr ,hr1=0,alarm_hr=0;
int min,min1=0,alarm_min=0;
int sec,sec1=0,dig_am_pm=0,alarm_am_pm=0;
int test_final=0,test_intermediate1[10],test_intermediate2[3]={0,0,0};
void delay(unsigned int msec) // Time dealy function
{
int i,j ;
for(i=0;i<msec;i++)
for(j=0;j<1275;j++);
}
void lcd_cmd(unsigned char item) //Function to send command to LCD
{
dataport = item;
rs= 0;
rw=0;
en=1;
delay(1);
en=0;
return;
}
void lcd_data(unsigned char item) // Function to send data to LCD
{
dataport = item;
rs= 1;
rw=0;
en=1;
delay(1);
en=0;
return;
}
void lcd_data_string(unsigned char *str) // Function to send string to LCD
{
int i=0;
while(str!='\0')
{
lcd_data(str);
i++;
delay(1);
}
return;
}
void lcd_data_int(int time_val) // Function to send number to LCD
{
int int_amt;
int_amt=time_val/10;
lcd_data(int_amt+48);
int_amt=time_val%10;
lcd_data(int_amt+48);
}
void lcd(unsigned char str1[10])
{
lcd_cmd(0x38);
lcd_cmd(0x0e);
delay(1);
lcd_data_string(str1);
}
void shape() // Function to create the shape of degree
{
lcd_cmd(64);
lcd_data(2);
lcd_data(5);
lcd_data(2);
lcd_data(0);
lcd_data(0);
lcd_data(0);
lcd_data(0);
lcd_data(0);
}
void set_hr1() // Function to set set hours digit of clock
{
hr1++;
if(hr1>11)
hr1=0;
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
}
void set_min1() // Function to set set minutes digit of clock
{
min1++;
if(min1>59)
min1=0;
lcd_cmd(0xc6);
lcd_data_int(min1);
}
void set_alarm_hr1() // Function to set set hours digit of alarm
{
alarm_hr++;
if(alarm_hr>11)
alarm_hr=0;
lcd_cmd(0xc3);
lcd_data_int(alarm_hr);
lcd_data(':');
}
void set_alarm_min1() // Function to set set minutes digit of clock
{
alarm_min++;
if(alarm_min>59)
alarm_min=0;
lcd_cmd(0xc6);
lcd_data_int(alarm_min);
}
void alarm_check() // Function to check alarm
{
if(hr==alarm_hr)
{
if(min==alarm_min)
{
if(dig_am_pm==alarm_am_pm)
{
alarm=1;
lcd_cmd(0x8b);
lcd("ALARM");
}
}
}
}
void main()
{
int k;
start=1;
dig_hr1=1;
dig_min1=1;
alarm_set=1;
alarm=0;
lcd_cmd(0x83);
lcd("SET ALARM");
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
lcd_data_int(min1);
while(alarm_set==0)
{
delay(10);
if(dig_hr1==0)
set_alarm_hr1();
if(dig_min1==0)
set_alarm_min1();
}
if(am_pm==0)
{
lcd_cmd(0xc8);
lcd_data_string("am");
alarm_am_pm=0;
}
if(am_pm==1)
{
lcd_cmd(0xc8);
lcd_data_string("pm");
alarm_am_pm=1;
}
delay(200);
lcd_cmd(0x01);
lcd_cmd(0x83);
lcd("SET TIMING");
lcd_cmd(0xc3);
lcd_data_int(hr1);
lcd_data(':');
lcd_data_int(min1);
while(start==0)
{
delay(10);
if(dig_hr1==0)
set_hr1();
if(dig_min1==0)
set_min1();
}
if(am_pm==0)
{
lcd_cmd(0xc8);
lcd_data_string("am");
dig_am_pm=0;
}
if(am_pm==1)
{
lcd_cmd(0xc8);
lcd_data_string("pm");
dig_am_pm=1;
}
delay(200);
lcd_cmd(0x01);
while(1)
{
for(k=0;k<2;k++)
{
for(hr=hr1;hr<12;hr++)
{
for(min=min1;min<60;min++)
{
for(sec=0;sec<60;sec++)
{
lcd_cmd(0x81);
delay(1);
lcd_data_int(hr);
lcd_data(':');
lcd_data_int(min);
lcd_data(':');
lcd_data_int(sec);
if(dig_am_pm==0)
{
lcd("am");
}
else
{
lcd("pm");
}
alarm_check();
lcd_cmd(0xc3);
delay(2);
// lcd_data_string("TEMP:");
// temp();
//lcd_data_string(" ");
}
}
min1=0;
}
if(dig_am_pm==0)
dig_am_pm=1;
else
dig_am_pm=0;
hr1=0;
}
}
}
可调闹钟lLCD显示.rar
(102.36 KB, 下载次数: 0)
|