2,425
社区成员
发帖
与我相关
我的任务
分享
/*****LCD功能初始化指令*****/
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD 0x06 //设定游标移到方向及图像整体移动方向(默认游标右移,图像整体不动)
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF 0x08 //显示关
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80
#define EXPEND_MODE 0x34 //工作模式:8位扩充指令集
#define SET_reverse 0x04 //反白显示第一行(扩充指令集)
/*****汉字位置表*****/
const unsigned char addr_tab[]={
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,//第一行汉字位置
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,//第二行汉字位置
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,//第三行汉字位置
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,//第四行汉字位置
};
//====LOGO-BMP数据,保存在FLASH===------
const unsigned char bmp1[];
/*****(n*1ms)延时子程序*****/
void Delayms(unsigned int time) //16MHz内部时钟精确测试
{
unsigned int i;
while(time--)
{
i=1768;
for(;i--;)NOP();
}
}
//串行发送一字节数据基础驱动
void SPI_INIT(void)
{
SPI_CR1=0x24;
//SPI_CR1=0x2C;
SPI_CR2=0x83;
SPI_Cmd(ENABLE);
}
void SendByte(unsigned char dat) //采用STM8 的硬件SPI端口
{
SPI_BiDirectionalLineConfig(SPI_DIRECTION_TX);
SPI_SendData(dat);
while(SPI_SR_BSY);
}
/*****写指令*****/
void LCD_WriteCmd(unsigned char Cbyte)
{
CS = 1;
//CheckBusy();
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte); //高四位
SendByte(0xf0&Cbyte<<4); //低四位(先执行<<)
//CS = 0;
}
/*****写数据*****/
void LCD_WriteData(unsigned char Dbyte)
{
CS = 1;
//CheckBusy();
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte); //高四位
SendByte(0xf0&Dbyte<<4); //低四位(先执行<<)
//CS = 0;
}
/*****初始化LCD*****/
void LCD_Init(void)
{
Delayms(50); //LCD忙读取好像采不到,其实采用延时更简单
LCD_WriteCmd(0x30); //选择基本指令集
Delayms(1);
LCD_WriteCmd(0x30); //选择8bit数据流
Delayms(1);
LCD_WriteCmd(0x0c); //开显示(无游标、不反白)
Delayms(1);
LCD_WriteCmd(0x01); //清除显示,并且设定地址指针为00H
Delayms(20);
}
/*****显示汉字*****/
void TXT_Disp(unsigned char x,unsigned char y,unsigned char *TXT)
{
LCD_WriteCmd(addr_tab[8*x+y]); //写地址
while(*TXT>0)
{
LCD_WriteData(*TXT); //写数据
TXT++;
}
}