用4x4矩阵及LCD1602液晶显示实现各进制转换

摘要:在计算机及其相关的各领域中,数制的二进制、八进制、十进制和十六进制之间的相互转换可谓无处不在。为满足相关领域人员对进制转换计算的需求,特此利用51系列单片机开发进制转换器,实现二进制、八进制、十进制之间的相互转换。本文从数制转换的基本原理出发,分析二进制、八进制、十进制之间的相互关系,并通过设计实验,尝试使用STC89C52rc单片机、4x4矩阵按键以及LCD1602液晶显示屏,通过相关软件的编程烧录,开发进制转换器,实现二进制、八进制以及十进制数之间的相互转换。

关键词:4x4矩阵按键;LCD1602;51单片机;进制转换;

1 绪论

随着近年来计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入。它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,适合于与控制有关的系统。因此单片机越来越广泛地应用于自动控制,消费电子,智能化仪器,仪表,数据采集,信息处理,军工产品以及家用电器等各个领域。单片机往往是作为一个核心部件来使用,再根据具体硬件结构,以及具体应用对象的特点,与软件相结合,构成完整的应用系统,并保留可扩展功能以作日后完善。本设计将采用STC89C52rc单片机开发进制转换器,从理论和实践两个角度出发,对一个功能齐全,数制转换准确,运行稳定的数制转换器进行设计与实现分析。

1.1 本设计的目标及主要研究内容

本设计要求通过设计实验,熟悉C51单片机的编程及其原件的结构、工作原理和使用方法,通过相关的开发工具实现各进间制相互转换,要求能够通过按键输入数据,并具有清屏、换行、确认功能,转换结果由LCD1602液晶显示屏输出。

本设计从数制转换的基本原理出发,分析二进制、八进制、十进制之间的相互关系,并通过设计实验,尝试使用4x4矩阵按键以及LCD1602实现二进制、八进制以及十进制数之间的相互转换,以按键输入十进制D(0~9),八进制O(0~7),二进制B(0~1),通过按键扫描和LCD1602扫描,51最小系统计算进制换算,计算结果通过LCD1602显示。

1.2 系统的开发环境及运行环境

操作系统:Windows 10 跨平台操作系统

开发工具:Keil uVision5;stc-isp-15xx-v6.89B烧录软件;51单片机开发板;

1.3 本文的结构安排

本文简要介绍了进制转换的相关知识,利用C51单片机开发出能实现各进制相互转换的系统,方便人们在工作学习中节省计算进制转换的时间。

本文具体结构如下:

第一章:阐述研究目标、主要内容、研究框架。

第二章:主要介绍了基于STC89C51单片机开发进制转换器所需要的模块及其结构功能,对理解实现进制转换有一个基础认识。

第三章:主要介绍了各进制转换过程的相关理论。简单讲解单片机实现各进制相互转换的基本步骤,并简单分析各进制转换的数学原理,其中包括二进制与十进制的相互转换,八进制与十进制的相互转换,十六进制与十进制的相互转换(因本系统无法实现十六进制转换,故只做简单分析,不做详细介绍与实现设计,后续成果展示也无十六进制展示,可以作为扩展功能展望,进一步完善本系统进制转换功能)

第四章:通过开发工具在STC89C51单片机开发板上进行系统开发,最终使进制转换器得以实现,通过实际操作,进行系统展示,并简单分析系统开发过程存在的问题及解决办法。

第五章: 对本文的内容、问题进行概括,总结本系统开发的心得体会,通过简单分析,提出在今后硬件与软件升级后,对本转换器功能扩展的展望。

2 系统实现需要的模块

2.1 LCD1602显示模块

本系统显示模块采用LCD1602液晶显示屏,它有体积小,重量轻,功耗低等显著优点,并且特别适用于51系列单片机,在本设计中采用单片机的P0系列端口作为LCD1602的8位数据端口,接至LCD1602的D0-D7引脚,另外LCD1602的RS(指令,数据选择端),RW(指令,数据读写选择端),E(使能端)分别接至单片机的P1.0,P1.1,P2.5引脚。LCD1602电路图(见图2.1.1),LCD1602实物图(见图2.1.2)。

图2.1.1 LCD1602电路图

图2.1.2 LCD1602实物图

Fig 2.1.1 The circuit diagram of LCD1602

Fig 2.1.2 The physical diagrm of LCD1602

2.2 4x4矩阵按键模块 

本系统数据输入及功能选择均由4x4矩阵按键扫描实现,采用中断控制扫描的方式来实现CPU对按键的处理。中断控制扫描方式是利用外部中断源,响应输入信号。

当无按键按下时,CPU执行正常工作程序;当有按键按下时,CPU立即产生中断,在中断服务子程序中扫描按键,判断是哪一个键被按下,然后执行该键的功能子程序。

终端服务子程序是将各个按键都连接到一个与门上,当有任何一个按键按下时,都会使与门输出为低电平,从而引起单片机的中断。它的好处是不用在主程序中持续不断地循环查询,如果有键按下,单片机再去做相应的处理。4x4矩阵按键电路图(见图2.2.1),4x4矩阵按键实物图(见图2.2.2)。

图2.2.1 4x4矩阵按键电路图

图2.2.2 4x4矩阵按键实物图

Fig 2.2.1 The circuit diagram of matrix keys

Fig 2.2.2 the physical diagram of matrix keys

2.3 电源模块

本系统电源模块为USB供电,电源供电路,是硬件电路工作的基础。本设计中电源的输入电压选择直流10V,由开关电源为系统供电。在图中电源芯片的3脚为电源的输入端。L2为二极管,在电路中的作用是防反接保护,如果操作者将电源接反,系统不会对外供电。USB供电电路(见图2.3.1)。

图2.3.1 USB供电电路图

Fig 2.3.1 The circuit diagram of USB power supply

2.4 51最小系统

图为51最小系统原理图(见图2.4.1)。

图2.4.1 51最小系统原理图

Fig 2.4.1 The schematic diagram of minimum system of 51 series

3各进制转换过程相关理论

3.1 进制相关概念

3.1.1 数制

数制也称为计数制,是指用一组固定的符号和统一的规则来表示数值的方法。在数制计算中,一般采用的是进位计数,按照进位的规则进行计数的数制称为进位计数制。

3.1.2基数

在一个计数制中表示每个数位上可用字符的个数称为该计数制的基数,若用r表示,则称为r进制,其进位规律为“逢r进1”。

3.1.3位权

数码在不同位置上的权值。确定位权须要两个因素:基数和位置序号。位置序号是整数系,其排列规则为:以小数点为中介点,以左的整数是从零开始的自然数;以右的小数是从-1开始的负整数。(见表3.1.3)。

表3.1.3 各进制数

Table3.1.3 The table of various system of numbers

3.2 二进制与十进制的相互转换

3.2.1十进制整数转二进制整数

十进制整数转二进制整数采用“除2取余,逆序排列”法。

具体做法:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时止,然后把所有余数按逆序依次排列。

3.2.2十进制小数转二进制小数。

十进制小数数转二进制小数采用“乘2取整,顺序排列”法。

具体的做法:用2乘以十进制小数,可以得到积,将积的整数部分取出,再用2乘以余下的小数部分,又会得到一个积,再将积的整数部分取出,如此进行,直到积中小数部分为零,或者达到所要求的精度为止,然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为二进制数的低位有效位。

3.2.3二进制数转十进制数。

二进制数转十进制数采用“按权相加法”,将二进制数的每一位数值乘上该位对应十进制的权值再相加,最终的结果即为对应的十进制数。(见表3.2.3)。

权值

256

128

64

32

16

8

4

2

1

2^8

2^7

2^6

2^5

2^4

2^3

2^2

2^1

2^0

表3.2.3 二进制权值表

Table 3.2.3 The table of Binary weights

3.3 八进制与十进制的相互转换

3.3.1八进制转换为十进制

八进制数的一共有0、1、2、3、4、5、6、7八个字符。同理,可以采取“除8取余,逆序排列”法,将十进制整数转换成八进制整数[4]。

同理:对于要转换的十进制数的小数部分,则应不断地乘以8,并记下其整数部分,直到结果的小数部分为零或达到需要的精度为止。

3.3.2八进制转换成十进制

