博士
最后登录1970-1-1
在线时间 小时
注册时间2016-10-31
|
发表于 2019-10-16 10:56:24
|
显示全部楼层
STM8_两线驱动12864节省GPIO实验 不知道有没有帮助 有点迟
******************************************************************/
#include "iostm8s208mb.h"//主控芯片的头文件
/************************常用数据类型定义*************************/
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
/***********************端口/引脚定义区域************************/
#define LCDCS PF_ODR_ODR0//LCD12864片选端口(原RS)
#define LCDDIO PF_ODR_ODR3//LCD12864串行数据输入/输出(原RW)
#define LCDCLK PF_ODR_ODR4//LCD12864串行时钟(原EN)
#define LCDPSB PF_ODR_ODR5//LCD12864串/并行数据选择端口
/*************************函数声明区域***************************/
void delay(u16 Count);//延时函数声明
void LCD12864_init(void);//12864初始化函数声明
void LCD12864_SBYTE(u8 byte);//逐位写入串行数据函数声明
void LCD12864_Write(u8 cmdordata,u8 writetype);//写入液晶模组命令或数据函数声明
void Display12864(u8 row,u8 col,u8 *string);//显示字符串函数声明
/**************************主函数区域****************************/
int main(void)
{
PF_DDR_DDR0=1; //配置PF0为输出模式
PF_CR1_C10=1; //配置PF0为推挽输出模式
PF_CR2_C20=0; //配置PF0低速率输出
PF_DDR_DDR3=1; //配置PF3为输出模式
PF_CR1_C13=1; //配置PF3为推挽输出模式
PF_CR2_C23=0; //配置PF3低速率输出
PF_DDR_DDR4=1; //配置PF4为输出模式
PF_CR1_C14=1; //配置PF4为推挽输出模式
PF_CR2_C24=0; //配置PF4低速率输出
PF_DDR_DDR5=1; //配置PF5为输出模式
PF_CR1_C15=1; //配置PF5为推挽输出模式
PF_CR2_C25=0; //配置PF5低速率输出
LCD12864_init(); //初始化12864液晶
Display12864(1,0,"STM8S208系统界面");//显示第一行数据
Display12864(2,0,"================");//显示第二行数据
Display12864(3,0,"串行数据控制方式");//显示第三行数据
Display12864(4,0,"ST7920控制器液晶");//显示第四行数据
while(1);
}
/****************************************************************/
//延时函数delay(),有形参Count用于控制延时函数执行次数,无返回值
/****************************************************************/
void delay(u16 Count)
{
u8 i,j;
while (Count--)//Count形参控制延时次数
{
for(i=0;i<50;i++)
for(j=0;j<20;j++);
}
}
/****************************************************************/
//初始化液晶模块函数LCD12864_init(),无形参和返回值
/****************************************************************/
void LCD12864_init(void)
{
LCDPSB=0;//选择串行模式将PSB置“0”或直接接地
LCDCS=1;//片选12864
delay(10);//延时等待稳定
LCD12864_Write(0x30,0);//选择基本指令集
LCD12864_Write(0x0C,0);//开显示,无游标,不反白
LCD12864_Write(0x01,0);//清除显示屏幕,把DDRAM位址计数器调整为00H
}
/****************************************************************/
//逐位写入串行数据函数LCD12864_SBYTE(),有形参byte,无返回值
/****************************************************************/
void LCD12864_SBYTE(u8 byte)
{
u8 i;
for(i=0;i<8;i++)//一个字节由8位组成故而循环8次写入
{
LCDCLK = 0;//拉低时钟线
if((byte<<i)&0x80)//取位操作
LCDDIO=1;//写入数据‘1’
else
LCDDIO=0;//写入数据'0'
LCDCLK = 1;//拉高时钟线
}
}
/****************************************************************/
//命令或数据写入函数LCD12864_Write(),有形参cmdordata和writetype
//cmdordata是欲写入数据,writetype是写入类型,无返回值
/****************************************************************/
void LCD12864_Write(u8 cmdordata,u8 writetype)
{
if(writetype==0)//判断写入类型
LCD12864_SBYTE(0xF8); //“1111 1000”表示写入命令信息
else
LCD12864_SBYTE(0xFA);//“1111 1010”表示写入数据信息
LCD12864_SBYTE(0xF0&cmdordata);//取高四位传送
LCD12864_SBYTE(0xF0&(cmdordata<<4));//取低四位传送
}
/****************************************************************/
//字符串显示函数Display12864(),有形参row,col,*string,row表示行
//col表示列,字符指针string指向字符串数据,无返回值
/****************************************************************/
void Display12864(u8 row,u8 col,u8 *string)
{
switch(row)//行变量判断
{
case 1:row=0x80;break;//第一行DDRAM首地址为0x80
case 2:row=0x90;break;//第二行DDRAM首地址为0x90
case 3:row=0x88;break;//第三行DDRAM首地址为0x88
case 4:row=0x98;break;//第四行DDRAM首地址为0x98
default:break;
}
LCD12864_Write(row+col,0);//写入行列地址
while(*string!='\0')//输出字符串直到结束标志‘|0’
{
LCD12864_Write(*string,1);//写入字符数据
string++;//指针后移
}
}
|
|