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

📄 液晶显示.txt

📁 单片机Atmega128控制液晶显示的项目
💻 TXT
字号:
// Target : M128 
// Crystal: 8.0000Mhz 

#include <iom128v.h> 
#include <macros.h> 
#include <stdio.h> 

// 直接访问方式地址定义  PA0~7接DB0~7 
// PC0~CS  PC1~A0 
//CS=0 A0=0 写数据口 
#define LcmWdataPort (*(volatile unsigned char *)0xFC00)  

//CS=0 A0=1 写命令口     
#define LcmCmdPort  (*(volatile unsigned char *)0xFE00)  

//CS=0 A0=1 读数据口   
#define LcmRdataPort LcmCmdPort      

//CS=0 A0=0 读忙状态标志口 
#define LcmStatusPort LcmWdataPort     

void port_init(void)    // I/O端口初始化函数{ 
{  
 DDRG = 0xFF;;  //PG3设定为输出(液晶RESET复位端) 
 PORTG = 0xFF;  //PG3输出高电平1(液晶低电平复位)  
 PORTA = 0xff; 
} 

void init_devices(void)     //调用初始化函数以及外部存储器初始化 
{ 
 //stop errant interrupts until set up 
 CLI(); //disable all interrupts  
 XMCRA = 0x0A;   // 外部存储器地址不分区,在RD、WR后插入2个等待周期 
 XMCRB = 0x00;   //不使能总线保持功能,不释放地址线 
 port_init();     //I/O口初始化 
 MCUCR = 0x80;   //使能外部存储器,并与XMCRA配合设定了插入2个等待周期 
 SEI(); //re-enable interrupts 
 //all peripherals are now initialised 
} 

// 变量类型标识的宏定义 
#define Uchar unsigned char 
#define Uint unsigned int 
// 时序要求:/WR=0;/RD=1  
#define SystemSet   0x40        
// P1-P8参数                        
Uchar ParaSysTable[8]= {0x30,0x87,0x07,0x27,0x42,0xF0,0x30,0x00};   
                       
/* P1=0x30 : 顶天无边界,单屏结构驱动,内部CGROM+CGRAM1(8×8点阵) 
   P2=0x87 : B形驱动波形,字符体宽度8列 
   P3=0x07 : C形驱动波形,字符体高度8行 
   P4=0x27 : C/R 有效显示窗口参数 320/8 = 40 = 0x27 
   P5=0x42 : 驱动频率时间常数 TC/R >= C/R+4 Fosc >= 9*TC/R*L/F*FR  FR=70Hz 
   P6=0xF0 : L/F 扫描的行数 240行 = 0xF0 
   P7,P8   : 设定分配给每一行的显示存储空间0x30=48字节   */   


/*******************显示域设置。后续10字节参数串ParaScrTableA[]****************/ 
// 时序要求:/WR=0;/RD=1 
#define Scroll      0x44            

#define BasePart1   0x00 
#define BasePart2   0x40 
#define BasePart3   0x80 
#define BasePart4   0x00 

Uchar ParaScrTableA[10]={0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4 }; 

/*****************************休闲模式设置。后续参数:无*********************************/ 
#define SleepIn 0x53 

/*****************************显示状态设置。后续参数1字节.*****************************/ 
#define DispOn  0x59 
#define DispOff 0x58 
//设定光标闪烁,4个显示区均显示但不闪烁。 
#define DispOnP1 0x56   


/***************************显示合成方式设置。后续参数1字节。**************************/ 
#define Ovlay  0x5b 
//设定1、3显示区为文本显示,2显示区为图形。L1、L2、L3简单或合成 
#define OvlayP1 0x00   


/*****************************点位移设置。后续参数1字********************************/ 
#define HdotScr 0x5A 
//设定点位移为1 
#define HdotScrP1 0x00   


/***********************光标形状设置。后续参数2字节*********************************/ 
#define CsrForm  0x5D 
//设定光标占8列 
#define CsrFormP1 0x07   
//设定光标为块状,占8行 
#define CsrFormP2  0x87    


/*********************Cgram首地址设置。后续参数2字节*********************************/ 
#define CgramAdr   0x5C 
//定义外部CGROM开始地址为8000H 
#define CgramAdrP1 0x00    
#define CgramAdrP2 0x80 


/************************光标移动方向设置。后续参数:无****************************/ 
//光标右移 
#define CsrDirR  0x4c    
//光标左移 
#define CsrDirL  0x4d     
//光标上移 
#define CsrDirU  0x4e   
//光标下移 
#define CsrDirD  0x4f    


/************************光标指针设置。后续参数2字节*****************************/ 
#define CsrW  0x46 


/************************读取光标指针。后续参数2字节****************************/ 
#define CsrR  0x47 

/**************************数据写入设置。后续参数N字节************************/ 
#define mWrite  0x42 

/**************************数据读取设置。后续参数N字节***********************/ 
#define mRead  0x43 

/*******************************程序参数定义***************************/ 
// 忙状态标志位0b0100 0000 
#define Busy  0x40    
// 相对于320 X 240 液晶屏  
#define AP  0x30        

/*____________________________微妙延时程序_,8M晶振______________________________*/  
void delay_1us() 
         {  
          asm("nop"); 
          asm("nop"); 
          asm("nop"); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
        asm("nop"); 
        } 
                   
void delay_us(Uchar n) 
    { 
    while(n--) 
    { delay_1us();} 
    } 

/*___________________________毫秒延时程序_______________________________*/ 
void delay_ms(Uchar m) 
     { 
      while(m--) 
      {delay_us(1000);} 
     } 

/*___________________________判断忙标志BF子程序________________________*/ 
void WaitForBusy(void) 
    { 
     while(LcmStatusPort & Busy); 
    } 

/*__________________________写指令子程序_______________________________*/ 
void WriteCommand(Uchar CommandByte) 
    { 
     LcmCmdPort = CommandByte; 
    } 

/*__________________________写参数及数据子程序________________________*/ 
void WriteData(Uchar DataW) 
    { 
     LcmWdataPort = DataW; 
    } 

/*_________________________读参数及显示数据子程序_____________________*/ 
Uchar ReadDataLcm(void) 
    { 
     return LcmRdataPort; 
    } 

/*_________________________初始化LCM子程序____________________________*/ 
void LcmInition(void) 
    { 
     Uchar i; 
     PORTG &= 0xF7;   //先复位液晶模块SED1330 
     delay_us(400); 
     PORTG |=0x08;    

     delay_ms(50); 
     WriteCommand(SystemSet);     //写系统设置命令 
     for(i=0;i<8;i++) 
        { 
         WriteData(ParaSysTable[i]);   //写P1—P8参数 
        }; 

     delay_1us(); 
     WriteCommand(Scroll);    //写显示区域设定命令 
     for(i=0;i<10;i++) 
        { 
         WriteData(ParaScrTableA[i]); 
        }; 
                 
     delay_1us(); 
     WriteCommand(HdotScr);   //写入点位移设置指令 
     WriteData(HdotScrP1);    //写入P1参数,点位移0 
          
     delay_1us(); 
     WriteCommand(Ovlay);     //写入区域合成设定指令 
     WriteData(OvlayP1);      //写入P1参数,L1,L2,L3简单或合成 
          
     delay_1us(); 
     WriteCommand(CsrForm);   //写入光标形状设定指令 
     WriteData(CsrFormP1);    //写入P1参数 8列 
     WriteData(CsrFormP2);    //写入P2参数 8行 
          
    delay_1us();  
      
    } 
/*______________________________清32K显存即清屏子程序__________________________________*/ 
void LcmClear(void) 
    { 
     Uint Number=32768; 
     WriteCommand(CsrDirR); 

     delay_1us(); 
     WriteCommand(CsrW); 
     WriteData(0x00); 
     WriteData(0x00); 

     delay_1us(); 
     WriteCommand(mWrite); 
     while(Number--) 
          { 
           WriteData(0x00); 
          } 
     delay_1us();  
    } 
         
void main() 
        { 
         delay_ms(100); 
         init_devices(); 
          
         delay_ms(100); 
         LcmInition(); 
          
         delay_ms(5); 
         LcmClear(); 
          
            WriteCommand(DispOn);    //写入LCM开显示屏幕指令 
         WriteCommand(DispOnP1);   //写入P1参数,光标闪烁,1,2,3,4区显示 

         delay_us(20); 
         WriteCommand(CgramAdr);   //设置CG地址 8000 
         WriteData(CgramAdrP1); 
         WriteData(CgramAdrP2); 
          
         delay_1us(); 
         WriteCommand(CsrDirR); 
          
         delay_1us(); 
         WriteCommand(CsrW);   //写入光标地址 
            WriteData(0x04);      //光标设定指向显示1区首地址 
            WriteData(0x00); 
          
         delay_1us(); 
         WriteCommand(mWrite);    //显示内部字符 
         WriteData(0x44);     //"D" 
         WriteData(0x5F);     //"_" 
         WriteData(0x42);     //"B" 
         WriteData(0x4F);     //"O" 
         WriteData(0x59);     //"Y" 
         while(1); 
        }  

⌨️ 快捷键说明

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