|
本帖最后由 wdsg 于 2018-6-20 11:52 編輯
原理圖能運(yùn)行,把lcd改成了led,程序是lcd的,但是不會改程序,有大神可以教一下嗎???
電路圖.PNG (59.72 KB, 下載次數(shù): 52)
下載附件
2018-6-20 11:49 上傳
程序:#include <reg52.h>
unsigned long int fre;
unsigned char time;
unsigned int count;
unsigned int count1;
sbit LCD_RS=P1^0; //片選信號
sbit LCD_RW=P1^1; //讀寫信號
sbit LCD_E=P1^2; //使能信號
#define LCD_DB P0 //數(shù)據(jù)信號
unsigned char character[10]={0};//在屏幕上顯示的字符串
unsigned char character_1[]={"fre= Hz"};
unsigned char FLAG = 0; //是否分頻選擇標(biāo)志
void LCD_init(void);//初始化函數(shù)
void LCD_write_command(unsigned char command);//寫指令函數(shù)
void LCD_write_data(unsigned char dat);//寫數(shù)據(jù)函數(shù)
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某個屏幕位置上顯示一個字符,X(0-15),y(1-2)
void delay_n40us(unsigned int n);//延時函數(shù)
void timer_init(); //中斷初始化函數(shù)
//-----------------------------延時函數(shù)---------------------------
void delay_n40us(unsigned int n) //延時函數(shù)
{
unsigned int i;
unsigned char j;
for(i=n;i>0;i--)
for(j=0;j<2;j++);
}
void delay_1s()
{
unsigned int i,j;
for(i = 0;i<100;i++)
for(j = 0;j<1000;j++);
}
//---------------------lcd1602液晶顯示函數(shù)--------------------
void LCD_init(void) //液晶初始化函數(shù)
{
LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
LCD_write_command(0x38);//設(shè)置8位格式,2行,5x7
LCD_write_command(0x0c);//整體顯示,關(guān)光標(biāo),不閃爍
LCD_write_command(0x06);//設(shè)定輸入方式,增量不移位
LCD_write_command(0x01);//清除屏幕顯示
delay_n40us(100);//清屏延時
}
void LCD_write_command(unsigned char dat) //寫命令函數(shù)
{
LCD_DB=dat;
LCD_RS=0;//指令
LCD_RW=0;//寫入
LCD_E=1; //使能
LCD_E=0;
delay_n40us(1);//寫命令延時
}
void LCD_write_data(unsigned char dat) //寫數(shù)據(jù)函數(shù)
{
LCD_DB=dat;
LCD_RS=1;//數(shù)據(jù)
LCD_RW=0;//寫入
LCD_E=1;//使能
LCD_E=0;
delay_n40us(1); //寫數(shù)據(jù)延時
}
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//顯示一個字符
{
unsigned char address;
if(y==1)
address=0x80+x; //顯示在第一排的時候的x的地址
else
address=0xc0+x; //顯示在第二排的時候的x的地址
LCD_write_command(address); //輸入地址
LCD_write_data(dat); //輸入數(shù)據(jù)
}
void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//顯示一個數(shù)字
{
unsigned char address;
if(y==1)
address=0x80+x; //顯示在第一排的時候的x的地址
else
address=0xc0+x; //顯示在第二排的時候的x的地址
LCD_write_command(address); //輸入地址
LCD_write_data(dat+48); //輸入數(shù)據(jù)
}
void dis_num(void)
{
unsigned char i=0,j=0,k=0;
LCD_write_command(0x01);//清除屏幕顯示
character[0] = fre/10000000;
character[1] = fre/1000000%10;
character[2] = fre/100000%10;
character[3] = fre/10000%10;
character[4] = fre/1000%10;
character[5] = fre/100%10;
character[6] = fre/10%10;
character[7] = fre%10;
character[8] = 'H';
character[9] = 'z';
for(i = 0;i<4;i++) //顯示“fre=”
{
LCD_disp_char(i+0,1,character_1);
}
for(i = 0;i<10;i++) //判斷第一個不為0的數(shù)
{
if(character!=0)
break;
}
k = 8-i;
for(j = 0;j<k;j++) //顯示所有的數(shù)字
{
LCD_disp_num(4+j,1,character[i++]);
}
for(i = 5;i<7;i++) //顯示“Hz”
{
LCD_disp_char(j+4,1,character_1);
j++;
}
}
//----------------主函數(shù)--------------------
void main()
{
unsigned char i;
LCD_init();
timer_init(); //定時/計數(shù)器初始化
for(i = 0;i<4;i++)
{
LCD_disp_char(i+0,1,character_1);
}
while(1)
{
dis_num(); //顯示
delay_1s();
}
}
//-------------------定時/計數(shù)器初始化--------------
void timer_init(void) //定時/計數(shù)器初始化
{
TMOD=0x66; //計數(shù)器0和計數(shù)器1工作工作方式2,自動重裝初值
TH0=0; //計數(shù)器初值為0
TL0=0;
TR0=1; //計數(shù)器開始計數(shù)
ET0=1; //打開計數(shù)器0中斷
TH1=0; //計數(shù)器初值為0
TL1=0;
TR1=1; //計數(shù)器開始計數(shù)
ET1=1; //打開計數(shù)器1中斷
RCAP2H=(65536-62500)/256; //在程序初始化的時候給RCAP2L和RCAP2H賦值,
RCAP2L=(65536-62500)%256; //TH2和TL2將會在中斷產(chǎn)生時自動使TH2=RCAP2H,TL2=RCAP2L。
TH2=RCAP2H; //12M晶振下每次中斷62.5ms(1s=1000ms=62.5ms×16)
TL2=RCAP2L;
ET2=1; //打開定時器2中斷
TR2=1; //定時器2開始計時
EA=1; //開總中斷
}
//------------------中斷函數(shù)----------------------
void timer2(void) interrupt 5 //定時器2中斷(62.5ms)
{
time++;
TF2=0; //定時器2的中斷標(biāo)志位TF2不能夠由硬件清零,所以要在中斷服務(wù)程序中將其清零
if (time==16) //定時1s時間到
{
time=0; //計時清0
EA=0; //關(guān)中斷
fre=(long)count1*256+TL1; //count*256強(qiáng)制轉(zhuǎn)換成long型,否則將不產(chǎn)生進(jìn)位~先判斷分頻后(計數(shù)器1)
FLAG = 0;
if(fre<2000)//如果不到200KHz則讀取分頻前(計數(shù)器0)頻率(200K÷100=2000)
{
fre = (long)count*256+TL0;
FLAG = 1;
}
if(!FLAG)
{
fre = fre *100;//100分頻
}
TL0=0; //清零計數(shù)器0計數(shù)
TH0=0;
TL1=0;
TH1=0;
count=0; //清零計數(shù)器0計數(shù)
count1=0;
EA=1; //開中斷
}
}
//----------------------------------------------------------------
void timer0(void) interrupt 1 //計數(shù)器0中斷(100分頻前)
{
count++;
}
//----------------------------------------------------------------
void timer1(void) interrupt 3 //計數(shù)器1中斷(100分頻后)
{
count1++;
}
|
評分
-
查看全部評分
|