本帖最后由 zdcn 于 2020-12-22 20:41 編輯
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RST=P1^0;
sbit DI=P1^5;
sbit RW=P1^4;
sbit CSL=P1^2;
sbit CSR=P1^1;
sbit EN=P1^3;
sbit RDY=P0^7;
sbit LCD=0x80;
#define LCD_DISPON 0x3f
#define LCD_STARTROW 0xc0
#define LCD_ADDRSTRY 0xb8
#define LCD_ADDRSTRX 0x40
#define CSL 0
#define CSR 1
void LCD_WrCmd(bit port, uchar cmd)
{
EN=0;
CSL=port;
DI=0;
RW=0;
EN=1;
LCD=cmd;
EN=0;
}
void LCD_WrDat(bit port, uchar wrdata)
{
EN=0;
CSR=port;
DI=1;
RW=0;
EN=1;
LCD=wrdata;
EN=0;
}
uchar code ASCII_TAB[480] = //0X20~0X7F之間 ASCII碼對應的點陣數據表
{ 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9e, 0x00, 0x00,
0x00, 0x0e, 0x00, 0x0e, 0x00,
0x28, 0xfe, 0x28, 0xfe, 0x28,
0x48, 0x54, 0xfe, 0x54, 0x24,
0x46, 0x26, 0x10, 0xc8, 0xc4,
0x6c, 0x92, 0xaa, 0x44, 0xa0,
0x00, 0x0a, 0x06, 0x00, 0x00,
0x00, 0x38, 0x44, 0x82, 0x00,
0x00, 0x82, 0x44, 0x38, 0x00,
0x28, 0x10, 0x7c, 0x10, 0x28,
0x10, 0x10, 0x7c, 0x10, 0x10,
0x00, 0xa0, 0x60, 0x00, 0x00,
0x10, 0x10, 0x10, 0x10, 0x10,
0x00, 0xc0, 0xc0, 0x00, 0x00,
0x40, 0x20, 0x10, 0x08, 0x04,
0x7C, 0xA2, 0x92, 0x8A, 0x7C,
0x00, 0x84, 0xFE, 0x80, 0x00,
0x84, 0xC2, 0xA2, 0x92, 0x8C,
0x42, 0x82, 0x8A, 0x96, 0x62,
0x30, 0x28, 0x24, 0xFE, 0x20,
0x4E, 0x8A, 0x8A, 0x8A, 0x72,
0x78, 0x94, 0x92, 0x92, 0x60,
0x02, 0xE2, 0x12, 0x0A, 0x06,
0x6C, 0x92, 0x92, 0x92, 0x6C,
0x0C, 0x92, 0x92, 0x52, 0x3C,
0x00, 0x6C, 0x6C, 0x00, 0x00,
0x00, 0xAC, 0x6C, 0x00, 0x00,
0x10, 0x28, 0x44, 0x82, 0x00,
0x28, 0x28, 0x28, 0x28, 0x28,
0x00, 0x82, 0x44, 0x28, 0x10,
0x04, 0x02, 0xA2, 0x12, 0x0C,
0x64, 0x92, 0xF2, 0x82, 0x7C,
0xFC, 0x22, 0x22, 0x22, 0xFC,
0xFE, 0x92, 0x92, 0x92, 0x6C,
0x7C, 0x82, 0x82, 0x82, 0x44,
0xFE, 0x82, 0x82, 0x44, 0x38,
0xFE, 0x92, 0x92, 0x92, 0x82,
0xFE, 0x12, 0x12, 0x12, 0x02,
0x7C, 0x82, 0x92, 0x92, 0xF4,
0xFE, 0x10, 0x10, 0x10, 0xFE,
0x00, 0x82, 0xFE, 0x82, 0x00,
0x40, 0x80, 0x82, 0x7E, 0x02,
0xFE, 0x10, 0x28, 0x44, 0x82,
0xFE, 0x80, 0x80, 0x80, 0x80,
0xFE, 0x04, 0x18, 0x04, 0xFE,
0xFE, 0x08, 0x10, 0x20, 0xFE,
0x7C, 0x82, 0x82, 0x82, 0x7C,
0xFE, 0x12, 0x12, 0x12, 0x0C,
0x7C, 0x82, 0xA2, 0x42, 0xBC,
0xFE, 0x12, 0x32, 0x52, 0x8C,
0x8C, 0x92, 0x92, 0x92, 0x62,
0x02, 0x02, 0xFE, 0x02, 0x02,
0x7E, 0x80, 0x80, 0x80, 0x7E,
0x3E, 0x40, 0x80, 0x40, 0x3E,
0x7E, 0x80, 0x70, 0x80, 0x7E,
0xC6, 0x28, 0x10, 0x28, 0xC6,
0x0E, 0x10, 0xE0, 0x10, 0x0E,
0xC2, 0xA2, 0x92, 0x8A, 0x86,
0x00, 0xFE, 0x82, 0x82, 0x00,
0x04, 0x08, 0x10, 0x20, 0x40,
0x00, 0x82, 0x82, 0xFE, 0x00,
0x08, 0x04, 0x02, 0x04, 0x08,
0x80, 0x80, 0x80, 0x80, 0x80,
0x00, 0x02, 0x04, 0x08, 0x00,
0x40, 0xA8, 0xA8, 0xA8, 0xF0,
0xFE, 0x90, 0x88, 0x88, 0x70,
0x70, 0x88, 0x88, 0x88, 0x40,
0x70, 0x88, 0x88, 0x90, 0xFE,
0x70, 0xA8, 0xA8, 0xA8, 0x30,
0x10, 0xFC, 0x12, 0x02, 0x04,
0x18, 0xA4, 0xA4, 0xA4, 0x7C,
0xFE, 0x10, 0x08, 0x08, 0xF0,
0x00, 0x88, 0xFA, 0x80, 0x00,
0x40, 0x80, 0x88, 0x7A, 0x00,
0xFE, 0x20, 0x50, 0x88, 0x00,
0x00, 0x82, 0xFE, 0x80, 0x00,
0xF8, 0x08, 0x30, 0x08, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0xF0,
0x70, 0x88, 0x88, 0x88, 0x70,
0xF8, 0x28, 0x28, 0x28, 0x10,
0x10, 0x28, 0x28, 0x30, 0xF8,
0xF8, 0x10, 0x08, 0x08, 0x10,
0x90, 0xA8, 0xA8, 0xA8, 0x40,
0x08, 0x7E, 0x88, 0x80, 0x40,
0x78, 0x80, 0x80, 0x40, 0xF8,
0x38, 0x40, 0x80, 0x40, 0x38,
0x78, 0x80, 0x60, 0x80, 0x78,
0x88, 0x50, 0x20, 0x50, 0x88,
0x18, 0xA0, 0xA0, 0xA0, 0x78,
0x88, 0xC8, 0xA8, 0x98, 0x88,
0x00, 0x10, 0x6C, 0x82, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00,
0x00, 0x82, 0x6C, 0x10, 0x00,
0x10, 0x10, 0x54, 0x38, 0x10,
0x10, 0x38, 0x54, 0x10, 0x10};
//以filldata充填液晶屏
void LCD_DispFill(uchar filldata)
{ uchar x, y;
LCD_WrCmd(CSL,LCD_STARTROW+0); //設置左半屏顯示起始行為0
LCD_WrCmd(CSR,LCD_STARTROW+0); //設置右半屏顯示起始行為0
for( y=0;y<8;y++) //循環充填8頁
{ LCD_WrCmd(CSL,LCD_ADDRSTRY+y); // 設置左半屏頁地址
LCD_WrCmd(CSL,LCD_ADDRSTRX); // 設置左半屏列地址
LCD_WrCmd(CSR,LCD_ADDRSTRY+y); // 設置右半屏頁地址
LCD_WrCmd(CSR,LCD_ADDRSTRX); // 設置右半屏列地址
for(x=0;x<64;x++) //充填每頁的64個單元(列)
{ LCD_WrDat(CSL,filldata);
LCD_WrDat(CSR,filldata);
}
}
}
//液晶模塊初始化
void LCD_DispIni(void)
{ uint i;
LCD_RST = 0; // 復位驅動芯片
for(i=0; i<500; i++);
LCD_RST = 1;
LCD_WrCmd(CSL,LCD_DISPON); // 打開顯示
LCD_WrCmd(CSL,LCD_STARTROW); // 設置顯示起始行為0
LCD_WrCmd(CSR,LCD_DISPON);
LCD_WrCmd(CSR,LCD_STARTROW);
LCD_DispFill(00); // 清屏
LCD_WrCmd(CSL,LCD_ADDRSTRY+0); // 設置頁(字符行)地址
LCD_WrCmd(CSL,LCD_ADDRSTRX+0); // 設置列地址
LCD_WrCmd(CSR,LCD_ADDRSTRY+0);
LCD_WrCmd(CSR,LCD_ADDRSTRX+0);
}
//在液晶屏的cy(0-7)行、cx(0-15)列顯示字符dispdata
void LCD_DispChar(uchar cy, uchar cx, char dispdata)
{ uchar code *pch;
uchar i;
bit port;
cy = cy&0x07; // 參數過濾
cx = cx&0x0f;
pch = &ASCII_TAB[(dispdata-0X20)*5]; //指向字符起始列的點陣碼
if((cx&0x08)==0) // 列號cx<8,在左半屏顯示
{ port=CSL;
i=cx<<3;
}
else
{ port=CSR;
i = (cx&0x07)<<3;
}
LCD_WrCmd(port,LCD_ADDRSTRX+i); // 設置當前列地址
LCD_WrCmd(port,LCD_ADDRSTRY+cy); // 設置當前頁地址
for(i=0; i<5; i++); //延時
LCD_WrDat(port,0x00); // 顯示一列空格
for(i=0; i<5; i++) //送出字符的5列點陣碼
{ LCD_WrDat(port,*pch);
pch++;
}
LCD_WrDat(port,0x00); //顯示一列空格
for(i=0; i<5; i++);
LCD_WrDat(port,0x00);
}
//在液晶屏的cy(0-7)行、cx(0-15)列顯示字符disp_str
void LCD_DispStr(uchar cy, uchar cx, char *disp_str)
{ while( *disp_str !='\0')
{ cy = cy&0x07; // 參數過濾
cx = cx&0x0f;
LCD_DispChar(cy, cx, *disp_str); // 顯示字符
disp_str++ ; // 指向下一字符數據
cx++;
if(cx>15) cy++; // 指向下一顯示行
}
}
#define uchar unsigned char
#define uint unsigned int
extern void LCD_DispIni(void);
extern void LCD_DispFill(uchar filldata);
extern void LCD_DispChar(uchar cy,uchar cx,char dispdata);
extern void LCD_DispStr(uchar cy,uchar cx,char *disp_str);
void main(void)
{ while(1)
{ LCD_DispIni(); // 初始化液晶模塊
LCD_DispStr (0,1,"void Stop()");
LCD_DispStr (1,1,"{ SDA=0;");
LCD_DispStr (2,1," SCL=1;");
LCD_DispStr (3,1," delay5us();");
LCD_DispStr (4,1," SDA=1;");
LCD_DispStr (5,1," delay5us();");
LCD_DispStr (6,1," SCL=0;");
LCD_DispChar (7,1,'}');
while(1);
}
}
|