|
stm32單片機(jī)串行方式控制st7920 128*64屏顯示字符,附件里面有2個(gè)程序,全部都是經(jīng)過(guò)測(cè)試ok的
b00d5298a8551fe631848e1e1e5d996a_604.jpg (31.21 KB, 下載次數(shù): 87)
下載附件
2017-7-19 01:11 上傳
單片機(jī)源程序如下:
- /**********************************************************
- * @ File name -> lcd12864.c
- * @ Version -> V1.1.2
- * @ Date -> 11-30-13
- * @ Brief -> LCD12864驅(qū)動(dòng)函數(shù)
- * 適用于ST7920驅(qū)動(dòng)芯片
- V1.1
- * @ Revise -> A、修正操作命令宏定義。
- * @ -> B、增加串口、并口轉(zhuǎn)換宏定義,增加對(duì)高速度MCU控制通訊頻率延時(shí)函數(shù)
- * @ -> C、顯示字符串函數(shù)增加顯示長(zhǎng)度選擇,即顯示多少個(gè)ASCII可顯示字符,漢字x2即可
- * @ -> D、去掉顯示數(shù)組函數(shù),合并在字符串顯示里
- V1.1.1
- * @ Revise -> 增加字符串顯示函數(shù),可以從要顯示的數(shù)組中任意位置顯示一定長(zhǎng)度字符串
- V1.1.2
- * @ Revise -> A、增加對(duì)低速晶振系統(tǒng)的MCU通訊頻率是否使用的宏定義
- * @ -> B、增加在檢測(cè)液晶忙超時(shí)退出,預(yù)防死循環(huán)
- **********************************************************/
- #include "lcd12864.h"
- /**********************************************************
- 自定義顯示字符
- **********************************************************/
- #define CGRAM_Value 64 //寫入CGRAM數(shù)量
-
- u8 code CGROM_Code[] = {
- //天線圖形
- 0xff,0xff,0x80,0x01,0xbf,0xfd,0xdf,0xfb,0xec,0x37,0xf6,0x6f,0xfb,0xdf,0xfd,0xbf,
- 0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xfe,0x7f,0xff,0xff,
- //攝氏圖形
- // 0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x70,0x14,0xd8,0x1d,0x88,0x01,0x80,0x01,0x80,
- // 0x01,0x80,0x01,0x80,0x01,0x88,0x00,0xc8,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
- //藍(lán)牙圖形
- 0x07,0xe0,0x0e,0x70,0x1e,0xb8,0x3e,0xdc,0x36,0xec,0x3a,0xdc,0x3c,0xbc,0x3e,0x7c,
- 0x3e,0x7c,0x3c,0xbc,0x3a,0xdc,0x36,0xec,0x3e,0xdc,0x1e,0xb8,0x0e,0x70,0x07,0xe0,
- //CD圖形
- 0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0x07,0xc9,0xb3,0x9d,0xb9,0x9f,0xb9,0x9f,0xb9,
- 0x9f,0xb9,0x9f,0xb9,0x9d,0xb9,0xc9,0xb3,0xe3,0x07,0xff,0xff,0xff,0xff,0xff,0xff,
- //右指向手型
- 0x00,0x00,0x1e,0x00,0x12,0x00,0x73,0xfc,0x52,0x02,0x52,0x1c,0x53,0xe0,0x52,0x10,
- 0x53,0xe0,0x52,0x10,0x53,0xe0,0x52,0x10,0x73,0xe0,0x12,0x00,0x1e,0x00,0x00,0x00
- };
- //=========================================================
- #ifdef LCD_Work_Mode //如果定義了,則使用并口工作模式
- //=========================================================
- /**********************************************************
- * 函數(shù)功能 ---> LCD12864判斷忙
- * 入口參數(shù) ---> none
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void LCD_Check_Busy(void)
- {
- static u16 busytimeout; //忙超時(shí)
- //=====================================================
-
- #ifdef LCD_USE_DELAY /* 定義了則使用延時(shí)調(diào)整通訊頻率 */
- //=====================================================
-
- ktdata = 0xf0; //數(shù)據(jù)口全部置位
- do
- {
- busytimeout++;
- if(busytimeout > 300) break;
- LCD_RS = 0;
- LCD_Delay();
- LCD_RW = 1;
- LCD_Delay();
- LCD_EN = 1;
- LCD_Delay();
- }while(ktdata & LCD_Busy == LCD_Busy); //等待LCD忙完
- LCD_EN = 0;
- //=====================================================
- #else /* 沒(méi)定義則不使用 */
- //=====================================================
- ktdata = 0xf0; //數(shù)據(jù)口全部置位
- do
- {
- busytimeout++;
- if(busytimeout > 300) break;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- // LCD_Delay();
- }while(ktdata & LCD_Busy == LCD_Busy); //等待LCD忙完
- LCD_EN = 0;
- //=====================================================
-
- #endif
- //=====================================================
- if(busytimeout >= 300) printf("LCD Busy TimeOut...\r\n");
- busytimeout = 0;
- }
- /**********************************************************
- * 函數(shù)功能 ---> LCD寫入一個(gè)字節(jié)命令或者數(shù)據(jù),判斷忙標(biāo)志(8位數(shù)據(jù)一次發(fā)送完畢)
- * 入口參數(shù) ---> dat:要寫入的字節(jié)
- * ord:判斷dat是命令還是數(shù)據(jù)依據(jù),“0”為命令,“1”為數(shù)據(jù)
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void LCD_Write_Byte(u8 dat,u8 ord)
- {
- //=====================================================
-
- #ifdef LCD_USE_DELAY /* 定義了則使用延時(shí)調(diào)整通訊頻率 */
- //=====================================================
-
- LCD_Check_Busy(); //判斷是否在忙?
- LCD_EN = 0;
- LCD_Delay();
- LCD_RW = 0;
- LCD_Delay();
- if(ord & 0x01) LCD_RS = 1; //放上數(shù)據(jù)或者命令判斷位
- else LCD_RS = 0;
- LCD_EN = 1;
- LCD_Delay();
- ktdata = dat; //放入數(shù)據(jù)
- LCD_Delay();
- LCD_EN = 0;
- //=====================================================
- #else /* 沒(méi)定義則不使用 */
- //=====================================================
- LCD_Check_Busy(); //判斷是否在忙?
- LCD_EN = 0;
- LCD_RW = 0;
- if(ord & 0x01) LCD_RS = 1; //放上數(shù)據(jù)或者命令判斷位
- else LCD_RS = 0;
- LCD_EN = 1;
- ktdata = dat; //放入數(shù)據(jù)
- LCD_EN = 0;
- //=====================================================
-
- #endif
- //=====================================================
- }
- //=========================================================
- #else //沒(méi)定義則使用串口通訊模式
- //=========================================================
- /**********************************************************
- * 函數(shù)功能 ---> LCD啟動(dòng)字節(jié)
- * 入口參數(shù) ---> dt:傳輸?shù)淖止?jié),高5位在函數(shù)內(nèi)部設(shè)定為1
- * 只是確定RW和RS為,最后那位也是內(nèi)部確定
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> 首先傳送一個(gè)啟動(dòng)字節(jié),送入連續(xù)5個(gè)“1”用來(lái)啟
- * 動(dòng)一個(gè)周期,此時(shí)傳輸計(jì)數(shù)被重置,并且串行傳輸
- * 被同步,緊接著的兩個(gè)位指定傳輸方向(R/W,確
- * 定是讀還是寫)和傳輸性質(zhì)(RS,確定是命令寄存
- * 器還是數(shù)據(jù)寄存器),最后的第八位是一個(gè)“0”
- **********************************************************/
- void LCD12864_Start(u8 dt)
- {
- u8 dat,j;
- dat = dt | 0xf8; //高5位設(shè)定為“1”,第八位設(shè)定為“0”
- LCD_SCL = 0;
- LCD_Delay();LCD_Delay();
- LCD_CS = 1; //選中顯示屏,高電平有效
- for(j = 0;j < 8;j++)
- {
- if(dat & 0x80) LCD_SDA = 1; //放數(shù)據(jù)到數(shù)據(jù)線
- else LCD_SDA = 0;
-
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SCL = 1; //發(fā)送數(shù)據(jù),上升沿有效
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SCL = 0;
- dat <<= 1; //左移一位,先發(fā)的是高位
- }
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SCL = 0;
- LCD_Delay();LCD_Delay();LCD_Delay(); //等待硬件反應(yīng)(等待數(shù)據(jù)發(fā)送完全)
- }
- /**********************************************************
- * 函數(shù)功能 ---> LCD寫入一個(gè)字節(jié)命令或者數(shù)據(jù)
- * 入口參數(shù) ---> dat:要寫入的命令或者數(shù)據(jù)
- * ord:命令或者數(shù)據(jù)判斷為。0為命令,1為數(shù)據(jù)
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void LCD_Write_Byte(u8 dat,u8 ord)
- {
- u8 tem;
- u8 i,j;
- tem = dat & 0xf0; //先發(fā)送高4位
- LCD12864_Start((ord << 1) | 0xf0); //置RW為“0”、RS為“ord”并啟動(dòng)串行傳輸為數(shù)據(jù)格式
- for(j = 0;j < 2;j++) //一個(gè)字節(jié)數(shù)據(jù)或者命令分兩次發(fā)送
- {
- LCD_SCL = 0; //允許數(shù)據(jù)線電平變化
- LCD_Delay();LCD_Delay();LCD_Delay();
- for(i = 0;i < 8;i++)
- {
- if(tem & 0x80) LCD_SDA = 1; //放上數(shù)據(jù),屏蔽低4位
- else LCD_SDA = 0;
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SCL = 1; //發(fā)送數(shù)據(jù),上升沿有效
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SCL = 0;
- tem <<= 1; //左移一位,先發(fā)的是高位
- }
- tem = (dat << 4) & 0xf0; //發(fā)完高4位,再次發(fā)送低4位
- }
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SDA = 0;
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_SCL = 0;
- LCD_Delay();LCD_Delay();LCD_Delay();
- LCD_CS = 0;
- LCD_Delay();LCD_Delay();LCD_Delay(); //等待硬件反應(yīng)(等待數(shù)據(jù)發(fā)送完全)
- }
- //=========================================================
- #endif
- //=========================================================
- /**********************************************************
- * 函數(shù)功能 ---> 設(shè)置LCD顯示位置
- * 入口參數(shù) ---> x:行,取值范圍:1 ~ 4
- * y:列,取值范圍:0 ~ 7
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void LCD_Set_xy(u8 x,u8 y)
- {
- switch(x)
- {
- case 1:
- LCD_Write_Byte((One_LineAddress + y),0); //寫入操作地址
- break;
- case 2:
- LCD_Write_Byte((Two_LineAddress + y),0); //寫入操作地址
- break;
- case 3:
- LCD_Write_Byte((Three_LineAddress + y),0); //寫入操作地址
- break;
- case 4:
- LCD_Write_Byte((Four_LineAddress + y),0); //寫入操作地址
- break;
- default:
- LCD_Write_Byte((One_LineAddress + y),0); //寫入操作地址
- break;
- }
- }
- /**********************************************************
- * 函數(shù)功能 ---> 寫入自定義字符到LCD的CGRAM
- * 入口參數(shù) ---> *data_code:寫入的數(shù)組
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void LCD_Write_CGRAM(u8 *data_code)
- {
- u8 i;
- LCD_Write_Byte(0x34,0); //打開(kāi)字符擴(kuò)展指令
- LCD_Write_Byte(0x02,0); //SR=0,允許輸入
- LCD_Write_Byte(0x30,0); //恢復(fù)基本指令
- LCD_Write_Byte(0x40,0); //CGRAM地址
- for(i = 0;i < CGRAM_Value;i++)
- {
- LCD_Write_Byte(data_code[i*2],1);
- LCD_Write_Byte(data_code[i*2+1],1);
- }
- }
- /**********************************************************
- * 函數(shù)功能 ---> 顯示一個(gè)CGRAM內(nèi)容
- * 入口參數(shù) ---> x:行
- * y:列
- * *str為要顯示的字符串
- * add_h:CGRAM高位地址
- * add_l:CGRAM低位地址
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void Display_CGRAM(u8 x,u8 y,u8 add_h,u8 add_l)
- {
- LCD_Set_xy(x,y); //設(shè)置顯示地址
- LCD_Write_Byte(add_h,1);
- LCD_Write_Byte(add_l,1);
- }
- /**********************************************************
- * 函數(shù)功能 ---> LCD顯示字符串
- * 入口參數(shù) ---> x:行
- * y:列
- * *str:要顯示的字符串
- * len:顯示的長(zhǎng)度
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> 只能從數(shù)組的開(kāi)頭開(kāi)始顯示len長(zhǎng)度字符串
- **********************************************************/
- void Display_String(u8 x,u8 y,u8 *str,u8 len)
- {
- LCD_Set_xy(x,y); //設(shè)置顯示地址
- while(len--)
- {
- LCD_Write_Byte(*str,1);
- str++;
- }
- }
- /**********************************************************
- * 函數(shù)功能 ---> LCD顯示字符串
- * 入口參數(shù) ---> x:行
- * y:列
- * *str:要顯示的字符串
- * len:顯示的長(zhǎng)度
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> 可以從顯示數(shù)組的任意位置starsum開(kāi)始顯示len長(zhǎng)度的字符串
- **********************************************************/
- void Display_String1(u8 x,u8 y,u8 *str,u8 starsum,u8 len)
- {
- u8 i;
- LCD_Set_xy(x,y); //設(shè)置顯示地址
- for(i = starsum;i < starsum + len;i++)
- {
- LCD_Write_Byte(str[i],1);
- }
- }
- /**********************************************************
- * 函數(shù)功能 ---> LCD寫入GDRAM繪圖
- * 入口參數(shù) ---> x:行
- * y:列
- * width:顯示圖片的寬度
- * hieght:顯示圖片的高度
- * *bmp:要顯示的字符串
- * dis_mode:顯示模式,是半屏顯示還是全屏顯示
- * 0:半屏顯示。1:全屏顯示
- * 返回?cái)?shù)值 ---> none
- * 功能說(shuō)明 ---> none
- **********************************************************/
- void Display_GDRAM(u8 x,u8 y,u8 width,u8 height,u8 *bmp,u8 dis_mode)
- {
- u8 i,j,k;
- u8 base_x,base_y; //起始坐標(biāo)
- /******全屏繪圖顯示******/
- if(dis_mode)
- {
- switch(x)
- {
- case 1:
- base_y = One_LineAddress + y;
- break;
- case 2:
- base_y = Two_LineAddress + y;
- break;
- case 3:
- base_y = Three_LineAddress + y;
- break;
- case 4:
- base_y = Four_LineAddress + y;
- break;
- default: break;
- }
-
- LCD_Write_Byte(MPU_8bit_Expansion_Draw_Close,0); //擴(kuò)充指令
- LCD_Write_Byte(MPU_8bit_Expansion_Draw_Open,0); //打開(kāi)繪圖功能
-
- for(j = 0;j < height;j++) //32
- {
- LCD_Write_Byte(base_y + j,0); //寫入行號(hào),即第幾行開(kāi)始
- LCD_Write_Byte(One_LineAddress,0); //橫坐標(biāo)的第幾個(gè)字節(jié)開(kāi)始寫
-
- for(i = 0;i < width;i++) //上半屏
- {
- LCD_Write_Byte(bmp[width * j + i],1); //開(kāi)始寫入數(shù)據(jù)
- }
- for(k = 0;k < width;k++) //下半屏
- {
- LCD_Write_Byte(bmp[width * (j + height) + k],1); //開(kāi)始寫入數(shù)據(jù)
- }
- }
- }
- /******分開(kāi)上半屏或者下半屏寫******/
- else
- {
- switch(x) //判斷顯示的橫坐標(biāo),確定起始行
- {
- case 1: //上半屏
- base_x = One_LineAddress; //起始地址為0x80
- break;
-
- case 2: //下半屏
- base_x = One_LineAddress; //起始地址為0x80
- break;
-
- case 3: //下半屏
- base_x = Three_LineAddress; //起始地址為0x88
- break;
- default:
- break;
- }
-
- base_y = base_x + y; //x軸方向的偏移,基地址 + 偏移地址
-
- LCD_Write_Byte(MPU_8bit_Expansion_Draw_Close,0); //擴(kuò)充指令
- LCD_Write_Byte(MPU_8bit_Expansion_Draw_Open,0); //打開(kāi)繪圖功能
-
- if(x == 1 || x == 3) //直接在同一個(gè)半屏的,直接寫完32位數(shù)據(jù)
- {
- for(i = 0;i < 32;i++) //寫地址有講究,先寫垂直再寫水平,詳見(jiàn)“設(shè)定繪圖RAM地址”說(shuō)明
- {
- LCD_Write_Byte(One_LineAddress + i,0); //寫入垂直地址,不管上半屏還是下半屏
- LCD_Write_Byte(base_y,0); //寫入水平地址
-
- for(j = 0;j < 2;j++) //兩組8bit數(shù)據(jù),組成16bit
- {
- LCD_Write_Byte(*bmp++,1); //寫入數(shù)據(jù)
- }
- }
- }
-
- if(x == 2) //數(shù)據(jù)顯示不在同一半屏上的,先寫上半屏,在寫下半屏
- {
- for(i = 0;i < 16;i++) //上半屏16行點(diǎn)陣數(shù)據(jù)
- {
- LCD_Write_Byte(Two_LineAddress + i,0); //寫入垂直地址
- LCD_Write_Byte(base_y,0); //寫入水平地址
-
- for(j = 0;j < 2;j++) //兩組8bit數(shù)據(jù),組成16bit
- {
- LCD_Write_Byte(*bmp++,1); //寫入數(shù)據(jù)
- }
- }
- for(i = 0;i < 16;i++) //下半屏16行點(diǎn)陣數(shù)據(jù)
- {
- LCD_Write_Byte(Three_LineAddress + i,0); //寫入垂直地址
- LCD_Write_Byte(base_y + 8,0); //寫入水平地址
-
- for(j = 0;j < 2;j++) //兩組8bit數(shù)據(jù),組成16bit
- {
- LCD_Write_Byte(*bmp++,1); //寫入數(shù)據(jù)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
STM32F103VCT612864.rar
(263.89 KB, 下載次數(shù): 100)
2017-7-19 01:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
lcd12864.zip
(8.03 KB, 下載次數(shù): 83)
2017-7-19 01:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
JN12864J使用說(shuō)明書(shū).pdf
(776.12 KB, 下載次數(shù): 40)
2017-7-19 01:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|