LCD不显示,求助各位大神
时间:10-02
整理:3721RD
点击:
#include<reg51.h>
#include<math.h>
#include<absacc.h>
#include<intrins.h>
//*********宏定义方便使用*******
#define uchar unsigned char
#define uint unsigned int
//*********定义变量区***********
sbit lcden = P2^0; //LCD使能信号
sbit lcdrs = P2^1; //LCD数据/命令选择信号
sbit INPUT1 = P2^2; //INPUT1检测口
sbit INPUT2 = P2^3; //INPUT2检测口
sbit INPUT3 = P2^4; //INPUT3检测口
sbit SDI = P1^3; sbit CONV = P1^2;
sbit SCK = P1^1; sbit SDO = P1^0;
uchar count,k;
uchar code tab_1[]="Freq:"
uchar tab_freq[]={0,0,0,0,0,0,0}; //频率数组
unsigned char voltage[16] = "voltage: 0.000V";//第二行电压显示
uint beishuo;
//*********函数声明区***********
void int_time1(); //定时器0
void int_count0(); //计数器1
void trans_count(); //转换为10进制
unsigned int ltc1865_ch0(); //读LTC1865通道0的AD值
void disp_voltage(); //AD转换数据计算
void lcd_dis(); //lcd显示函数
void lcd_init(); //LCD初始化函数
void write_com(uchar); //写命令函数
void write_data(uchar); //写数据函数
void delay(uint); //延时函数
//*********主函数开始***********
void main()
{
TMOD= 0x11; //T0为计数模式:方式1?T1为定时模式:方式1
TH0=0;//T0计数初始值
TL0=0;
TH1=0x4c; //T1定时初始值
TL1=0x00; //50MS
EA=1;
ET1=1; //允许T1定时中断?
ET0=1; //允许T0计数中断?
lcd_init();
write_com(1);
while(1)
{
if(INPUT1==1)
{
beishuo=512;
TR0=1;
TR1=1;break;
}
if(INPUT2==1)
{
beishuo=16;
TR0=1;
TR1=1;
break;
}
if(INPUT3==1)
{
beishuo=1;
TR0=1;
TR1=1;
break;
}
}
trans_count(); //读取频率值
disp_voltage(); //读取电压值
lcd_dis(); //显示电压和频率值
}
//*********T0计数函数开始**************
void int_count0() interrupt 1
{
k++;
}
//*********T1定时中断函数开始***********
void int_time1() interrupt 3
{
TH1=0x4c;
TL1=0x00; //50MS
count++;
if(count>=20)
{
count=0;
TR0=0; //到1秒T0停止计数?
TR1=0; //T1停止定时?
}
}
//*********数据转换函数开始**************
void trans_count()
{
unsigned long int z;
z = k * 65536 + TH0 * 256 + TL0; //计算出一秒钟收到的脉冲数量
z = z * beishuo; //乘以分频倍数还原原始频率
if(z>10000000) //最大量程为999999
{
z=9999999;
}
tab_freq[0]=z/1000000; //百万位
tab_freq[1]=(z-tab_freq[0]*1000000)/100000 //十万位
tab_freq[2]=(z-tab_freq[0]*1000000-tab_freq[1]*100000)/10000; //万位
tab_freq[3]=(z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000)/1000; //千位
tab_freq[4]=(z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000-tab_freq[3]*1000)%100; //百位;
tab_freq[5]=(z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000-tab_freq[3]*1000-tab_freq[4]*100)%10; //十位
tab_freq[6]=z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000-tab_freq[3]*1000-tab_freq[4]*100-tab_freq[5]; //个位 }
/*读LTC1865通道0的AD值*/
unsigned int ltc1865_ch0()
{
unsigned char i;
unsigned int voltage;
SDO = 1;
SCK = 1;
CONV = 0;
for(i=0;i<16;i++)
{
SCK = 0;
voltage<<=1;
if(SDO==1)
{
voltage+=1;
}
SCK = 1;
}
CONV = 1;
return(voltage);
}
/*AD转换数据计算*/
void disp_voltage()
{
unsigned long temp;
temp=ltc1865_ch0();
temp=(temp*5000)/65535;
temp=temp*2; //还原回原始电压
tab2[10]=0x30+temp/1000;
tab2[12]=0x30+temp%1000/100;
tab2[13]=0x30+temp%100/10;
tab2[14]=0x30+temp%10;
}
//*********lcd显示函数开始******
void lcd_dis()
{
uchar i,t;
for(i=0;i<5;i++)
{
write_data(tab_1); //显示"Freq:"
}
write_com(0x80+5);
for(i=0;i<7;i++)
{
t=tab_freq;
write_data(tab[t]); //显示频率值
}
write_com(0x80+14);
write_data('H');
write_data('z'); //显示Hz
write_com(0x80+0x40);
for(i=0;i<15;i++)
{
write_data(voltage);
}
}
//*********LCD初始化函数开始****
void lcd_init()
{
dula=0;
wela=0; // 关闭数码管显示
lcden=0;
write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口
write_com(0x0c); //开显示,显示光标,光标闪烁
write_com(0x06); //读写一个字符后,地址指针及光标加一,且 光标加一整屏显示不移动
write_com(0x80); //设置光标指针
}
//*********写命令函数开始*******
void write_com(uchar com)
{
lcdrs=0; //低电平写命令
P0=com; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********写数据函数开始*******
void write_data(uchar dat)
{
lcdrs=1; //低电平写数据
P0=dat; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********延时函数开始*********
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
#include<math.h>
#include<absacc.h>
#include<intrins.h>
//*********宏定义方便使用*******
#define uchar unsigned char
#define uint unsigned int
//*********定义变量区***********
sbit lcden = P2^0; //LCD使能信号
sbit lcdrs = P2^1; //LCD数据/命令选择信号
sbit INPUT1 = P2^2; //INPUT1检测口
sbit INPUT2 = P2^3; //INPUT2检测口
sbit INPUT3 = P2^4; //INPUT3检测口
sbit SDI = P1^3; sbit CONV = P1^2;
sbit SCK = P1^1; sbit SDO = P1^0;
uchar count,k;
uchar code tab_1[]="Freq:"
uchar tab_freq[]={0,0,0,0,0,0,0}; //频率数组
unsigned char voltage[16] = "voltage: 0.000V";//第二行电压显示
uint beishuo;
//*********函数声明区***********
void int_time1(); //定时器0
void int_count0(); //计数器1
void trans_count(); //转换为10进制
unsigned int ltc1865_ch0(); //读LTC1865通道0的AD值
void disp_voltage(); //AD转换数据计算
void lcd_dis(); //lcd显示函数
void lcd_init(); //LCD初始化函数
void write_com(uchar); //写命令函数
void write_data(uchar); //写数据函数
void delay(uint); //延时函数
//*********主函数开始***********
void main()
{
TMOD= 0x11; //T0为计数模式:方式1?T1为定时模式:方式1
TH0=0;//T0计数初始值
TL0=0;
TH1=0x4c; //T1定时初始值
TL1=0x00; //50MS
EA=1;
ET1=1; //允许T1定时中断?
ET0=1; //允许T0计数中断?
lcd_init();
write_com(1);
while(1)
{
if(INPUT1==1)
{
beishuo=512;
TR0=1;
TR1=1;break;
}
if(INPUT2==1)
{
beishuo=16;
TR0=1;
TR1=1;
break;
}
if(INPUT3==1)
{
beishuo=1;
TR0=1;
TR1=1;
break;
}
}
trans_count(); //读取频率值
disp_voltage(); //读取电压值
lcd_dis(); //显示电压和频率值
}
//*********T0计数函数开始**************
void int_count0() interrupt 1
{
k++;
}
//*********T1定时中断函数开始***********
void int_time1() interrupt 3
{
TH1=0x4c;
TL1=0x00; //50MS
count++;
if(count>=20)
{
count=0;
TR0=0; //到1秒T0停止计数?
TR1=0; //T1停止定时?
}
}
//*********数据转换函数开始**************
void trans_count()
{
unsigned long int z;
z = k * 65536 + TH0 * 256 + TL0; //计算出一秒钟收到的脉冲数量
z = z * beishuo; //乘以分频倍数还原原始频率
if(z>10000000) //最大量程为999999
{
z=9999999;
}
tab_freq[0]=z/1000000; //百万位
tab_freq[1]=(z-tab_freq[0]*1000000)/100000 //十万位
tab_freq[2]=(z-tab_freq[0]*1000000-tab_freq[1]*100000)/10000; //万位
tab_freq[3]=(z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000)/1000; //千位
tab_freq[4]=(z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000-tab_freq[3]*1000)%100; //百位;
tab_freq[5]=(z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000-tab_freq[3]*1000-tab_freq[4]*100)%10; //十位
tab_freq[6]=z-tab_freq[0]*1000000-tab_freq[1]*100000-tab_freq[2]*10000-tab_freq[3]*1000-tab_freq[4]*100-tab_freq[5]; //个位 }
/*读LTC1865通道0的AD值*/
unsigned int ltc1865_ch0()
{
unsigned char i;
unsigned int voltage;
SDO = 1;
SCK = 1;
CONV = 0;
for(i=0;i<16;i++)
{
SCK = 0;
voltage<<=1;
if(SDO==1)
{
voltage+=1;
}
SCK = 1;
}
CONV = 1;
return(voltage);
}
/*AD转换数据计算*/
void disp_voltage()
{
unsigned long temp;
temp=ltc1865_ch0();
temp=(temp*5000)/65535;
temp=temp*2; //还原回原始电压
tab2[10]=0x30+temp/1000;
tab2[12]=0x30+temp%1000/100;
tab2[13]=0x30+temp%100/10;
tab2[14]=0x30+temp%10;
}
//*********lcd显示函数开始******
void lcd_dis()
{
uchar i,t;
for(i=0;i<5;i++)
{
write_data(tab_1); //显示"Freq:"
}
write_com(0x80+5);
for(i=0;i<7;i++)
{
t=tab_freq;
write_data(tab[t]); //显示频率值
}
write_com(0x80+14);
write_data('H');
write_data('z'); //显示Hz
write_com(0x80+0x40);
for(i=0;i<15;i++)
{
write_data(voltage);
}
}
//*********LCD初始化函数开始****
void lcd_init()
{
dula=0;
wela=0; // 关闭数码管显示
lcden=0;
write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口
write_com(0x0c); //开显示,显示光标,光标闪烁
write_com(0x06); //读写一个字符后,地址指针及光标加一,且 光标加一整屏显示不移动
write_com(0x80); //设置光标指针
}
//*********写命令函数开始*******
void write_com(uchar com)
{
lcdrs=0; //低电平写命令
P0=com; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********写数据函数开始*******
void write_data(uchar dat)
{
lcdrs=1; //低电平写数据
P0=dat; //写入命令
delay(3); //延时约3ms
lcden=1; //LCD使能端置高电平
delay(5); //延时约5ms
lcden=0; //LCD使能端拉低电平
}
//*********延时函数开始*********
void delay(uint k)
{
uint i,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
PIC的板块,看到个reg51.h,有些不懂了。