📄 main.c
字号:
#include <stdio.h>
#include <absacc.h>
#include <./Atmel/at89x52.h>
#define uchar unsigned char
#define MWCMD(a) XBYTE[0X40]=(a) //主控制器写命令
#define MWDATA(a) XBYTE[0X41]=(a) //主控制器写数据
#define MRCMD XBYTE[0X42] //主控制器读命令
#define MRDATA XBYTE[0X43]= //主控制器读数据
#define SWCMD(a) XBYTE[0X80]=(a) //从控制器写命令
#define SWDATA(a) XBYTE[0X81]=(a) //从控制器写数据
#define SRCMD XBYTE[0X82] //从控制器读命令
#define SRDATA XBYTE[0X83] //从控制器读数据
#define BLIGHT_ON P1_7=0 //背光开
#define BLIGHT_OFF P1_7=1 //背光关
#define LCD_RST_ON P1_6=0 //对液晶模块进行硬件复位
#define LCD_RST_OFF P1_6=1 //对液晶模块进行硬件复位解除
#define PWM_PORT P1_5 //PWM模拟端口
uchar code NanJing[]={
/*-- 文字: 南 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x27,0x24,0x24,0x26,0x2D,0xF4,0x24,0x25,0x26,0x24,0x24,0x67,0x20,0x00,
0x00,0x00,0xFE,0x20,0xA0,0xA0,0xA0,0xFE,0xA0,0xA0,0xA0,0xA4,0x22,0xFC,0x00,0x00,
/*-- 文字: 京 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x20,0x20,0x27,0x24,0x24,0xA4,0x64,0x24,0x24,0x24,0x27,0x60,0x20,0x00,0x00,
0x00,0x04,0x08,0x98,0xB0,0x82,0x81,0xFE,0x80,0x80,0xA0,0xB0,0x1C,0x08,0x00,0x00,
};
uchar code Asc12[]={
/*-- 文字: 1 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x08,0x08,0x1F,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,0x00,
/*-- 文字: 2 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x00,0x0E,0x10,0x10,0x10,0x11,0x0E,0x00,0x00,0x0C,0x14,0x24,0x44,0x84,0x0C,0x00,
};
struct PIC {
uchar x;
uchar y;
uchar w;
uchar h;
uchar *dat;
};
void Init_Lcd(void);
void drawbmp(struct PIC *p);
void clearbmp(struct PIC *p);
main(){
struct PIC This;
unsigned int i=0;
IE=0X40;
EA=1; /* Enable interrupts */
Init_Lcd();
BLIGHT_ON;
while(1){
i++;
if(i==10000){
This.x=0;This.y=0;
This.w=16;This.h=16;
clearbmp(&This);
This.w=32;This.h=16;
This.dat=NanJing;
drawbmp(&This);
}
else if(i==20000){
This.x=0;This.y=0;
This.w=32;This.h=16;
clearbmp(&This);
This.w=16;This.h=16;
This.dat=Asc12;
drawbmp(&This);
}
}
}
void Init_Lcd(void){
unsigned int i;
LCD_RST_ON;//对LCD进行硬件复位
for(i=0;i<500;i++){
}
LCD_RST_OFF;//解除硬件复位
/***下面开始对LCD进行初始化**/
/*MWCMD(0xae);SWCMD(0xae); //显示开关:关
MWCMD(0xc0);SWCMD(0xc0); //显示起始在第一行
MWCMD(0xa4);SWCMD(0xa4); //static driver 关
MWCMD(0x00);SWCMD(0x00); //列地址设置为 0列
MWCMD(0xbb);SWCMD(0xbb); //页地址设置为 0页
MWCMD(0xa9);SWCMD(0xa9); //占空比选择
MWCMD(0xa0);SWCMD(0xa0); //ADC选择 rightward
MWCMD(0xee);SWCMD(0xee); //读修改写:关
*/
/***在实际初始化中发现只采用以下几就可以完成初始化了,而用上面的初始化代码不行****/
MWCMD(0xaf);SWCMD(0xaf); //显示开关 :开
MWCMD(0x00);SWCMD(0x00); //列地址设置为 0列
MWCMD(0xbb);SWCMD(0xbb); //页地址设置为 0页
}
#define setpages(page) SWCMD(0xb8+((page)&0x03))
#define setcols(address) SWCMD((address)&0x7f) //column
#define setpagem(page) MWCMD(0xb8+((page)&0x03))
#define setcolm(address) MWCMD((address)&0x7f)
void drawbmp(struct PIC *p){//y must 0,8,16 or 24
/*display a 8*8 bitmap */
uchar i;
uchar *buf;
buf=p->dat;
setpages(p->y/8);
setpagem(p->y/8);
if(p->h==8){
for(i=p->x;i<p->w+p->x;i++){
if(i<61){//是主控制器控制的列
setcolm(i);
MWDATA(*buf);
}
else{//是从控制器控制的列
setcols(i-61);
SWDATA(*buf);
}
buf++;
}
}
else if(p->h==16){
for(i=p->x;i<p->w+p->x;i++){
if(i<61){//是主控制器控制的列
setcolm(i);
MWDATA(*buf);
}
else{//是从控制器控制的列
setcols(i-61);
SWDATA(*buf);
}
buf +=2;
}
buf=p->dat+1;
setpages(p->y/8+1);
setpagem(p->y/8+1);
for(i=p->x;i<p->w+p->x;i++){
if(i<61){//是主控制器控制的列
setcolm(i);
MWDATA(*buf);
}
else{//是从控制器控制的列
setcols(i-61);
SWDATA(*buf);
}
buf +=2;
}
}
}
void clearbmp(struct PIC *p){//y must 0,8,16 or 24
uchar i,j;
uchar *buf;
for(j=0;j<p->h/8;j++){
setpages(p->y/8+j);
setpagem(p->y/8+j);
for(i=p->x;i<p->w+p->x;i++){
if(i<61){//是主控制器控制的列
setcolm(i);
MWDATA(0);
}
else{//是从控制器控制的列
setcols(i-61);
SWDATA(0);
}
buf++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -