📄 main.c
字号:
/*----------------------------------------------
选用16位单片机: 英飞凌 XC164CS-16F
选用的液晶模块:QH2001,内部采用KS0108B控制器。
接线:
液晶接口 单片机接口
1 CSB P4_P0
2 CSA P4_P1
3 VSS GND
4 VDD +5V
5 VO
6 RS P4_P2
7 RW P4_P3
8 E P4_P4
9 --16 DB0 --DB7 P0L
19 RST P4_P5
申明:此程序是根据网上的程序改的。
-------------------------------------------------*/
#include "MAIN.H"
//控制管脚定义
//P0L数据通道
#define CSB P4_P0 //片选2
#define CSA P4_P1 //片选1
#define RS P4_P2 //指令数据通道 DI
#define RW P4_P3 //读写选择
#define E P4_P4 //使能信号, 在下降沿写入数据 (WR)
#define RST P4_P5 //复位
unsigned char huan[]={//欢[16*16]下半列排
0x04,0x34,0xC4,0x04,0xC4,0x3C,0x20,0x10,
0x0F,0xE8,0x08,0x08,0x28,0x18,0x00,0x00,
0x10,0x08,0x06,0x01,0x82,0x8C,0x40,0x30,
0x0C,0x03,0x0C,0x10,0x60,0xC0,0x40,0x00};
unsigned char ying[]={//迎[16*16]下半列排
0x40,0x42,0x44,0xC8,0x00,0xFC,0x04,0x02,
0x82,0xFC,0x04,0x04,0x04,0xFE,0x04,0x00,
0x00,0x40,0x20,0x1F,0x20,0x47,0x42,0x41,
0x40,0x7F,0x40,0x42,0x44,0x63,0x20,0x00};
unsigned char guang[]={//光[16*16]下半列排
0x40,0x40,0x42,0x44,0x58,0xC0,0x40,0x7F,
0x40,0xC0,0x50,0x48,0x46,0x64,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,
0x00,0x3F,0x40,0x40,0x40,0x40,0x70,0x00};
unsigned char lin[]={//临[16*16]下半列排
0x00,0xFC,0x00,0xFF,0x40,0x20,0x10,0x0C,
0x2B,0x48,0xC8,0x08,0x08,0x8C,0x08,0x00,
0x00,0x1F,0x00,0xFF,0x00,0xFF,0x41,0x41,
0x41,0x7F,0x41,0x41,0x41,0xFF,0x01,0x00};
unsigned char tanhao[]={0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00};
unsigned char jinghao[]={0x40,0xc0,0x78,0x40,0xc0,0x78,0x40,0x00,
0x04,0x3f,0x04,0x04,0x3f,0x04,0x04,0x00};
unsigned char w2[]={0xf8,0x08,0x00,0xf8,0x00,0x08,0xf8,0x00,
0x03,0x3c,0x07,0x00,0x07,0x3c,0x03,0x00};
unsigned char w[]={0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
0x0f,0x30,0x0c,0x03,0x0c,0x30,0x0f,0x00};
unsigned char o2[]={0xe0,0x10,0x08,0x08,0x08,0x10,0xe0,0x00,
0x0f,0x10,0x20,0x20,0x20,0x10,0x0f,0x00};
unsigned char u[]={0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
0x00,0x1f,0x20,0x20,0x20,0x10,0x3f,0x20};
unsigned char r[]={0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x20,0x20,0x3f,0x21,0x20,0x00,0x01,0x00};
unsigned char o[]={0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1f,0x20,0x20,0x20,0x20,0x1f,0x00};
unsigned char e2[]={0x08,0xf8,0x88,0x88,0xe8,0x08,0x10,0x00,
0x20,0x3f,0x20,0x20,0x23,0x20,0x18,0x00};
unsigned char a2[]={0x00,0x00,0xc0,0x38,0xe0,0x00,0x00,0x00,
0x20,0x3c,0x23,0x02,0x02,0x27,0x38,0x20};
unsigned char v[]={0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x00,0x01,0x0e,0x30,0x08,0x06,0x01,0x00};
unsigned char dot[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char a[]={0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x19,0x24,0x22,0x22,0x22,0x3f,0x20};
unsigned char c[]={0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
0x00,0x0e,0x11,0x20,0x20,0x20,0x11,0x00};
unsigned char m[]={0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x20,0x3f,0x20,0x00,0x3f,0x20,0x00,0x3f};
void delayms(int tickms) //延时子程序
{
int i,count;
_nop_();
_nop_();
_nop_();
for(i=tickms;i>0;i--)
{
for(count=0;count<1000;count++)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
}
void CheckState()
{
// unsigned char dat;
RS=0; //
RW=1; // read
P0L=0x00;
do
{
E=1;
E=0;
}
while (P0L&0x80); //
}
/*----------------------------------------------
写显示数据
形参dat:显示数据
-------------------------------------------------*/
void WriteByte(unsigned char dat)
{
CheckState();
RS=1; //
RW=0; // write
// DP0L=0x00ff; //P0L as output
P0L=dat;
E=1;
E=0;
}
/*----------------------------------------------
读显示数据
形参dat:显示数据
-------------------------------------------------*/
unsigned char ReadByte()
{
unsigned char dat;
CheckState();
RS=1;
RW=1;
E=1;
dat=P0L;
E=0;
return(dat);
}
/*-------------------------------------------------
向LCD发送命令
形参command :命令
--------------------------------------------------*/
void SendCommandToLCD(unsigned char command)
{
CheckState();
RS=0;
RW=0;
// DP0L=0xff; //P0L as output
P0L=command;
E=1;
E=0;
}
/*-------------------------------------------------*/
//设定行地址(页)--X 0-7
void SetLine(unsigned char line)
{
line=line & 0x07; // 0<=line<=7
line=line|0xb8; //1011 1xxx
SendCommandToLCD(line);
}
//设定列地址--Y 0-63
void SetColumn(unsigned char column)
{
column=column &0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
SendCommandToLCD(column);
}
//设定显示开始行--XX
void SetStartLine(unsigned char startline) //0--63
{
startline=startline & 0x07; //??0x3f
startline=startline|0xc0; //1100 0000
SendCommandToLCD(startline);
}
//开关显示
void SetOnOff(unsigned char onoff)
{
onoff=0x3e | onoff; //0011 111x
SendCommandToLCD(onoff);
}
/*------------------清除内存---------------*/
void Clr_Scr()
{
unsigned char j,k;
CSA=1;
// delayms(10);
CSB=1;
// delayms(10);
SetLine(0);
// delayms(10);
SetColumn(0);
for(k=0;k<8;k++)
{
SetLine(k); //第K页
for(j=0;j<64;j++)
WriteByte(0x00);
}
}
/*------------------初始化LCD屏--------------------------*/
void init_lcd()
{
RST=0;
// delayms(10);
RST=1;
// delayms(10);
CSA=1;
// delayms(10);
CSB=1;
// delayms(10);
SetOnOff(0x3e); //关显示
// delayms(10);
SetLine(0x00); // 设定页
// delayms(10);
SetStartLine(0x00);
// delayms(10);
SetColumn(0x00);
// delayms(10);
SetOnOff(0x3f); //开显示
// delayms(10);
}
/*----------------------------------------------------------------------
说明:12864液晶横放,汉字按正常方式显示,pag:0~7(从上到下);
row:0~7(从左到右,水平行,一行可显示8个汉字)
功能:指定位置显示汉字16*16
------------------------------------------------------------------------*/
void word_disp(unsigned char pag,unsigned char row, unsigned char *hzk)
{
unsigned char j=0,i=0,k=0;
for(j=0;j<2;j++)
{
if (row < 4)
{
k=row;
CSA = 1; //CSA=1,CSB=0,select leftwindow
CSB = 0;
}
else
{
k = row-4;
CSA = 0; //CSA=0,CSB=1,select rightwindow
CSB = 1;
}
SetLine(pag+j);
SetColumn(k*16);
for(i=0;i<16;i++)
{
WriteByte(hzk[16*j+i]);
}
}
}
/*----------------------------------------------------------------------
说明:12864液晶横放,字符按正常方式显示,pag:0~7(从上到下);
row:0~15(从左到右,水平行,一行可显示16个字符)
功能:指定位置显示字符8*16
------------------------------------------------------------------------*/
void byte_disp(unsigned char pag, unsigned char row, unsigned char *bytek)
{
unsigned char j=0,i=0,k=0;
for(j=0;j<2;j++)
{
if (row < 8)
{
k=row;
CSA = 1;
CSB = 0;
}
else
{
k=row-8;
CSA = 0;
CSB = 1;
}
SetLine(pag+j);
SetColumn(k*8);
for(i=0;i<8;i++)
{
WriteByte(bytek[8*j+i]);
}
}
}
void main_window (void)
{ //分三行显示:欢迎光临 OurAvr www.ouravr.com
word_disp(1,2,huan);
delayms(100);
word_disp(1,3,ying);
delayms(100);
word_disp(1,4,guang);
delayms(100);
word_disp(1,5,lin);
delayms(100);
byte_disp(3,5,o2);
delayms(100);
byte_disp(3,6,u);
delayms(100);
byte_disp(3,7,r);
delayms(100);
byte_disp(3,8,a2);
delayms(100);
byte_disp(3,9,v);
delayms(100);
byte_disp(3,10,r);
delayms(100);
byte_disp(5,1,w);
delayms(100);
byte_disp(5,2,w);
delayms(100);
byte_disp(5,3,w);
delayms(100);
byte_disp(5,4,dot);
delayms(100);
byte_disp(5,5,o);
delayms(100);
byte_disp(5,6,u);
delayms(100);
byte_disp(5,7,r);
delayms(100);
byte_disp(5,8,a);
delayms(100);
byte_disp(5,9,v);
delayms(100);
byte_disp(5,10,r);
delayms(100);
byte_disp(5,11,dot);
delayms(100);
byte_disp(5,12,c);
delayms(100);
byte_disp(5,13,o);
delayms(100);
byte_disp(5,14,m);
delayms(100);
}
//****************************************************************************
// @Function void MAIN_vUnlockProtecReg(void)
//
//----------------------------------------------------------------------------
// @Description This function makes it possible to write one protected
// register. After calling of this function and write on the
// protected register is the security level set to low
// protected mode.
//
//----------------------------------------------------------------------------
void MAIN_vUnlockProtecReg(void)
{
uword ubPASSWORD;
if((SCUSLS & 0x1800) == 0x0800) // if low protected mode
{
ubPASSWORD = SCUSLS & 0x00FF;
ubPASSWORD = ~ubPASSWORD;
SCUSLC = 0x8E00 | ubPASSWORD; // command 4
} // end if low protected mode
if((SCUSLS & 0x1800) == 0x1800) // if write protected mode
{
SCUSLC = 0xAAAA; // command 0
SCUSLC = 0x5554; // command 1
ubPASSWORD = SCUSLS & 0x00FF;
ubPASSWORD = ~ubPASSWORD;
SCUSLC = 0x9600 | ubPASSWORD; // command 2
SCUSLC = 0x0800; // command 3; new PASSWOR is 0x00
ubPASSWORD = SCUSLS & 0x00FF;
ubPASSWORD = ~ubPASSWORD;
SCUSLC = 0x8E00 | ubPASSWORD; // command 4
}
}
void IO_vInit(void)
{
PICON = 0x0000; // load input configuration register
P0H = 0x0000; // load data register
POCON0H = 0x0000; // load output control register
DP0H = 0x0000; // load direction register
P0L = 0x0000; // load data register
POCON0L = 0x0000; // load output control register
DP0L = 0xFFFF; // load direction register
ODP4 = 0x0000; // load open-drain register
P4 = 0x0000; // load data register
ALTSEL0P4 = 0x0000; // load alternate output function select
// register 0
ALTSEL1P4 = 0x0000; // load alternate output function select
// register 1
POCON4 = 0x0000; // load output control register
DP4 = 0xffff; // load direction register
}
void MAIN_vInit(void)
{
MAIN_vUnlockProtecReg(); // unlock write security
PLLCON = 0x7814; // load PLL control register
IO_vInit();
PSW_IEN = 1;
}
//****************************************************************************
// @Function void main(void)
//
//----------------------------------------------------------------------------
void main(void)
{
MAIN_vInit();
init_lcd();
Clr_Scr();
//insert your functional code here...
while (1)
{
main_window();
}
}
/*----------------------------------------------
程序烧写后无显示。检查接线正确。
开电瞬间液晶会亮一下,然后没有什么显示。
初次使用液晶显示芯片,希望能帮忙看一下程序。
我实在不知道错在哪里。
-------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -