📄 text1.c
字号:
/***********************************************
TCM12864J液晶显示屏驱动程序
驱动芯片:KS0107
MCU:AT89S52
日期:08-09-05
P11--RS RS=1,表示DB7~DB0 为显示数据
RS=0”,表示DB7~DB0 为显示指令数据
P12--RW R/W=1”,E=“H”,数据被读到DB7~DB0
R/W=0”,E=“H→L”, DB7~DB0 的数据被写到IR 或DR
P13--E 使能信号: R/W=“L”,E 信号下降沿锁存DB7~DB0
R/W=“H”,E=“H” DRAM数据读到DB7~DB0
P14--CSA H:选择芯片(右半屏)信号
P15--CSB H:选择芯片(左半屏)信号
P0---DB0~7
***********************************************/
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#include <stdio.h>
sbit P0_0 = P0^0;
sbit P0_1= P0^1;
sbit P0_2 = P0^2;
sbit P0_3 = P0^3;
sbit P0_4 = P0^4;
sbit P0_5 = P0^5;
sbit P0_6 = P0^6;
sbit P0_7 = P0^7;
sbit p_RS = P1^1;
sbit p_RW = P1^2;
sbit p_E = P1^3;
sbit p_CSA = P1^4;
sbit p_CSB = P1^5;
sbit EOC = P1^0;
sbit ST = P2^6;
sbit OE = P2^7;
unsigned char ad_value;
unsigned char data_value;
#define DATA P3
void DelayMs(unsigned int count1);
void lcd_busy(void);
void lcd_init(void);
void lcd_setxy(unsigned char x,unsigned char y);
unsigned char lcd_AD(void) ;
void lcd_clear(void);
void lcd_writepoint(unsigned char i,unsigned char j);
unsigned char lcd_readdata(unsigned char x,unsigned char y);
void main(void) //主函数
{
int y=0;
unsigned char data1,data2;
lcd_init();
lcd_clear();
while(1)
{
lcd_AD();
{
ad_value=0x00;
if(data_value&0x80) ad_value=ad_value+0x01;
if(data_value&0x40) ad_value=ad_value+0x02;
if(data_value&0x20) ad_value=ad_value+0x04;
if(data_value&0x10) ad_value=ad_value+0x08;
if(data_value&0x08) ad_value=ad_value+0x10;
if(data_value&0x04) ad_value=ad_value+0x20;
if(data_value&0x02) ad_value=ad_value+0x40;
if(data_value&0x01) ad_value=ad_value+0x80;
}
data1= ad_value;
data2=data1>>2;
lcd_writepoint(data2,y);
DelayMs(25) ;
y++;
if(y>=128) { lcd_clear(); y=0; }
}
}
/*******************延迟***************/
void DelayMs(unsigned int count1)
{
while (count1--)
{
unsigned char count2 = 0;
for (; count2<30; count2++);
}
}
/**************************************AD转换函数******************/
unsigned char lcd_AD(void)
{
unsigned char data_AD;
P2 = 0xc2;
ST=0;
ST=1;
ST=0;
while(EOC ==0) ;
OE=1;
data_value=P0;
_nop_();
_nop_();
_nop_();
_nop_();
OE=0;
return data_value;
}
/***********************************************
查询LCD是否忙碌,如果忙碌,则等待,直到不忙碌,
跳出该函数,顺序执行下面程序
************************************************/
void lcd_busy(void)
{
p_RS=0; //CMD
p_RW=1; //READ
while(1)
{
p_E=1;
if(DATA<0x80)break; //BUSY(DB7) = 0
p_E=0;
}
p_E=0;
}
/**********************************************
初始化
***********************************************/
void lcd_init(void)
{
//开显示
p_RS=0; //CMD
p_RW=0; //Write
DATA=0x3f; //Display ON
p_CSA=1;
p_CSB=0;
p_E=1;
p_E=0;
p_CSA=0;
p_CSB=1;
p_E=1;
p_E=0;
//0行显示
lcd_busy();
//P15=0;
DATA=0xc0; //0行开始
p_CSA=1;
p_CSB=0;
p_E=1;
p_E=0;
p_CSA=0;
p_CSB=1;
p_E=1;
p_E=0;
}
/**********************************************
设置行值和列值
***********************************************/
void lcd_setxy(unsigned char x,unsigned char y)
{
if(y<64)
{
//写行地址left
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=1;
p_CSB=0;
DATA=0xb8|x;
p_E=1;
p_E=0;
//写列地址left
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=1;
p_CSB=0;
DATA=0x40|y;
p_E=1;
p_E=0;
}
else
{
//y=y-64;
//写行地址right
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=0;
p_CSB=1;
DATA=0xb8|x;
p_E=1;
p_E=0;
//写列地址right
lcd_busy();
p_RS=0;
p_RW=0;
p_CSA=0;
p_CSB=1;
DATA=0x40|y;
p_E=1;
p_E=0;
}
}
/**********************************************
画点i(0-63),j(0-127)
***********************************************/
void lcd_writepoint(unsigned char i,unsigned char j)
{
unsigned char x,y,data_t=0x00;
y=j;
if(i>=0&&i<=7)
{
x=0;
data_t=(0x01<<i);
}
else if(i>=8&&i<=15)
{
x=1;
data_t=(0x01<<(i-8));
}
else if(i>=16&&i<=23)
{
x=2;
data_t=(0x01<<(i-16));
}
else if(i>=24&&i<=31)
{
x=3;
data_t=(0x01<<(i-24));
}
else if(i>=32&&i<=39)
{
x=4;
data_t=(0x01<<(i-32));
}
else if(i>=40&&i<=47)
{
x=5;
data_t=(0x01<<(i-40));
}
else if(i>=48&&i<=55)
{
x=6;
data_t=(0x01<<(i-48));
}
else if(i>=56&&i<=63)
{
x=7;
data_t=(0x01<<(i-56));
}
lcd_busy();
lcd_setxy(x,y);
p_RS=1;
p_RW=0;
if(y<64)
{
p_CSA=1;
p_CSB=0;
}
else
{
p_CSA=0;
p_CSB=1;
}
DATA=data_t;
p_E=1;
p_E=0;
}
/**********************************************
写数据,给所有单元都写入0
***********************************************/
void lcd_writedata(unsigned char x,unsigned char y)
{
lcd_busy();
lcd_setxy(x,y); //set x,y address
p_RS=1; //write data
p_RW=0; //write
if(y<64)
{
p_CSA=1;
p_CSB=0;
}
else
{
p_CSA=0;
p_CSB=1;
}
DATA=0x00;
p_E=1;
p_E=0;
}
/**********************************************
清屏
***********************************************/
void lcd_clear(void)
{
unsigned char i,j;
for(i=0;i<8;i++)
for(j=0;j<128;j++)
lcd_writedata(i,j);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -