您的位置 首页 设计

运用8051连接到LCD显示器程序

使用8051连接到LCD显示器程序执行时让LCD显示器显示出数字时钟修改时间4ⅹ4小键盘的按钮B,可以修改间(2009-08-0418:57)/*Target:89S…

运用8051连接到LCD显示器程序执行时让LCD显示器显示出数字时钟修正时刻4ⅹ4小键盘的按钮B ,能够修正间 (2009-08-04 18:57)

/*

Target:89S51

程序描绘:这个典范阐明怎么运用8051的Port 1连接到LCD显示器,PORT 3的P3.3,P3.4和P3.5别离连接到LCD显示器的控制线程序执行时让LCD显示器显示出数字时钟PORT 2连接到4ⅹ4的小键盘,能够修正时刻4ⅹ4小键盘的按钮B ,能够修正间*/

/* ***************************************************** */

#include

#include

#define TIMER0_COUNT 0xD8F0 /*10000h-((12,000,000/(12*100))*/

/* 数字时钟的作业形式 */

#define SET 11

#define TRUE 1

#define FALSE 0

#define putchar write_LCD_data

typedef struct {

char hour;

char minute;

char second;

} time;

typedef struct {

char year;

char month;

char day;

} date;

time now={23,59,0},display;

date today={04,05,29},tmpday;

static unsigned timer0_tick=100,mode=0,operation;

char code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};

char code weekday[7][4]={“MON”,”TUE”,”WED”,”THU”,”FRI”,”SAT”,

“SUN”};

char code command[1][6]={“Watch”,};

char code int2char[]=”0123456789″;

char gotkey();

void display_time(void)

{

gotoxy(1,0);

display_LCD_number(display.hour);

display_LCD_string(“:”);

display_LCD_number(display.minute);

display_LCD_string(“:”);

display_LCD_number(display.second);

}

void display_date()

{

char i,days=4;

gotoxy(2,2);

display_LCD_number(today.year);

display_LCD_string(“/”);

display_LCD_number(today.month);

display_LCD_string(“/”);

display_LCD_number(today.day);

display_LCD_string(” “);

if(today.month > 1)

for(i=0;i<=today.month-2;i++)

days+=(dayofmonth[i]%7);

if( today.year !=0 ) days+=((today.year-1)/4)+today.year+1;

if (today.year%4==0 && today.month >2) days++;

days=(days+today.day) % 7;

display_LCD_string(&weekday[days][0]);

}

int getdigit(unsigned char x,unsigned char y)

{

char keys;

do {

gotoxy(x,y);

putchar(_);

keys=gotkey();

gotoxy(x,y);

putchar(int2char[keys]);

} while(keys>9);

return(keys);

}

int gettime()

{

char temp;

do {

while((temp=getdigit(1,0))>2); //时的十位数不能大于2

temp=temp*10+getdigit(1,1);

if (temp > 23) display_time();

} while (temp > 23);

display.hour=temp;

while((temp=getdigit(1,3))>5);

display.minute=temp*10+getdigit(1,4);

return(TRUE);

}

char monthday(char year,char month)

{

if(month==2 && year%4==0) //润年的2月有29天

return(29);

else

return(dayofmonth[month-1]); //非闰年时的该月份天数

}

int getdate()

{

char temp,days;

temp=getdigit(2,2);

tmpday.year=temp*10+getdigit(2,3);

do {

while((temp=getdigit(2,5))>1); //月的十位数不能大于1

temp=temp*10+getdigit(2,6);

if (temp > 12) display_date(); //月份的数字不能大于12

} while (temp > 12);

tmpday.month=temp;

do {

while((temp=getdigit(2,8))>3); //日的十位数不能大于3

temp=temp*10+getdigit(2,9);

days=monthday(tmpday.year,tmpday.month);

if(temp > days || temp==0) display_date();

} while (temp > days || temp==0);

//输入的日期大于该月日期就从头输入

tmpday.day=temp;

return(TRUE);

}

static void timer0_isr(void) interrupt TF0_VECTOR using 1

{

TR0=0;

TL0=(TIMER0_COUNT & 0x00FF);

TH0=(TIMER0_COUNT >> 8);

TR0=1;

if(–timer0_tick) return;

timer0_tick=100;

now.second++; //秒加1

if (now.second==60) { //假如秒等于60

now.second=0; //秒康复为0

now.minute++; //分加1

if (now.minute==60) { //假如分等于60

now.minute=0; //分康复为0

now.hour++; //时加1

if (now.hour==24) { //假如时等于24

now.hour=0; //时康复为0

today.day++; //日加1

if (today.day>monthday(today.year,

today.month)) {

today.day=1;

//假如日超越当月最大日数,就变成1

today.month++;

//月加1

if(today.month==13) {

//假如月等于13

today.month=1;

//月康复为1

today.year++;

//年加1

}

}

display_date();

}

}

}

if (operation==SET ) return;

display=now;

display_time();

}

static void timer0_initialize(void)

{

EA=0;

TR0=0;

TMOD &= 0XF0;

TMOD |=0x01;

TL0=(TIMER0_COUNT & 0x00FF);

TH0=(TIMER0_COUNT >> 8);

PT0=0;

ET0=1;

TR0=1;

EA=1;

}

void main (void) {

char keys;

init_LCD();

clear_LCD();

gotoxy(2,0);

display_LCD_string(“20”);

display=now;

display_time();

display_date();

gotoxy(1,9);

display_LCD_string(&command[mode][0]);

timer0_initialize();

do {

keys=gotkey();

if(keys==SET) {

operation=SET;

if ( gettime()) now=display;

if ( getdate()) {

today=tmpday;

display_date();

}

}

operation=0;

} while(1);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/266130.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部