⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ljcd.c

📁 这是一段关于在使用单片机和液晶显示器时如何在液晶显示器上显示两级菜单的源程序。
💻 C
字号:
///////////////////////////////////////////////////////////////////////////////////////////////
//                                               
//           H.C.H                            
//           NNU(南京师范大学通信工程)                               
//           TLC0838驱动程序TLC0838_II.c           
//           uchar adc_tlc0838(uchar channel);
//           函数说明:channel为通道的选择:0……CH0   1……CH1  2……CH2  3……CH3 
//                         当error=0时,返回的值为有效值,当error=1时,返回值无效                               
///////////////////////////////////////////////////////////////////////////////////////////////

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


#define lcd_bus P1
sbit rs=P3^2;
sbit rw=P3^3;
sbit e=P3^4;

sbit CS=P2^3;      //TLC0838---PIN18 
sbit DI=P2^2;      //TLC0838---PIN17
sbit CLK=P2^1;     //TLC0838---PIN16
sbit DO=P2^0;      //TLC0838---PIN14
                   //SE接成低电平
bit error=1;
uchar adc_tlc0838(uchar channel);



delay(uchar d)
{
        while(--d);
}

/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
        uchar bflag;     
        rs=0;
        rw=1;
        _nop_();
        e=1;
        _nop_();
        lcd_bus=0xff;
        bflag=lcd_bus;
        e=0;
        return(bit)(bflag&0x80);    //BF=1 busy   
}



/*********写命令,有两个参数,第一个是要写的命令控制字,

  第二个是用来控制是否进行忙标志的判断。

  busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
        while(lcd_busy());
        lcd_bus=cmd;
        rs=0;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0; 
}




/************向液晶片写数据***************/

void lcd_wrdata( uchar lcddata)
{

        while(lcd_busy());
        lcd_bus=lcddata;
        rs=1;
        rw=0;
        _nop_();
        e=1;
        _nop_();
        _nop_();
        e=0;
}

void lcd_ini(void)
{

    lcd_wrcmd(0x38);
    delay(100);
    lcd_wrcmd(0x0c);
    delay(100);
    lcd_wrcmd(0x06);
    delay(100);
    lcd_wrcmd(0x01);
    delay(100);
}

main()
{           		 
   uchar result,a[3];
   lcd_ini();
   while(1)
   {
   result=adc_tlc0838(7);
   a[0]=result/100;
   result=result%100;
   a[1]=result/10;
   result=result%10;
   a[2]=result;
   lcd_wrcmd(0x80);
   lcd_wrdata(a[0]+48);
   lcd_wrdata(a[1]+48);
   lcd_wrdata(a[2]+48);
   }
}



uchar adc_tlc0838(uchar channel)
{
    uchar t,i;
    uchar temp1,temp2=1;
    if (channel==0)     t=0;
    else if(channel==1) t=1;
    else if(channel==2) t=4;
    else if(channel==3) t=5;
    else if(channel==4) t=2;
    else if(channel==5) t=3;
    else if(channel==6) t=6;
    else if(channel==7) t=7;
   
    CS=1;
   _nop_();_nop_();_nop_();_nop_();

    CLK=0;
    CS=0;            //使AD通道打开
    DI = 1;          //Start bit=1
    CLK = 1;

    CLK=0;
    CS=0;          
    DI = 1;          
    CLK = 1;

    for(i=0;i<3;i++)
    {
      CLK = 0;
      if(t&1)DI=1;
      else DI=0;
      t=t>>1;       
      CLK = 1;
    }
    CLK=0;
    CLK=1;
     for(i=0;i<=6;i++)
     {
         CLK = 0;                  //时钟为低电平
         DO=1;
         if(DO)
         {                         //如果采集到的位为1
           Temp1=Temp1+1;          //给临时存储Temp1加1
           Temp1=Temp1<<1;
         }         //临时存储器左移一位
         else
           Temp1=Temp1<<1;          //如果采集到的数位为0,临时存储器左移一位
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         CLK = 1;    
      }                             //时钟为高电平,完成一个时钟周期数据采集
       CLK = 0;
       if(DO)  Temp1=Temp1+1;
       if(DO)  Temp2=0x80;

       CLK = 1; 
                                      //采集数据校验          
       
       for(i=0;i<=6;i++)
         {
           CLK=0;
           if(DO){
             Temp2=Temp2>>1;
             Temp2=Temp2+0x80;  }
           else
             Temp2=Temp2>>1;
           CLK = 1; 
         }
   CS = 1;
   return Temp1;

}


    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -