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

📄 avr_12864_st7565.c

📁 用AVR点亮驱动ST7565点阵12864
💻 C
字号:
#include <iom16v.h>
//#include <delay.h>  
#include <macros.h>



//以下为连接方式  其中PORTC与数据口连接  
#define LCD_RS PB2    //即 A0  
#define LCD_RW PB1      //WR 
#define LCD_CS PB4      //CS1  
#define LCD_RES PB3    //RST  
#define LCD_E PB0       //RD 

#define uchar unsigned char
#define uint unsigned int



//DELAY
void delay_ms(uint ms)
{
    uint i,j;
    for (i=0;i<ms;i++)
    {
       for (j=0;j<1141;j++);
    }
}

//忙检测  
void check_busy(void)  
{  
unsigned char read_data=0xff;  
DDRA=0x00;  
PORTA=0x00;  
PORTB&=~BIT(2);//LCD_RS=0;  
PORTB|=BIT(1);//LCD_RW=1; //读命令  
PORTB&=~BIT(4);//LCD_CS=0; //片使能  
while(read_data&0x80)  
{  
PORTB|=BIT(0);//LCD_E=1;  
#asm("nop");  
#asm("nop");  
read_data=PORTA;  
PORTB&=~BIT(0);//LCD_E=0;   
#asm("nop");  
#asm("nop");  
}  
PORTB&=~BIT(0);//LCD_E=0;  
PORTB|=BIT(4);//LCD_CS=1; //片禁能  
DDRA=0xFF;  
}       

//写命令到寄存器  
void send_cmd(unsigned char cmd)  
{  
check_busy();  
PORTB&=~BIT(2);//LCD_RS=0;  
PORTB&=~BIT(1);//LCD_RW=0; //写命令  
PORTB&=~BIT(4);//LCD_CS=0; //片使能  
PORTA=cmd;  
PORTB|=BIT(0);//LCD_E=1;  
#asm("nop");  
#asm("nop");  
PORTB&=~BIT(0);//LCD_E=0;  
#asm("nop");  
#asm("nop");  
PORTB|=BIT(0);//LCD_CS=1; //片禁能  
}     

//写数据到DDRAM  
void send_dat(unsigned char dat)  
{  
check_busy();  
PORTB|=BIT(2);//LCD_RS=1;  
PORTB&=~BIT(1);//LCD_RW=0; //写数据  
PORTB&=~BIT(4);//LCD_CS=0; //片使能  
PORTA=dat;  
PORTB|=BIT(0);//LCD_E=1;  
#asm("nop");  
#asm("nop");  
PORTB&=~BIT(0);//LCD_E=0;  
#asm("nop");  
#asm("nop");  
PORTB|=BIT(4);//LCD_CS=1; //片禁能  
}       

//初始化   设置LCD的控制电压, 行 列 页的初始化

void lcd_initial(void)
{  
PORTB|=BIT(3);//LCD_RES=1;      //复位,延时50ms  
delay_ms(50);
send_cmd(0xE2);  //internal reset
send_cmd(0xA1);  //LCD bias set 1/7 bias    
send_cmd(0xA0);  //ADC select  //0xa0为Segment正向,0xa1 为Segment反向(0xa0-0xa1为ADC方向选择)  
send_cmd(0xA6);  // Display mode//0xa6正向显示,0xa7反向显示
send_cmd(0xC8);  //0xc0正向扫描,0xc8反向扫描  //Common output mode select reverse direction  
send_cmd(0x24);  //V0 voltage regulator internal resistor ratio set  V0 调压器内部电阻率设定(控制对比度,后三位)  
send_cmd(0x81);  //electronic voltage mode set 亮度调整,下一命令是它的具体值  
send_cmd(0x20);  // 后6位是亮度调整具体值
send_cmd(0x2C);  //power control set   
send_cmd(0x2E);  //from 0x28 to 0x2F  
send_cmd(0x2F);  //0x2f升压电路,电压管理电路,电压跟随电路均开(0x28-0x2f为设置上电控制模式)    
send_cmd(0x40);  //Display start line set  
send_cmd(0xAF);  //Display ON  
send_cmd(0xA4);  //0xa4正常显示,0xa5全屏点亮
send_cmd(0xB0);  //page address set   
send_cmd(0x10);  //column address set upper bit  
send_cmd(0x00);  //column address set lower bit
send_cmd(0xf8);  //SET BOOSTER RATIO
send_cmd(0x03);  //
}  

void clearLCD(void)  
{  
 unsigned char page,seg;  
   
 for(page=0xb0;page<0xb8;page++)  
 {  
  send_cmd(page);  
  send_cmd(0x10);                            /*列地址高位,D4位为1表示高位地址*/  
  send_cmd(0x00);                            /*列地址低位,D4位为0表示低位地址*/  
  for(seg=0;seg<128;seg++)  
  {  
   send_dat(0xFF);  
  }  
 }  
}  
// 16*16电阵函数// 

unsigned char a1[32]={0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00,};  //汉字 “我” 的点阵数据 ,使用 纵向取模 字节倒序  
unsigned char a2[32]={0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00,};  //汉字  的 
unsigned char a3[32]={0x10,0x08,0x04,0xD3,0x56,0x5A,0x52,0x5A,0xF4,0x53,0x56,0x5A,0x72,0x02,0x02,0x00,0x00,0x20,0x20,0x23,0x12,0x12,0x0A,0x06,0xFF,0x02,0x02,0x12,0x22,0x1E,0x00,0x00,}; 
unsigned char a4[32]={0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}; 
unsigned char a5[32]={0x00,0x80,0x80,0x40,0x20,0x10,0x0C,0xE3,0x04,0x08,0x10,0x20,0x60,0xC0,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}; 
unsigned char a6[32]={0x10,0x12,0xD2,0xFE,0x91,0x11,0x80,0xBF,0xA1,0xA1,0xA1,0xA1,0xBF,0x80,0x00,0x00,0x04,0x03,0x00,0xFF,0x00,0x41,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0x40,0x00,};
unsigned char a7[32]={0x00,0x00,0xFC,0x04,0x04,0x14,0x14,0x35,0x56,0x94,0x54,0x34,0x14,0x04,0x04,0x00,0x80,0x60,0x1F,0x00,0x01,0x01,0x01,0x41,0x81,0x7F,0x01,0x01,0x01,0x03,0x01,0x00,};
void disphz(unsigned char pages,unsigned char line,unsigned char * zfdz)  
{   //  pages页参数可取(0-7),line 列参数可取(0-111),zfdz 点阵指针  
 unsigned char page,seg,zi,j;  
 char ix=0;//bit ix=0;  
   
 for(page=0;page<2;page++)  
 {  
  send_cmd(page+0xb0+pages);   
  j = line & 0xf0;  
  j = j/16;  
 send_cmd(0x10|j);                            /*列地址高位,D4位为1表示高位地址*/  
 send_cmd(0x0f&line);                             /*列地址低位,D4位为0表示低位地址*/  
   
  zi=0;                              
 for(seg=0;seg<16;seg++) 
  {  
   if(ix)  
   zi=16;  
   send_dat(zfdz[seg+zi]);  
     
  }  
  ix=!ix;  
 }  
}  

void main(void)  
{  

PORTA=0x00;  
DDRA=0xFF;  

PORTB=0x00;  
DDRB=0xFF;  

PORTC=0x00;  
DDRC=0xFF;  

PORTD=0x80;  
DDRD=0xFF;  

lcd_initial(); //LCD初始化  
clearLCD();    //清屏  
while (1)  
      {  
      disphz (3,0,a1); 
      disphz (3,18,a2); 
      disphz (3,36,a3); 
      disphz (3,54,a4); 
      disphz (3,72,a5); 
      disphz (3,90,a6); 
      disphz (3,108,a7);
	    		 
      };  
} 

⌨️ 快捷键说明

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