STC32G12K128库函数操作(LCM使用+I8080波形分析)

devtools/2024/10/20 8:47:45/

1.前言

最近搞在开一个新项目,核心在于低成本,于是重新看回了咱们的老朋友STC。不看不知道,一看吓一跳,STC出的芯片外设真全,涵盖了基础的各种外设。不过嘛,STC嘛,都熟悉。基本的外设很快上手了,不得不说姚总的芯片手册是真不错,各种情况都列举写在手册里了,硬件也挺简单的。不过有些地方还是美中不足的,比如这个LCM模块,库函数写的非常不完善,基本处于无法使用的情况。没办法,只能大改库了。

2.程序

我们先看一下原本的库函数

sbit LCD_RS = P4^5;      //数据/命令切换
sbit LCD_WR = P4^2;      //写控制
sbit LCD_RD = P4^4;      //读控制
sbit LCD_CS = P3^4;      //片选
sbit LCD_RESET = P4^3;   //复位typedef struct
{u8	LCM_Enable;					//LCM接口使能  	ENABLE,DISABLEu8	LCM_Mode;						//LCM接口模式  	MODE_I8080,MODE_M6800u8	LCM_Bit_Wide;				//LCM数据宽度  	BIT_WIDE_8,BIT_WIDE_16u8	LCM_Setup_Time;			//LCM通信数据建立时间  	0~7u8	LCM_Hold_Time;			//LCM通信数据保持时间  	0~3
} LCM_InitTypeDef;
void LCM_Inilize(LCM_InitTypeDef *LCM)
{LCMIFSTA = 0x00;if(LCM->LCM_Mode == MODE_M6800)		LCMIFCFG |= MODE_M6800;	//LCM接口模式:M6800else LCMIFCFG &= ~MODE_M6800;	//LCM接口模式:I8080if(LCM->LCM_Bit_Wide == BIT_WIDE_16)		LCMIFCFG |= BIT_WIDE_16;	//LCM数据宽度:16位else LCMIFCFG &= ~BIT_WIDE_16;	//LCM数据宽度:8位if(LCM->LCM_Setup_Time <= 7) LCMIFCFG2 = (LCMIFCFG2 & ~0x1c) | (LCM->LCM_Setup_Time << 2);	//LCM通信数据建立时间:0~7if(LCM->LCM_Hold_Time <= 3) LCMIFCFG2 = (LCMIFCFG2 & ~0x03) | LCM->LCM_Hold_Time;	//LCM通信数据建立时间:0~7if(LCM->LCM_Enable == ENABLE)		LCMIFCR |= 0x80;	//使能LCM接口功能else LCMIFCR &= ~0x80;	//禁止LCM接口功能
}

原本的库函数里面只有一个初始化函数,端口,中断都没有写。

首先我们从定义开始讲起

这里的管脚只保留片选和复位两个管脚,剩下的3个管脚均由硬件LCM模块控制。

然后是结构体的定义

我重新加入了控制管脚,数据管脚,中断的定义。这些都是下面重要的参数

然后是具体的设置函数

void init_lcd(void)
{LcdStruct->LCM_Enable=ENABLE;				//启动LCM模块LcdStruct->LCM_Control_Pin=3;				//控制管脚为第4种组合LcdStruct->LCM_Data_Pin=3;					//数据管脚为第4种组合LcdStruct->LCM_Isr_Enable=ENABLE;		//使能LCM中断LcdStruct->LCM_Mode=MODE_I8080;			//I8080模式LcdStruct->LCM_Bit_Wide=BIT_WIDE_8;	//8位数据宽带LcdStruct->LCM_Setup_Time=1;				//建立时间为1个周期LcdStruct->LCM_Hold_Time=3;					//保持时间为3个周期LCM_Inilize(LcdStruct);							//将设置投入寄存器
}

首先是初始化,按照需要进行配置就可以了。这里放出一个参考程序我使用I8080模式,8位数据模式。

然后是发送数据和发送参数

void LCD_WR_CMD(unsigned int Cmd)	 
{if(LcdStruct->LCM_Bit_Wide==BIT_WIDE_8){LCMIFDATL = Cmd;}else{LCMIFDATL = Cmd&0xff;LCMIFDATH = Cmd>>8;}LCD_CS=0;LCMIFCR = 0x84;		//启动总线 发送指令while(!LCD_CS);
} void LCD_WR_DATA(unsigned int Data)
{if(LcdStruct->LCM_Bit_Wide==BIT_WIDE_8){LCMIFDATL = Data;}else{LCMIFDATL = Data&0xff;LCMIFDATH = Data>>8;}LCD_CS=0;LCMIFCR = 0x85;		//启动总线 发送数据while(!LCD_CS);
}

这个没什么很大的出入

然后是中断服务函数

void LCM_ISR_Handler (void) interrupt LCM_VECTOR
{// TODO: 在此处添加用户代码if(LCMIFSTA & 0x01){LCD_CS=1;LCMIFSTA = 0x00;LcmFlag = 0;}
}

注意一下CS管脚要在所有数据发送完毕后拉高

3.I8080波形

手册上给出了两张图

只能说比较抽象,我们来具体看一下实际的波形

我们单独分析一个数据来看

首先是控制管脚,左侧是发送命令,右侧是发送数据,唯一的区别在于RS,数据是高,命令是低,也与实际手册上一致。

然后是数据,因为是并行总线,所以单次发送的数据是8位。

4.结语

STC系列的硬件做的还是不错的,但是软件和现在发展迅猛的ARM系列还是有差距的,尤其是魔改过后的STC,存储,中断用起来都非常难受。特别是Keil,估计Keil官方也没有想到8051架构能魔改成这样,前面调用函数的时候原本外部参数放在idata里,结果都找不到,程序运行一半直接乱飞,后来通过反汇编查看地址才发现问题,最后把参数放到xdata里才解决,更难受的是编译器都找不到问题,直接下载更是找不到,要不是有stc-usb仿真就直接GG了,大家记得也注意这个问题。那么OK,估计STC的这个模块用的人也不是特别多,就不多说了,我们下一篇文章见。


http://www.ppmy.cn/devtools/127239.html

相关文章

lesson01 Backtrader是什么

[Backtrader]专题连载 Backtrader是什么&#xff1f; Backtrader 是 2015 年开源的 Python 量化回测框架&#xff08;支持实盘交易&#xff09;。专注于为量化交易策略提供回测和实盘交易功能。它允许用户集中精力编写可复用的交易策略、指标和分析工具&#xff0c;而无需花费…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

计算机组成原理之高速缓冲存储器

定义&#xff1a; 高速缓冲存储器是一种存取速度比一般随机存取记忆体&#xff08;RAM&#xff09;更快的RAM&#xff0c;通常使用SRAM技术。 位置&#xff1a; 它是存在于主存与CPU之间的一级存储器&#xff0c;由静态存储芯片&#xff08;SRAM&#xff09;组成。 特点&am…

Android 取消充电动画logo,直接显示图片即可

删除充电动画逻辑&#xff0c;直接设置显示图片logo&#xff1a;hvga_low_battery.bmp vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp void show_battery_capacity(unsigned int capacity) { anim_show_logo(LOW_BATTERY_INDEX);//*/rm animat…

C++卓越:全面提升专业技能的深度课程(第一章第一课C++17与C++20概述)

第一章&#xff1a;C的现代化 第一课&#xff1a;C17与C20概述 引言 C是一种强大的编程语言&#xff0c;具有丰富的特性和广泛的应用。随着C17和C20的发布&#xff0c;这些版本引入了大量新特性&#xff0c;进一步增强了语言的灵活性和效率。本课将全面探讨C17与C20的新特性…

Atlas800昇腾服务器(型号:3000)—CANN安装(二)

服务器配置如下&#xff1a; CPU/NPU&#xff1a;鲲鹏 CPU&#xff08;ARM64&#xff09;A300I pro推理卡 系统&#xff1a;Kylin V10 SP1【下载链接】【安装链接】 驱动与固件版本版本&#xff1a; Ascend-hdk-310p-npu-driver_23.0.1_linux-aarch64.run【下载链接】 Ascend-…

基于SpringBoot+Vue+uniapp微信小程序的澡堂预订的微信小程序的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…