標題:
51單片機1602液晶顯示-NE555頻率計/555的2號引腳連接不對
[打印本頁]
作者:
SZDXYJH
時間:
2018-5-27 19:27
標題:
51單片機1602液晶顯示-NE555頻率計/555的2號引腳連接不對
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD_RS= P2^6;//定義LCD引腳
sbit LCD_RW= P2^5;
sbit LCD_E= P2^7;
uchar codeDIS[]={"NE555-------TEST"};//NE555 測試;
uchar codedsptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表碼;
uchari,c[4],a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint s;
/*====================延時子程序====================*/
void delay(uint z)
{
uchar m;
for(;z>0;z--)
for(m=124;m>0;m--);
}
void delay400ms(void)////400ms延時
{ uchar z = 5;
uintm;
while(z--)
{m=7269;
while(m--);
}
}
/*====================LCD1602子程序====================*/
/*-- 讀狀態(tài) --*/
//讀狀態(tài)子程序;有返回值;返回值類型為CHAR型;
//讀回的狀態(tài)通過RETURN返回;
uchar read_estate(void) //定義有返回值的函數(shù);
{ P0=0Xff; //把LCD端口全置1方便讀取信號;
LCD_RS=0; //RS置0;
LCD_RW=1; //RW置1;
LCD_E=0; //E端置0;
delay(10); //短延時;
LCD_E=1; //E端置1;以鎖存數(shù)據(jù);
while(P0&0x80); //檢測忙,則一直循環(huán);
return(P0); //返回讀取的信號;
}
/*-- 寫數(shù)據(jù) --*/
//寫數(shù)據(jù)子程序;無返回值;輸入變量I;
//I為要寫入LCD中的數(shù)據(jù);
//數(shù)據(jù)類型CHAR形;
void write_data(uchar i) //定義輸入變量值I;
{
read_estate(); //檢測忙信號;
P0=i; //把I中數(shù)據(jù)送到LCD數(shù)據(jù)端;
LCD_RS=1; //RS置1;
LCD_RW=0; //RW置0;
LCD_E=0; //E置0;
delay(10); //短延時;
LCD_E=1; //E置1;以鎖存數(shù)據(jù);
}
/*-- 寫指令 --*/
//寫指令子程序;無返回值;輸入二個變量I和J.
//I為要寫入LCD的指令;J為判斷要不要檢測忙.
//如果J為0則不判斷檢測忙;
//如果J為1則判斷檢測忙;
void write_dictate(uchar i,j) //定義二個變量;
{
if(j)read_estate(); //根據(jù)需要檢測忙;
P0=i; //把要寫入的數(shù)據(jù)送到LCD數(shù)據(jù)端;
LCD_RS=0; //RS置0;
LCD_RW=0; //RW置0;
LCD_E =1; //E端置0;
delay(10); //延時;
LCD_E =0; //E端置1;以鎖存數(shù)據(jù);
}
/*-- LCD初始化 --*/
//LCD初始化程序;主要作用初始化LCD,對LCD進行復位以及設(shè)置;
void initialization(void) //定義函數(shù);
{
delay(50); //延時5MS;
write_dictate(0x38,0); //寫指令38H;不檢測忙;
delay(50); //延時5MS;
write_dictate(0x38,0); //寫指令38H;不檢測忙;
delay(50); //延時5MS;
write_dictate(0x38,0); //寫指令38H;不檢測忙;
delay(50);
write_dictate(0x38,1); //顯示模式設(shè)置;檢測忙;
write_dictate(0x08,1); //關(guān)閉顯示;檢測忙;
write_dictate(0x01,1); //顯示清屏;檢測忙;
write_dictate(0x06,1); //顯示光標移動設(shè)置;檢測忙;
write_dictate(0x0C,1); //顯示開及光標設(shè)置;檢測忙;
}
/*-- 在指定位置顯示一個字符 --*/
void displayonechar(uchar x, y,ddata)
{
y &= 0x01;
x &= 0x0f; //限制X不能大于15,Y不能大于1
if (y) x+= 0x40; //當要顯示第二行時地址碼+0x40;
x+= 0x80; //算出指令碼
write_dictate(x,0); //這里不檢測忙信號,發(fā)送地址碼
write_data(ddata);
}
/*-- 在指定位置顯示一串字符 --*/
void displaylistchar(uchar x,y,uchar code*ddata)
{uchar a=0;
y&=0x01;
x&=0xf;
while(ddata[a]>0x20)
{if(x<=0xff)
{
displayonechar(x, y,ddata[a]);
a++;
x++;
}
}
}
/*====================MAIN主程序====================*/
void main()
{
delay400ms();//延時400MS
initialization();//LCD復位;
displaylistchar(0,0,DIS);//顯示NE555 測試;
displayonechar(0,1,'F'); //在LCD是顯示F=____Hz
displayonechar(1,1,'=');
displayonechar(9,1,'H');
displayonechar(10,1,'z');
TMOD=0X51; //定義T0為方式一(十六位進制),T1為計數(shù)器(16位)
TH0=0X3C; //50 ms
TL0=0XB0;
TH1=0X00; //初始值
TL1=0X00;
TR0=1;
TR1=1;
ET0=1;
ET1=0;
EA=1;
i=0;
/* 顯示 */ // 調(diào)用顯示子程序(顯示位,顯示行,顯示數(shù)據(jù))注:顯示行 “0”為第一行,“1為第二行”
while(1)
{
if(s/10000>=1)
{
displayonechar(2,1,dsptab[s/10000]);//萬
displayonechar(3,1,dsptab[s/1000%10]);//千
displayonechar(4,1,'.');//點
displayonechar(5,1,dsptab[s/100%10]);//百
displayonechar(6,1,dsptab[s/10%10]);//十
displayonechar(7,1,dsptab[s%10]); //個
displayonechar(8,1,'K');
}
else if(s/1000>=1)
{
displayonechar(2,1,' ');
displayonechar(3,1,dsptab[s/1000%10]);//千
displayonechar(4,1,'.'); //點
displayonechar(5,1,dsptab[s/100%10]);//百
displayonechar(6,1,dsptab[s/10%10]); //十
displayonechar(7,1,dsptab[s%10]); //個
displayonechar(8,1,'K');
}
else if(s/100>=1)
{
displayonechar(2,1,' ');
displayonechar(3,1,' ');
displayonechar(4,1,' '); //萬
displayonechar(5,1,' '); //千
displayonechar(6,1,dsptab[s/100%10]);//百
displayonechar(7,1,dsptab[s/10%10]); //十
displayonechar(8,1,dsptab[s%10]); //個
}
else if(s/10>=1)
{
displayonechar(2,1,'');
displayonechar(3,1,'');
displayonechar(4,1,''); //萬
displayonechar(5,1,''); //千
displayonechar(6,1,' ');//百
displayonechar(7,1,dsptab[s/10%10]); //十
displayonechar(8,1,dsptab[s%10]); //個
}
else
{
displayonechar(2,1,'');
displayonechar(3,1,'');
displayonechar(4,1,''); //萬
displayonechar(5,1,''); //千
displayonechar(6,1,'');//百
displayonechar(7,1,dsptab[s/10%10]);//十
displayonechar(8,1,dsptab[s%10]); //個
}
}
}
/* 中斷 */
void t0()interrupt 1
{
TH0=0X3C;
TL0=0XB0;
i++;
if(i==20) //1 s時間到時
{
s=TH1; //555信號發(fā)生器的輸出口接P3.5(T1) 15腳
s=s<<8;
s=s+TL1;
i=0; //清零
TH1=0X00;
TL1=0X00;
}
}
/*----------------------------------------------------------------*/
/*----------------- 1602液晶數(shù)據(jù)讀取子程序 -----------------------*/
//讀數(shù)據(jù)子程序;有返回值,返回值類型為CHAR型;
/*uchar read_data(void) //定義有返回值的子函數(shù);
{
LCD_DATA=0Xff; //LCD數(shù)據(jù)端口置1;
LCD_RS=1; //RS置1;
LCD_RW=1; //RW置1;
LCD_E=0; //E置0;
delay(10); //短延時;
LCD_E=1; //E置1;以鎖存數(shù)據(jù);
return(LCD_DATA); //返回讀取的值;
}
/*----------------------------------------------------------------*/
復制代碼
測試系統(tǒng).zip
2018-5-27 19:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
36.36 KB, 下載次數(shù): 13, 下載積分: 黑幣 -5
Proteus仿真圖
作者:
admin
時間:
2018-5-27 23:41
請先把問題描述清楚吧,帖子先轉(zhuǎn)到這里來
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1