12864 st7920液晶 任意位置显示点的函数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include

#define uchar unsigned char
#define uint unsigned int

#define LCD_data P0 //数据口
sbit LCD_RS = P3^5; //寄存器选择输入
sbit LCD_RW = P3^6; //液晶读/写控制
sbit LCD_EN = P3^4; //液晶使能控制
sbit LCD_PSB = P3^0; //串/并方式控制

uchar code lie[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};


/*******************************************************************
延时函数
*******************************************************************/
void delay(uint ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

void delayNOP()
{
_nop_();
_nop_();
_nop_();
_nop_();
}

/*********************************************************/
/* */
/* 延时x*0.14ms子程序 */
/* */
/*********************************************************/
void delay0(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}

/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/**********************************

*********************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*********************LCD初始化设定************************/
void lcd_init()
{

LCD_PSB = 1; //并口方式

lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x06);
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*------------------清整个GDRAM空间----------------------------*/
void clrgdram()
{
unsigned char x,y;
for(y=0;y<64;y++)
for(x=0;x<16;x++)
{
lcd_wcmd(0x34);
lcd_wcmd(y+0x80); //行地址
lcd_wcmd(x+0x80); //列地址
lcd_wcmd(0x30);
lcd_wdat(0x00);
lcd_wdat(0x00);
}
}
/*------------------在第7列的位置加入两条竖线--------------------------*/
void shuxian()
{ unsigned char x,y;

for(x=0;x<9;x+=8)
for(y=0;y<32;y++)
{ lcd_wcmd(0x36);
lcd_wcmd(y+0x81); //行地址 ,????????????????
lcd_wcmd(x+0x80); //列地址 ,有8列,一列由16个点组成,占2个字节
lcd_wcmd(0x30);
lcd_wdat(0x00);
lcd_wdat(0x01);
delay(5);
};
}











//*******************huolingyi自己编的语句--任意位置显示点的函数**************************
void lcd_X(uchar i) //列子函数 X范围为0~15,
{
if(i<8)
{
lcd_wcmd(0x30);
lcd_wdat(lie[i]);
lcd_wdat(0x00);
}
if(i>=8)
{
lcd_wcmd(0x30);
lcd_wdat(0x00);
lcd_wdat(lie[i-8]);
}
}
void display(uchar Y,uchar X,uchar Z)
{
uint z_pos,y_pos,x_pos;
z_pos=Z%16; //定义块 Z范围为0~15
y_pos=Y%32; //定义行 Y范围为0~31

lcd_wcmd(0x36);
lcd_wcmd(y_pos+0x80);
lcd_wcmd(z_pos+0x80);
lcd_wcmd(0x30);
lcd_X(X); //定义列
lcd_X(X-1);
delay(100);

}
//*****************************************************************









/*********************************************************/
/* */
/* 主程序 */
/* */
/*********************************************************/
void main()
{
uchar i,j;
lcd_init();
while(1)
{
clrgdram() ;

shuxian();

delay(100);

clrgdram() ;

for(i=8;i<16;i++)
for(j=0;j<16;j++)
display(32,j,i);

delay(10000);
}
}





相关文档
最新文档