历史上的今天
返回首页

历史上的今天

今天是:2025年02月08日(星期六)

正在发生

2020年02月08日 | 基于52单片机控制编码器显示程序

2020-02-08 来源:51hei

#include "reg52.h"  

  

#define uchar unsigned char

#define uint unsigned int

#define LCD1602_DATAPINS P0

sbit LCD1602_E=P2^7;

sbit LCD1602_RW=P2^5;

sbit LCD1602_RS=P2^6;

sbit DIR=P1^0;

sbit STEP=P1^1;

sbit K1=P3^1;

sbit K2=P3^0;

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

uchar code digit[ ]={"0123456789"}; //定义字符数组显示数字

uchar idata TEST[]="SPEED";


//电机正反转二维数组 0为逆时针,1为顺时针

uchar code MotorCode[2][8]={{0x04,0x06,0x02,0x0a,0x08,0x09,0x01,0x05},{0x05,0x01,0x09,0x08,0x0a,0x02,0x06,0x04}};

sbit EncoderA=P3^2;    //编码器A相

sbit EncoderB=P3^4;    //编码器B相

uint EncoderCount=0 ; 


void delay(u16 i)

{

while(i--); 

}

void Lcd1602_Delay1ms(uint c)   //误差 0us

{

        uint a,b;

        for(a=c;a>0;a--)

                for(b=114;b>0;b--); 

}

#ifndef  LCD1602_4PINS  //当没有定义这个LCD1602_4PINS时

void LcdWriteCom(uchar com)   //写入命令

{

LCD1602_E = 0;     //使能

LCD1602_RS = 0;    //选择发送命令

LCD1602_RW = 0;    //选择写入


LCD1602_DATAPINS = com;     //放入命令

Lcd1602_Delay1ms(1);  //等待数据稳定

LCD1602_E = 1;           //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}

#else 

void LcdWriteCom(uchar com)   //写入命令

{

LCD1602_E = 0;  //使能清零

LCD1602_RS = 0;  //选择写入命令

LCD1602_RW = 0;  //选择写入

LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1;  //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

LCD1602_DATAPINS = com << 4; //发送低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;  //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

/*******************************************************************************

* 函 数 名         : LcdWriteData

* 函数功能     : 向LCD写入一个字节的数据

* 输    入         : dat

* 输    出         : 无

*******************************************************************************/     

#ifndef  LCD1602_4PINS     

void LcdWriteData(uchar dat)   //写入数据

{

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择输入数据

LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat; //写入数据

Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}

#else

void LcdWriteData(uchar dat)   //写入数据

{

LCD1602_E = 0;   //使能清零

LCD1602_RS = 1;   //选择写入数据

LCD1602_RW = 0;   //选择写入

LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位

Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

#ifndef  LCD1602_4PINS

/*=================================================

*函数名称:LCD1602_Dis_OneChar

*函数功能:在指定位置显示一个字符

*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();        

*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)

                dat:需要显示的数据以ASCLL形式显示

=================================================*/

void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)

{

        if(y)        x |= 0x40;

        x |= 0x80;

        LcdWriteCom(x);

        LcdWriteData(dat);                

}

#endif

/*=================================================

*函数名称:LCD1602_Dis_Str

*函数功能:在指定位置显示字符串

*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();

*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)

                *str:需要显示的字符串

=================================================*/

#ifndef  LCD1602_4PINS 

void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)

{

        if(y) x |= 0x40;

        x |= 0x80;

        LcdWriteCom(x);

        while(*str != '')

        {

                LcdWriteData(*str++);

        }

}

#endif

/*******************************************************************************

* 函 数 名       : LcdInit()

* 函数功能   : 初始化LCD屏

* 输    入       : 无

* 输    出       : 无

*******************************************************************************/     

#ifndef  LCD1602_4PINS

void LcdInit()        //LCD初始化子程序

{

  LcdWriteCom(0x38);  //开显示

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

#else

void LcdInit()        //LCD初始化子程序

{

LcdWriteCom(0x32);  //将8位总线转为4位总线

LcdWriteCom(0x28);  //在四位线下的初始化

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

#endif


void keypros1()

{

  if(K1==0)  //检测按键K1是否按下

  {

   delay(1); //消除抖动

   if(K1==0)

   {

     while(1)

     { 

    TMOD=0x01;

          TH0=(65535-2000)/256;

          TL0=(65535-2000)%256;

          EA=1;

          ET0=1;

          TR0=1;

          

    DIR=0;

     }

   while(!K1);   

      }    

         }

}


推荐阅读

史海拾趣

ATM [Advanced Technical Materials]公司的发展小趣事

中国ATM的发展历程始于20世纪80年代中期。1987年,中国银行在珠海推出了中国大陆第一台ATM,标志着ATM在中国开始了发展。随后,经过数十年的快速发展,中国ATM市场经历了多个阶段,从初级阶段到专业化阶段,再到如今的快速发展阶段。中国ATM市场的繁荣,不仅反映了国内银行业电子化建设的成果,也体现了电子行业的快速发展和普及。

CSB公司的发展小趣事

在电子行业的初期,CSB公司以其独特的技术创新能力脱颖而出。公司研发团队在某一关键领域取得了重大突破,开发出了一款具有市场竞争力的新产品。这款产品不仅满足了消费者对性能和品质的高要求,还凭借其独特的设计和功能,吸引了大量忠实用户。随着产品的热销,CSB公司的知名度逐渐提升,市场份额也稳步增长。

Altera (Intel)公司的发展小趣事

随着技术的不断发展和市场的日益成熟,CSB公司意识到单纯依靠技术创新已无法满足企业长远发展的需求。于是,公司开始加强市场拓展和品牌建设。通过积极参加行业展会、加大广告宣传力度、优化销售渠道等方式,CSB公司成功提升了品牌知名度和美誉度。同时,公司还注重与合作伙伴建立长期稳定的合作关系,共同开拓市场,实现互利共赢。

DOMINANT公司的发展小趣事

在LED产业蓬勃发展的背景下,统明亮(DOMINANT)公司在2000年应运而生。它的诞生源于欧司朗(OSRAM)在马六甲工厂的分拆,加上马来西亚财团的加持,这家新公司迅速崭露头角。统明亮公司从成立之初就专注于LED技术的研发和生产,凭借其卓越的技术实力和创新能力,逐渐在电子行业中树立了良好的口碑。经过数年的不懈努力,统明亮在全球贴片式LED领域取得了领先地位,特别是在车用LED封装领域,其产品质量和技术水平均处于行业前列。

Abilis Systems公司的发展小趣事

为了进一步提升市场竞争力,统明亮公司在2016年推出了一款新型直角DomiLED产品。这款LED产品具有高光照强度、低热阻等特点,广泛应用于测光照明领域。新型直角DomiLED的推出,不仅丰富了统明亮的产品线,也进一步巩固了其在LED市场的领先地位。这款产品的成功推出,也充分展示了统明亮公司在LED技术创新方面的实力。

Dantona Industries公司的发展小趣事

Dantona Industries公司的创始人,Daniel Tona,在电子工程领域拥有深厚的背景。他看到了电子行业的巨大潜力,决定创立自己的公司。起初,他只有一间小办公室和几个志同道合的伙伴。为了节省成本,他们经常需要亲自采购材料、组装产品,甚至进行市场推广。在这个过程中,他们遇到了资金短缺、技术难题以及市场竞争等多重挑战。然而,凭借对技术的执着和对市场的敏锐洞察力,Daniel Tona带领团队一步步克服困难,逐渐在电子行业站稳了脚跟。

问答坊 | AI 解惑

LED数码管知识简介

replyreload += \',\' + 374455;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

Windows7与wince常用开发环境的兼容性问题

最近打算买台新电脑,想试试Windows7,不知道与wince的开发环境兼容性如何 我一般用到的软件有:PB5.0 EVC VS2005 VC++6.0 ADS1.2 Keil3…

查看全部问答>

关于TE2440-II 显示问题

TE2440-II的VGA是通过CH7026来把LCD信号转换成VGA信号的,我对比了下和阳初的BSP发现个问题,TE2440-II里找不到VGAinit,而且在KERNEL里的CFW.C文件中initdisplay函数中也没有关于VGA的初始化问题,请问TE2440-II的CH7026的控制程序在哪个地方啊(芯 ...…

查看全部问答>

求助

在微软的adocepbzip安装包的adocepb\\setup\\Data Access 3.1\\Program Files\\DataAccess31\\INCLUDE目录下,有这样两个文件adoce31.idl和adocec31.idl,在命令行中执行midl adoce31.idl和midl adocec31.idl即可生成.h文件. 为什么我的生不成啊 ...…

查看全部问答>

哪里有PowerPC开发培训

11月祥佑PowerPC嵌入式系统开发培训班 开始报名了 开课时间:2008年11月,为期三天。 上课地点:上海 课程教材:《PowerPC嵌入式开发系统实验教材》 收费标准: 4000元/人 注:本次开班7折优惠:2800元/人。(含讲义费,午餐费) 课程特点: ...…

查看全部问答>

力保产品质量 佛山发布LED筒灯联盟标准

 佛山本土的LED筒灯联盟标准近日在佛山市质监局发布。据悉,该标准由佛山市标准技术研究院、佛山市照明灯具协会、中山大学佛山研究院联合本土7家LED企业发起制定。   据悉,佛山是全国最大的筒灯生产基地,筒灯产量约占全国40%左右,目前已有120 ...…

查看全部问答>

Magafunction的用法

As design complexities increase, use of vendor-specific intellectual property (IP) blocks has become a common design methodology. Altera provides parameterizable megafunctions that are optimized for Altera device architectures. ...…

查看全部问答>

定时器0中断

本帖最后由 dontium 于 2015-1-23 13:29 编辑 我从EEWORLD网站上载了一些例子,学习2812。 没有电路板,只进行软件仿真。 其中一个定时器0中断,发现不进中断。 情况是这样的,观察定时器可以计数。 本来我定时器周期设为0XFFFFFFFF. 可是计 ...…

查看全部问答>

请教,在用IAR软件仿真单步运行程序时怎样才能使它不跳入中断?

请教,在用IAR软件单步运行程序时怎样才能使它不跳入中断?…

查看全部问答>

大家一起来讨论一哈16位计数器TAR的用法(针对169)

Q1:当Timer_A的捕获比较模块工作在捕获模式(即CAP = 1)时,TAR是里面的值表示什么含义?它是在对什么进行计数? Q2:TAR中的值写入CCRx后,TAR会自动清零吗?此时TAIFG的状态和TAR有关吗?…

查看全部问答>