📄 12864.c~
字号:
#include <mega16.h>
#include <delay.h>
#include <12864.h>
#define RS PORTA.0
#define RW PORTA.1
#define E PORTA.2
/*1--GND
2--VCC
3--V0--kong
4--RS--PA0
5--RW--PA1
6--E---PA2
7---14 PC0---PC7
15--PSB---VCC选并口
*/
void lcd_init(void) //初始化
{
DDRC=0xff;
PORTC=0x00;
DDRA=0xff;
PORTA=0x00;
delay_ms(50);
lcd_write_command(0x30); // //选择基本指令集
delay_ms(1);
lcd_write_command(0x0c); //开显示(无游标、不反白)
delay_ms(1);
lcd_write_command(0x01); //清除显示,并且设定地址指针为00H
delay_ms(1);
lcd_write_command(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
delay_ms(1);
lcd_write_command(0x80); //
}
void lcd_write_command(unsigned char cmdcode) //写指令RS=0,RW=0,下降沿打入。
{
chek_busy ();
RS = 0;
RW = 0;
E = 1;
#asm("nop");
PORTC = cmdcode;
#asm("nop");
E = 0;
}
void chek_busy(void) //判忙, RS=0,RW=1,E=1,读指令。
{
DDRC &= 0x7f;
RS = 0;
RW = 1;
E = 1;
#asm("nop");
while(PINC&0x80);
#asm("nop");
E = 0;
DDRC |= 0x80;
}
void lcd_write_data(unsigned char disdata) //写数据,RS=1,RW=0,下降沿打入。
{
chek_busy ();
RS = 1;
RW = 0;
E = 1;
#asm("nop");
PORTC = disdata;
#asm("nop");
E = 0;
#asm("nop");
}
void lcd_set_xy( unsigned char x, unsigned char y ) //写地址函数
{
unsigned char address; //x范围是0~7 y范围0~3
switch ( y )
{
case 0 : address=0x80+x;
break;
case 1 : address=0x90+x;
break;
case 2 : address=0x88+x;
break;
case 3 : address=0x98+x;
break;
default: break;
}
lcd_write_command(address);
}
void SetLCDCursor( unsigned char x,unsigned char y )
{
lcd_cursor_flash(1);
lcd_set_xy(x,y);
}
void lcd_write_stringf(unsigned char flash *s)
{
while(*s>0)
{
lcd_write_data(*s);
s++;
}
}
void lcd_write_string(unsigned char *s)
{
while(*s>0)
{
lcd_write_data(*s);
s++;
}
}
void lcd_clear(void)
{
lcd_write_command(0x01);
}
void lcd_cursor_flash(unsigned char i)
{
if(i==1)
{
lcd_write_command(0x0f);
}
else if (i==0)
{
lcd_write_command(0x0c);
}
}
void lcd_write_full(unsigned char *s)
{
unsigned char i;
for (i=0;i<64;i++)
{
if (i==0)
lcd_write_command(0x80);
else if(i==16)
lcd_write_command(0x90);
else if(i==32)
lcd_write_command(0x88);
else if (i==48)
lcd_write_command(0x98);
lcd_write_data(*s);
s++;
}
}
/*------------------自定义一个字符代码(一个星星和月亮)--------------------------*/
/*
void CGRAM()
{ int i;
lcd_write_command(0x30);
lcd_write_command(0x40);
for(i=0;i<16;i++)
{
lcd_write_data(zk[i*2]);
lcd_write_data(zk[i*2+1]);
}
}
/*------------------显示字符串--------------------------*/
/*void hzkdis(unsigned char flash *s)
{ while(*s>0)
{ lcd_write_data(*s);
s++;
delay_ms(1);
}
}
/*------------------显示图片------------------------2005.11.14.21:20修改---benladn911---*/
void Disp_Img(unsigned char flash *img)
{ unsigned int j=0;
unsigned char x,y,i;
for(i=0;i<9;i+=8)
for(y=0;y<32;y++)/*原来 为 y<26 ,上下两个半屏不能正常对接显示,导致显示的图片中间有空隙*/
for(x=0;x<8;x++)
{ lcd_write_command(0x36);//功能设置---8BIT控制界面,扩充指令集
lcd_write_command(y+0x80); //行地址
lcd_write_command(x+0x80+i); //列地址
lcd_write_command(0x30); //基本指令集
lcd_write_data(img[j++]);
lcd_write_data(img[j++]);
}
}
/*------------------清整个GDRAM空间----------------------------*/
/*void clrgdram()
{ unsigned char x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{ lcd_write_command(0x34);
lcd_write_command(y+0x80); //行地址
lcd_write_command(x+0x80); //列地址
lcd_write_command(0x30);
lcd_write_data(0x00);
lcd_write_data(0x00);
}
}
/*------------------整屏写入数据:全亮,或者竖条-----------------------------*/
/*void lcdfill(unsigned char disdata)
{ unsigned char x,y;
for(y=0;y<32;y++)
for(x=0;x<16;x++)
{ lcd_write_command(0x36);
lcd_write_command(y+0x80); //行地址
lcd_write_command(x+0x80); //列地址
lcd_write_command(0x30);
lcd_write_data(disdata);
lcd_write_data(disdata);
}
lcd_write_command(0x34);
lcd_write_command(0x36);
}
/*------------------显示横-----------------------------*/
/*void Disp_H_Line()
{ unsigned char x,y;
unsigned char k=0x00;
for(y=0;y<32;y++)
{ k=~k;
for(x=0;x<16;x++)
{ lcd_write_command(0x36);
lcd_write_command(y+0x80); //行地址
lcd_write_command(x+0x80); //列地址
lcd_write_command(0x30);
lcd_write_data(k);
lcd_write_data(k);
};
}
lcd_write_command(0x34);
lcd_write_command(0x36);
}
/*绘图显示的步骤
1 关闭绘图显示功能
2 先将垂直的坐标(Y)写入绘图RAM地址
3 再将水平的位元组坐标(X)写入绘图RAM地址
4 将D15-D8写入RAM中
5 将D7-D0写入到RAM中
6 打开绘图显示功能*/
//整屏显示竖条
//当ii=0时显示上面128×32,当ii=8时显示下面128×32
/*void LcdFill_Vertical()
{ unsigned char x,y,ii;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
for(x=0;x<8;x++)
{
lcd_write_command(0x36);//扩充指令 绘图显示
lcd_write_command(y+0x80); //行地址
lcd_write_command(x+0x80+ii); //列地址
lcd_write_data(0x55); //写数据 D15-D8
lcd_write_data(0x55); //写数据 D7-D0
lcd_write_command(0x30);
}
}
//当ii=0时显示上面128×32,当ii=8时显示下面128×32
//整屏显示横条线
void LcdFill_Level()
{ unsigned char x,y,ii;
unsigned char k;
for(ii=0;ii<9;ii+=8)
for(y=0;y<0x20;y++)
{ if((y%2)==1)
k=0xff;
else
k=0;
for(x=0;x<8;x++)
{ lcd_write_command(0x36); //扩充指令 绘图显示
lcd_write_command(y+0x80); //行地址
lcd_write_command(x+0x80+ii); //列地址
lcd_write_data(k);
lcd_write_data(k);
lcd_write_command(0x30);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -