📄 pcf8833.c
字号:
/*
\\\|///
\\ - - //
( @ @ )
+---------------------oOOo-(_)-oOOo-------------------------+
| |
| CPU.c |
| by Xiaoran Liu |
| 2005.3.16 |
| |
| ZERO research group |
| www.the0.net |
| |
| Oooo |
+----------------------oooO--( )--------------------------+
( ) ) /
\ ( (_/
\_)
*/
// 引入相关芯片的头文件
#include <LPC2103.h>
#include "PCF8833.h"
/*----------------------------------------------------------*\
| Backlight Initialize |
\*----------------------------------------------------------*/
void BacklightOn(void) {
//PINSEL0=0x00000000;
PINSEL1 |= 0x00000200; //设置MAT1.3--P0.20
T1TCR=0x03; //在设置之前,先将定时器复位
T1IR=0x01; //清除中断标志位
T1PR=0x00; //设置预分频器
T1PWMCON=0x08; //使能相应PWM模式位MAT1.3
T1MCR=0x02; //MR0匹配时,定时器复位
T1MR0=50; //设置匹配寄存器
T1MR3=49;
T1TCR=0x01; //重新启动定时器
}
/*----------------------------------------------------------*\
| PCF8833 Initialize |
\*----------------------------------------------------------*/
void PCF8833SpiInit(void) {
//PCONP |= 0x00000100;
PINSEL0 |= 0x00001100; // 设置SPI管脚连接
S0SPCCR = 0x08; // 设置SPI时钟分频
S0SPCR = 0x934; // 设置SPI接口模式,MSTR=1,CPOL=1,CPHA=1,LSBF=0
}
/*----------------------------------------------------------*\
| PCF8833 Write Command |
\*----------------------------------------------------------*/
void S1D15G00WriteCommand(INT8U Data) {
INT16U temp=Data;
IOCLR=LCD_CS;
temp&=0xFF; // bit8 = 0 : command
S0SPSR=0;
S0SPDR = temp;
while( 0==(S0SPSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
IOSET=LCD_CS;
}
/*----------------------------------------------------------*\
| PCF8833 Write Data |
\*----------------------------------------------------------*/
void S1D15G00WriteData(INT8U Data) {
INT16U temp=Data;
IOCLR=LCD_CS;
temp|=0x100; // bit8 = 1 : Data
S0SPSR=0;
S0SPDR = temp;
while( 0==(S0SPSR&0x80) ); // 等待SPIF置位,即等待数据发送完毕
IOSET=LCD_CS;
}
/*----------------------------------------------------------*\
| PCF8833 Set Page Area |
\*----------------------------------------------------------*/
void S1D15G00SetPageArea(char x1, char y1, char x2, char y2) {
S1D15G00WriteCommand(SET_X_ADDR);
S1D15G00WriteData(x1);
S1D15G00WriteData(x2);
S1D15G00WriteCommand(SET_Y_ADDR);
S1D15G00WriteData(y1);
S1D15G00WriteData(y2);
S1D15G00WriteCommand(MEM_WRITE);
}
/*----------------------------------------------------------*\
| PCF8833 Clear LCD |
\*----------------------------------------------------------*/
void LCD_Clear_Screen(void) {
unsigned int i;
S1D15G00SetPageArea(0, 0, GLCD_X_END, GLCD_Y_END);
// S1D15G00WriteCommand(RAMWR);
for(i=0; i<(GLCD_PIXELX*GLCD_PIXELY);i++)//(GLCD_PIXELX*GLCD_PIXELY)
{
S1D15G00WriteData(0xFF);
S1D15G00WriteData(0xFF);
}
}
/*----------------------------------------------------------*\
| Delay |
\*----------------------------------------------------------*/
void Delay(INT32U dly) {
INT32U i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/*----------------------------------------------------------*\
| PCF8833 Initial |
\*----------------------------------------------------------*/
void PCF8833Init(void) {
BacklightOn();
PINSEL0 &= 0xFFFF003F; // 设置SPI管脚连接
IODIR |= LCD_DATA|LCD_CS|LCD_CLK|LCD_RST;
IOSET=LCD_CS;
Delay(1);
IOCLR=LCD_RST;
Delay(6);
IOSET=LCD_RST;
Delay(6);
IOSET=LCD_DATA;
IOSET=LCD_CLK;
Delay(6);
PCF8833SpiInit();
S1D15G00WriteCommand(SOFT_RESET); //Temperature gradient set
S1D15G00WriteCommand(BOOSTER_ON); //Internal oscillation on
S1D15G00WriteCommand(SLEEP_OUT); //Sleep out
S1D15G00WriteCommand(COLOR_INTERFACE); //Partial display out
S1D15G00WriteData(COLOR_16_BIT);
S1D15G00WriteCommand(COLOR_SET); //256-color position set
S1D15G00WriteData(0x00);
S1D15G00WriteData(0x02);
S1D15G00WriteData(0x04);
S1D15G00WriteData(0x06);
S1D15G00WriteData(0x09);
S1D15G00WriteData(0x0B);
S1D15G00WriteData(0x0D);
S1D15G00WriteData(0x0F);
S1D15G00WriteData(0x00);
S1D15G00WriteData(0x02);
S1D15G00WriteData(0x04);
S1D15G00WriteData(0x06);
S1D15G00WriteData(0x09);
S1D15G00WriteData(0x0B);
S1D15G00WriteData(0x0D);
S1D15G00WriteData(0x0F);
S1D15G00WriteData(0x00);
S1D15G00WriteData(0x04);
S1D15G00WriteData(0x0B);
S1D15G00WriteData(0x0F);
S1D15G00WriteCommand(MEM_CONTROL); //Display control
S1D15G00WriteData((0 << MEM_MX) | (1 << MEM_MY) | (1 << MEM_RGB) | (0 << MEM_VW) | (0 << MEM_LAO));
Delay(60);
S1D15G00WriteCommand(DISPLAY_ON); //Display control
}
/*
#include "GB1616.h" //16*16汉字字模
void PutGB1616(INT8U x, INT8U y, unsigned char c[2], INT16U f,INT16U b){
unsigned int i,j,k;
INT8U fRed,fGreenBlue,bRed,bGreenBlue;
fRed = (f>>8) & 0xFF; fGreenBlue = f & 0xFF;
bRed = (b>>8) & 0xFF; bGreenBlue = b & 0xFF;
S1D15G00SetPageArea(x, y, x+16-1, y+16-1);
for (k=0;k<49;k++) {
if ((codeGB_16[k].Index[0]==c[0])&&(codeGB_16[k].Index[1]==c[1])){
for(i=0;i<32;i++) {
INT8U m=codeGB_16[k].Msk[i];
for(j=0;j<8;j++) {
if((m&0x80)==0x80) {
S1D15G00WriteData(fRed);
S1D15G00WriteData(fGreenBlue);
}
else {
S1D15G00WriteData(bRed);
S1D15G00WriteData(bGreenBlue);
}
m<<=1;
}
}
}
}
}
*/
#include "8X16.h"
void PutChar(INT8U x, INT8U y, char c, INT16U f, INT16U b) {
unsigned int i,j;
INT8U fRed,fGreenBlue,bRed,bGreenBlue;
fRed = (f>>8) & 0xFF; fGreenBlue = f & 0xFF;
bRed = (b>>8) & 0xFF; bGreenBlue = b & 0xFF;
S1D15G00SetPageArea(x, y, x+8-1, y+16-1);
for(i=0; i<16;i++) {
INT8U m=font[c*16+i];
for(j=0;j<8;j++) {
if((m&0x80)==0x80) {
S1D15G00WriteData(fRed);
S1D15G00WriteData(fGreenBlue);
}
else {
S1D15G00WriteData(bRed);
S1D15G00WriteData(bGreenBlue);
}
m<<=1;
}
}
}
void PutString(INT8U x, INT8U y, char *s, INT16U f, INT16U b) {
INT8U l=0;
while(*s) {
PutChar(x+l*8,y,*s,f,b);
s++;l++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -