久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1746|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

c52單片機(jī)的1602液晶屏只顯示第一排的黑格子 求幫助

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:660739 發(fā)表于 2019-12-23 20:42 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我做的矩陣鍵盤輸入,LCD屏幕顯示,可以實(shí)現(xiàn)9999以內(nèi)簡單的四則運(yùn)算,
把程序燒進(jìn)去后LCD1602卻只顯示一排黑色方塊,求大神來看看是哪里出了問題。
程序如下

//利用51單片機(jī)控制LCD1602,實(shí)現(xiàn)加減乘除運(yùn)算
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define DATE_IO P0//P0口并行傳輸數(shù)據(jù)(LCD1602的數(shù)據(jù)端接P0口)
sbit RS=P1^0;//LCD1602寄存器選擇端
sbit E=P1^2; //使能信號(hào)端
sbit RW=P1^1;//讀寫控制端
sbit deng=P1^3;//結(jié)果
sbit shuzi11=P3^2;//前面的數(shù)字加1(因?yàn)槲业陌存I是與P3口相連的)
sbit shuzi22=P3^7; //后面的數(shù)字加1
sbit jia=P3^3;//加號(hào)
sbit jian=P3^4;//減號(hào)
sbit cheng=P3^5;//乘號(hào)
sbit chu=P3^6;//除號(hào)

uint countqian=0,counthou=0;//數(shù)值
uchar qian,bai,shi,ge,a=0;

uchar code table1[]="0123456789";
uchar code table2[]="+-*/";

//**********************延時(shí)函數(shù)*****************************************
void delay_us(unsigned int n)
  {
        if(n==0)
           return ;           
        while(--n);
  }

void delay_ms(uint i)
{
         unsigned char a,b;
         for (a=1;a<i;a++)
                 for(b=1;b;b++);            
}

void delay(uint z)
{        
   uint x,y;
   for(x=110;x>0;x--)        
                for(y=z;y>0;y--);
}
//***********************************************************************

//*********************控制LCD1602的函數(shù)*******************************
void write_command(uchar come)//寫指令函數(shù)
{
        RS=0;//選擇指令寄存器
        E=1;//由高電平跳變成低電平時(shí),液晶執(zhí)行命令
        DATE_IO=come;
        delay_us(5);
        E=0;        
        RS=1;
}

void write_date(uchar date)//寫數(shù)據(jù)函數(shù)
{        
  RS=1;//選擇數(shù)據(jù)寄存器        
  E=1;//由高電平跳變成低電平時(shí),液晶執(zhí)行命令        
  DATE_IO=date;        
  delay_us(5);
  E=0;
  RS=0;
}
//********************************************************************************

//**************************液晶初始化函數(shù)(基本上就是這個(gè)模式)*******************
void init()//液晶初始化函數(shù)
{        
RW=0;//低電平時(shí)進(jìn)行寫操作(高電平時(shí)進(jìn)行讀操作)
E=0;
write_command(0x38);//設(shè)置LCD兩行顯示,一個(gè)數(shù)據(jù)由5*7點(diǎn)陣表示,數(shù)據(jù)由8跟線傳輸
delay_ms(5);
write_command(0x01);//清除屏幕顯示
delay_ms(5);
write_command(0x06);//設(shè)定輸入方式,增量不移位
delay_ms(5);
write_command(0x0c);//開整體顯示,關(guān)光標(biāo),不閃爍
delay_ms(5);
}
//**********************************************************************************

void jiayiqian()//前邊數(shù)字加1計(jì)數(shù)函數(shù)
{
  if(shuzi11==0)//如果前面加1的按鍵按下
  {
        delay(50);//消除抖動(dòng)
    countqian=countqian+1;
  }
  if(countqian==999)//記到999歸0
        countqian=0;
}

void jiayihou()//后邊數(shù)字加1計(jì)數(shù)函數(shù)
{
  if(shuzi22==0)//如果后面加1的按鍵按下
  {
        delay(50);//消除抖動(dòng)
    counthou=counthou+1;
  }
  if(counthou==999)//記到999歸0
        counthou=0;
}

void fuhao()//+,-,*,/運(yùn)算號(hào)
{
  if(jia==0)//如果加號(hào)按下
  {
    while(!jia);//等待按鍵的釋放
    write_date(table2[0]);//顯示'+'
        a=1;//加號(hào)按下的標(biāo)志
  }
   if(jian==0)//如果減號(hào)按下
   {
     while(!jian);//等待按鍵的釋放
     write_date(table2[1]);//顯示'-'
         a=2;//減號(hào)按下的標(biāo)志
   }
   if(cheng==0)//如果乘號(hào)按下
   {
    while(!cheng);//等待按鍵的釋放
   write_date(table2[2]);//顯示'*'
   a=3;        //乘號(hào)按下的標(biāo)志
   }
   if(chu==0)////如果除號(hào)按下
   {
     while(!chu);//等待按鍵的釋放
    write_date(table2[3]);//顯示'/'
        a=4;//除號(hào)按下的標(biāo)志
  }
}

void chaiqian()//將前邊各位數(shù)字拆開函數(shù)
{
  bai=countqian/100;//求百位數(shù)字
  shi=countqian%100/10;//求十位數(shù)字
  ge=countqian%10;//求各位數(shù)字
}

void chaihou()//將后邊各位數(shù)字拆開函數(shù)
{
  bai=counthou/100;//求百位數(shù)字
  shi=counthou%100/10;//求十位數(shù)字
  ge=counthou%10;//求各位數(shù)字
}

void chaijiejia()//將相加結(jié)果各位數(shù)字拆開函數(shù)
{
  qian=(countqian+counthou)/1000;//求千位數(shù)字
  bai=(countqian+counthou)%1000/100;//求百位數(shù)字
  shi=(countqian+counthou)%100/10;//求十位數(shù)字
  ge=(countqian+counthou)%10;//求各位數(shù)字
}

void chaijiejian()//將相減結(jié)果各位數(shù)字拆開函數(shù)
{
  qian=(countqian-counthou)/1000;//求千位數(shù)字
  bai=(countqian-counthou)%1000/100;//求百位數(shù)字
  shi=(countqian-counthou)%100/10;//求十位數(shù)字
  ge=(countqian-counthou)%10;//求各位數(shù)字
}

void chaijiecheng()//將相乘結(jié)果各位數(shù)字拆開函數(shù)
{
  qian=(countqian*counthou)/1000;//求千位數(shù)字
  bai=(countqian*counthou)%1000/100;//求百位數(shù)字
  shi=(countqian*counthou)%100/10;//求十位數(shù)字
  ge=(countqian*counthou)%10;//求各位數(shù)字
}

void chaijiechu()//將相除結(jié)果各位數(shù)字拆開函數(shù)(只取了模值)
{
  qian=(countqian/counthou)/1000;//求千位數(shù)字
  bai=(countqian/counthou)%1000/100;//求百位數(shù)字
  shi=(countqian/counthou)%100/10;//求十位數(shù)字
  ge=(countqian/counthou)%10;//求各位數(shù)字
}

void xianshiqian()//顯示前邊數(shù)字
{
  write_command(0x80);//設(shè)置顯示地址為LCD第一行,一旦首地址確定,顯示完第一個(gè)數(shù)字后,光標(biāo)會(huì)自動(dòng)加1右移
  write_date(table1[bai]);//第一位顯示百位
  write_date(table1[shi]); //第二位顯示十位
  write_date(table1[ge]); //第三位顯示個(gè)位
  fuhao();//顯示運(yùn)算號(hào)
  delay(50);//改變數(shù)值可以修改數(shù)字滾動(dòng)的速度
}

void xianshihou()//顯示后邊數(shù)字
{
  write_command(0x80+4);//設(shè)置顯示地址為LCD第一行,一旦首地址確定,顯示完第一個(gè)數(shù)字后,光標(biāo)會(huì)自動(dòng)加1右移
  write_date(table1[bai]);//第一位顯示百位
  write_date(table1[shi]); //第二位顯示十位
  write_date(table1[ge]); //第三位顯示個(gè)位
  //delay(50);//改變數(shù)值可以修改數(shù)字滾動(dòng)的速度
}

void xianshijie()//顯示結(jié)果
{
  write_command(0xc0);//設(shè)置顯示地址為LCD第二行,一旦首地址確定,顯示完第一個(gè)數(shù)字后,光標(biāo)會(huì)自動(dòng)加1右移
  write_date(table1[qian]);//第一位顯示千位
  write_date(table1[bai]);//第二位顯示百位
  write_date(table1[shi]); //第三位顯示十位
  write_date(table1[ge]); //第四位顯示個(gè)位
  //delay(50);//改變數(shù)值可以修改數(shù)字滾動(dòng)的速度
}

void main()//主函數(shù)
{
  init();//調(diào)用液晶初始化函數(shù)        
  while(1)
          {
            jiayiqian();//調(diào)用前邊數(shù)字加1計(jì)數(shù)函數(shù)
                chaiqian();//調(diào)用將前邊數(shù)字各位數(shù)字拆開函數(shù)
            xianshiqian();//顯示前邊數(shù)字
                jiayihou();//調(diào)用后邊數(shù)字加1計(jì)數(shù)函數(shù)
                chaihou();//調(diào)用將后邊數(shù)字各位數(shù)字拆開函數(shù)
            xianshihou();//顯示后邊數(shù)字
                if(deng==0)//控制顯示結(jié)果的按鍵按下
                {
                 if(a==1)//計(jì)算的是加法
                 {
                 chaijiejia();//將結(jié)果的各位數(shù)字拆分開
                 xianshijie(); //顯示結(jié)果
                 }
                 if(a==2)//計(jì)算的是減法
                 {
                 chaijiejian(); //將結(jié)果的各位數(shù)字拆分開
                 xianshijie();//顯示結(jié)果
                 }
                 if(a==3)//計(jì)算的是乘法
                 {
                 chaijiecheng();//將結(jié)果的各位數(shù)字拆分開
                 xianshijie(); //顯示結(jié)果
                 }
                 if(a==4) //計(jì)算的是除法
                 {
                 chaijiechu();//將結(jié)果的各位數(shù)字拆分開
                 xianshijie(); //顯示結(jié)果
                 }
                }
          }                          
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:23606 發(fā)表于 2019-12-24 09:02 | 只看該作者
簡化程序,從顯示一個(gè)字符去排查
回復(fù)

使用道具 舉報(bào)

板凳
ID:356963 發(fā)表于 2019-12-24 10:21 | 只看該作者
對(duì)比調(diào)節(jié)了嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:395068 發(fā)表于 2019-12-26 16:10 | 只看該作者
你直接貼這么大一段,誰有耐心去看。顯示黑格子,一般是讀寫時(shí)序有問題,主要檢查時(shí)序
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久69精品久久久久久国产越南 | 欧美一区二区三区免费在线观看 | 精品视频亚洲 | 91精品国产综合久久久久久蜜臀 | 黄色片在线看 | 日韩中文字幕 | 人妖av| 国产亚洲人成a在线v网站 | 欧美日韩视频一区二区 | 久久大全 | 国产 欧美 日韩 一区 | 色婷婷激情综合 | 国产精品久久久99 | 日韩国产欧美在线观看 | 久久久久久亚洲精品 | 久久久久国产精品一区 | 精品久久久久久久久久久久 | 精品国产视频在线观看 | 日日骚av| 大象一区| 久久国产电影 | 国产成视频在线观看 | 国产精品不卡一区 | 精品国产女人 | 亚洲精品久久久蜜桃网站 | 黄视频免费 | 亚洲欧美日韩国产 | 天天av综合 | 精品日韩一区 | 夜夜草av| 亚洲精品9999 | 日本黄色的视频 | 一区二区视频 | 天天综合成人网 | 中文字幕亚洲精品 | 亚洲欧美在线视频 | 国产精品久久久久久久久久久久 | 久久首页 | 天天精品在线 | 欧美一区二区在线 | 色婷婷狠狠 |