找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3594|回复: 1
打印 上一主题 下一主题
收起左侧

EC11+lcd1602 C51程序问题求教

[复制链接]
跳转到指定楼层
楼主
ID:149451 发表于 2016-11-29 20:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天在学着检测编码开关EC11,在网上找到一个比较完整的C51程序代码(http://wenku.baidu.com/link?url=juGohi5ki6MRLXFjklQW6Kqr92sFfQb-viy3mc58xG12zg3AUhVe6yf63dQa6Sq461fz0ZsnvKYdAt7FOybpSKIZJYt94qEvMgqZwspBRI_###),对照自己的开发板稍加修改(主要是与LCD1602的驱动端子),下载运行后乱跳,LCD1602屏上数字转一下编码器就按2、4、8、16、32、64、128   +升到128,是不是我用的是EC11,与原帖作者的编码器不同的原因?还有代码最后一句P3,是不是笔误?。请明白的大侠指点一二,谢谢。

#include<reg51.h>  
#include <MATH.H>  
/**********************************
宏定义字符串
**********************************/  
#define uchar unsigned char   
#define LCD_DAT P0 //LCD数据/指令输入端(D7,D6,D5,D4,D3,D2,D1,D0)  
sbit LCD_RW = P2^3;//LCD读写控制端
sbit LCD_RS = P2^4;//LCD指令/数据控制端
sbit LCD_E = P2^2; //LCD使能控制端
sbit AA  = P1^0;//接编码器A端
sbit BB  = P1^1;//接编码器B端
/**********************************
任意ms延时函数
**********************************/
void delayms(uchar count)
{
uchar i,j;
for(i = 0; i < count; i++)
for(j = 0; j < 120; j++);  
}  
/**********************************
  5ms延时函数
**********************************/
void delay(void) //延时5ms
{
uchar a, b;  
for(b = 19; b > 0; b--)
for(a = 130; a > 0; a--);  
}  
/**********************************
LCD写函数
**********************************/  
void LCD_W(uchar m, uchar com_dat) //m=0:写指令,m=1:写数据
{
LCD_RS = m;  
LCD_RW = 0;//写操作
LCD_E = 0; //使能禁止
LCD_DAT = com_dat; //在指令/数据端置数
delay();   //5ms延时
LCD_E = 1; //使能允许
delay();   //5ms延时
LCD_E = 0; //使能禁止
}  
/**********************************
LCD初始化函数
**********************************/
void LCD_INIT()
{
delay();  
delay();  
delay(); //5ms延时
LCD_W(0, 0x38); //不检测忙信号
delay();  
LCD_W(0, 0x38); //不检测忙信号
delay();  
LCD_W(0, 0x38); //不检测忙信号
LCD_W(0, 0x38); //显示模式
LCD_W(0, 0x08); //显示关闭
LCD_W(0, 0x06); //光标移动
LCD_W(0, 0x0c); //显示开和光标设置
}  
/**********************************
LCD清屏函数
**********************************/
void CLS()
{
LCD_W(0, 0x01); //清屏
}  
/**********************************
LCD定位函数
**********************************/
void LOCATE(uchar H, uchar L)
{
if(H == 1) //如果是第一行
LCD_W(0, 0x80 + L - 1); //定位在第一行第L列
else
LCD_W(0, 0x80 + 0x40 + L - 1); //否则定位在第二行第L列
}  
/**********************************
LCD显示数值函数
**********************************/
void LCD(unsigned long num)
{
char n, m;  
unsigned long ww;  
if(num > 9) //两位数以上进行处理显示
{
  n = log10(num); //取数值的位数
  for(m = n; m >= 0; m--)     //从高位开始输出
  {
   ww = (num / pow(10, m)); //从高位向低位依次取数
   ww = ww % 10;            //取各次的最低位数
   LCD_W(1, 48 + ww);      //输出
  }  
}  
else LCD_W(1, 48 + num);  //一位数直接显示
LCD_W(1, ' '); //显示空格
LCD_W(1, ' '); //显示空格
LCD_W(1, ' '); //显示空格
}  
/**********************************
主函数
**********************************/
void main()
{
uchar kkk, keys, tmp = 1;
LCD_INIT();//LCD初始化
CLS();//清屏
while(1)
{
  if(AA == 0)//开始检测是否旋转了开关
  {
   delayms(10);//消除抖动
   if(AA == 0) //确实是旋转了,进行正反转判断
   {
    if(BB == 0)//正转,进行正转处理
    {
     tmp = tmp * 2;//为了使LED正向递增
     if(tmp == 0)tmp = 128;//达到最大值,不再加
     kkk = '+';//正转显示+  
    }  
    if(BB == 1)//反转,进行反转处理
    {
     tmp = tmp / 2;//为了使LED反向递减
     if(tmp == 0)tmp = 1;//达到最小值,不再
     kkk = '-';//反转显示-  
    }  
   }  
   LOCATE(1,1);//定位第 1 行 1 列
   LCD(tmp);//显示数值
   LOCATE(1,5);//定位第1 行5 列
   LCD_W(1, kkk);//显示字符
   keys = 0;//延时等待计数器
   while(AA == 0)//等待开关A端复位(断开),防止出现乱加减的现象
   {
    delayms(20);//延时等待
    keys++;//计数器加1  
    if(keys == 50)break;//达到 1 秒没有复位,开关卡住了,退出继续扫描开关
   }  
  }  
  P0 = ~tmp; //输出到P0  (原帖子里是P3,是不是笔误?)
}
}  

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-12-2 16:44 | 只看该作者
你这个程序和百度文库好像不是同一个吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表