/********************************************************************
* 文件名 : 串行12864显示.c
* 描述 : 该程序实现了12864以串行的方式进行通信。
* 创建人 :
* 版本号 :
***********************************************************************/
#include"stm8s105k4.h"
#define uchar unsigned char
#define uint unsigned int
/********************************************************************
* 名称 :
* 功能 : 端口定义
* 输入 : 无
* 输出 : 无
***********************************************************************/
_Bool CS @PB_ODR:2;//片选
_Bool SID @PB_ODR:3;//串行数据
_Bool SCLK @PB_ODR:1;//时钟信号
/********************************************************************
* 名称 :
* 功能 : 数组内容,用液晶显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
uchar table1[]={"珊珊"};
uchar table2[]={"I"};
uchar table3[]={"LOVE"};
uchar table4[]={"YOU"};
/********************************************************************
* 名称 :
* 功能 : 函数声明
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delayus(uint us);//us级延时函数
void delayms(uint ms);//ms级延时函数
void SendByte(uchar Dbyte);//发送字节函数
void Lcd_WriteCmd(uchar Cbyte );//写入命令函数
void Lcd_WriteData(uchar Dbyte );//写入数据函数
void Lcd_Init(void);//液晶初始化函数
void Lcd_Display(void);//液晶显示函数
void GPIO_Init(void);//端口初始化函数
/********************************************************************
* 名称 : main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
GPIO_Init();
Lcd_Init();
Lcd_Display();
while(1);
}
/********************************************************************
* 名称 : GPIO_Init()
* 功能 : 端口初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void GPIO_Init(void)
{
PB_DDR |= 0x0E;
PB_CR1 |= 0x0E;
}
/********************************************************************
* 名称 : delayus()
* 功能 : 16MHZ 延时1.02us
* 输入 : us
* 输出 : 无
***********************************************************************/
void delayus(uint us)
{
while(us--);
}
/********************************************************************
* 名称 : delayms()
* 功能 : 16MHZ 延时1ms
* 输入 : ms
* 输出 : 无
***********************************************************************/
void delayms(uint ms)
{
uint i;
while(ms--)
{
for(i=0;i<2130;i++){}
}
}
/********************************************************************
* 名称 : sendByte()
* 功能 : 按照液晶的串口通信协议,发送数据
* 输入 : Dbyte
* 输出 : 无
***********************************************************************/
void SendByte(uchar Dbyte)
{
uchar i;
CS = 1;
for(i=0;i<8;i++)
{
if((Dbyte<<i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;
}
CS = 0;
}
/********************************************************************
* 名称 : Lcd_WriteCmd()
* 功能 : 按照液晶的串口通信协议,写入命令
* 输入 : Cbyte
* 输出 : 无
***********************************************************************/
void Lcd_WriteCmd(uchar Cbyte )
{
SendByte(0xf8); //11111,RW(0),RS(0),0
SendByte(0xf0&Cbyte); //先送高四位
SendByte(0xf0&Cbyte<<4); //低四位
}
/********************************************************************
* 名称 : Lcd_WriteData()
* 功能 : 按照液晶的串口通信协议,写入数据
* 输入 : Dbyte
* 输出 : 无
***********************************************************************/
void Lcd_WriteData(uchar Dbyte )
{
SendByte(0xfa); //11111,RW(0),RS(1),0
SendByte(0xf0&Dbyte); //先送高四位
SendByte(0xf0&Dbyte<<4); //低四位
}
/********************************************************************
* 名称 : Lcd_Init()
* 功能 : 液晶显示初始化
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Lcd_Init(void)
{
delayms(1);
Lcd_WriteCmd(0x30); //选择基本指令集,8bit数据流
delayms(1);
Lcd_WriteCmd(0x0c); //开显示(无游标、不反白)
delayms(1);
Lcd_WriteCmd(0x01); //清除显示,设定地址指针开始地址为00H
delayms(1);
}
/********************************************************************
* 名称 : Lcd_Display()
* 功能 : 液晶显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Lcd_Display(void)
{
uchar num;
Lcd_WriteCmd(0x80);
delayms(1);
num = 0;
while(table1[num] != '\0')
{
Lcd_WriteData(table1[num]);
num++;
delayms(1);
}
Lcd_WriteCmd(0x90);
delayms(1);
num=0;
while(table2[num] != '\0')
{
Lcd_WriteData(table2[num]);
num++;
delayms(1);
}
Lcd_WriteCmd(0x88);
delayms(1);
num=0;
while(table3[num] != '\0')
{
Lcd_WriteData(table3[num]);
num++;
delayms(1);
}
Lcd_WriteCmd(0x98);
delayms(1);
num=0;
while(table4[num] != '\0')
{
Lcd_WriteData(table4[num]);
num++;
delayms(1);
}
}