📄 avr_12864_st7565.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 + -