八进制数转十进制数采用“按权相加法”,将八进制数的每一位数值乘上该位对应十进制的权值再相加,最终的结果即为对应的十进制数。(见表3.3.2)。

权值

16777216

2097152

262144

32768

4096

512

64

8

1

8^8

8^7

8^6

8^5

8^4

8^3

8^2

8^1

8^0

表3.3.2 八进制权值表

Table 3.3.2 The table of Octal weights

3.4 二进制与八进制的相互转换

3.4.1二进制转换成八进制

二进制含有0和1,八进制数含有0-7,通过二进制表来表示八进制0-7,需要采用三位二进制组合成一个八进制方法来实现,归纳为“三位并一”的原则,把需要转成成八进制的二进制数以小数点为分界点,小数点左边的从右向左为三位一组高位不够三位的补零,小数点右边的从左向右三位一组低位不够三位的补零,然后把三位一组的二进制数转换成十进制数组合在一起就是所求的八进制数。

3.4.2八进制转换成二进制

采用的是把一位八进制数分成三位二进制数,和二进制转换成八进制数的过程正好相反。归纳与“一分三”的原则。

3.5 进制转换的流程

3.5.1 进制转换对应的流程(见图3.5.1)。

图3.5.1 进制转换流程图

Fig 3.5.1 System conversion flow chart

3.5.2 进制转换方法小结(见图3.5.2)。

图3.5.2 进制转换关系图

Fig 3.5.2 Decimal conversion diagram

进制转换共三种方法:按权位展开、辗转乘或除、按位兑换

3.5.2.1按权位展开法

此方法适合于r进制转换为十进制,公式为:

其中,Xi表示第i位的r进制的数,Xi可取的数由r决定;m,n为正整数,i=n-1表示数的某一位,从0位开始。按位权展开特点是以小数点为界限,整数位指数从0开始编码,小数位的指数从-1开始编码。

位权Nn在 二、八、十六进制中所对应的值[8](见表3.5.2.1)。

表3.5.2.1 二进制、八进制、十六进制权值表

Table 3.5.2.1 Weights of Binary、Octal and hexadecimal

3.5.2.2辗转乘或除

此方法适用于十进制转r进制。十进制转r进制时,整数和小数部分的转换方法不一样,需分开进行。整数部分:逐次除以r,取余数倒排。小数部分:逐次乘r,取整顺排。

这种算法的特点是整数部分用目标进制为基数短除,余数倒排,小数部分用目标进制为因子连续相乘,取出来的整数顺排,一般保留三位即可。此算法适合十进制转任意进制。

3.5.2.3按位兑换

此方法适用于2n进制与二进制之间相互转换。从小数点开始,整数部分向左分割,小数部分向右分割,按位兑换。因为2n进制与二进制之间存在位数对应关系: (2n)^x=2^y(x=1),即x位2n进制可以用y位二进制来表示。所以转换可以按位兑换。

(1)一位兑多位:2n进制转成二进制,一位兑成x位,最终结果将整数部分高位和小数部分低位的零舍弃。

(2)多位兑一位:二进制转成2n进制,从小数点开始,整数部分向左分割,小数部分向右分割,位数不够的整数部分高位和小数部分低位补零,x位合成一位。

(3)以二进制为中介转换:2n进制与2m进制(n≠m)之间,需要以二进制为中介转换。按位兑换适合任意进制二进制之间转换。特点是需要理清(2n)^x=2^y(x=1)中的对应关系(见图3.2.5.3)。

图3.2.5.3 有关二进制的关系

Fig 3.2.5.3 Diagram of Binary system

3.5.3 二、八、十、十六进制对应数值表(见图3.5.3)

图3.5.3 进制对应数值表

Fig 3.5.3 System corresponding numerical table

3.5.4 进制转换时4x4矩阵按键对应的键值及功能

键值对应关系如下:S1~S10输入0~9,S11十进制功能键,S12二进制功能键,S13八进制功能键,S14清屏键,S15确认键,S16闲置。(见图3.5.4)。

图3.5.4 键值及功能表

Fig 3.5.4 The table of key values and functions

4 数制转换器结果展示

4.1数制转换器初始化结果展示

初始化界面结果(见图4.1.1):

十进制初始化结果(见图4.1.2):

八进制初始化结果(见图4.1.3):

二进制初始化结果(见图4.1.4):

图4.1.1 初始化界面

图4.1.2 十进制初始化结果

Fig 4.1.1 Initialization interface

Fig 4.1.2 Decimal initialization result

图4.1.3 八进制初始化结果

图4.1.4 二进制初始化结果

Fig4.1.3 Octal initialization result

Fig 4.1.4 Binary initialization result

4.2 各进制相互转换结果展示

4.2.1 十进制与二进制

十进制转二进制(以11转1011为例),见图4.2.11:

二进制转十进制(以1011转11为例),见图4.2.11:

图4.2.11 十进制转二进制结果

图4.2.12 二进制转十进制结果

Fig 4.2.11 The result of decimal to binary

Fig4.2.12 The result of binary to decimal

4.2.2 十进制与八进制

十进制转八进制(以11转13为例),见图4.2.21:

八进制转十进制(以11转13为例),见图4.2.22:

图4.2.21 十进制转八进制结果

图4.2.22 八进制转十进制结果

Fig4.2.21 The result of decimal to octal

Fig4.2.22 The result of octal to decimal

4.2.3八进制与二进制

八进制转二进制(以11转1001为例),见图4.2.31:

二进制转八进制(以11转3为例),见图4.2.32:

图4.2.31八进制转二进制结果

图4.2.32二进制转八进制结果

Fig4.2.31 The result of octal to binary

Fig4.2.32 The result of binary to octal

5 总结与展望

5.1总结

经过两个周的准备,通过查阅资料,学习原理,编写程序,撰写报告,我完成了本次考查内容,成果由本报告呈现。

本设计以STC89c52rc单片机为主控器,使用LCD1602显示模块,4x4矩阵按键模块,利用Keil uVision5及stc-isp-15xx-v6.89B烧录软件,51单片机开发板进行了基于单片机的数制转换器开发。通过各个硬件设备的特点设计来了相应的软件系统,达到了本设计的目的,是一款实用且非常有可开发性的产品,设计结构简单、调试方便、成本低、功耗低。采用模块化的设计思想,设计开发周期短,各个模块具有独立性,有很大的扩展空间。报告在撰写过程中,力求将理论与实践应用相结合,对各种理论进行阐述的同时配合系统从实际应用和操作技巧上加以说明,希望能够更充分地体现这些知识与技术在本系统中的应用与实现。

本系统基本实现了关键的功能模块,在功能上基本满足了用户的需求,但是由于时间较紧,有些模块以及整个系统还有许多不完善的地方,如操作性不太友好,不能进行连续数制转换等。

通过这次工程设计开发的实践训练,进一步掌握了工程的方法和技术,提高了工程开发的实际能力,培养了工程设计能力和综合分析、解决问题的能力。学习和实践了在分析和设计计算机应用系统所需要的知识,包括系统分析与设计,编码和测试方面的知识,并将其运用于工程开发的全过程。

本系统开发的过程中遇到了许多问题,虽然旅途艰辛,但是经过自己不断的翻阅书本以及同学的相互交流,这些问题终于被克服了。这有助于我们提高自己的学习和独立工作的能力。

5.2展望

本次系统开发结束以后,虽然自己在运用基础、专业知识解决问题、检索信息的能力得到了很大的提升,但是也发现了自己所欠缺的知识还很多。这次的题目属于计算机领域常用问题,因此,我认为可行性与实用性还是非常强的。经过这次的系统开发设计,我认识到系统开发还有很多可以提升完善的地方,因只有4×4矩阵按键,所以不能有效输入16进制,故只能进行二、八、十进制间的互相转换,若后续硬件更新,可在本系统的基础上继续扩展功能,实现十六进制及其他需要转换的进制。可以根据自己知识的提升,软硬件设施的更新,不断的完善进制转换系统,增添诸如十六进制,五进制,三进制等各常用进制转换功能。简而言之,这次的系统开发设计使我受益匪浅。

Use 4x4 matrix and LCD1602 liquid crystal display to realize the conversion of each base

