Schematic_STC32G12K128_DIP40Project_2023-07-27.png (350.25 KB, 下載次數(shù): 70)
下載附件
2023-7-27 17:25 上傳
- /************* 功能說明 **************
- 本例程基于STC32G為主控芯片的實驗箱9.6版本進行編寫測試。
- 使用Keil C251編譯器,Memory Model推薦設(shè)置XSmall模式,默認定義變量在edata,單時鐘存取訪問速度快。
- edata建議保留1K給堆棧使用,空間不夠時可將大數(shù)組、不常用變量加xdata關(guān)鍵字定義到xdata空間。
- 128*64的LCD顯示程序
- 顯示圖形,漢字,英文,數(shù)字
- 下載時, 選擇時鐘 24MHz (用戶可自行修改頻率).
- ******************************************/
- #include "..\comm\STC32G.h"
- #include "stdio.h"
- #include "intrins.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
- #define MAIN_Fosc 24000000UL
- /****************************** 用戶定義宏 ***********************************/
- sbit LCD_RS = P4^1; //定義引腳
- sbit LCD_RW = P4^2; //9.5版本之前實驗箱需要將P42與P44對調(diào)才能正常使用
- sbit LCD_E = P4^4;
- //sbit PSB = P3^5; //PSB腳為12864的串、并通訊功能切換,我們使用8位并行接口,PSB=1
- sbit LCD_RESET = P3^4; // 17---RESET L-->Enable
- #define LCD_Data P0
- #define Busy 0x80 //用于檢測LCD狀態(tài)字中的Busy標識
- /*****************************************************************************/
- /************* 本地常量聲明 **************/
- u8 code uctech[] = {"微電子 "};
- u8 code net[] = {" stcmcu "};
- u8 code mcu[] = {"51單片機"};
- u8 code qq[] = {" 123456 "};
- //128*64點陣圖形數(shù)據(jù)
- u8 code gImage_gxw[1024] = { /* 0X10,0X01,0X00,0X80,0X00,0X40, */
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X3F,0X03,0XF0,0X3F,0X03,0XF0,0X00,0X00,0X00,0X0C,0X00,0X00,0X00,0XC0,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X0C,0X00,0X18,0XFF,0XE0,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X08,0X1C,0X1C,0X1B,0X00,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X1F,0XFF,0XFE,0X0C,0X0E,0X00,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X00,0X0C,0X00,0X00,0X8C,0X60,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X04,0X0C,0X10,0X00,0XFF,0XF0,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X07,0XFF,0XF8,0X0C,0XCC,0X60,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X00,0X06,0X63,0X18,0X7E,0XCC,0X60,0X00,
- 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X06,0X33,0X98,0X0C,0XFF,0XE0,0X00,
- 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X06,0X32,0X18,0X0C,0XCC,0X60,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X05,0XD8,0X0C,0XCC,0X60,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0XFF,0X78,0X0C,0XFF,0XE0,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X08,0XD8,0X0C,0XCC,0X60,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XF8,0X0C,0XCC,0X60,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X0C,0XCF,0XE0,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X3E,0X80,0X40,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X73,0XC0,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X0D,0XF0,0X20,0X7F,0XF8,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X30,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X18,0X01,0X84,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XFC,0X01,0XC6,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X06,0X00,0X58,0X01,0X86,0X30,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X07,0XFF,0XD8,0X7F,0XFF,0XF8,0X00,
- 0X60,0X00,0XFD,0X1F,0XF0,0X7A,0X00,0X18,0X00,0X06,0X0C,0X18,0X01,0X86,0X00,0X00,
- 0X60,0X01,0X87,0X13,0X30,0XC6,0X00,0X18,0X00,0X06,0X0C,0X18,0X01,0X86,0X00,0X00,
- 0X60,0X03,0X03,0X33,0X11,0X83,0X00,0X18,0X00,0X06,0X0C,0X18,0X00,0X40,0X00,0X00,
- 0X60,0X03,0X03,0X03,0X01,0X83,0X00,0X18,0X00,0X06,0X0C,0XD8,0X00,0X30,0X00,0X00,
- 0X60,0X03,0X80,0X03,0X03,0X80,0X00,0X18,0X00,0X06,0XFF,0XF8,0X03,0X38,0X00,0X00,
- 0X60,0X01,0XC0,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0F,0X18,0X0B,0X98,0X80,0X00,
- 0X60,0X00,0X78,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0D,0X98,0X0B,0X18,0XC0,0X00,
- 0X60,0X00,0X1E,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0C,0XD8,0X1B,0X00,0X70,0X00,
- 0X60,0X00,0X07,0X03,0X03,0X00,0X00,0X18,0X00,0X06,0X0C,0X18,0X1B,0X01,0X30,0X00,
- 0X60,0X00,0X03,0X03,0X03,0X80,0X00,0X18,0X00,0X06,0X0C,0XD8,0X3B,0X01,0X30,0X00,
- 0X60,0X03,0X03,0X03,0X03,0X83,0X00,0X18,0X00,0X07,0XF7,0XB8,0X33,0X01,0X80,0X00,
- 0X60,0X03,0X03,0X03,0X01,0X82,0X00,0X18,0X00,0X06,0X00,0X18,0X03,0X01,0X80,0X00,
- 0X60,0X01,0XC6,0X03,0X01,0XC6,0X00,0X18,0X00,0X07,0XFF,0XF8,0X01,0XFF,0X80,0X00,
- 0X60,0X01,0X7C,0X07,0XC0,0X7C,0X00,0X18,0X00,0X06,0X00,0X18,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X04,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X21,0X86,0X00,0X07,0X00,0X00,0X00,0X10,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X31,0X86,0X00,0X07,0X00,0X03,0XFF,0XF8,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X65,0X66,0X00,0X02,0X00,0X00,0X00,0X68,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0XC7,0X7C,0X00,0X02,0X08,0X00,0X00,0XC0,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X95,0X6C,0X41,0XFF,0XFC,0X00,0X03,0X80,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X19,0X3D,0X6F,0XE1,0X82,0X0C,0X00,0X0E,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X3E,0XE9,0XA1,0X82,0X0C,0X00,0X0E,0X00,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X60,0X59,0X81,0X82,0X0C,0X00,0X0C,0X0C,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0X6F,0XFD,0X81,0XFF,0XFC,0X1F,0XFF,0XFE,
- 0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X18,0XE0,0X15,0X81,0X82,0X0C,0X00,0X0C,0X02,
- 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF8,0XA6,0X45,0X81,0X82,0X0C,0X00,0X0C,0X00,
- 0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF9,0X27,0XC7,0X01,0X82,0X0C,0X00,0X0C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X47,0X01,0XFF,0XFC,0X00,0X0C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X5F,0X01,0X82,0X0B,0X00,0X0C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0X77,0X01,0X02,0X03,0X00,0X0C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X26,0XEF,0X80,0X02,0X03,0X00,0X0C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X24,0X59,0XC0,0X02,0X03,0X00,0X0C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X38,0X30,0XE0,0X03,0XFF,0X80,0X7C,0X00,
- 0X00,0X21,0X02,0X10,0X21,0X02,0X10,0X00,0X38,0XE0,0X00,0X00,0X00,0X00,0X18,0X00,
- 0X00,0X3F,0X03,0XF0,0X3F,0X03,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- };
- /************* 本地變量聲明 **************/
- /************* 本地函數(shù)聲明 **************/
- void delay_ms(u16 ms);
- void WriteDataLCD(u8 WDLCD);
- void WriteCommandLCD(u8 WCLCD,u8 BuysC);
- u8 ReadDataLCD(void);
- u8 ReadStatusLCD(void);
- void LCDInit(void);
- void LCDClear(void);
- void LCDFlash(void);
- void DisplayOneChar(u8 X, u8 Y, u8 DData);
- void DisplayListChar(u8 X, u8 Y, u8 code *DData);
- void DisplayImage (u8 code *DData);
- /********************* 主函數(shù) *************************/
- void main(void)
- {
- WTST = 0; //設(shè)置程序指令延時參數(shù),賦值為0可將CPU執(zhí)行指令的速度設(shè)置為最快
- EAXFR = 1; //擴展寄存器(XFR)訪問使能
- CKCON = 0; //提高訪問XRAM速度
- P0M1 = 0x30; P0M0 = 0x30; //設(shè)置P0.4、P0.5為漏極開路(實驗箱加了上拉電阻到3.3V)
- P1M1 = 0x3a; P1M0 = 0x32; //設(shè)置P1.1、P1.4、P1.5為漏極開路(實驗箱加了上拉電阻到3.3V), P1.1在PWM當DAC電路通過電阻串聯(lián)到P2.3, P1.3 為 ADC 高阻輸入
- P2M1 = 0x3c; P2M0 = 0x3c; //設(shè)置P2.2~P2.5為漏極開路(實驗箱加了上拉電阻到3.3V)
- P3M1 = 0x50; P3M0 = 0x50; //設(shè)置P3.4、P3.6為漏極開路(實驗箱加了上拉電阻到3.3V)
- P4M1 = 0x3c; P4M0 = 0x3c; //設(shè)置P4.2~P4.5為漏極開路(實驗箱加了上拉電阻到3.3V)
- P5M1 = 0x0c; P5M0 = 0x0c; //設(shè)置P5.2、P5.3為漏極開路(實驗箱加了上拉電阻到3.3V)
- P6M1 = 0xff; P6M0 = 0xff; //設(shè)置為漏極開路(實驗箱加了上拉電阻到3.3V)
- P7M1 = 0x00; P7M0 = 0x00; //設(shè)置為準雙向口
- delay_ms(100); //啟動等待,等LCD講入工作狀態(tài)
- LCDInit(); //LCM初始化
- delay_ms(5); //延時片刻(可不要)
- while(1)
- {
- LCDClear();
- DisplayImage(gImage_gxw);//顯示圖形
- delay_ms(3000);
- LCDClear();
- DisplayListChar(0,1,uctech); //顯示字庫中的中文數(shù)字
- DisplayListChar(0,2,net); //顯示字庫中的中文數(shù)字
- DisplayListChar(0,3,mcu); //顯示字庫中的中文
- DisplayListChar(0,4,qq); //顯示字庫中的中文數(shù)字
- delay_ms(3000);
- }
- }
- //========================================================================
- // 函數(shù): void delay_ms(u8 ms)
- // 描述: 延時函數(shù)。
- // 參數(shù): ms,要延時的ms數(shù), 這里只支持1~255ms. 自動適應(yīng)主時鐘.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2013-4-1
- // 備注:
- //========================================================================
- void delay_ms(u16 ms)
- {
- u16 i;
- do{
- i = MAIN_Fosc / 6000;
- while(--i);
- }while(--ms);
- }
- //******************************************
- void LCD_delay(void)
- {
- NOP(30); //電壓降低,IO口翻轉(zhuǎn)速度變慢,驅(qū)動信號需要增加延時時間
- NOP(30);
- }
- //寫數(shù)據(jù)
- void WriteDataLCD(u8 WDLCD)
- {
- ReadStatusLCD(); //檢測忙
- LCD_RS = 1;
- LCD_delay();
- LCD_RW = 0;
- LCD_Data = WDLCD;
- LCD_delay();
- LCD_E = 1;
- LCD_delay();
- LCD_E = 0;
- }
- //寫指令
- void WriteCommandLCD(u8 WCLCD,u8 BuysC) //BuysC為0時忽略忙檢測
- {
- if (BuysC) ReadStatusLCD(); //根據(jù)需要檢測忙
- LCD_RS = 0;
- LCD_delay();
- LCD_RW = 0;
- LCD_Data = WCLCD;
- LCD_delay();
- LCD_E = 1;
- LCD_delay();
- LCD_E = 0;
- }
- //讀狀態(tài)
- u8 ReadStatusLCD(void)
- {
- LCD_Data = 0xFF;
- LCD_RS = 0;
- LCD_delay();
- LCD_RW = 1;
- LCD_delay();
- LCD_E = 1;
- LCD_delay();
- while (LCD_Data & Busy); //檢測忙信號
- LCD_E = 0;
- return(LCD_Data);
- }
- void LCDInit(void) //LCM初始化
- {
- // PSB = 1; //并口
- // PSB = 0; //SPI口
- delay_ms(10);
- LCD_RESET = 0;
- delay_ms(10);
- LCD_RESET = 1;
- delay_ms(100);
-
- WriteCommandLCD(0x30,1); //顯示模式設(shè)置,開始要求每次檢測忙信號
- WriteCommandLCD(0x01,1); //顯示清屏
- WriteCommandLCD(0x06,1); // 顯示光標移動設(shè)置
- WriteCommandLCD(0x0C,1); // 顯示開及光標設(shè)置
- }
- void LCDClear(void) //清屏
- {
- WriteCommandLCD(0x01,1); //顯示清屏
- WriteCommandLCD(0x34,1); // 顯示光標移動設(shè)置
- WriteCommandLCD(0x30,1); // 顯示開及光標設(shè)置
- }
- //按指定位置顯示一串字符
- void DisplayListChar(u8 X, u8 Y, u8 code *DData)
- {
- u8 ListLength,X2;
- ListLength = 0;
- X2 = X;
- if(Y < 1) Y=1;
- if(Y > 4) Y=4;
- X &= 0x0F; //限制X不能大于16,Y在1-4之內(nèi)
- switch(Y)
- {
- case 1: X2 |= 0X80; break; //根據(jù)行數(shù)來選擇相應(yīng)地址
- case 2: X2 |= 0X90; break;
- case 3: X2 |= 0X88; break;
- case 4: X2 |= 0X98; break;
- }
- WriteCommandLCD(X2, 1); //發(fā)送地址碼
- while (DData[ListLength] >= 0x20) //若到達字串尾則退出
- {
- if (X <= 0x0F) //X坐標應(yīng)小于0xF
- {
- WriteDataLCD(DData[ListLength]); //
- ListLength++;
- X++;
- }
- }
- }
- //圖形顯示122*32
- void DisplayImage (u8 code *DData)
- {
- u8 x,y,i;
- unsigned int tmp=0;
- for(i=0;i<9;) //分兩屏,上半屏和下半屏,因為起始地址不同,需要分開
- {
- for(x=0;x<32;x++) //32行
- {
- WriteCommandLCD(0x34,1);
- WriteCommandLCD((u8)(0x80+x),1);//列地址
- WriteCommandLCD((u8)(0x80+i),1); //行地址,下半屏,即第三行地址0X88
- WriteCommandLCD(0x30,1);
- for(y=0;y<16;y++)
- WriteDataLCD(DData[tmp+y]);//讀取數(shù)據(jù)寫入LCD
- tmp+=16;
- }
- i+=8;
- }
- WriteCommandLCD(0x36,1); //擴充功能設(shè)定
- WriteCommandLCD(0x30,1);
- }
復制代碼
|