其他分享
首页 > 其他分享> > Holtek合泰单片机 《二》 LED1602字符显示实验

Holtek合泰单片机 《二》 LED1602字符显示实验

作者:互联网

由于项目的需要,可能会用到led1602显示屏。因为网上资源的欠缺,并没有找到很多相关资料,所以发表该博文希望对大家的学习有所帮助。

先了解下led1602是什么?怎么用?本次实验很大需求在于1602的手册上,必须配有一本手册,网上一搜一大把,有些内容就不再赘述。因为我运用的单片机型号是HT66F70A,也在官网上下载了该单片机手册(有些新手不知道怎么下载。就直接在官网里输入自己单片机型号就可以了,配个官网https://www.holtek.com.cn/)。如果大家写不来程序,或者程序语法有误的话,可以打开HT-IDE3000软件上的“帮助”,有个c语言V3手册(现在更新到V3了),可以对照着看看。

#为什么叫led1602,简单来说就是一排显示16个字符,可以显示2排。

首先,先看硬件,1602上的引脚及其作用,你就会知道该怎么连接了。
在这里插入图片描述
在这里插入图片描述
可以看出,
1、VSS、K接地。VDD、A接正级5V(VDD),这里要与上一篇博文HOPE3000的操作相对应。
2、V0接滑动变阻器,如果没有就接地吧,因为我也是接的地,我去连接另一个最小系统上的滑动变阻器最后以失败告终,如果有成功的可以给我说下,因为接地后的字符显示可能不是很清楚。
3、RS、R/W、E这3个端口很重要,用来操作1602的,我接的是PD1、PD2、PD3。
4、D0-D7,因为HT单片引出来了8个引脚,所以正好对应。我接的是是PC的8个引脚,这个在软件编程上也要对应。

硬件连接完了就开始编程软件了,这个需要多多阅读下手册了,我会用图片引出来一些关键的。下面如果有什么不懂的或者遗留的就去看下自己的(手册)。

先看看led1602。
上面有说过3个端口RS、R/W、E很重要,为什么重要呢,因为它关系到我们如何来操作1602,换个意思就是关系到我们如何编程。

在这里插入图片描述
在这里插入图片描述
如图可以看出,当RS、R/W等于某些值时就会实现什么操作。
先定义指令函数。直接给我的程序。

void led_wr_com(uchar cdat)   //写指令    
{
 rs=0;                     
 rw=0;
 e=0;                        //rs=0,rw=0 写指令
 delay_us(1);                    
 led_c=cdat;               
 delay_us(1);
 e=1;                        //高脉冲使能
 delay_us(1);
 e=0;
}

再定义数据函数。也是直接放上程序。

void led_wr_data(uchar dat)   //写、显示数据
{   
 rs=1;
 rw=0;                    
 e=0;                        //rs=1,rw=0 写数据
 delay_us(1);                              
 led_c=dat;               
 delay_us(1);
 e=1;                        //高脉冲使能             
 delay_us(1);
 e=0;
}

(可以看出有时间函数,这点我要单独拿到后面出来说,关系时序时间参数设置,还有HT单片机编程独有函数。)
不知道大家有没有了解过或者用过相关硬件,关于初始化的概念,1602需要做的其中一个就是初始化也叫清屏,去查查51程序就会发现有很重要的一步就是初始化(Holtek与51的程序有很大部分相似哈)。不懂就查查百度吧。
然后根据手册开始写初始化。(只放上用了的部分,不懂的看看手册)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
放程序。

void led_init()            //初始化led
{
 led_wr_com(0x38);         //0011 1000 8位数据总线DB7~DB0、2行显示模式
 delay_us(1);
 led_wr_com(0x0c);         //0000 1100 开显示,关光标(关光标的显示,其实还有,看不见)
 delay_us(1);
 led_wr_com(0x06);         //0000 0110 显示不移位,光标右移
 delay_us(1);
 led_wr_com(0x01);         //0000 0001 清屏
 delay_us(1);            
}

到这里,程序大都看不懂,下面放上端口定义的程序。

#include "HT66F70A.h"
#include "type.h"             //运用自己写的库
#define pc     _pcc           //设置c端口模式
#define pd     _pdc           //设置d端口模式
#define rs     _pd1           //定义rs使能端口
#define rw     _pd2           //定义rw读写端口
#define e      _pd3           //定义e端口,高脉冲使能,脉宽最小150ns
#define led_c  _pc            //连接1602的DB0~DB7
void delay_us(uint);          //延时函数
void led_wr_data(uchar);      //写数据
void led_wr_com(uchar);       //写指令
void led_init();              //1602初始化
uchar table[]= "my-blog-name-is-";    
uchar table1[]="XiaoMingTongxie-";     //显示字符内容16位

额,初学者肯定还是看不懂程序。下面就是让你看懂程序。
此时该拿出芯片手册了,HT66F70A。(也会配合HT-IDE3000帮助里自带的V3 C语言手册,上面有提到过)

先看端口定义程序。
1、"自己写的库"就是另创一个.h文件,根据上次博文添加到工程里,放入自己的宏定义就OK了,学过32的都知道,没学过32的就照着做下吧,或者百度下,因为这个问题不大。知道uchar、uint什么意思就行。
这是.h文件程序。

#ifndef __TYPE_H_
#define __TYPE_H_
typedef unsigned char uchar;
typedef unsigned int uint;
#endif

2、那么_pcc、_pdc、_pd1、_pd2、_pd3、_pc是什么意思呢?
在这里插入图片描述
只放了重要部分手册内容。讲解下:
_pcc、_pdc就是设置硬件上C、D的IO的模式,为1则是输入模式,为0就是输出模式。
_pd1、_pd2、_pd3就是硬件上的D1、D2、D3。
_pc就是硬件上C0-C8,可以用16进制来表示。

4、最重要的来了。(博主在这里卡了很久。其实也不是太久- -!)
GCC_DELAY()函数,用于延时。

void delay_us(uint time)      //延时函数time us
{
 int i;
 for(i=0;i<time;i++)
 GCC_DELAY(2);
}

在V1、V2手册里面GCC_DELAY()是用_delay()表示的,现在是V3了,用前面的表示方法。
在这里插入图片描述

在这里插入图片描述
这个可以算下,8MHz情况下,当给里面参数为几时,延时多久?
答案,是参数为2时延时为1μs。16MHz指令周期为 0.25μs,8MHz时令周期为 0.5μs,参数为2时为1μs。给个时间量纲:
秒(s)
毫秒(ms)
微秒(μs)
纳秒(ns)
皮秒(ps)
用个for循环给个形参time就可以用来延时了。
那么为什么上面实参为什么全是1呢?
看1602波形:
在这里插入图片描述

哈哈,没看懂吧,我也没看懂,没关系,看下面。
在这里插入图片描述
这下知道了延时的重要性了吧。

进入主题。
先放程序:

void main()
{
 _wdtc=0b10101111;         //关狗
 pd=0x0;                   //d端口为输出模式
 pc=0x0;                   //c端口为输出模式
 uint n;                   
 delay_us(1);                    
 led_init();
 while(1)
 {
 led_wr_com(0x00|0x80);    //0000 0000|1000 0000设置初始显示位置
 for(n=0;n<16;n++)         //因为D7恒为1,所有第一位必须为1
 {
 led_wr_data(table[n]);    //在第一排写字符内容
 delay_us(200);   
 }
 led_wr_com(0x40|0x80);    //0100 0000|1000 0000设置初始显示位置
 for(n=0;n<16;n++)         //因为D7恒为1,所有第一位必须为1
 {
 led_wr_data(table1[n]);   //在第二排写字符内容
 delay_us(200);   
 }
 }
} 

讲解:
1、关狗,这个东西有毒,关掉。
在这里插入图片描述
简单点,内部振荡器 LIRC 的周期大约为32kHz,可以算算多少时间,只要超过这个时间,马上对单片机复位,这会导致想要的结果不能实现。后面用到了会详细讲解。
2、pd、pc就是设置C、D所有IO口为输出模式,后面可能不会这么用。
3、最后的一个知识点,字符显示的位置。
在这里插入图片描述
这是网上找的,放上引用网址https://wenku.baidu.com/view/6108cb7a66ec102de2bd960590c69ec3d5bbdbf5.html
看看结果:
(17)
到这里关于HT单片机的led1602显示实验就结束了。博主的程序全都已经放在上面,虽然有些零碎,但主要还是掌握方法。由于上课的原因,额,更新进度有点慢- -!。
总结下,其实这次实验对于HT单片机的使用要求并不大,大都在讲怎么使用1602,对于单片机主要就知道了IO口与定时函数GCC_DELAY()的使用,后面可能还会接触到TM定时器,到时再说了,不过最多的学到的东西就是怎么去看一个手册和怎么去使用手册上(还好是中文的),也还有点收获。

标签:led,合泰,端口,us,LED1602,delay,单片机,手册,void
来源: https://blog.csdn.net/weixin_44783974/article/details/88806222