|
//#include "hal.h"
#include "hal_types.h"
#include "LCD128_64.h"
#include "Font.h"
#ifdef LCD_SUPPORTED
/****************************************************
* B) Command Table per device *
****************************************************/
#define DisplayOff 0xAE //关闭lcd lcd display off
#define DisplayOn 0xAF //打开lcd lcd display on
#define DisplayStart 0x40 //设置显示开始列位置 set the display RAM display start line address
#define PageAddr 0xB0 //设置显示开始页位置 set the display RAM page address
#define ColAddrHi 0x10 //设置显示位置列高地址 set the most significant 4 bits of the display RAM column address
#define ColAddrLo 0x00 //设置显示位置列低地址 set the least significant 4 bits of the display RAM column address
#define SegRemapOff 0xA0 // ADC select normal 正常显示 set the display RAM address SEG output correspondence
#define SegRemapOn 0xA1 // ADC select reverse 反黑显示
#define NormalDisp 0xA6 //lcd 正常显示 set the lcd display normal
#define ReverseDisp 0xA7 //lcd 反向显示 set the lcd display reverse
#define ExitEntireD 0xA4 //设置整个屏幕显示 正常显示 display all points :normal display
#define EntEntireD 0xA5 //全部显示 display all points :all points on
#define EnterRMW 0xE0 //进入Read/Modify/Write模式,列地址增量 column address increment at write +1,at read 0;
#define ExitRMW 0xEE //退出RMW clear read/modify/write
#define SWRest 0xE2 //内部复位 internal reset
#define ComRemapOff 0xC0 //设置COM输出扫描方向,垂直扫描 select COM output scan direction:0 normal direction
#define ComRemapOn 0xC8 //水平扫描 1 reverse direction
#define PwrCtrlReg 0x28 //选择内部电源模式 select internal power supply operating mode
#define OPampBuffer 0x01 //
#define IntReg 0x02 //
#define IntVolBstr 0x04 //内部电压
#define IntRegRatio 0x20 //选择内部电阻率模式(Rb/Ra)select internal resistor ratio(Ra/Rb)mode
#define ContCtrlReg 0x81 // 内部对比度控制器 set the v0 output voltage electronic volume register
#define CmdMuxRatio 0x48 // 设置集多重比率
#define CmdBiasRatio 0x50 // 设置偏压比
#define DispOffset 0x44 // 设置显示偏移
#define IconModeOn 0xA3 //设置液晶驱动电压偏差率 sets the lcd drive voltage bias ratio 1/9 bias
#define IconModeOff 0xA2 //1/7 bias(st756p)
#define NlineInver 0x4C //
#define DCDCconver 0x64 //dc-dc 转换
#define PowersavStandby 0xA8 // 待机模式 standby mode
#define PowersavSleep 0xA9 //休眠模式 sleep mode
#define PowersavOff 0xE1 //省电关闭 power save off
#define InterOsc 0xAB // 内部振荡器
#define Device SSD1821 / /*设备演示装置 device under demo */
#define ColNo 132 / /* lcd玻璃板的列/柱数目 number of Column/Seg on LCD glass*/
#define RowNo 64 //* Row/Com/Mux的数目 number of Row/Com/Mux */
#define PS 1 / /*固定并行模式 fixed to Parallel mode */
#define PageNo 10 / /*总共没有内存页 Total no of RAM pages */
#define IconPage 10 / /*图标页码 Icon Page number */
#define All0 6 / /* 3 for all 0, 4 for all 1 */
#define All1 4
#define iIntRegValue 1 / /*内部稳压电阻比值 Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValue 16 / /* 设定缺省对比度 Contrast Control Register Value */
#define iIntRegValuea 20 / /* 内部稳压电阻比值 Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValuea 16 / /* Contrast Control Register Value */
#define iIntRegValueb 1 / /*内部稳压电阻比值 Internal Regulator Resistor Ratio Value */
#define iContCtrlRegValueb 16 / /* Contrast Control Register Value */
#define MSGNo 16
#define MSGLength 22
#define SSLNameNo 4
#define DevicePg 0 //内存页的显示设备名称 RAM page for showing device name
#define FeaturePg 1 //内存页显示功能 RAM page for showing feature
#define GRAPHICNo 13
#define xlogo 38
#define ylogo 5
#define xsolomon 91
#define ysolomon 2
#define xsystech 81
#define ysystech 2
#define xlimited 70
#define ylimited 2
#define xcc 16
#define ycc 2
#define xpageq 128
#define ypageq 4
#define horizonal 0
#define d_time 60 //延时
////////////////////////////////////////////////////////////////////////////////////////////
void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn);
INT8U ContrastValue =90;
void WriteLCD(INT8U fs, INT8U da);
void Write595(INT8U dat);
void delay_us(INT16U s);
void delay1(INT8U jj);
void contrastctrl(INT8U start, INT8U stop);
void HalLcdInit(void);
void PrintCh8(INT16U y,INT16U x, INT8U ch,INT16U yn);
void delay1(INT8U jj) //单字节延时
{
INT8U i;
for(i=0; i<jj; i++);
}
void delay_us(INT16U s) //双字节延时
{
INT16U i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
//******************************************************************************
//???:void Write595(INT8U dat)
//?功能:写595数据?
//??:?
//????:595???,????8?
//******************************************************************************
void Write595(INT8U dat)
{
INT8U ii;
for(ii = 0 ; ii < 8; ii++)
{
if(dat & 0x80) LCD_595_DAT = 1; //取数据,最高位相与
else LCD_595_DAT = 0;
dat <<= 1; //左移一位
LCD_595_CK = 1; //一个时钟变化送一个数据
LCD_595_CK = 0;
}
LCD_595_LD = 1;
LCD_595_LD = 0;
}
//*****************************************************************************
//*****************************************************************************
//???:void delay(unsigned int n)
//????:??????
//*****************************************************************************
void WriteLCD(INT8U fs, INT8U da)
{
delay1(0);
LCD_CS1 = 0; //片使能
LCD_RW = 0; //写模式
//delay1(0);
if(fs){
LCD_RS = 1; //数据寄存器
}
else{
LCD_RS = 0; //指令寄存器
}
// delay1(0);
Write595(da);
LCD_E = 1; // = 1;使能信号
delay1(0);
LCD_E = 0; // = 0;
//delay1(0);
LCD_CS1 = 1; //片禁止
}
/*
INT8U ReadLCD(INT8U fs) //读取lcd数据
{
INT8U temp = 0;
LCD_CS1 = 0;
NOP;
NOP;
NOP;
NOP;
do{
LCD_RW = 1;
LCD_RS = 0;
LCD_E = 1;
NOP;
NOP;
temp = P1 & 0x80;
LCD_E = 0;
}while(temp != 0);
if(fs){
LCD_RS = 1;
}
else{
LCD_RS = 0;
}
LCD_E = 1;
NOP;
NOP;
NOP;
NOP;
temp = P1;
LCD_E = 0;
LCD_CS1 = 1;
return(temp);
}
*/
void SetRamAddr(INT8U x ,INT8U y) //lcd位置选择
{
INT8U temp;
temp = 0x0f & x;
WriteLCD(COMMAND , PageAddr|temp); //设置显示位置一行
temp = 0x0f & (y >> 4);
WriteLCD(COMMAND , ColAddrHi|temp);//高位set higher column address
temp = 0x0f & y;
WriteLCD(COMMAND , ColAddrLo|temp);//低位set lower column address
}
/*******************************************************************************
//???:void SetContrast(INT8U Gain, INT8U Step)
//??:lcd对比度设定
//??:Page-页,Col-列
//??:无
********************************************************************************/
void SetContrast(INT8U Gain, INT8U Step)
{
WriteLCD(COMMAND , IntRegRatio | (0x0f & Gain)); //设定内部电阻
WriteLCD(COMMAND , ContCtrlReg); //设定内部对比度控制器
WriteLCD(COMMAND , 0x3f & Step);
}
/*******************************************************************************
//???:void InitDisplay(void)
//??:lcd初始化
//??:?
//??:?
********************************************************************************/
void InitDisplay(void)
{
WriteLCD(COMMAND , DisplayOff); //关闭lcd
WriteLCD(COMMAND , SegRemapOn); //ks0713/ssd1815
WriteLCD(COMMAND , ComRemapOn); //ssd1815
SetContrast(iIntRegValue, iContCtrlRegValue); //设定缺省对比度
WriteLCD(COMMAND , PwrCtrlReg | IntVolBstr | IntReg | OPampBuffer); //turn on booster, regulator & divider
WriteLCD(COMMAND , DisplayOn); //开启lcd
}
/*******************************************************************************
//???:void contrastctrl(INT8U start,stop)
//??:lcd?????
//??:?
//??:?
********************************************************************************/
void contrastctrl(INT8U start, INT8U stop)
{
INT8U i;
if (start < stop)
{
for (i=start; i<stop; i+=1)
{
SetContrast(iIntRegValue, i); //slowly turn on display
delay_us(80);
}
}
else
{
for (i=start; i>stop; i-=1)
{
SetContrast(iIntRegValue, i); //slowly turn off display
delay_us(120);
}
}
}
void ClearScreen(void) //清屏
{
INT8U x,y;
for(x = 0;x < 8 ;x++){
SetRamAddr(x , 0);
for(y = 0 ; y < 128 ; y++){
WriteLCD(DATA , 0x00);
}
}
}
void HalLcdInit(void)
{
P1DIR |= 0xFC;
P2DIR |= 0x01;
P0DIR |= 0x02;
P1_2 = 0;
delay_us(100);
WriteLCD(COMMAND , 0xE2);//内部复位
delay_us(100);
WriteLCD(COMMAND , 0xA3);//设置液晶驱动电压偏差率 sets the lcd drive voltage bias ratio 1/7bias
delay_us(100);
WriteLCD(COMMAND , 0xA0);//ADC select normal 正常 set the display RAM address SEG output correspondence
delay_us(100);
WriteLCD(COMMAND , 0xC8);//输出扫描方向 reverse反方向
delay_us(100);
WriteLCD(COMMAND , 0x24);//
delay_us(100);
WriteLCD(COMMAND , 0x81);// 电量模式设置 electronic volume mode set , set the v0 output voltage electronic volume register
delay_us(100);
WriteLCD(COMMAND , 0x14);//高地址显示位置
delay_us(100);
WriteLCD(COMMAND , 0x2F);//增压电路booster circuit on,电压调节器电路voltage regulator circuit on,电压跟随器电路voltage follower cicuit on.
delay_us(100);
WriteLCD(COMMAND , 0x40);//显示行位置
delay_us(100);
WriteLCD(COMMAND , 0xB0);//显示页位置
delay_us(100);
WriteLCD(COMMAND , 0x10);//显示高4位列地址
delay_us(100);
WriteLCD(COMMAND , 0x00);//显示低4位列地址
delay_us(100);
WriteLCD(COMMAND , 0xAF);//显示开
WriteLCD(COMMAND , 0x81);
WriteLCD(COMMAND , 0x1b);
delay_us(100);
SetContrast(iIntRegValuea,ContrastValue);
ClearScreen();
}
/*******************************************************************************
//???:void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)
//??:??显示6*8字符串
//??:xx ,yy 坐标,ch1待显示字符串,yn反显
//??:?
*******************************************************************************
void Print6(INT8U xx, INT8U yy, INT8U ch1[], INT8U yn)
{
INT8U ii = 0;
INT8U bb = 0;
unsigned int index = 0 ;
while(ch1[bb] != '/0')
{
index = (unsigned int)(ch1[bb] - 0x20);
index = (unsigned int)index*6;
for(ii=0;ii<6;ii++)
{
SetRamAddr(xx , yy);
if(yn == 0)
{
WriteLCD(DATA, ~FontSystem6x8[index]);
}
else
{
WriteLCD(DATA, FontSystem6x8[index]);
}
index += 1;
yy += 1;
}
bb += 1;
}
}
*/
//*******************************************************************************
//???:void Printn8(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
//??:显示8*8一个无符号数据
//??:xx , yy屏幕当中的位置,no待显数据 yn=0正常显示 yn=1反黑显示 le有效位
//??:?
//*******************************************************************************
void Printn8(INT8U xx ,INT8U yy , INT32U no,INT8U yn,INT8U le)
{
INT8U ch2[6];
INT8U ii;
for(ii = 1 ; ii <= le ;){
ch2[le - ii] = no % 10 + 0x30;
no /= 10;
ii += 1;
}
ch2[le] = '/0';
Print8(xx ,yy ,ch2 ,yn);
}
/*******************************************************************************
//???:void Print8(INT16U y,INT16U x, INT8U ch,INT16U yn)
//??:显示8*8字符
//??:xx ,yy 坐标,ch待显示字符,yn是否反黑
//??:?
*******************************************************************************
void PrintCh8(INT16U y,INT16U x, INT8U ch,INT16U yn)
{
INT8U wm;
INT16U adder;
adder = (ch - 0x20) * 16;
for(wm = 0;wm < 8;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, ~Font8X8[adder]);//调用字符库
}
else
{
WriteLCD(DATA, Font8X8[adder]);
}
adder += 1;
x += 1;
}
y += 1;
x -= 8;
for(wm = 0;wm < 8;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, ~Font8X8[adder]);
}
else
{
WriteLCD(DATA, Font8X8[adder]);
}
adder += 1;
x += 1;
}
}
*/
/*******************************************************************************
//???:void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
//??:显示8*8字符串
//??:xx ,yy 坐标,ch1待显示的字符串,yn是否反黑
//??:?
********************************************************************************/
void Print8(INT16U y,INT16U x, INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
while(ch[ii] != '/0')
{
adder = (ch[ii] - 0x20) * 16;//字符的ASCII码
for(wm = 0;wm < 8;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, ~Font8X8[adder]);
}
else
{
WriteLCD(DATA, Font8X8[adder]);
}
adder += 1;
x += 1;
}
y += 1;
x -= 8;
for(wm = 0;wm < 8;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, ~Font8X8[adder]);
}
else
{
WriteLCD(DATA, Font8X8[adder]);
}
adder += 1;
x += 1;
}
ii += 1;
y -= 1;
}
}
/*******************************************************************************
//???:void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
//??:显示汉字
//??:x ,y ??,ch[]待显示的汉字,yn是否反黑
//??:?
********************************************************************************
void Print16(INT16U y,INT16U x,INT8U ch[],INT16U yn)
{
INT8U wm ,ii = 0;
INT16U adder;
wm = 0;
adder = 1;
while(FontNew8X16_Index[wm] > 128)
{
if(FontNew8X16_Index[wm] == ch[ii])
{
if(FontNew8X16_Index[wm + 1] == ch[ii + 1])
{
adder = wm * 14;
break;
}
}
wm += 2; //找到汉字在索引中的位置
}
SetRamAddr(y , x);
if(adder != 1) //找到汉字,显示出来
{
for(wm = 0;wm < 14;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, ~FontNew16X16[adder]);
}
else
{
WriteLCD(DATA, FontNew16X16[adder]);
}
adder += 1;
x += 1;
}
for(wm = 0;wm < 2;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, 0xff);
}
else
{
WriteLCD(DATA, 0x00);
}
x += 1;
}
y += 1;
x -=16;
for(wm = 0;wm < 14;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, ~FontNew16X16[adder]);
}
else
{
WriteLCD(DATA, FontNew16X16[adder]);
}
adder += 1;
x += 1;
}
for(wm = 0;wm < 2;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, 0xff);
}
else
{
WriteLCD(DATA, 0x00);
}
x += 1;
}
}
else //找不到显示空格
{
ii += 1;
for(wm = 0;wm < 16;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, 0xff);
}
else
{
WriteLCD(DATA, 0x00);
}
x += 1;
}
y += 1;
x -= 16;
for(wm = 0;wm < 16;wm++)
{
SetRamAddr(y , x);
if(yn == 0)
{
WriteLCD(DATA, 0xff);
}
else
{
WriteLCD(DATA, 0x00);
}
x += 1;
}
}
}*/
/*******************************************************************************
//???:void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
//??:实现汉字及字母混合显示
//??:x ,y 坐标,ch[]带显示的汉字或字母,yn是否反黑
//??:?
*******************************************************************************
void Print(INT8U y, INT8U x, INT8U ch[], INT16U yn)
{
INT8U ch2[3];
INT8U ii;
ii = 0;
while(ch[ii] != '/0')
{
if(ch[ii] > 128)
{
ch2[0] = ch[ii];
ch2[1] = ch[ii + 1];
ch2[2] = '/0'; //汉字为两个字节
//Print16(y , x , ch2 , yn); //显示汉字
x += 16;
ii += 2;
}
else
{
ch2[0] = ch[ii];
ch2[1] = '/0'; //字母占一个字节
Print8(y , x , ch2 , yn); //显示字母
x += 8;
ii += 1;
}
}
}
*/
#endif
版权声明:本文为博主原创文章,未经博主允许不得转载。 |
|