Abstract: In the computer and related fields, the conversion between binary, octal, decimal and hexadecimal of the number system is everywhere. In order to meet the requirements of the relevant field personnel on the base conversion calculation, we hereby use the 51 series of single-chip microcomputer to develop the base converter to achieve the conversion between binary, octal and decimal. In this paper, starting from the basic principle of number system conversion, analysis of the relationship between binary, octal and decimal, and through the design of experiments, try to use STC89C52rc MCU, 4x4 matrix keys and LCD1602 liquid crystal display, through the programming of related software burning, the development of base converter, Implement the conversion between binary, octal and decimal numbers.

Keywords: 4x4 matrix keys; LCD1602; 51 MCU; Base conversion;

附源码如下:

/*
key_0       key_1       key_2       key_3
key_4       key_5       key_6       key_7
key_8       key_9       key_D       key_B
key_O       clear       change  back
D   十进制
B   二进制
O   八进制
*///引用第三方头文件
#include <reg51.h>    //矩阵按键使用P3组端口,LCD1602数据使用P0组端口
#define KEY_DATA P3
#define LCD_DATA P0unsigned char KEY_VALUE = 0;//存放按键的号位
unsigned char KEY_STATE;//存放按键状态的值//按键值的存放数组,以此对应每一个按键的值
unsigned char code LCD_SHOW_KEY[]="0123456789DBOCT"; unsigned char Recive_Buff[10] = {0}; // 读取按键值的数据空间
unsigned int Recive_lengh = 0;       // 读取按键值的数据长度unsigned char CHANGE_Buff[10] = {0}; // 将按键值由字符转换为整型数值的数据空间
unsigned int CHANGE_lengh = 0;       // 将按键值由字符转换为整型数值的数据长度unsigned char RESULT_Buff[10] = {0}; // 输出结果的数据空间
unsigned int RESULT_lengh = 0;       // 输出结果的数据长度sbit LCD_RS = P1^0  ;            //定义lcd数据/命令选择脚
sbit LCD_RW = P1^1  ;          //定义lcd读/写选择脚
sbit LCD_EN = P2^5  ;          //定义lcd屏使能引脚void delay_ms(unsigned int i);  //定义延时函数
unsigned char KEY_INPUT();          //检测按键值函数
void LCD_INIT();                                //LCD屏初始化函数
void LCD_WRITE_DATA(unsigned char Data);//LCD屏写数据函数
void LCD_WRITE_CMD(unsigned char Cmd);  //LCD屏写命令函数
void CHANGE_OUTPUT(void);//字符串读取函数
void Delete(void);//变量清除函数
void D_CHANGE(void);//十进制转换函数
void B_CHANGE(void);//二进制转换函数
void O_CHANGE(void);//八进制转换函数
void CHANGE_D(void);//转换十进制函数
void CHANGE_B(void);//转换二进制函数
void CHANGE_O(void);//转换八进制函数
unsigned    int DATA_BEFOR=0;//进制转换前变量
unsigned    int DATA_AFTER=0;//进制转换后变量
unsigned char i = 0;//for循环变量1
unsigned char j = 0;//for循环变量2/******************************主函数**********************************/
void main(void)
{LCD_INIT();//LCD屏初始化KEY_STATE=0;//按键状态值置0while(1){while(KEY_INPUT()!=20){    //检测到按键被按下      //将按键的值以字符的形式存入数组   Recive_Buff[Recive_lengh] = LCD_SHOW_KEY[KEY_VALUE];Recive_lengh = Recive_lengh + 1;          // 地址后移switch(KEY_VALUE){case 0:LCD_WRITE_DATA('0');break;//按键值为0,输出lcd屏0case 1:LCD_WRITE_DATA('1');break;//按键值为1,输出lcd屏1case 2:LCD_WRITE_DATA('2');break;//按键值为2,输出lcd屏2case 3:LCD_WRITE_DATA('3');break;//按键值为3,输出lcd屏3case 4:LCD_WRITE_DATA('4');break;//按键值为4,输出lcd屏4case 5:LCD_WRITE_DATA('5');break;//按键值为5,输出lcd屏5case 6:LCD_WRITE_DATA('6');break;//按键值为6,输出lcd屏6case 7:LCD_WRITE_DATA('7');break;//按键值为7,输出lcd屏7case 8:LCD_WRITE_DATA('8');break;//按键值为8,输出lcd屏8case 9:LCD_WRITE_DATA('9');break;//按键值为9,输出lcd屏9case 10:LCD_WRITE_DATA('D');LCD_WRITE_DATA(':');CHANGE_OUTPUT();break;//按键值为D,输出/输出十进制数case 11:LCD_WRITE_DATA('B');LCD_WRITE_DATA(':');CHANGE_OUTPUT();break;//按键值为B,输出/输出二进制数case 12:LCD_WRITE_DATA('O');LCD_WRITE_DATA(':');CHANGE_OUTPUT();break;//按键值为O,输出/输出八进制数case 13:LCD_WRITE_CMD(0X01);Delete();break;//清屏命令case 14:LCD_WRITE_CMD(0XC0);break;//换行命令case 15:break;//无用途,搁置}               }}
}/**********************按键函数设置********************/
unsigned char  KEY_INPUT(void){char a;KEY_DATA=0x0f;        //设置初始值if(KEY_DATA!=0x0f){   //按键消除抖动delay_ms(10);//延时消除抖动if(KEY_DATA!=0x0f){KEY_STATE=0;KEY_DATA=0xf0;//列扫描switch(KEY_DATA){case 0xe0:KEY_VALUE=0;           break;//确定第一列case 0xd0:KEY_VALUE=1;            break;//确定第二列case 0xb0:KEY_VALUE=2;            break;//确定第三列case 0x70:KEY_VALUE=3;            break;//确定第四列}KEY_DATA=0x0f;//行扫描switch(KEY_DATA){case 0x0e:KEY_VALUE=KEY_VALUE;      break;//确定第一行case 0x0d:KEY_VALUE=KEY_VALUE+4; break;//确定第二行case 0x0b:KEY_VALUE=KEY_VALUE+8; break;//确定第三行case 0x07:KEY_VALUE=KEY_VALUE+12;    break;//确定第四行}/*********稳定按键功能***********/while((a<50)&&(LCD_SHOW_KEY!=0xf0)){delay_ms(10);a++;}a=0;}return KEY_VALUE;//返回按键值}
return 20;//未按下,返回标志符号
}
/*******************************************************//*********************读取字符串中有用数值*********************/
void CHANGE_OUTPUT(void){//检测到有输入值并且有转换命令的标志符号Tif (Recive_lengh > 0 && Recive_Buff[Recive_lengh - 2] =='T'//第一位为输入进制的类型确定&& (Recive_Buff[0] == 'D'||Recive_Buff[0] == 'B'||Recive_Buff[0] == 'O')//最后一位为输出进制的类型确定&& (Recive_Buff[Recive_lengh - 1] == 'D'||Recive_Buff[Recive_lengh - 1] == 'B'||Recive_Buff[Recive_lengh - 1] == 'O')){switch(Recive_Buff[0]){case 'D':D_CHANGE();break;case 'B':B_CHANGE();break;case 'O':O_CHANGE();break;}}
}
/*******************************************************//*****************输入进制转换******************/
void D_CHANGE(void){            for (i = 0; Recive_Buff[i] !='T'; i++) {if (Recive_Buff[i] >= '0' && Recive_Buff[i] <= '9'){      DATA_BEFOR = DATA_BEFOR * 10 + (Recive_Buff[i]- '0');   }}switch(Recive_Buff[Recive_lengh-1]){case 'D':CHANGE_D();break;case 'B':CHANGE_B();break;case 'O':CHANGE_O();break;}
}
void B_CHANGE(void){            for (i = 0; Recive_Buff[i] !='T'; i++) {if (Recive_Buff[i] >= '0' && Recive_Buff[i] <= '9'){      DATA_BEFOR = DATA_BEFOR * 2+ (Recive_Buff[i]- '0'); }}switch(Recive_Buff[Recive_lengh-1]){case 'D':CHANGE_D();break;case 'B':CHANGE_B();break;case 'O':CHANGE_O();break;}
}
void O_CHANGE(void){            for (i = 0; Recive_Buff[i] !='T'; i++) {if (Recive_Buff[i] >= '0' && Recive_Buff[i] <= '9'){      DATA_BEFOR = DATA_BEFOR * 8 + (Recive_Buff[i]- '0');    }}switch(Recive_Buff[Recive_lengh-1]){case 'D':CHANGE_D();break;case 'B':CHANGE_B();break;case 'O':CHANGE_O();break;}
}/*****************输出进制转换******************/void CHANGE_D(void){for(i=0;DATA_BEFOR!=0;i++){CHANGE_Buff[CHANGE_lengh]=DATA_BEFOR %10;DATA_BEFOR=DATA_BEFOR / 10;CHANGE_lengh ++;}j=CHANGE_lengh-1;for(i=0;j<CHANGE_lengh;i++){RESULT_Buff[i]=CHANGE_Buff[j];LCD_WRITE_DATA(LCD_SHOW_KEY[RESULT_Buff[i]]);j --;}
}
void CHANGE_B(void){for(i=0;DATA_BEFOR!=0;i++){CHANGE_Buff[CHANGE_lengh]=DATA_BEFOR %2;DATA_BEFOR=DATA_BEFOR / 2;CHANGE_lengh ++;}j=CHANGE_lengh-1;for(i=0;j<CHANGE_lengh;i++){RESULT_Buff[i]=CHANGE_Buff[j];LCD_WRITE_DATA(LCD_SHOW_KEY[RESULT_Buff[i]]);j --;}
}
void CHANGE_O(void){for(i=0;DATA_BEFOR!=0;i++){CHANGE_Buff[CHANGE_lengh]=DATA_BEFOR %8;DATA_BEFOR=DATA_BEFOR / 8;CHANGE_lengh ++;}j=CHANGE_lengh-1;for(i=0;j<CHANGE_lengh;i++){RESULT_Buff[i]=CHANGE_Buff[j];LCD_WRITE_DATA(LCD_SHOW_KEY[RESULT_Buff[i]]);j --;}
}//延时函数
void delay_ms(unsigned int i){int x;int y;for(x=0;x<i;x++){for(y=0;y<125;y++){}}
}
/*****************清除变量函数**********************/
void Delete(void){Recive_Buff[1] = '0'; // 数据空间Recive_lengh = 0;       // 数据长度CHANGE_Buff[1] = '0'; // 数据空间CHANGE_lengh = 0;       // 数据长度RESULT_Buff[1] = '0'; // 数据空间RESULT_lengh = 0;       // 数据长度
}
/*****************LCD屏定义**********************/
void LCD_WRITE_CMD(unsigned char Cmd){LCD_RS = 0; //LCD_RW = 0;LCD_EN = 0;LCD_DATA =Cmd;delay_ms(10);LCD_EN = 1;delay_ms(10);LCD_EN = 0;
}
void LCD_WRITE_DATA(unsigned char Data)         //写入数据
{   LCD_RS = 1;    //选择输入数据LCD_RW = 0;    //选择写入LCD_EN = 0;  //使能清零LCD_DATA=Data;delay_ms(1);LCD_EN = 1;delay_ms(5);LCD_EN = 0;
}
void LCD_INIT()                       //LCD初始化
{LCD_WRITE_CMD(0x38);  //开显示LCD_WRITE_CMD(0x0c);  //开显示不显示光标LCD_WRITE_CMD(0x06);  //写一个指针加1,即写一个往后一个LCD_WRITE_CMD(0x01);  //清屏操作LCD_WRITE_CMD(0x80);  //设置数据指针起点第一行
}

以上内容为本人练习,仅供参考,若读者发现错误请私信指正,谢谢~

单片机进制转换实现(报告+源码)相关推荐

  1. c语言进制转换实验报告,c语言_各种进制转换.docx

    c语言_各种进制转换.docx c 语言 各种进制转换 计算机中常用的数的进制主要有二进制.八进制.十六进制. 2 进制,用两个阿拉伯数字0.1: 8 进制,用八个阿拉伯数字0.1.2.3.4.5.6 ...

  2. Winform中实现颜色拾取器获取RGB与16进制颜色程序与源码分享

    场景 效果 实现 关键代码 using System; using System.Collections.Generic; using System.ComponentModel; using Sys ...

  3. python学习-综合练习三(斐波那契数列、阿姆斯特朗数、//和/、十进制转二进制bin、八进制oct、十六进制hex、进制转换源码、python中::和:的区别)

    文章目录 斐波那契数列 阿姆斯特朗数 十进制转二进制bin.八进制oct.十六进制hex 补充进制转换源码 python中::和:的区别 说明:本篇博文的知识点大部分来自 Python3 实例 斐波那 ...

  4. 【VB6|第17期】16进制颜色值与RGB值互相转换(含源码)

    日期:2023年3月28日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海-- 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长:如果有不对的地方,还望各位 ...

  5. 探索一下进制转换 (Python 实现源码)

    Python 实现进制转换 一.导言 导语: 在计算机进行数据交换时,常常会有一个进制转换的过程,我们知道计算机只认0 和 1.在内存系统中,基本基于二进制进行运算的,但是有时候数据过于庞大,为了方便 ...

  6. java:实现进制转换工具(附完整源码)

    java:实现进制转换工具 package com.xxq;import java.awt.BorderLayout; import java.awt.EventQueue;import javax. ...

  7. 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

    我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找.也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找): 一.进制转换 让我们先来看看各个进制的定义: 十进制 ...

  8. 软考笔记——1.1、计算机硬件组成、数据的进制转换、校验码

    一.计算机硬件组成 计算机的硬件基本系统由五部分组成:运算器.控制器.存储器.输入设备(如鼠标键盘).输出设备(如显示器) 存储器分为内部存储器(即内存.容量小,速度快,临时存放数据)和外部存储器(即 ...

  9. 单片机预备知识(电平、进制转换、字节、数据类型)

    参考:郭天祥十天带你精通51单片机 网址:https://www.bilibili.com/video/BV1DW411a7mz/?spm_id_from=333.788.videocard.0 目录 ...

最新文章

  1. 快速排序的递归和非递归实现 c语言版本
  2. 删除文件提示“您需要权限才能执行此操作”如何解决
  3. java堆缓冲区,Java NIO之Buffer(缓冲区)
  4. python表单_python-基于添加表单的Django编辑表单?
  5. 【C语言】强迫症是不是病QAQ
  6. 多核处理器_游戏爱好者的福音!AMD全新一代高性能多核处理器3950X
  7. python3.5安装教程linux_安装Python 3.6在Ubuntu 16.04上
  8. mybatis学习笔记(五):mybatis 逆向工程
  9. RSA原理及其攻击方法
  10. Python学习(4)证件照底色变换
  11. 数学分析高等代数考研试题荟萃[更新至2017年12月28日]
  12. Win10+Android+夜神安卓模拟器 搭建ReactNative开发环境
  13. 蓝桥杯 带分数 By Assassin
  14. 解决Mac book pro (M1芯片)电脑打开idea卡顿,cpu飙升的问题。
  15. Python时间24小时制和12小时制转换
  16. 23.从0学ARM-网卡DM9000及uboot协议栈详解
  17. 321套Excel可视化图表、Excel模板(在Excel里面实现数据可视化),史上最全Excel可视化图表,模板
  18. 【附注册教程】10分钟学会WINDOWS、MAC、LINUX如何安装ChatGPT桌面版
  19. 燕山大学——软件用户界面设计(八)原型设计
  20. 图片布局的最全实现方式都在这了!附源码

热门文章

  1. python如何单步调试程序_python如何单步调试
  2. win10系统下使用onnxruntime部署yolov5模型
  3. 基于kendryte K210 的Sipeed M1W上电
  4. 【2021-11】 CKAD 2
  5. 苹果挖走英特尔5G项目一重要工程师 领英资料显示2月份就已入职
  6. SSM之一点一滴:mybatis parameterType传入类型 resultType返回类型
  7. 阿里P8熬了一个月肝出这份32W字Java面试手册,Github标星31K+,持续涨星中
  8. 概率统计——期望、方差与最小二乘法
  9. 微信小程序毕业设计 基于微信电影播放小程序系统开题报告
  10. java 前言中不允许有内容,Java解析XML文档给出了“序言中不允许的内容”。