普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 581|回复: 1

拜托大佬们看看,STC89C52RC LCD1602问题

[复制链接]

1

主题

1

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2024-1-9 10:32:30 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 WWWQIUJIUWA 于 2024-1-9 10:43 编辑

拜托拜托,拜托大佬们看看问题,我做的控制直流电机转速,lcd应该显示转速,这里lcd有亮但是没有显示,没有用上数码管,数码管却变化,是什么问题
仿真是都可以的    用的普中A2    电机有转动,蜂鸣器没响,按钮控制也正常

#define uint unsigned int
#define uchar unsigned char        

#define out P0
sbit P1_0=P1^0;
sbit Rs = P2^6;   // 位变量   寄存器选择(1-数据,0-命令/状态寄存器)
sbit Rw = P2^5;   // 读写操作选择(1-读,0-写)
sbit En = P2^7;        // 使能信号
sbit K1  = P3^0;                //按钮
sbit K2  = P3^1;
sbit K3  = P3^2;
sbit K4  = P3^3;
sbit BULL  = P1^5;                //蜂鸣器
uchar time;
uint temp,humi;
enum {TEMP,HUMI};
typedef union               //定义共用同类型
{   
        unsigned int i;
        float f;
}value;
void DelayMs(uint t);
void lcd_init();
void lcdwrite(uchar com);
void lcdwritedata(uchar dat);
void str(uchar *str);
void lcdxy(uchar line,uchar column);
void lcdprintnum(uchar num);
void lcd_showinit(void);
//1ms延时函数
void DelayMs(uint t)         
{
        int x,y;
        for(x=0;x<t;x++)
        for(y=0;y<112;y++);
}

// LCD初始化函数

void lcd_init()
{
    lcdwrite(0x38);        // 写入命令六  0x38:8位两行显示,5×7点阵字符           00111000

        lcdwrite(0x0c);        // 写入命令四  0x0C:开整体显示,光标关,无黑块        00001100

        lcdwrite(0x06);        //写入命令三  0x06:光标右移                                 00000110

        lcdwrite(0x01);      //写入命令一  0x01:清屏                                          00000001
           DelayMs(1);
}
// 写命令函数,cmd就是要写入的命令

void lcdwrite(uchar com)
{
    Rs= 0;                  //命令寄存器
    Rw= 0;            //  RS,E同时为零,才可写入命令
    En= 0;
        P0=com;                   //将命令com写入P0口   
        _nop_();                //空操作一个机器周期,等待硬件反应
    En = 1;       //写命令是需E为正脉冲,即正跳变 ,所以前面置E=0
        DelayMs(1);           //延时等待硬件反应
    En = 0;          //变低电平,LCD执行命令
}



// 写数据函数,dat就是要写入的命令

void lcdwritedata(uchar dat)
{
        En = 0;            //  写数据需E为正脉冲,先置E=0
    Rs = 1;            //  数据寄存器
    Rw = 0;                   //        RS=1,RW=0可写数据
        P0=dat;                   //将数据dat从P0口输出,即写入LCD  
        _nop_();
    En = 1;   
        DelayMs(1);
    En = 0;
}



// lcd光标定位函数

void lcdxy(uchar line,uchar column)
{
    if(line==1)        // 第一行
        lcdwrite(0x80+column-1);
    if(line==2)        // 第二行
        lcdwrite(0xC0+column-1);
}

// 输出字符串函数

void str(uchar *str)
{
    while(*str!='\0')
        lcdwritedata(*str++);
}

// lcd输出数字

void lcdprintnum(uchar num)
{
        lcdwritedata(num/10+0x30);        // 十位
        lcdwritedata(num%10+0x30);        // 个位
}

// lcd显示初始化

void lcd_showinit(void)
{
        lcdxy(2,1);                                          
        str("PWM:");

}

//主函数
void main(void)
{
        uchar i;
        uchar j;
        uchar k;
        lcd_init();                                    // 液晶功能初始化
        lcd_showinit();                                // 液晶显示内容初始化
P1_0=0;
TMOD=0x01;           //  TO方式1
TH0=(65536-250)/256;        
TL0=(65536-250)%256;
ET0=1;                           // T0中断允许
EA=1;                           //总中断开启
TR0=1;                           //T0中断打开
time=0;                           //
temp=50;                   //
i=0;
j=0;
k=0;
        while(1)
        {
                  
                if(K1==0)                                 //加速
            {        
                   temp=temp+1;
                   while(!K1);                  
            
                }
                  if(K2==0)                         //减速
            {         
               temp=temp-1;
                   while(!K2);                    
            
                }                        
                if(K3==0)                        
            {         
                   BULL=0;
                   while(!K3);         
                   BULL=1;
                   DelayMs(2000);
                   temp=0;

            }
                if(K4==0)                    //关闭,启动
            {         
               
                     i++;
                     if(i%2==1)   
                     {
                        BULL=0;
                        temp=0;         
                        while(!K4);         
                        BULL=1;
                     }
                    else
                 {                              
                   BULL=0;
                        temp=50;        
                          while(!K4);            
                        BULL=1;
                 }
               
                }
                                 
                        lcdxy(2,5);
                        lcdwritedata(temp/10+'0');
                        lcdwritedata(temp%10+'0');
               
               

        }        
}

void T0_int(void) interrupt 1 using 1
{
time++;
if(time>=100)          //PWM占空比值超过100,变0
  {
    time=0;
  }
if(time<=temp)
  {
    P1_0=1;
  }
else P1_0=0;
TH0=(65536-250)/256;        //重新赋值
TL0=(65536-250)%256;
TR0=1;                                  //手动启动T0
}

我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有1人回答

附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册
回复

使用道具 举报

0

主题

1

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2024-1-9 20:25:45 | 显示全部楼层
调下对比度
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-28 05:09 , Processed in 0.097907 second(s), 31 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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