?? lcd.c
字號:
/*--------------------------------------------
主題:S3C44B0-LCM-NT7534顯示程序
編寫人:龍壽華
程序功能:用ARM點亮此13264點陣的黑白液晶屏
;連線圖:
;*LCM------MCU* *LCM-------MCU*
;*DB0~7---VD0~7/PD0~PD3-PC7~PC4* *A0----VFRAME/PD7*
;*WR-------VCLK/PD4* *CS1----EL_ON/PC9*
;*RD------VLINE/PD5* *RESET-----NRESET*
-------------------------------------------------*/
#include "..\inc\uTypes.h"
#include "..\inc\44b0x.h"
#include "..\inc\console.h"
#include "..\inc\sysUtils.h"
#include <stdarg.h>
//#define LCM_DELAY 1 //事實證明根本不需要延時,LCM完全能反應過來
/***********LCM常用操作命令和參數定義***************/
#define DISPON 0xAf /*顯示on */
#define DISPOFF 0xAe /*顯示off */
#define DISPFIRST 0x40 /*顯示起始行定義 */
#define SETX1 0x00 /*X定位低4位設定指令(列) */
#define SETX2 0x10 /*X定位高4位設定指令(列) */
#define SETY 0xb0 /*Y定位設定指令(頁) */
#define Lcdbusy 0x80 /*LCM忙判斷位,當讀出數據的最高位為1時,表示正忙。 */
#define DISCURRENT 0x81 /*進入到電流量設定 */
/*初始化LCD時用到的指令和參數定義*/
#define DISADC 0xA0 /*LCM顯示ADC設定,順方向 */
#define DISVOL 0xA2 /*LCM顯示偏壓設定(取中間值) */
#define DISCOM 0xCF /*LCM公共輸出模式選擇,逆方向 */
#define DISNORMAL 0xA6 /*一般顯示指令 */
#define DISREVERSE 0xA7 /*反顯指令 */
#define DISVR 0x24 /*調整V0電阻比率,這里折中*/
#define DISCURVUL 0x5D /*設定電流量值,這里折中 */
#define DISfrequency 0xE4 /*設定LCM工作頻率,這里是最大值 */
#define DISPOWER 0x2F /*LCM電源控制項設定,這里全開 */
#define LCMLIMIT 132 /*本程序驅動13264LCM,所以這里為132.*/
/*******************************************************/
const unsigned char Ezk[]; //ASCII字庫8列*16行
#define SET_LCM_A0() \
rPDATD |= MASK_BIT(7)
#define CLR_LCM_A0() \
rPDATD &= ~MASK_BIT(7)
#define SET_LCM_WR() \
rPDATD |= MASK_BIT(4)
#define CLR_LCM_WR() \
rPDATD &= ~MASK_BIT(4)
#define SET_LCM_RD() \
rPDATD |= MASK_BIT(5)
#define CLR_LCM_RD() \
rPDATD &= ~MASK_BIT(5)
#define SET_LCM_CS1() \
rPDATC &= ~MASK_BIT(9) //LCM的CS1是經過一個反向器與ARM連接,所以要反向
#define CLR_LCM_CS1() \
rPDATC |= MASK_BIT(9)
unsigned char col,row; //col即LCM的行地址,row即LCM的列地址
/****************************************/
/* 向LCM數據口輸出數據函數 */
/****************************************/
void LCM_WRITE(unsigned char data)
{
unsigned char count;
unsigned char baker;
rPDATD = (rPDATD&0xf0)|(data&0x0f);
baker=data>>4;
data=baker&0x01;
for(count=1;count<4;count++){ //高四位高低位交換
data=(data<<1)|((baker>>count)&0x01);
}
rPDATC = (rPDATC&0xff0f)|(data<<4);
}
/****************************************/
/* 讀出LCM數據口數據函數 */
/****************************************/
unsigned char LCM_READ(void)
{
unsigned char count;
unsigned char baker,data1,data2;
data1 = (rPDATD&0x0f);
data2 = (rPDATC&0xf0);
baker=data2>>4;
data2=baker&0x01;
for(count=1;count<4;count++){ //高四位高低位交換
data2=(data2<<1)|((baker>>count)&0x01);
}
return((data2<<4)|data1);
}
/****************************************/
/* LCM專用延時函數 */
/****************************************/
void lcmDelay (unsigned int nDelay)
{
int i;
for (i = 0; i < nDelay; ++ i);
}
/****************************************/
/* 對LCM寫入命令 */
/****************************************/
void lcmWriteCmd (U8 byCmd)
{
CLR_LCM_A0();
CLR_LCM_CS1();
SET_LCM_RD();
// lcmDelay (LCM_DELAY);
CLR_LCM_WR();
LCM_WRITE (byCmd);
SET_LCM_CS1();
SET_LCM_WR ();
SET_LCM_A0();
// lcmDelay (LCM_DELAY);
}
/****************************************/
/* 對LCM寫入數據 */
/****************************************/
void lcmWriteData (U8 byData)
{
SET_LCM_A0 ();
CLR_LCM_CS1();
SET_LCM_RD();
// lcmDelay (LCM_DELAY);
CLR_LCM_WR();
LCM_WRITE (byData);
SET_LCM_CS1();
SET_LCM_WR ();
SET_LCM_A0();
// lcmDelay (LCM_DELAY);
}
/****************************************/
/* LCM寫入地址函數 */
/****************************************/
void LcmLoadxy ()
{
lcmWriteCmd(row | SETY); /* 寫入頁地址 */
lcmWriteCmd((col>>4) | SETX2); /*寫入列地址的高4位*/
lcmWriteCmd((col & 0x0F) | SETX1); /* 寫入列地址的低4位 */
}
/****************************************/
/* 清屏,全屏幕清零,不清屏ICON圖標 */
/****************************************/
void Lcmcls( void )
{
row=0,col=0;
for(row=0;row<8;row++) /*這里不清功能指示行*/
{
col=0; /*回歸到初始值0*/
LcmLoadxy(); /* 寫入頁首地址 */
for(;col<LCMLIMIT;col++)lcmWriteData(0); /* 寫入數據0 */
}
row=0,col=0; /* 地址歸位 */
}
/****************************************/
/*LCM顯示功能點函數*/
/*入口數i是指定要顯示的點的列數,j為1時表示點亮該點,為0時消隱*/
/****************************************/
void Lcm_dot (unsigned char i,unsigned char j)
{
unsigned char bakerx,bakery; //定義兩個變量,用于存放col及row的初值
bakerx=col;bakery=row; //備份地址
col=i; /*寫入標志的列地址*/
row=8; /*功能點都在第8頁,即第65行*/
LcmLoadxy(); /* 寫入地址 */
if (j)
{lcmWriteData(0xFF);} /*j=1,則點亮此點*/
else
{lcmWriteData(0);} /*j=0,關掉此點*/
col=bakerx;row=bakery; //還原地址
}
/****************************************/
/* 判斷當前行及列是否足夠顯示函數 */
/* 入口數i是要輸出的圖形總列數,r是圖形的總頁數 */
/****************************************/
void Alldot(unsigned char i,unsigned char r)
{
if((LCMLIMIT-col)<i) /*判斷當頁所剩的列數是否小于i*/
{
col=0; /*如果所剩列數不夠顯示,則換行*/
row=(2+row);
}
if((8-row)<r) /*判斷所剩的頁數是否小于r*/
{
Lcmcls(); /*清屏處理*/
LcmLoadxy(); /*輸入當前字符首地址*/
}
}
/****************************************************************************/
// 顯示圖片函數
/* 入口數*photo為圖片首指針,x為圖片的列數,y為圖片的頁數(最多8頁)*/
/****************************************************************************/
void show_photo(const unsigned char*photo,unsigned char x,unsigned char y)
{
unsigned char bakerx,bakery,a,j;
bakerx = col; /*暫存x,y坐標,備下半個字符使用 */
bakery = row;
LcmLoadxy(); /*輸入當前字符的首地址*/
for(a=0;a<y;a++)
{
for(j=0;j<x;j++)
{
lcmWriteData(*photo); /*取點陣碼,并寫輸出一字節 */
photo++;
}
col = bakerx; /*列對齊 */
row++; /*指向下一行 */
LcmLoadxy(); /*輸入下一行的首地址*/
}
/*整個圖形輸出結束 */
col = bakerx; /*恢復原來的col值*/
row = bakery; /*恢復原來的row值*/
}
/****************************************/
/* 半角字符點陣碼數據輸出 */
/* 入口數Order是指要輸出的半角字序號,比如輸出"空格",那么Order=0 */
/****************************************/
void Putedot(unsigned char Order)
{
Alldot(8,2); /* 調用列、行判斷函數 */
show_photo(&Ezk[Order * 0x10],8,2);
/*整個字符輸出結束 */
col = (col+8); /*列增加8,便于輸入下個字符,row值不變*/
}
/****************************************/
/* 字符串顯示輸出 */
/* 本函數是可變函數,入口數為要顯示的字符串 */
/****************************************/
void myprintf(const char *format,...)
{
va_list ap;//說明變量ap
unsigned char c;
c=*format; //取第一個值。
va_start(ap,format);//ap被初始化為指向format第一個參數
while(c!='%')
{ // 利用指針取數。
Alldot(8,2);
Putedot(c-0x20); /*ascii碼表從0x20開始*/
++format;
c=*format;
}
va_end(ap);//清除變量x
}
/********************************/
/*液晶屏初始化函數 */
/********************************/
void lcmInit ()
{
//先初始化端口
//PORT C GROUP
//BUSWIDTH=16 */
/* PC15 14 13 12 11 10 9 8 */
/* o o RXD1 TXD1 o o o o */
/* NC NC Uart1 Uart1 NC NC CS1 NC */
/* 01 01 11 11 01 01 01 01 */
/* PC7 6 5 4 3 2 1 0 */
/* o o o o o o o o */
/* VD4 VD5 VD6 VD7 LED LED LED LED */
/* 01 01 01 01 01 01 01 01 */
rPDATC = 0x0000; //All IO is low
rPCONC = 0x5f555555;
rPUPC = 0x3000; //PULL UP RESISTOR should be enabled to I/O
//PORT D GROUP
/* PORT D GROUP(I/O OR LCD) */
/* BIT7 6 5 4 3 2 1 0 */
/* A0 VM RD ER VD3 VD2 VD1 VD0 */
/* 01 01 01 01 01 01 01 01 */
rPDATD= 0x00;
rPCOND= 0x5555;
rPUPD = 0x00;
lcmDelay (100);
lcmWriteCmd(DISVOL); /*LCD偏壓設定 */
lcmWriteCmd(DISADC); /*ADC選擇(順方向) */
lcmWriteCmd(DISCOM); /*公共輸出模式選擇(逆方向) */
lcmWriteCmd(DISVR); /*調整V0電壓電阻比率(折中) */
lcmWriteCmd(DISCURRENT); /*進入電流量設定*/
lcmWriteCmd(DISCURVUL); /*設定電流量*/
lcmWriteCmd(DISfrequency); /*設定晶振振蕩頻率*/
lcmWriteCmd(DISPOWER); /*電源控制設定(全開)*/
lcmWriteCmd(DISNORMAL); /*正顯*/
Lcmcls(); /*清屏 */
col=0; /*回歸到初始值0*/
row=8; /*清第8頁,即第65行的功能點顯示控制頁*/
LcmLoadxy(); /* 寫入頁首地址 */
for(;col<LCMLIMIT;col++)lcmWriteData(0); /* 寫入數據0 */
lcmWriteCmd(DISPFIRST); /*設定顯示起始行*/
lcmWriteCmd(DISPON);/*開顯示*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -