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

📄 dm12864m串行.c

📁 EEPROM读写程序: 先向EEPROM写入一幅图片数据
💻 C
字号:
/****************************************************************************************
           LCM(DM12864M-带字库,ST7920控制芯片)显示程序   
		                                                
             程序功能:该程序是用AVR来控制对DM12864M
			           读写信号等的操作.
             硬件连接:采用串行方式显示,分配PA.0,PA.1,PA.2
			           三个I/O口分别作为LCM片选CS,数据SID,时钟信
					   号CLK的控制。PA3置为低电平,用来串行选择信号。
		                PA4置位时开启背光。                                           
 
****************************************************************************************/

#include <iom16v.h>
#include <macros.h>
#include <stdio.h>  
#define LCDDDR        DDRA
#define LCDDDR_IN     LCDDDR&=~BIT(PA1);
#define LCDDDR_OUT    LCDDDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)|BIT(PA3)|BIT(PA4);
/*===============================================================*/
#define LCDCTL      PORTA   
#define LCD_RS_H    LCDCTL |= BIT(PA0)  //片选               
#define LCD_RS_L    LCDCTL &= ~BIT(PA0)                                           
#define LCD_RW_H    LCDCTL |= BIT(PA1)  //数据                            
#define LCD_RW_L    LCDCTL &= ~BIT(PA1)  
#define LCD_EN_H    LCDCTL |= BIT(PA2)  //时钟                          
#define LCD_EN_L    LCDCTL &= ~BIT(PA2) 
#define LCD_PSB     LCDCTL &= ~BIT(PA3) //串行选择
#define LCD_AK      LCDCTL |= BIT(PA4)  //开启背光
#define  uchar unsigned char
/***********************函数体部分*********************************/

void dm12864_inputbyte(uchar comm)  // 写入一字节数据
{
 	 uchar i;
	 uchar mid;
	 for (i=0;i<8;i++)
	 {
	  	 mid=comm&0x80;
		 if (mid==0)
		 LCD_RW_L ;
		 else
		 LCD_RW_H ;
		 LCD_EN_H ;
		 //delay(15);
		 LCD_EN_L; 
		 comm=comm<<1;
	  }
}
uchar dm12864_outputbyte(void)  //读取一字节数据
{
 	  uchar i,mid=0;
	  for (i=0;i<8;i++)
	  {
	   	  //delay(15);
 		  LCDDDR_IN;
		  LCD_RS_H ;
		  mid=mid<<1;
		  if ((PINA&0x02)==0)
		  mid&=~BIT(PD0);
		  else
		  mid|=BIT(PD0);
 		  LCDDDR_OUT;
		  LCD_EN_H ;
		  //delay(15);
		  LCD_EN_L; 
	 }
	 return(mid);
}

/*-----------------读取标志位,判断控制器是否为忙状态--------------*/
void DetectLCMBusyState()
{
  	 char BF = 0x00;
  	 LCDDDR_OUT;
	 LCD_RS_H ;
	 LCD_EN_L ;
	 do
    {
	   dm12864_inputbyte(0xfc);
	   BF=dm12864_outputbyte();
    } while(BF==0x80);
	LCD_RS_L ;
	LCD_EN_H ;
	//delay(15);
}

/*----------------------------写入命令-----------------------------*/
void LCMWriteCommand(char DisplayCmd)
{
 	 uchar a,b;
	 a=DisplayCmd&0xf0;
	 b=(DisplayCmd<<4)&0xf0;
 	 LCDDDR_OUT;
	 LCD_RS_H ;
	 LCD_EN_L ;
	 dm12864_inputbyte(0xf8);
	 dm12864_inputbyte(a);
	 dm12864_inputbyte(b);
	 LCD_EN_H ;
	 LCD_RS_L ;
	 //delay(15);
}

/*-----------------------写入一字节数据--------------------------*/
void LCMWriteData(char DisplayData)
{
 	 uchar a,b;
	 a=DisplayData&0xf0;
	 b=(DisplayData<<4)&0xf0;
 	 LCDDDR_OUT;
	 LCD_RS_H ;
	 LCD_EN_L ;
	 dm12864_inputbyte(0xfa);
	 dm12864_inputbyte(a);
	 dm12864_inputbyte(b);
	 LCD_EN_H ;
	 LCD_RS_L ;
	 //delay(15);
}

/*------------设置显示位置DisplayCol(1~8),DisplayRow(1~4)---------*/
void LCMSetXYAddress(char DisplayCol,char DisplayRow)
{
    switch(DisplayRow)
    {
        case 1:LCMWriteCommand(0x7f + DisplayCol);
        break;
        case 2:LCMWriteCommand(0x8f + DisplayCol);
        break;
        case 3:LCMWriteCommand(0x87 + DisplayCol);
        break;
        case 4:LCMWriteCommand(0x97 + DisplayCol);
	    break;
    }
}

/*-------------------在指定位置显示一半角字符-----------------------*/
void LCMDisplayASC(char DisplayCol,char DisplayRow,char ASCCharacter)
{
     LCMSetXYAddress(DisplayCol,DisplayRow);
     LCMWriteData(ASCCharacter);
}

/*----------------------在指定位置显示字符串-------------------------*/
void LCMDisplayString(char DisplayCol,char DisplayRow,char *DisplayString)
{ 
    char LCD_temp; 
    LCMSetXYAddress(DisplayCol,DisplayRow);
    LCD_temp=*DisplayString;
    while(LCD_temp!=0x00) 
    { 
        LCMWriteData(LCD_temp);
        LCD_temp=*(++DisplayString);
    }                   
}

/*-------------------------显示一个整形数字,范围-32767~32767---------------------------*/
                          //宏定义判断函数,其中\是连接符
                    
void LCMDisplayNummber(char DisplayCol,char DisplayRow,int DisplayNum)
{
        char LCD_temp=0,flag=0;
        LCMSetXYAddress(DisplayCol,DisplayRow);
        if(DisplayNum < 0)
        {
                LCMWriteData(0x2d);            //显示负号
                DisplayNum = -DisplayNum;
        }
        LCD_temp=DisplayNum/10000;
         if(flag | LCD_temp)                  

                    {                                   

                        LCMWriteData(0x30 + LCD_temp); 

                        flag = 1;                      

                    }    
        DisplayNum -= LCD_temp*10000;
        LCD_temp = DisplayNum/1000;
       if(flag | LCD_temp)                  

                    {                                   

                        LCMWriteData(0x30 + LCD_temp); 

                        flag = 1;                      

                    }    
        DisplayNum -= LCD_temp*1000;
        LCD_temp = DisplayNum/100;
         if(flag | LCD_temp)                  

                    {                                   

                        LCMWriteData(0x30 + LCD_temp); 

                        flag = 1;                      

                    }    
        DisplayNum -= LCD_temp*100;
        LCD_temp = DisplayNum/10;
         if(flag | LCD_temp)                  

                    {                                   

                        LCMWriteData(0x30 + LCD_temp); 

                        flag = 1;                      

                    }    
        DisplayNum -= LCD_temp*10;
        LCD_temp = DisplayNum;
         if(flag | LCD_temp)                  

                    {                                   

                        LCMWriteData(0x30 + LCD_temp); 

                        flag = 1;                      

                    }    
        if(!flag) LCMWriteData(0x30);   
}



////////////////////////////////////////////////////////////////////

/*-----------------------液晶初始化-----------------------------*/
void LCMInit()
{
  	LCDDDR_OUT;
	 LCD_PSB;
	LCD_AK;
    LCD_EN_L;      
    LCD_RS_L;
    LCD_RW_L;
   
    LCMWriteCommand(0x30); 
    //  8 bits interface,basic instrument
	 LCMWriteCommand(0x0c);
    //  display,cursor on
    LCMWriteCommand(0x01); 
	  //  clear DDRAM
    LCMWriteCommand(0x02);
	  //  cursor return
   
	 
}

/*----------------------延时子函数---------------------------*/
void LCMDelay(int k)                                     
{ 
    int   i;
   int  j;           
    for(i=0;i<k;i++)
    {
       for(j=0;j<=2000;j++)
       {
         ;
       }
    }
}

⌨️ 快捷键说明

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