📄 w27c020.c
字号:
#include <SST89x5xxRD2.H>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**************I/O口定义*****************/
sbit A16=P3^3;
sbit A17=P1^7;
sbit BUZ=P3^4;
sbit CE =P1^2;
sbit E1 =P1^0;
sbit E2 =P1^1;
sbit COL2=P1^7;
sbit COL3=P1^6;
sbit COL4=P1^5;
sbit COL5=P1^4;
sbit Lcdbusy=P0^7; //working:1,ready:0
sbit AO=P2^0;
sbit RW=P2^1;
/**************变量定义******************/
uchar AddrH,AddrM,AddrL;
uchar sum;
uchar zk_data[32];
/**************位定义********************/
/**************函数定义******************/
void Read_27C020(uchar qw,uchar wh); //读27C020的数据
void delayms(uchar delay);
/**********************LCD控制子程序*******************/
void LCD_RDY_L(void);
void LCD_RDY_R(void);
void WR_CMDL(uchar cmd);
void WR_CMDR(uchar cmd);
void WR_DATAL(uchar dt);
void WR_DATAR(uchar dt);
void Lcd_clr();
void disphz (uchar lcd_f,bit zf,bit underside);
void disptu (uchar code *img);
void wrlattice (uchar lattice1,uchar lattice2,uchar lcd_f,uchar lcd_page);
void Lcd_init();
main(void)
{
P0 =0xff;
P1 =0xff;
P2 =0xff;
P3 =0xef;
P4 =0x02;
AUXR|=0x01;
PCON&=0xef;//上电复位标志清‘0’
TMOD=0x21; //T0:16定时器
SCON=0x50; //10 bit 1 start 8 data 1 stop (50H=01010000B)
TH1=0xfd; //波特率:9600bps
TL1=0xfd;
TL0=0xed; //5ms
TH0=0xff;
T2CON=0x00;//T2为16位定时器
TH2=0x4b; //50MS
TL2=0xfd;
IE=0xb2; //EA,uart,T0,T2
//TR0=1;
//TR1=1;
//TR2=1;
//PS=1; //串口中断优先
Lcd_init( );
while(1)
{
Read_27C020(0x39,0x83); //求
disphz(0x00,0,0);
Read_27C020(0x42,0x21); //实
disphz(0x10,0,0);
Read_27C020(0x54,0x39); //智
disphz(0x20,0,0);
Read_27C020(0x36,0x60); //能
disphz(0x30,0,0);
}
}
void Read_27C020(uchar qw,uchar wh) //读27C020的数据,qw:区号,wh:位号
{
ulong reg;
uchar i;
//十六进制转换成十进制
qw=((qw&0xf0)>>4)*10+(qw&0x0f);
wh=((wh&0xf0)>>4)*10+(wh&0x0f);
//区位码-字模地址转换公式
reg=(qw-1)*94+(wh-1);
reg*=32;
AddrH=reg>>16 & 0xff;
AddrM=reg>>8 & 0xff;
AddrL=reg & 0xff;
//地址补偿
AddrM+=(AddrH+1)*0x20;
if(CY)
{
AddrH++;AddrM+=0x20;
}
//读取数据
EA=0;
AUXR|=0x02;
P1=0xf8;
if(AddrH&0x01) A16=1;
else A16=0;
if(AddrH&0x02) A17=1;
else A17=0;
for(i=0;i<32;i++)
zk_data[i]=XBYTE[(AddrM*0x100+AddrL)+i];
A16=1;P1=0xff;AUXR&=0xfd;EA=1;
}
void delayms(uchar delay)
{
unsigned int i;
for(;delay>0;delay--)
{
for(i=0;i<125;i++)
{;}
}
}
/***********************液晶显示模块*******************************/
//检测LCD左半部是否空闲
void LCD_RDY_L(void)
{
uchar i;
AO=0;
RW=1;
E1=1;
for(i=0;i<20;i++)
{
if(Lcdbusy) { _nop_();_nop_();_nop_();_nop_();_nop_();}
else break;
}
E1=0;
}
//检测LCD右半部是否空闲
void LCD_RDY_R(void)
{
uchar i;
AO=0;
RW=1;
E2=1;
for(i=0;i<20;i++)
{
if(Lcdbusy) { _nop_();_nop_();_nop_();_nop_();_nop_();}
else break;
}
E2=0;
}
//写LCD左半部命令
void WR_CMDL(uchar cmd)
{
LCD_RDY_L() ;
E1=1;
AO=0;
RW=0;
P0=cmd;
E1=0;
E1=1;E2=0;WR=0;WR=1;E2=1;
}
//写LCD右半部命令
void WR_CMDR(uchar cmd)
{
LCD_RDY_R() ;
E2=1;
AO=0;
RW=0;
P0=cmd;
E2=0;
E2=1;E1=0;WR=0;WR=1;E1=1;
}
//写LCD左半部数据
void WR_DATAL(uchar dt)
{
LCD_RDY_L() ;
E1=1;
AO=1;
RW=0;
P0=dt;
E1=0;
E1=1;E2=0;WR=0;WR=1;E2=1;
}
//写LCD右半部数据
void WR_DATAR(uchar dt)
{
LCD_RDY_R() ;
E2=1;
AO=1;
RW=0;
P0=dt;
E2=0;
E2=1;E1=0;WR=0;WR=1;E1=1;
}
//清屏
void Lcd_clr()
{
uchar i,j;
for(i=0xb8;i<0xbc;i++)
{
WR_CMDL(i); //PAGE(0~3)
WR_CMDR(i);
WR_CMDL(0); //Column Address starts from 0
WR_CMDR(0);
for(j=0;j<61;j++)
{
WR_DATAL(0); //The Column address increment ’1’ after read or write.
WR_DATAR(0);
}
}
}
/*--------------显示汉字(16*16)和字符(8*16)---------------*/
void disphz (uchar lcd_f,bit zf,bit underside)//lcd_f:LCD中的显示位置0--121,zf:=1 为字符,=0为汉字
{ //underside=0:写上面 =1:写在下面
uchar i,j,s;
uchar f_page,chn_add;
if(zf) s=8; //字符
else s=16; //汉字
if(!underside) f_page=0xb8;
else f_page=0xba;
chn_add=0;
if(lcd_f+s<61) //如果初始地址+字长<61,写在左半部 0--60
{
for(j=0;j<2;j++)
{
WR_CMDL(f_page+j);
WR_CMDL(lcd_f);
for(i=0;i<s;i++)
WR_DATAL(zk_data[chn_add+i]);
chn_add+=s;
}
}
else if(lcd_f>=61) //如果大于61,写在右半部 61--121
{
for(j=0;j<2;j++)
{
WR_CMDR(f_page+j);
WR_CMDR(lcd_f-61);
for(i=0;i<s;i++)
WR_DATAR(zk_data[chn_add+i]);
chn_add+=s;
}
}
else //否则两边都要写
{
for(j=0;j<2;j++)
{
WR_CMDL(f_page+j);
WR_CMDL(lcd_f);
for(i=0;i<(61-lcd_f);i++) //左半部写到61-lcd_f个字节
WR_DATAL(zk_data[chn_add+i]);
WR_CMDR(f_page+j);
WR_CMDR(0x00);
for(i=61-lcd_f;i<s;i++) //右半部写剩下的字节
WR_DATAR(zk_data[chn_add+i]);
chn_add+=s;
}
}
}
/*----------------画图形-----------------*/
/*void disptu (uchar code *img)
{
uchar i,j,img_add;
img_add=0;
for(j=0;j<4;j++)
{
WR_CMDL(0xb8+j);
WR_CMDL(0x00);
WR_CMDR(0xb8+j);
WR_CMDR(0x00);
for(i=0;i<122;i++)
{
if(i<61) WR_DATAL(img[img_add+i]);
else WR_DATAR(img[img_add+i]);
}
img_add+=122;
}
}
/*--------------写点阵------------------
void wrlattice (uchar lattice1,uchar lattice2,uchar lcd_f,uchar lcd_page)//lattice:显示的数,lcd_f:同上,lcd_page:显示的行
{
if(lcd_f<61)
{
WR_CMDL(lcd_page);
WR_CMDL(lcd_f);
WR_DATAL(lattice1);
}
else
{
WR_CMDR(lcd_page);
WR_CMDR(lcd_f-61);
WR_DATAR(lattice1);
}
if(lcd_f<61)
{
WR_CMDL(lcd_page+1);
WR_CMDL(lcd_f);
WR_DATAL(lattice2);
}
else
{
WR_CMDR(lcd_page+1);
WR_CMDR(lcd_f-61);
WR_DATAR(lattice2);
}
}
*/
//-------------------LCD初始化--------------------------
void Lcd_init()
{
WR_CMDL(0XE2); //RESET
WR_CMDR(0XE2);
delayms(20);
WR_CMDL(0XA4); //Normal Display
WR_CMDR(0XA4);
WR_CMDL(0XA9); //DUTYSELECT=1/32
WR_CMDR(0XA9);
WR_CMDL(0XA0); //ADC SELECT=CLOCKWISE OUTPUT
WR_CMDR(0XA0);
WR_CMDL(0XAF); //OPEN DISPLAY
WR_CMDR(0XAF);
WR_CMDL(0XC0); //START FIRST LINE
WR_CMDR(0XC0);
Lcd_clr(); //CLEAR LCD
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -