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

📄 01.c

📁 Mega8单片机操作SO12864液晶屏例程
💻 C
字号:
#include <iom8.h>
#include <inavr.h> 

/*
日期  2008-03-02
目的  使用M8操作SO12864液晶屏
频率  外部4MHz
采用串口发送方式
*/

#ifndef uchar 
  #define uchar unsigned char 
#endif 
#ifndef uint 
  #define uint unsigned int
#endif

#define nop() asm("nop")


#define  cs1    PORTB_Bit1
#define  rst    PORTB_Bit2
#define  a0     PORTB_Bit3
#define  sclk   PORTB_Bit4
#define  di     PORTB_Bit5

void lcd_init(void);
void M8_init(void);
void lcd_rst(void);
void lcd_openclose(uchar);
void lcd_setpage(uchar);
void lcd_setrow(uchar);
void lcd_setcol(uchar);
void lcd_colrev(uchar);
void lcd_rowrev(uchar);
void lcd_setrat(uchar);
void lcd_setvol(uchar);
void lcd_nomrev(uchar);
void lcd_init(void);

uchar __flash niu[]={/*--  文字:  武  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x10,0x14,0x14,0x14,0xD4,0x14,0x14,0x10,0x7F,0x90,0x12,0x14,0x10,0x10,0x00,


/*--  文字:  汉  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x60,0x01,0x86,0x60,0x04,0x1C,0xE4,0x04,0x04,0x04,0xE4,0x1C,0x04,0x00,0x00,

/*--  文字:  理  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x44,0x44,0xFC,0x44,0x44,0x00,0xFE,0x92,0x92,0xFE,0x92,0x92,0x92,0xFE,0x00,0x00,

/*--  文字:  工  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x02,0x02,0x02,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,

/*--  文字:  大  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

/*--  文字:  学  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x30,0x10,0x12,0x5C,0x54,0x50,0x51,0x5E,0xD4,0x50,0x18,0x57,0x32,0x10,0x00,

0x40,0x40,0x7F,0x20,0x20,0x1F,0x11,0x11,0x01,0x00,0x07,0x18,0x20,0x40,0xF0,0x00,

0x04,0x04,0x7E,0x01,0x40,0x20,0x20,0x10,0x0B,0x04,0x0B,0x10,0x30,0x60,0x20,0x00,

0x10,0x10,0x0F,0x08,0x48,0x40,0x45,0x44,0x44,0x7F,0x44,0x44,0x44,0x45,0x40,0x00,

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,

0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,

0x00,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00};



void delay(uchar j)
 {

  while(j--)
   ;
 }
void data_send(unsigned char dat) 
 {  
    unsigned char s,temp; 
      int i; 
      sclk=0; 
      s=dat; 
      for(i=8;i>0;i--) 
       {
       	sclk=0; 
        delay(1);
        temp=s & 0x80; 
        if(temp) 
         {di=1;} 
        else 
        {di=0;} 
        sclk=1;    
        s=s<<1;   
       } 
 }  
 
/*************************************************/ 
//写命令,串行模式 
/*************************************************/ 
void w_com(unsigned char x) 
{ 
   a0=0; 
   cs1=0; 
   data_send(x); 
} 
 
/*************************************************/ 
//写数据,串行模式 
/*************************************************/ 
void wdata(unsigned char dat) 
{ 
   a0=1; 
   cs1=0;                                  
   data_send(dat); 
} 
 

  
void display_map(unsigned char __flash *p)//P是图片数据的首地址 
{ 
    uchar  seg,page; 
    for(page=0;page<2;page++)  //写页地址共 8 页  0xb0----0xb8 
    {   
      lcd_setpage(page);                      
      w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始 
      w_com(0x00);              
      for(seg=0;seg<96;seg++)//写 128 列 
      { wdata(*p++); } 
    } 
} 

/*************************************************
mega8初始化 主要是进行端口的设置
**************************************************/
void M8_init(void)
   {
   	DDRB  = 0xff;
    PORTB = 0xff;
    
    PORTC = 0xFF;
    DDRC  = 0xFF;//00111100
    
    DDRD  = 0xFF;
    PORTD = 0xFF;
   	
   	}
 /*
 用于将SO128*64液晶屏复位
 */
void lcd_rst(void)
 {
  rst=0;
  delay(10);
  rst=1;
 }
 /*
 lcd打开还是关断    1:打开 0:关断
 */
void lcd_openclose(uchar i)
 {
  w_com(0xae|(i&0x01));
 }

 /*
 用于设置页面,0-8,其中第8页只有一行
 */
void lcd_setpage(uchar i)
 {
  w_com((i&0x0f)|0xb0);
 } 
 /*
 用于设置起始行,从0到63,不考虑页面
 */
void lcd_setrow(uchar row)
 {
  w_com((row&0x3f)|0x40);
 }
 /*
 用于设置开始列,从0-131,其中127后是不能显示的
 分高低两个字节写入
 */ 
void lcd_setcol(uchar i)
 {
  w_com((i>>4)|0x10);
  w_com(i&0x0f);
 }
 /*
 列顺序翻转,左右翻转0:正常  1:翻转
 */
void lcd_colrev(uchar i)
 {
  w_com(0xa0|(i&0x01));
 }
 /*
 行顺序翻转,上下翻转 0:正常 1;翻转
 */
void lcd_rowrev(uchar i)
 {
  w_com(0xc0|((i<<3)&0x08));
 }
 /*
 设置对比度 0-7  5V电压下 设置为4比较好
 */
void lcd_setrat(uchar i)
 {
  w_com(0x20|(i&0x07)); 
  }
 /*
 设置亮度 0-64;5V电压下设置为0X20比较适中 0x20=32
 */
void lcd_setvol(uchar vol)
 {
  w_com(0x81);
  w_com(vol);
 }
 /*
 黑白翻转 0正常 1翻转
 */
void lcd_nomrev(uchar nomrev)
 {
  w_com(0xa6|(nomrev&0x01));
 }
 /*
 
 */
void lcd_init(void)
 {
     lcd_rst();
     lcd_openclose(1);
     lcd_setpage(0);
     lcd_setrow(0);
     lcd_setcol(0);
     lcd_nomrev(0);
     lcd_rowrev(1);
     lcd_colrev(0);
     lcd_setvol(32);
     lcd_setrat(4);
     w_com(0x2f);//电源打开
     
       /*
        rst=0; 
        delay(100); 
        rst=1; 
        w_com(0xaf);        //LCD打开
        
        w_com(0x40);        //设置开始行,从0行开始
        
        //w_com(0xa0);        //正常顺序
        w_com(0xa1);      //左右翻转
        
        w_com(0xa6);        // 正常颜色
       //w_com(0xa7);       //黑白翻转
       
        w_com(0xa4);        //CLEAR  
        
        w_com(0xa2);       //1/9BIAS  1/9偏置电压 
        
        w_com(0xc0);       //正常显示
        //w_com(0xc8);       //上下翻转
        
        w_com(0x2f);        //POWER CONTROL 电源打开
         
        w_com(0x24);      //RESISTER RATIO   对比度调节 000B-111B
        
        w_com(0x81);       //VOLUM MODE SET  进入亮度调节
        w_com(0x24);       //RESISTER RATIO  亮度,000001B-111111B
        */
 }
      
/*************************************************
主程序 
*************************************************/ 
void main(void) 
{  
     unsigned char  seg; 
    unsigned char page;
        M8_init();
        lcd_init();
       
        
        
    for(page=0xb0;page<0xb9;page++)  //写页地址共 8 页  0xb0----0xb8 
    {   
      lcd_setpage(page);                       
      w_com(0x10); //列地址,高低字节两次写入,从第 0 列开始 
      w_com(0x00);              
      for(seg=0;seg<133;seg++)//写 128 列 
      { wdata(0x00); } 
      }
 
//********************************************************************* 

        display_map(niu);                             //显示一副 SCH图案 
        while(1)
        ;
   

} 

⌨️ 快捷键说明

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