【国产中颖】SH79F9202U单片机驱动LCD段码液晶学习笔记

在这里插入图片描述

1. 引言

因新公司之前液晶数显表产品单片机一直用的是 C51单片机(SH79F9202U9),本人之前没有接触过这款单片机,为了维护老产品不得不重新研究研究这款单片机。

10位ADC + LCD的增强型8051微控制器

SH79F9202是一种高速高效率8051可兼容单片机。在同样振荡频率下,较之传统的8051芯片它有着运行更快速的优越特性。

SH79F9202保留了标准8051芯片的大部分特性。这些特性包括内置256字节RAM,2个UART,外部中断0/2/3和外部中断4(8路输入)。此外,SH79F9202还集成了外部1280字节RAM,以及程序存储的最大32K字节Flash,此外还集成了最大4K类EEPROM,用于在系统掉电后保存数据。

SH79F9202不仅集成了如UART等标准通讯模块,此外还集成了LCD驱动器(内建LCD电压稳定电路、电容型偏压电路和电阻型偏压电路),PCA,PWM,10Bit ADC等模块。

为了达到高可靠性和低功耗,SH79F9202内建看门狗定时器,低电压复位功能及系统时钟监控功能。此外SH79F9202还提供了2种低功耗省电模式。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2. 开发环境搭建

  • 所需硬件
    • SH79F9202U 电路板
    • LCD段码液晶屏
    • SinoLink Plus 仿真器(见1.文档中的《中颖仿真器使用手册》)
  • 所需软件
    • Keil C51编译器 C51V961(见2.中颖开发工具包)
    • keil插件集成包】Sinowealth_KEIL_Setup_V3.8.13.9.1.7(见2.中颖开发工具包)
  • 开发环境安装与配置
    • Keil μVision 安装好后要根据需要,代码里面的寄存器初始化和keil里面的代码选项配置保持一致。
      在这里插入图片描述

在这里插入图片描述

3. SH79F9202U单片机资源介绍

基本IO介绍

在这里插入图片描述

// Note:配置为输出时,对应的IO上拉需关闭以降低功耗
void IO_Init()
{P0PCR = 0x00; //端口上拉电阻控制寄存器P0CR = 0XFF; // 端口控制寄存器  0:输入模式1:输出模式P0 = 0X00;  //端口数据寄存器P0_4 = 1; // P0.4端口输出高电平P1PCR = 0X00;P1CR = 0XFF;P1 = 0X00;P2PCR = 0X00;P2CR = 0XFF;P2 = 0X00;P3PCR = 0X00;P3CR = 0XFE;P3 = 0X00;P4PCR = 0X00;P4CR = 0XFF;P4 = 0X00;P5PCR = 0X04;  // 开启上拉P5CR = 0XFB;  // P5_2 输入模式P5 = 0X00;	 //P5_2 input
}
中断

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

更加详细的中断介绍还是要仔细看芯片手册,这里为了方便查阅放几张截图。

在这里插入图片描述

定时器外设
  • 注意:定时器的相关寄存器配置和Keil软件上的程序选项配置保持一致
#include "timer2.h"// 20ms 
void INT_TIMER2(void) interrupt 5  
{ static unsigned char counter = 0;TF2 = 0; // 清除中断标志++counter;if(counter >= 25) // 500ms{Test_Num++;
//		 P0_4 = !P0_4; // 翻转输出counter = 0;}LCD_Data_OK(Test_Num);// LCD显示内容LCD_Data_Show();
}void Delays(int del)
{while(del--);
}//OSC = 24M
//sysclk OSC / 2 = 12M
void Timer2_Init(void)
{CLKCON = 0x08;        //【打开HFON】内部24MHz RC振荡器Delays(2000);         //至少等待振荡器预热时间       CLKCON |= 0x04;       //【选择FS】24M/8M Hz为OSCSCLKCLKCON |= 0x20;       //【分频器CLKS[0:1]】fSYS = fOSCS/2//12M/12 = 1M = 1us(T=1/f)  定时20ms P0PCR = 0x00; // 输出模式 关闭上拉电阻P0CR |= 0X10; // P0_4 GPIO设置为输出模式 T2CON = 0;							// 停止定时器2T2MOD = 0x00;           //  TCK = 12/12 = 1M    系统时钟的1/12|P1.0时钟输入或IO端口|递增计数/*如果EXEN2 = 0,定时器2递增到0FFFFH,在溢出后置起TF2位,同时定时器自动将用户软件写好的寄存器RCAP2H和RCAP2L的16位值装入TH2和TL2寄存器。
*///初始值 45535   2^16=65536 TH2 = 45535 >> 8;        // 取高位(177=1011 0001) = 1011 0001 1101 1111 >> 8 TL2 = 45535 & 0x00FF;    // 取低位 (223=1101 1111)  = 1011 0001 1101 1111 & 0000 0000 1111 1111    // TH2+TL2 = 1011 0001 1101 1111 =45535//重载值 45535RCAP2H = 45535 >> 8;RCAP2L = 45535 & 0x00FF;    //重载值// 自动重载值=65536-45535=20001IEN0 |= 0x20;          //开中断  定时器2溢出中断T2CON |= 0x04;         //开始定时器2 即寄存器0000 0100EA = 1;							 	 // 开启总中断
// 	while(1);
}//IPL1 = 0X01;
//IPH1 = OX01;

4. LCD段码液晶屏参数介绍

  • LCD段码液晶屏技术参数
    在这里插入图片描述

5. 根据LCD液晶屏的真值表写数字译码和驱动程序

根据液晶屏的工作原理和真值表的结构,设计一个数字译码算法,将数字或字符转换为对应的 SEG 和 COM 值。

LCD 真值表

在这里插入图片描述

数字译码

在这里插入图片描述

在这里插入图片描述

基于真值表,编写数字译码表和相应的驱动程序。

源文件 LCD.c

#include "LCD.h"xdata unsigned char  LCD_SEG[SEGSIZE] _at_ 0x500; // LCD显示地址 指定位置为0x500//时间/频率/电压显示				     // 0     1    2    3    4    5    6    7    8    9
const unsigned char Disp_Code[]={0xf5,0x05,0xd3,0x97,0x27,0xb6,0xf6,0x15,0xf7,0xb7,// 不带小数点显示
0xfd,0x0d,0xdb,0x9f,0x2f,0xbe,0xfe,0x1d,0xff,0xbf // 带小数点显示
};//显示数字译码//功率显示                          // 0    1    2    3    4    5    6    7    8    9
const unsigned char DispPower_Code[]={0xfd,0x85,0xdb,0x9f,0xa7,0xbe,0xfe,0x95,0xff,0xbf};// 数字译码  "POWER" ":" "."这几个符号常亮//Note:需在(Keil C51)Option中进行选择LCD为电容型
//为更有效的使用电容型LCD驱动器,用户必须先设置PUMPON,LCDON位之外的所有控制位,然后设置PUMPON位,
//在延迟之后(至少50ms)打开LCD,即LCDON位置1,点亮LCD面板;
void LCD_Init(void)
{unsigned char i,j;LCDCON = 0x4F;   //0100 1111      LCDON|PUMPON|DUTY(1/4占空比,1/3偏置)|TYPESEL|   1111:VLCD = 1.000VDD 注意:当选择电容型LCD驱动时,此4位无效LCDCON1 = 0x00;  // 电阻型LCD驱动控制器寄存器DISPCLK0 = 0x00; // LCD驱动时钟分频寄存器 1/4   128K RC 对应的LCD帧频为256/4=64HzDISPCLK1 = 0x03; // LCD驱动Pump寄存器 4KLCDSEL = 0x00;   // 闪烁模式控制寄存器  00 无闪烁功能// 模式选择寄存器P0SS = 0x83 ;     // P0_7/1/0 作为SEG13~15P1SS = 0xFF ;     // P1_7-P1.0作为SEG5~12P2SS = 0xFF ;			// P2_7-P2_4作为COM1~COM4 , P2_3-P2_0 即SEG1~4 P3SS = 0x00 ;     // P3_7-P3_0作为I/O,SEG25~32P4SS = 0x00 ;     // P4_6-P4_0作为I/0,SEG18~24P5SS = 0x0C ;     // P5_3/2   作为SEG16/17for(i=0;i<250;i++)	   	// Delay  50ms 以上再打开LCD 模块{for(j=0;j<250;j++);}LCDCON |= 0X80;			// 打开 LCD 模块
}void LCD_Show(unsigned char udata)
{unsigned char i;for(i=0;i<SEGSIZE;i++){LCD_SEG[i] = udata;}}// 数据处理
void LCD_Data_Show(void){// 电压 /频率/时间显示LCD_SEG[0] = Disp_4H;  // 千位LCD_SEG[1] = Disp_4L;LCD_SEG[2] = Disp_3H;  // 百位LCD_SEG[3] = Disp_3L;LCD_SEG[4] = Disp_2H;  // 十位LCD_SEG[5] = Disp_2L;LCD_SEG[6] = Disp_1H;  // 个位LCD_SEG[7] = Disp_1L;// V H z 时钟符号显示 LCD_SEG[8] = 0x03;// 功率显示LCD_SEG[14] = DispPower_3H;   LCD_SEG[13] = DispPower_3L;  // 百位LCD_SEG[12] = DispPower_2H;   LCD_SEG[11] = DispPower_2L;  // 十位LCD_SEG[10] = DispPower_1H;  LCD_SEG[9] =  DispPower_1L;  // 个位// 油位显示LCD_SEG[15] = 0x0f;LCD_SEG[16] = 0x0f;
//	
}void LCD_Data_OK(unsigned long disp_data){//Disp_Data = disp_data;b4 = Disp_Data /1000%10; // 千位b3 = Disp_Data /100%10;  // 百位b2 = Disp_Data /10%10;   // 十位b1 = Disp_Data %10;      // 个位 // 带小数点显示
//	b4 = Disp_Data /1000%10 + 10; // 千位
//	b3 = Disp_Data /100%10 + 10;  // 百位
//	b2 = Disp_Data /10%10 + 10;   // 十位
//	b1 = Disp_Data %10;      // 个位 //------------------------------------------------------------------Disp_4H = (Disp_Code[b4])>>4;Disp_4L = (Disp_Code[b4])&0x0F;Disp_3H = (Disp_Code[b3])>>4;Disp_3L = (Disp_Code[b3])&0x0F;Disp_2H = (Disp_Code[b2])>>4;Disp_2L = (Disp_Code[b2])&0x0F;Disp_1H = (Disp_Code[b1])>>4; // 个位Disp_1L = (Disp_Code[b1])&0x0F;//------------------------------------------------------------------	DispPower_3H = (DispPower_Code[b3])>>4;DispPower_3L = (DispPower_Code[b3])&0x0F;DispPower_2H = (DispPower_Code[b2])>>4;DispPower_2L = (DispPower_Code[b2])&0x0F;DispPower_1H = (DispPower_Code[b1])>>4;// 个位DispPower_1L = (DispPower_Code[b1])&0x0F;if(Disp_Data < 1000) // 当显示数值是"0321"时,不显示前面的"0"   {Disp_4H = 0;Disp_4L = 0;if(Disp_Data < 100){Disp_3H = 0;Disp_3L = 0;if(Disp_Data < 10){Disp_2H = 0;Disp_2L = 0;}}}
}

头文件LCD.h

#ifndef   __LCD_H
#define   __LCD_H#include "SH79F9202.h"
#include "cpu.h"#define SEGSIZE   17extern xdata unsigned char  LCD_SEG[SEGSIZE]; // LCD显示地址 指定位置为0x500//时间/频率/电压显示	
extern const unsigned char Disp_Code[];
//功率显示 
extern const unsigned char DispPower_Code[];static volatile unsigned long	Disp_Data=0; // 显示数据static volatile unsigned char b1,b2,b3,b4; // 存放 个/十/百/千/万位的数值
static volatile unsigned char Disp_1H,Disp_1L,Disp_2H,Disp_2L,Disp_3H,Disp_3L,Disp_4H,Disp_4L;		//显示数据预处理值
static volatile unsigned char DispPower_1H,DispPower_1L,DispPower_2H,DispPower_2L,DispPower_3H,DispPower_3L;//显示数据预处理值(功率)void LCD_Init(void);
void LCD_Show(unsigned char udata);		
void LCD_Data_Show(void);                   // LCD显示内容
void LCD_Data_OK(unsigned long disp_data);#endif

资料下载

  • 参考资料和文献
  • 示例代码下载链接

参考资料

  • 【CSDN】编程圈子-谢厂节的博客
    这个大纲提供了从基础到实际应用的全面指导,可以帮助你系统地学习和掌握使用SH79F9202U单片机驱动LCD段码液晶屏的技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构造+模拟,CF1148C. Crazy Diamond

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1148C - Codeforces 二、解题报告 1、思路分析 题目提示O(5n)的解法了&#xff0c;事实上我们O(3n)就能解决&#xff0c;关键在于1&#xff0c;n的处理 我们读入数据a[]&#xff0c;代表初始数组…

继电器的选型和英应用

如何保证信号的稳定&#xff1f; 怎么消除继电器触点的电弧&#xff1f; 危害&#xff1a; 继电器的触点在动作时容易产生电弧&#xff0c;电弧具有热效应容易导致触点烧蚀粘接&#xff0c;缩短继电器的寿命&#xff0c;并且产生电弧的过程中会对外进行电磁辐射&#xff0c;…

GoFly框架快速新增接口/上手写代码

拿到一个新框架大家可能无从下手&#xff0c;因为你对框架设计思路、结构不了解&#xff0c;从而产生恐惧&#xff0c;所以我们框架是通过简单可视化界面安装&#xff0c;安装后即可看到效果&#xff0c;然后点击先点点看各个功能&#xff0c;看现有的功能是怎么写的&#xff0…

【错误记录】HarmonyOS 运行报错 ( Failure INSTALL_PARSE_FAILED_USESDK_ERROR )

文章目录 一、报错信息二、问题分析三、解决方案 一、报错信息 在 DevEco Studio 中 , 使用 远程设备 , 向 P40 Failure[INSTALL_PARSE_FAILED_USESDK_ERROR] compileSdkVersion and releaseType of the app do not match the apiVersion and releaseType on the device. 二、…

ABB 控制柜

1,主计算机:相当于电脑的主机,用于存放系统和数据,需要24V直流电才能工作。执行用户编写的程序,控制机器人进行响应的动作。主计算机有很多接口,比如与编程PC连接的服务网口、用于连接示教器的网口、连接轴计算机板的接口、连接安全面板的接口、不同的现场总线卡接口(比…

OrangePi AIpro测评

文章目录 1、外观部分2、系统初探3、AI性能体验4、总结 首先非常感谢csdn以及香橙派能够提供这样一个平台&#xff0c;可以测试OrangePi AIpro这样一块开发板&#xff0c;这块板子给我的感觉还是非常不错的&#xff0c;非常适合用来作为嵌入式学习的板子&#xff0c;性能也达到…

什么是边缘计算网关?工业方向应用有哪些?天拓四方

在数字化时代&#xff0c;信息的传输与处理变得愈发重要&#xff0c;而其中的关键节点之一便是边缘计算网关。这一先进的网络设备&#xff0c;不仅扩展了云端功能至本地边缘设备&#xff0c;还使得边缘设备能够自主、快速地响应本地事件&#xff0c;提供了低延时、低成本、隐私…

matlab工具使用记录-编辑器和命令行窗口分开还原

工具&#xff1a;matlab2021b 场景&#xff1a;在使用软件的过程中&#xff0c;我们误操作将matlab的编辑器单独出来了。这时候对软件进行各种操作都还原不回去。 matlab中编辑器和命令行窗口分开了如下图所示。 这时候只需要使用快捷键在编辑器窗口按CtrlshiftD&#xff0c;…

linux Inodes满导致数据库宕机

项目经理反馈集群环境中有个节点无法使用了需要支援下&#xff0c;同时发过来截图说明磁盘还是有空的。 登录系统后直接发现问题 orcl2:/home/oracledb2> sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed May 29 13:59:21 2024 Copyright (c) 1982,…

摩尔线程MTT S4000 AI GPU助力30亿参数大模型训练,性能比肩英伟达同类解决方案

中国国产GPU制造商摩尔线程(Moore Threads)在AI加速器领域取得了显著进展&#xff0c;其最新推出的MTT S4000 AI GPU在训练大规模语言模型时表现突出&#xff0c;据称相较于其前代产品有着显著的性能提升。根据cnBeta的报道&#xff0c;搭载S4000 GPU的全新“酷鹅千卡智能计算集…

装机必备——截图工具Snipaste安装教程

装机必备——截图工具Snipaste安装教程 软件下载 软件名称&#xff1a;Snipaste2.7 软件语言&#xff1a;简体中文 软件大小&#xff1a;15.37M 系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载通…

探索AES对称加密:Python代码实战

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;从非对称到对称 二、AES加密机制概述 三、Python实现AES加密与解密 …

三十三、openlayers官网示例Drawing Features Style——在地图上绘制图形,并修改绘制过程中的颜色

这篇讲的是使用Draw绘制图形时根据绘制形状设置不同颜色。 根据下拉框中的值在styles对象中取对应的颜色对象&#xff0c;new Draw的时候将其设置为style参数。 const styles {Point: {"circle-radius": 5,"circle-fill-color": "red",},LineS…

Llama改进之——RoPE旋转位置编码

引言 旋转位置编码(Rotary Position Embedding, RoPE)将绝对相对位置依赖纳入自注意力机制中&#xff0c;以增强Transformer架构的性能。目前很火的大模型LLaMA、QWen等都应用了旋转位置编码。 之前在[论文笔记]ROFORMER中对旋转位置编码的原始论文进行了解析&#xff0c;重点…

数据与结构——红黑树

目录 红黑树的概念 性质 结点的定义 插入 验证 查找 删除 红黑树与AVL树的比较 红黑树的概念 红黑树是一种自平衡二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;&#xff0c;其每个节点带有颜色属性&#xff0c;可以是红色或黑色。红黑树通过约束节点颜色…

未来已来:Facebook的数字革命与社交转型

在当今数字化时代&#xff0c;Facebook作为全球最大的社交网络之一&#xff0c;不仅扮演着连接人们的桥梁&#xff0c;更是引领着社交行业的数字革命与转型。本文将深入探讨Facebook如何通过创新技术、改变用户体验以及应对挑战&#xff0c;塑造了未来社交的面貌&#xff0c;以…

ozon卖家精灵,ozon卖家怎么使用

在跨境电商的浪潮中&#xff0c;OZON作为俄罗斯领先的电商平台&#xff0c;吸引了众多卖家争相入驻。然而&#xff0c;面对日益激烈的市场竞争&#xff0c;如何提升店铺的运营效果&#xff0c;成为卖家们迫切需要解决的问题。而OZON卖家精灵作为一款专为OZON卖家打造的辅助工具…

java高级——Collection集合之List探索(包含ArrayList、LinkedList、Vector底层实现及区别,非常详细哦)

java高级——Collection集合之List探索 前情提要文章介绍提前了解的知识点1. 数组2. 单向链表3. 双向链表4. 为什么单向链表使用的较多5. 线程安全和线程不安全的概念 ArrayList介绍1. 继承结构解析1.1 三个标志性接口1.2 AbstractList和AbstractCollection 2. ArrayList底层代…

民国漫画杂志《时代漫画》第32期.PDF

时代漫画32.PDF: https://url03.ctfile.com/f/1779803-1248635561-0ae98a?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

去除字符串中的空格和特殊字符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 用户在输入数据时&#xff0c;可能会无意中输入多余的空格&#xff0c;或在一些情况下&#xff0c;字符串前后不允许出现空格和特殊字符&#xff0c;…