新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Atmega16單片機實用程序

        Atmega16單片機實用程序

        作者: 時間:2016-12-01 來源:網絡 收藏
        /****************************************************************
        名稱:設置顯示列地址
        功能:設置顯示列地址y,範圍0~63;
        *****************************************************************/
        void LCD_Command_set_y(uchar column)
        {
        RW_WRITE;
        RS_COMM;
        EN_CLR;
        SET_DATA(0x40+column); //設置顯示列地址y,範圍0~63;
        EN_SET;
        delayus(2);
        EN_CLR;
        }
        /********************************************************************
        名稱:LCD顯示數據寫入
        功能:將顯示數據寫入12864液晶
        *********************************************************************/
        void LCD_Command_writebyte(uchar data)
        {
        RW_WRITE;
        RS_DATA;
        EN_CLR;
        SET_DATA(data);
        EN_SET;
        delayus(2);
        EN_CLR;
        }
        /*********************************************************************
        名稱:LCD複位操作
        功能:複位LCD
        **********************************************************************/
        void LCD_RESET()
        {
        RESET;
        NOP();
        NOP();
        NOP();
        RESET_OVER;
        }
        /************************************************************
        名稱:清除指定範圍函數
        功能:清除LCD屏幕指定範圍起始行~結束行的顯示內容
        ************************************************************/
        void LCD_CLEAR_LINE(uchar startline,uchar endline)
        {
        uchar i,j;
        for(i-startline;i<=endline;i++)
        {
        CS1_EN;
        CS2_EN;
        LCD_Command_set_x(i);
        LCD_Command_set_y(0); //y地址每次操作後自動加1;
        for(j=0;j<64;j++)
        {
        LCD_Command_writebyte(0x00);
        }
        }
        }
        /*************************************************************
        名稱:顯示初始化
        功能:初始化LCD
        *************************************************************/
        void LCD_init()
        {
        LCD_RESET();
        LCD_CLEAR_LINE(0,7);
        NOP();
        LCD_Command_Displayonoff(1);
        NOP();
        LCD_Command_setstartline(0);
        }
        /**************************************************************
        名稱:LCD_WRITE_DATA
        輸入:x in [0,7] and y in [0,127]
        輸出:無
        功能:在LCD指定行列寫一個數據
        **************************************************************/
        void LCD_write_data(uchar x,uchar y,uchar data)
        {
        if(y<64)
        {
        CS1_EN;
        CS2_DIS;
        LCD_Command_set_x(x);
        LCD_Command_set_y(y);
        }
        else
        {
        CS1_DIS;
        CS2_EN;
        LCD_Command_set_x(x);
        LCD_Command_set_y(y-64);
        }
        LCD_Command_writebyte(data);
        delayus(1);
        }
        /*********************************************************
        名稱:LCD_WRITE_DOT
        輸入:x in [0,63] and y in [0,127]
        輸出:無
        功能:在指定像素位置描點,此函數為覆蓋式描點,原位置一個
        字節數據被覆蓋
        *********************************************************/
        void LCD_write_dot(uchar x,uchar y)
        {
        uchar x_address,y_address;
        uchar data=0;
        if((x<64)&&(y<128))
        {
        x_address=x>>3;
        y_address=y;
        LCD_write_data(x_address,y_address,data|(1<<(x%8)));
        }
        }
        /**********************************************************
        名稱:LCD_WRITE_CHAR
        輸入:x in [0,3],y in [0,15], disp-顯示字符自模數組首地址
        輸出:無
        功能:在LCD指定顯示單元顯示一個字符,每個顯示單元默認為8*16
        點陣字體,對12864點陣LCD,x最多顯示4行,y最多顯示16個字
        符。
        ***********************************************************/
        void LCD_write_char(uchar x,uchar y,const uchar *disp)
        {
        uchar i;
        uchar x_address;
        uchar y_address;
        if((x<4)&&(y<16))
        {
        for(i=0;i<8;i++)
        {
        x_address=x<<1;
        y_address=(y<<3)+i;
        LCD_write_data(x_address,y_address,*disp++);
        }
        for(i=0;i<8;i++)
        {
        x_address=(x<<1)+1;
        y_address=(y<<3)+i;
        LCD_write_data(x_address,y_address,*disp++);
        }
        }
        }
        /***********************************************************
        名稱:LCD_write_word
        輸入:x in [1,3],y in [1,14] disp-顯示字符字模組首地址
        輸出:無
        功能:在LCD指定顯示單元顯示一個中文字符,每個顯示單元默認為
        16*16點陣字體,對128*64點陣LCD,x最多顯示4行,y最多顯
        示16個字符,不允許顯示半個漢字
        ***********************************************************/
        void LCD_write_word(int x,int y,const uchar *disp)
        {
        int i;
        int x_address;
        int y_address;
        if((x<4)&&(y<15))
        {
        for(i=0;i<16;i++)
        {
        x_address=x<<1;
        y_address=(y<<3)+i;
        LCD_write_data(x_address,y_address,*disp++);
        }
        }
        for(i=0;i<16;i++)
        {
        x_address=(x<<1)+1;
        y_address=(y<<3)+i;
        LCD_write_data(x_address,y_address,*disp++);
        }
        }
        /************************************************************
        名稱:LCD_write_picture
        輸入:x in [1,7] and y in [0,127],x1_length-縱向像素(8的整數倍),
        y1_length-橫向像素(不一定為8的整數倍)
        輸出:無
        功能:在指定區域顯示指定像素大小的圖片
        ************************************************************/
        void LCD_write_picture(int x1,int y1,int x_length,int y_length,const int *pdata)
        {
        int x_address;
        int y_address;
        for(x_address=x1;x_address<=x1+(x_length>>3)-1;x_address++)
        {
        for(y_address=y1;y_address {
        LCD_write_data(x_address,y_address,*pdata);
        }
        }
        }
        /**********************************************************
        名稱: busy
        輸入:無
        輸出:忙狀態返回1,空閒狀態返回0;
        功能:判別LCD控制器內部狀態,忙時返回1,閑時返回0
        **********************************************************/
        uchar busy(void)
        {
        RS_COMM;
        RW_READ;
        if(BIT(7)==0)
        {
        return 0;
        }
        else
        return 1;
        }
        /***************************************************************
        名稱:12864測試
        功能:逐點掃描
        ****************************************************************/
        void LCD_test()
        {
        uchar i,j;
        for(i=0;i<63;i++)
        {
        for(j=0;j<127;j++)
        {
        delayms(20);
        LCD_write_dot(i,j);
        delayms(100);
        }
        }
        }
        /**************************************************************
        名稱:axis()
        輸入:無
        輸出:無
        功能:標定界面坐標
        ***************************************************************/
        void axis()
        {
        uchar a,b,y,x;
        for(a=0;a<63;a++) //y軸坐標及分位點;
        {
        LCD_write_data(a,29,0x01);
        }
        for(b=0;b<127;b+=5) //x軸坐標及分位點;
        {
        LCD_write_data(30,b,0x04);
        }
        }
        /**********************************************************
        /********************************************************
        名稱:定時器0初始化
        輸入:
        輸出:
        描述:普通方式,中斷工作方式,注意中斷響應程序中要重裝初值
        *********************************************************/
        void timer0_init()
        {
        SFIOR|=BIT(0); //復位預定比例分頻器;
        TCCR0|=(BIT(2)|BIT(0)); //設定分頻器為1024分頻;
        //TCCR0|=BIT(0); //設定分頻器為無分頻;
        TCNT0=255; //裝訂計數初值
        TIMSK|=BIT(0); //開啟T/C0中斷;
        SEI(); //開總中斷;
        DDRC|=BIT(0);
        PORTC|=BIT(0);
        }
        /************************************************************
        中斷處理函數
        ************************************************************/
        #pragma interrupt_handler time0_proc:10
        void time0_proc()
        {
        TIMSK&=~BIT(0); //關閉中斷;
        TCNT0=255; //重新裝訂計數初值;
        PORTC^=BIT(0);
        TIMSK|=BIT(0); //開啟T0中斷
        }
        /*************************************************************
        名稱:6位數碼管按鍵位移顯示
        輸入:無
        輸出:無
        描述:按鍵輸入時在LED上移位顯示按鍵值,當按下f時,全部清零。
        **************************************************************/
        void keymovedis()
        {
        uchar keyval1,keyval2,presstimes;
        while(1)
        {
        if(keyscan()==15) //F的鍵值為15;
        {
        for(presstimes=0;presstimes<5;presstimes++)
        {
        dispbuf[presstimes]=date[0];
        show(0,presstimes);
        }
        }
        else
        {
        for(presstimes=0;presstimes<5;presstimes++)
        {
        dispbuf[5-presstimes]=dispbuf[4-presstimes];
        dispbuf[0]=keyscan();
        show(dispbuf[presstimes],presstimes);
        }
        }
        }
        }
        /*********************************************************
        主函數main().c,地球人都知道,不必廢話
        **********************************************************/
        void main()
        {
        while(1)
        {
        }
        }
        上一頁 1 2 3 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 翼城县| 安泽县| 万宁市| 霸州市| 桃源县| 满洲里市| 龙岩市| 泰和县| 汉阴县| 海宁市| 镇巴县| 江阴市| 宁南县| 马关县| 丽水市| 无棣县| 百色市| 平乐县| 潮安县| 中山市| 绵竹市| 平昌县| 天柱县| 拉孜县| 永靖县| 江北区| 湘潭市| 双城市| 滦南县| 和政县| 乐平市| 太仆寺旗| 丁青县| 滨海县| 西乌珠穆沁旗| 绍兴市| 鄢陵县| 中西区| 龙泉市| 德州市| 凌云县|