新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ATMEGA8515的SPI驅動ST7565P液晶屏的程序

        基于ATMEGA8515的SPI驅動ST7565P液晶屏的程序

        作者: 時間:2016-11-22 來源:網絡 收藏
        這是用SPI方式來驅動12864液晶的源程序,液晶屏的控制芯片為ST7565P經測試SPI的時鐘可達到振蕩頻率的二分頻。比用普通IO口模擬串行的方式快多了。。。
        下面貼出源代碼,有詳細注釋。。。。
        本程序簡單實用,可拿去作簡單參考。。。。
        編譯環境:GCC+AVR STUDIO
        單片機:ATMEGA 8515
        晶振: 3.6864M
        #include<avr/io.h> //包含頭文件
        #include
        #define COMMAND 1
        #define DATA 0
        /////////////////////////////////////////
        //數據線定義:
        // SI==========PB5 //
        // A0==========PC0
        // CS==========PC2
        // RES=========PC1
        // SCL=========PB7
        //
        /////////////////////////////////////////
        unsigned char gushi[8][112]PROGMEM=
        {
        {0x10,0x10,0x92,0x92,0x92,0xF2,0x9E,0x92,0x92,0x92,0x92,0x92,0xFE,0x10,0x10,0x00, //君問歸期未有期
        0x00,0x00,0xF8,0x01,0x06,0xE0,0x22,0x22,0x22,0x22,0xE2,0x02,0x02,0xFE,0x00,0x00,
        0x00,0xF8,0x00,0x00,0xFF,0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0xFC,0x00,0x00,
        0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,
        0x40,0x40,0x48,0x48,0x48,0x48,0xC8,0xFF,0x48,0x48,0x48,0x48,0x48,0x40,0x40,0x00,
        0x00,0x04,0x84,0x44,0xE4,0x34,0x2C,0x27,0x24,0x24,0x24,0xE4,0x04,0x04,0x04,0x00,
        0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00},
        {0x40,0x20,0x10,0x0C,0xFE,0x45,0x44,0x44,0x44,0x44,0x44,0x44,0xFD,0x00,0x00,0x00,
        0x00,0x00,0xFF,0x00,0x00,0x03,0x02,0x02,0x02,0x02,0x03,0x40,0x80,0x7F,0x00,0x00,
        0x00,0x87,0x40,0x30,0x0F,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x00,0x00,
        0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
        0x20,0x20,0x10,0x10,0x08,0x06,0x01,0xFF,0x01,0x02,0x04,0x08,0x18,0x30,0x10,0x00,
        0x02,0x01,0x00,0x00,0xFF,0x09,0x09,0x09,0x29,0x49,0xC9,0x7F,0x00,0x00,0x00,0x00,
        0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00},
        {0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00, //巴山夜雨漲池
        0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,
        0x04,0x04,0x84,0xC4,0x3C,0x14,0x85,0x66,0xBC,0x24,0x24,0x24,0xE4,0x24,0x04,0x00,
        0x02,0x02,0xF2,0x32,0x52,0x92,0x12,0xFE,0x32,0x52,0x92,0x12,0xF2,0x02,0x02,0x00,
        0x10,0x61,0x86,0x60,0xF2,0x12,0x12,0x1E,0x80,0xFF,0xA0,0x90,0x88,0x86,0x80,0x00,
        0x24,0x24,0xE4,0xFC,0xA2,0x22,0x22,0x80,0x70,0x00,0xFF,0x40,0x20,0x18,0x00,0x00,
        0x10,0x60,0x02,0x8C,0x60,0x80,0xF8,0x40,0x40,0xFE,0x20,0x20,0x10,0xF0,0x00,0x00},
        {0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x20,0x00,
        0x00,0x20,0x7F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,
        0x02,0x01,0x00,0xFF,0x00,0x82,0x41,0x22,0x14,0x09,0x14,0x23,0x40,0xC0,0x40,0x00,
        0x00,0x00,0xFF,0x01,0x02,0x04,0x00,0x7F,0x01,0x02,0x44,0x80,0x7F,0x00,0x00,0x00,
        0x04,0xFC,0x03,0x00,0x01,0x41,0x81,0x7F,0x00,0xFF,0x42,0x0C,0x30,0x60,0x20,0x00,
        0x02,0x01,0x00,0xFF,0x00,0x83,0x40,0x20,0x18,0x07,0x01,0x06,0x18,0xE0,0x40,0x00,
        0x08,0x08,0x7C,0x03,0x00,0x00,0x3F,0x40,0x40,0x5F,0x40,0x42,0x44,0x43,0x70,0x00},
        {0x80,0x40,0xF0,0x1C,0x07,0xE2,0x24,0x24,0x24,0xE4,0x04,0x04,0xFC,0x04,0x04,0x00, //何當共剪西窗燭
        0x00,0x00,0x40,0x42,0x5C,0x48,0x40,0x40,0x7F,0x40,0x50,0x4E,0x44,0xC0,0x00,0x00,
        0x00,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x00,0x00,
        0x00,0x04,0xF4,0x54,0x55,0x56,0x54,0xF4,0x04,0x04,0xE6,0x05,0x04,0xF4,0x04,0x00,
        0x02,0xF2,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xFE,0x12,0x12,0x12,0xF2,0x02,0x00,
        0x00,0x4C,0x44,0xE4,0x54,0x44,0x64,0xD5,0x46,0x44,0x4C,0x54,0xD4,0x24,0x2C,0x00,
        0x80,0x60,0x00,0xFF,0x20,0x18,0xF0,0x10,0x10,0xFF,0x12,0x10,0xF0,0x10,0x00,0x00},
        {0x00,0x00,0x7F,0x00,0x00,0x07,0x02,0x02,0x02,0x07,0x20,0x40,0x3F,0x00,0x00,0x00,
        0x00,0x00,0x20,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,
        0x02,0x02,0x82,0x42,0x32,0x1F,0x0A,0x02,0x02,0x06,0x0B,0x32,0xE2,0x42,0x02,0x00,
        0x00,0x08,0x8F,0x89,0x49,0x2B,0x1D,0x0B,0x08,0x08,0x08,0x4A,0x8C,0x7B,0x00,0x00,
        0x00,0x7F,0x28,0x24,0x22,0x21,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,
        0x00,0x00,0x00,0xFF,0x44,0x62,0x55,0x49,0x55,0x43,0x41,0x40,0xFF,0x00,0x00,0x00,
        0x40,0x20,0x18,0x07,0x04,0x28,0x63,0x21,0x21,0x3F,0x11,0x15,0x1B,0x30,0x00,0x00},
        {0x80,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00, //卻話巴山夜雨時
        0x40,0x41,0x4E,0xC4,0x00,0x20,0x24,0x24,0x24,0x24,0xFC,0x22,0x22,0x22,0x20,0x00,
        0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,
        0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,
        0x04,0x04,0x84,0xC4,0x3C,0x14,0x85,0x66,0xBC,0x24,0x24,0x24,0xE4,0x24,0x04,0x00,
        0x02,0x02,0xF2,0x32,0x52,0x92,0x12,0xFE,0x32,0x52,0x92,0x12,0xF2,0x02,0x02,0x00,
        0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00},
        {0x00,0x10,0x3C,0x13,0x10,0x08,0x0A,0x1C,0x08,0xFF,0x00,0x08,0x10,0x0F,0x00,0x00,
        0x00,0x00,0x00,0x7F,0x20,0x10,0x00,0x7E,0x22,0x22,0x23,0x22,0x22,0x7E,0x00,0x00,
        0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x20,0x00,
        0x00,0x20,0x7F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,
        0x02,0x01,0x00,0xFF,0x00,0x82,0x41,0x22,0x14,0x09,0x14,0x23,0x40,0xC0,0x40,0x00,
        0x00,0x00,0xFF,0x01,0x02,0x04,0x00,0x7F,0x01,0x02,0x44,0x80,0x7F,0x00,0x00,0x00,
        0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00},
        };
        ////////////////////////////////
        //發送一個字節到ST7565P并等待發送完畢
        //入口:要發送的字節
        //返回值:無
        ////////////////////////////////
        void SPIByte(unsigned char byte)
        {
        SPDR = byte; //寫數據
        while(!(SPSR & (1<//等待發送完成
        }
        ////////////////////////////////////////////////
        //將一個字節發送的ST7565P的函數
        //入口參數: select ,data
        //select:根據此值確定發送給ST7565P的是數據還是命令
        //data: 要發送給ST7565的一個字節
        //返回值:無
        ////////////////////////////////////////////////
        void LCD_SPISend(unsigned char select,unsigned char data)
        {
        PORTC &= ~(1<<2); // CS=0 芯片使能信號
        if(select == COMMAND) //傳輸的是命令
        {
        PORTC &= ~(1<<0); // 根據ST7565P的數據手冊,傳輸命令時A0應該是為低電平
        SPIByte(data);
        PORTC |= 1<<0; // A0=1
        }
        else
        {
        SPIByte(data);
        }
        PORTC |= 1<<2; //CS= 恢復不使能
        }
        ////////////////////////////////////////////
        //寫坐標函數
        //入口參數:x y
        //y: 頁面地址,此液晶將顯示區域分為9個頁面,y的值域0~8
        //x: 列地址,值域:0~127
        //返回值:無
        ////////////////////////////////////////////
        void LCD_XYSet(unsigned char x,unsigned char y)
        {
        LCD_SPISend(COMMAND,0xB0|y); //y的值為0~8
        LCD_SPISend(COMMAND,0x10|(x>>4));
        LCD_SPISend(COMMAND,0x00|(x&0x0F));
        }
        /////////////////////////////////////
        //延時函數
        //入口: ms 當延時100毫秒時,ms的值為100即可
        //返回值:無
        /////////////////////////////////////
        void DelayMs(volatile unsigned int ms)
        {
        volatile unsigned int i;
        volatile unsigned int j;
        for(i=0;i
        {
        j=280;
        while(j--);
        }
        }
        //////////////////////////////////////////////////////
        //初始化SPI及液晶屏的函數
        //入口:無
        //返回值:無
        /////////////////////////////////////////////////////
        void LCD_Init(void)
        {
        SPCR = 0x5C;
        SPSR |= 1<
        //SPI的功能設置解釋:使能SPI;采用主機模式;SPI的傳輸模式為模式3;時鐘頻率為系統時鐘的兩分頻,即 //3.6864/2M
        DelayMs(100);
        SPIByte(0xFF); //可發可不發,無意義
        PORTC &= ~(1<<1); //將復位腳拉低
        DelayMs(5); //延時5ms,等待電源穩定
        PORTC |= 1<<1; //將復位腳拉高
        DelayMs(5);
        LCD_SPISend(COMMAND,0xAE); //將液晶屏的顯示關掉
        LCD_SPISend(COMMAND,0xA3); //設置偏壓比
        LCD_SPISend(COMMAND,0xA0); //設置SEG 輸出方向
        LCD_SPISend(COMMAND,0xC8); //設置公共端輸出掃描方向
        LCD_SPISend(COMMAND,0x25); //調整 (1 + Rb/Ra) ratio 值,調整此值影響很大
        LCD_SPISend(COMMAND,0x81); //開始設置α的命令
        LCD_SPISend(COMMAND,0x28); //設置α的值,值越大對比度越強,調整此值影響不太,是微調的
        DelayMs(5);
        LCD_SPISend(COMMAND,0x2F); //開啟相關電壓
        DelayMs(50);
        LCD_SPISend(COMMAND,0xAF); //顯示開
        LCD_SPISend(COMMAND,0xF8);
        LCD_SPISend(COMMAND,0x01); //此兩條命令是設置升壓比的
        DelayMs(500); //不知此延時可否省去,不過了安全起見,初次調試保留為好。。
        }
        ////////////////////////////////////////
        //清屏函數
        //入口:無
        //返回值:無
        ///////////////////////////////////////
        void Clear_Display(void)
        {
        unsigned char i;
        unsigned char j;
        for(i=0;i<8;i++)
        {
        LCD_XYSet(0,i);
        for(j=0;j<128;j++)
        {
        LCD_SPISend(DATA,0); //傳輸數據
        }
        }
        }
        ////////////////////////////////
        //顯示一首李商隱的詩歌:
        //  君問歸期未有期
        //  巴山夜雨漲秋池
        //  何當共剪西窗燭
        //  卻話巴山夜雨時
        //入口:無
        //返回值:無
        ////////////////////////////////
        void Gushi_Display(void)
        {
        unsigned char i;
        unsigned char j;
        for(i=0;i<8;i++)
        {
        LCD_XYSet(8,i);
        for(j=0;j<112;j++)
        {
        LCD_SPISend(DATA,__LPM(&gushi[i][j]));
        }
        }
        }
        int main(void)
        {
        DDRB = 0xFF; //將IO口配置為輸出
        PORTB = 0xFF; //讓IO口都輸出高電平
        DDRC = 0xFF; //配置為輸出
        PORTC = 0xFF; //輸出高電平
        DelayMs(1);
        LCD_Init(); //初始化的函數
        Clear_Display(); //清屏函數
        Gushi_Display();
        while(1)
        {
        }
        }
        編譯結果如下:
        AVR Memory Usage
        ----------------
        Device: atmega8515
        Program: 1688 bytes (20.6% Full)
        (.text + .data + .bootloader)
        Data: 0 bytes (0.0% Full)
        (.data + .bss + .noinit)
        Build succeeded with 0 Warnings...
        顯示效果如下:



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 兰州市| 泸州市| 漳浦县| 延长县| 太康县| 赤城县| 德江县| 法库县| 略阳县| 饶河县| 钦州市| 盐津县| 徐水县| 湘潭县| 嵩明县| 原平市| 马鞍山市| 兴文县| 沙坪坝区| 田阳县| 荆门市| 彩票| 庆阳市| 区。| 耒阳市| 苏尼特左旗| 泰安市| 清原| 连城县| 会理县| 昌平区| 长岛县| 石棉县| 错那县| 黎城县| 阿城市| 七台河市| 周口市| 鹤壁市| 临武县| 铜川市|