久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
c52單片機的1602液晶屏只顯示第一排的黑格子 求幫助
[打印本頁]
作者:
51黑迪多斯
時間:
2019-12-23 20:42
標題:
c52單片機的1602液晶屏只顯示第一排的黑格子 求幫助
我做的矩陣鍵盤輸入,LCD屏幕顯示,可以實現9999以內簡單的四則運算,
把程序燒進去后LCD1602卻只顯示一排黑色方塊,求大神來看看是哪里出了問題。
程序如下
//利用51單片機控制LCD1602,實現加減乘除運算
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define DATE_IO P0//P0口并行傳輸數據(LCD1602的數據端接P0口)
sbit RS=P1^0;//LCD1602寄存器選擇端
sbit E=P1^2; //使能信號端
sbit RW=P1^1;//讀寫控制端
sbit deng=P1^3;//結果
sbit shuzi11=P3^2;//前面的數字加1(因為我的按鍵是與P3口相連的)
sbit shuzi22=P3^7; //后面的數字加1
sbit jia=P3^3;//加號
sbit jian=P3^4;//減號
sbit cheng=P3^5;//乘號
sbit chu=P3^6;//除號
uint countqian=0,counthou=0;//數值
uchar qian,bai,shi,ge,a=0;
uchar code table1[]="0123456789";
uchar code table2[]="+-*/";
//**********************延時函數*****************************************
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的函數*******************************
void write_command(uchar come)//寫指令函數
{
RS=0;//選擇指令寄存器
E=1;//由高電平跳變成低電平時,液晶執行命令
DATE_IO=come;
delay_us(5);
E=0;
RS=1;
}
void write_date(uchar date)//寫數據函數
{
RS=1;//選擇數據寄存器
E=1;//由高電平跳變成低電平時,液晶執行命令
DATE_IO=date;
delay_us(5);
E=0;
RS=0;
}
//********************************************************************************
//**************************液晶初始化函數(基本上就是這個模式)*******************
void init()//液晶初始化函數
{
RW=0;//低電平時進行寫操作(高電平時進行讀操作)
E=0;
write_command(0x38);//設置LCD兩行顯示,一個數據由5*7點陣表示,數據由8跟線傳輸
delay_ms(5);
write_command(0x01);//清除屏幕顯示
delay_ms(5);
write_command(0x06);//設定輸入方式,增量不移位
delay_ms(5);
write_command(0x0c);//開整體顯示,關光標,不閃爍
delay_ms(5);
}
//**********************************************************************************
void jiayiqian()//前邊數字加1計數函數
{
if(shuzi11==0)//如果前面加1的按鍵按下
{
delay(50);//消除抖動
countqian=countqian+1;
}
if(countqian==999)//記到999歸0
countqian=0;
}
void jiayihou()//后邊數字加1計數函數
{
if(shuzi22==0)//如果后面加1的按鍵按下
{
delay(50);//消除抖動
counthou=counthou+1;
}
if(counthou==999)//記到999歸0
counthou=0;
}
void fuhao()//+,-,*,/運算號
{
if(jia==0)//如果加號按下
{
while(!jia);//等待按鍵的釋放
write_date(table2[0]);//顯示'+'
a=1;//加號按下的標志
}
if(jian==0)//如果減號按下
{
while(!jian);//等待按鍵的釋放
write_date(table2[1]);//顯示'-'
a=2;//減號按下的標志
}
if(cheng==0)//如果乘號按下
{
while(!cheng);//等待按鍵的釋放
write_date(table2[2]);//顯示'*'
a=3; //乘號按下的標志
}
if(chu==0)////如果除號按下
{
while(!chu);//等待按鍵的釋放
write_date(table2[3]);//顯示'/'
a=4;//除號按下的標志
}
}
void chaiqian()//將前邊各位數字拆開函數
{
bai=countqian/100;//求百位數字
shi=countqian%100/10;//求十位數字
ge=countqian%10;//求各位數字
}
void chaihou()//將后邊各位數字拆開函數
{
bai=counthou/100;//求百位數字
shi=counthou%100/10;//求十位數字
ge=counthou%10;//求各位數字
}
void chaijiejia()//將相加結果各位數字拆開函數
{
qian=(countqian+counthou)/1000;//求千位數字
bai=(countqian+counthou)%1000/100;//求百位數字
shi=(countqian+counthou)%100/10;//求十位數字
ge=(countqian+counthou)%10;//求各位數字
}
void chaijiejian()//將相減結果各位數字拆開函數
{
qian=(countqian-counthou)/1000;//求千位數字
bai=(countqian-counthou)%1000/100;//求百位數字
shi=(countqian-counthou)%100/10;//求十位數字
ge=(countqian-counthou)%10;//求各位數字
}
void chaijiecheng()//將相乘結果各位數字拆開函數
{
qian=(countqian*counthou)/1000;//求千位數字
bai=(countqian*counthou)%1000/100;//求百位數字
shi=(countqian*counthou)%100/10;//求十位數字
ge=(countqian*counthou)%10;//求各位數字
}
void chaijiechu()//將相除結果各位數字拆開函數(只取了模值)
{
qian=(countqian/counthou)/1000;//求千位數字
bai=(countqian/counthou)%1000/100;//求百位數字
shi=(countqian/counthou)%100/10;//求十位數字
ge=(countqian/counthou)%10;//求各位數字
}
void xianshiqian()//顯示前邊數字
{
write_command(0x80);//設置顯示地址為LCD第一行,一旦首地址確定,顯示完第一個數字后,光標會自動加1右移
write_date(table1[bai]);//第一位顯示百位
write_date(table1[shi]); //第二位顯示十位
write_date(table1[ge]); //第三位顯示個位
fuhao();//顯示運算號
delay(50);//改變數值可以修改數字滾動的速度
}
void xianshihou()//顯示后邊數字
{
write_command(0x80+4);//設置顯示地址為LCD第一行,一旦首地址確定,顯示完第一個數字后,光標會自動加1右移
write_date(table1[bai]);//第一位顯示百位
write_date(table1[shi]); //第二位顯示十位
write_date(table1[ge]); //第三位顯示個位
//delay(50);//改變數值可以修改數字滾動的速度
}
void xianshijie()//顯示結果
{
write_command(0xc0);//設置顯示地址為LCD第二行,一旦首地址確定,顯示完第一個數字后,光標會自動加1右移
write_date(table1[qian]);//第一位顯示千位
write_date(table1[bai]);//第二位顯示百位
write_date(table1[shi]); //第三位顯示十位
write_date(table1[ge]); //第四位顯示個位
//delay(50);//改變數值可以修改數字滾動的速度
}
void main()//主函數
{
init();//調用液晶初始化函數
while(1)
{
jiayiqian();//調用前邊數字加1計數函數
chaiqian();//調用將前邊數字各位數字拆開函數
xianshiqian();//顯示前邊數字
jiayihou();//調用后邊數字加1計數函數
chaihou();//調用將后邊數字各位數字拆開函數
xianshihou();//顯示后邊數字
if(deng==0)//控制顯示結果的按鍵按下
{
if(a==1)//計算的是加法
{
chaijiejia();//將結果的各位數字拆分開
xianshijie(); //顯示結果
}
if(a==2)//計算的是減法
{
chaijiejian(); //將結果的各位數字拆分開
xianshijie();//顯示結果
}
if(a==3)//計算的是乘法
{
chaijiecheng();//將結果的各位數字拆分開
xianshijie(); //顯示結果
}
if(a==4) //計算的是除法
{
chaijiechu();//將結果的各位數字拆分開
xianshijie(); //顯示結果
}
}
}
}
作者:
YJGG
時間:
2019-12-24 09:02
簡化程序,從顯示一個字符去排查
作者:
桂林y
時間:
2019-12-24 10:21
對比調節了嗎
作者:
166864646883
時間:
2019-12-26 16:10
你直接貼這么大一段,誰有耐心去看。顯示黑格子,一般是讀寫時序有問題,主要檢查時序
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
国产女人叫床高潮大片免费
|
伊人久久在线观看
|
日韩成人免费中文字幕
|
一级黄色短片
|
精品国产欧美日韩不卡在线观看
|
欧美一区二区三区,视频
|
av日韩精品
|
18gay男同69亚洲网站
|
成年人黄色小视频
|
动漫www.被爆羞羞av44
|
久久久久久成人
|
午夜精品久久久久久不卡欧美一级
|
五月综合激情在线
|
精品日韩一区
|
欧美一级在线
|
亚洲理论在线观看电影
|
国产一区二区三区四区
|
亚洲成人精品在线
|
国产激情视频在线免费观看
|
欧美极品在线播放
|
久久亚洲精品国产精品紫薇
|
免费视频一区二区三区在线观看
|
亚洲欧洲日韩
|
成人一区二区在线
|
www日
|
日韩高清av
|
久久黄网
|
欧美久久精品一级黑人c片 91免费在线视频
|
国产精品污www一区二区三区
|
有码一区
|
国产精品久久久亚洲
|
久久这里有精品
|
国产精品久久久久久久久久久免费看
|
国产一区二区在线免费
|
国产精品国产精品国产专区不片
|
久久久片
|
日韩资源
|
91网站在线观看视频
|
蜜桃av人人夜夜澡人人爽
|
免费麻豆视频
|
日韩精品一区二区三区
|