新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 使用8051連接到LCD顯示器程序

        使用8051連接到LCD顯示器程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        使用8051連接到LCD顯示器程序執行時讓LCD顯示器顯示出數字時鐘修改時間4ⅹ4小鍵盤的按鈕B ,可以修改間 (2009-08-04 18:57)

        /*

        本文引用地址:http://www.104case.com/article/201611/315593.htm

        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);

        }



        關鍵詞: 8051LCD顯示器程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 图木舒克市| 宿松县| 乐平市| 嘉鱼县| 化德县| 长宁县| 新和县| 兰考县| 华宁县| 海淀区| 吉林市| 广丰县| 获嘉县| 德化县| 瑞金市| 禹城市| 江达县| 施甸县| 老河口市| 黄浦区| 和平区| 和龙市| 酉阳| 东安县| 喀喇沁旗| 陕西省| 宁国市| 永昌县| 福清市| 乌兰察布市| 灵璧县| 贡嘎县| 南宫市| 临桂县| 鲁甸县| 策勒县| 社会| 新闻| 阿克| 白朗县| 印江|