新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于stc89c52rc單片機的數字鐘設計程序

        基于stc89c52rc單片機的數字鐘設計程序

        作者: 時間:2012-08-13 來源:網絡 收藏

        與數字中的顯示類似,

        增加:

        液晶初始化部分

        寫命令部分

        寫數據部分


        ********************************************************

        #includereg52.h>
        #define uchar unsigned char
        #define uint unsigned int
        sbit rs = P2^6; //1602相應
        sbit rw = P2^5;
        sbit ep = P2^7;

        uchar hour,min,sec,k;

        uchar key;
        unsigned char lcdd[]="0123456789";
        uchar key_code[] = {0xb7,0xbb,0xbd,0xbe};//鍵盤編碼,我只用到四個鍵。 你我的編碼可能不同 ,具體看電路如何連接。

        void delay(uint z)
        {

        uint x,y;
        for(z=x;x>0;x--)
        for(y=100;y>0;y--);
        }

        bit lcd_bz()
        { // 測試LCD忙碌狀態
        bit result;
        rs = 0;
        rw = 1;
        ep = 1;
        delay(5);
        result = (bit)(P0 0x80);//判斷P0^7是一還是零.屏蔽掉其它位0x80.強制轉換位bit型數據。在返回給result。
        ep = 0;
        return result;
        }
        void lcd_cmd(uchar cmd)
        {

        while(lcd_bz());
        rs = 0;//rs為1時寫入的是“數據”為0時寫入“指令”
        rw = 0;//rw為1時“讀取”為0時“寫入”
        ep = 0;//使能
        delay(5);
        P0 = cmd;
        delay(5);
        ep = 1;
        delay(5);
        ep = 0;

        }


        void lcd_data(uchar dat )//液晶寫數據
        {

        while(lcd_bz());
        rs=1;
        rw=0;
        ep=0;
        P0 = dat;
        delay(5);
        ep = 1;
        delay(5);
        ep = 0;
        //return dat;
        }

        void lcd_init() //液晶寫命令
        {
        delay(15); //等待LCD電源穩定
        lcd_cmd(0x38);
        delay(10);
        lcd_cmd(0x38);
        delay(10);
        lcd_cmd(0x38);
        delay(10);

        lcd_cmd(0x0c); //顯示開,關光標
        delay(10);
        lcd_cmd(0x06); //移動光標
        delay(10);
        lcd_cmd(0x01); //清除LCD的顯示內容
        delay(10);
        }


        void timer0() interrupt 1
        {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        k++;
        if(k==20)
        {
        k=0;
        sec++;

        }

        if(sec>59)
        {
        min++;
        sec=0;
        }
        if(min>59)
        {
        min=0;
        hour++;
        }
        if(hour>23)
        {
        hour=0;
        }
        }


        void disptime() //時間顯示函數
        {
        lcd_cmd(0x0c); //設置光標不顯示、不閃爍
        delay(20);
        lcd_cmd(0x80); //起始顯示地址
        delay(20);

        lcd_data(lcdd[hour/10]);
        delay(10);
        lcd_data(lcdd[hour%10]);
        delay(10);
        lcd_data(':');
        delay(12);

        lcd_data(lcdd[min/10]);
        delay(10);
        lcd_data(lcdd[min%10]);
        delay(12);
        lcd_data(':');
        delay(12);

        lcd_data(lcdd[sec/10]);
        delay(12);
        lcd_data(lcdd[sec%10]);
        delay(12);
        lcd_data(' ');
        delay(12);


        }

        uchar keyscan() //鍵盤掃描程序
        {
        uchar scan1, scan2, keycode, j;

        P1 = 0xf0;
        scan1 = P1;
        if (scan1 != 0xf0)
        //判鍵是否按下
        {
        delay(10); //延時10ms
        scan1 = P1;
        if (scan1 != 0xf0)
        //二次判鍵是否按下
        {
        TR0=0; //如果有鍵按下 則定時器停止工作
        P1 = 0x0f;
        scan2 = P1;
        keycode = scan1 | scan2; //組合成鍵掃描編碼

        for (j = 0; j 4; j++)
        {
        if (keycode == key_code[j])
        //查表得鍵值
        {
        key = j;
        while(P1!= 0x0f) //松手有效 這里需要好好研究一下 可以用萬用表測量管腳電壓幫助理解
        disptime();
        return (key); //返回有效鍵值
        }
        }
        }

        }
        else
        P1 = 0xff;


        return (key = 4); //返回無效碼
        }



        void Set_time(uchar key)
        {

        if(key==0||key==1||key==2)//若s1,s2,s3其中有鍵按下,則為真
        {
        if(key==0)
        {
        sec++;
        if(sec>59)
        {
        sec=0;
        }
        }
        else if(key==1)
        {
        min++;
        if(min>59)
        {
        min=0;
        }
        }
        else if(key==2)
        {
        hour++;
        if(hour>23)
        {
        hour=0;
        }
        }


        }
        else if(key==3)
        {
        TR0=1; //按下退出鍵 定時器繼續工作

        }
        }


        void sysint() //定時器初始化
        {

        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        }


        void timeint() //初始化
        {

        hour=0;
        min=0;
        sec=0;
        }

        void main()
        {

        sysint() ;
        timeint();
        lcd_init();//函數調用
        while(1)
        {
        keyscan();//調用鍵盤掃描,
        Set_time(key);
        disptime();

        }
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 平南县| 黄平县| 平度市| 柳河县| 新民市| 门头沟区| 云阳县| 永和县| 开平市| 昌都县| 彰武县| 洪泽县| 岳西县| 柘城县| 兴业县| 镇远县| 江北区| 正蓝旗| 开原市| 乌什县| 巍山| 伊吾县| 玉溪市| 岑溪市| 石狮市| 江西省| 鄂尔多斯市| 阿尔山市| 盐池县| 南京市| 武川县| 义马市| 棋牌| 连江县| 丘北县| 新乐市| 铜鼓县| 昂仁县| 称多县| 南开区| 吉林省|