微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > LCD不显示,求助各位大神

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--);
}  

PIC的板块,看到个reg51.h,有些不懂了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top