📄 asad.c
字号:
////////////////LCD测试程序//////////////////////
#include<c8051f020.h>
#include<stdio.h>
#define uchar unsigned char;
#define uint unsigned int;
sbit A0=P2^0; //硬件接口控制
sbit E1=P2^1;
sbit E2=P2^2;
void delay(unsigned int i)
{
unsigned char k=200 ;
while(i>0)
{
i--;
}
while(k>1)k--;
}
void OutMI(unsigned int i ) //发指令i到主窗口
{
A0=0;
delay(5);
E1=1; //左页
delay(10);
P1=i;
delay(5);
E1=0;
}
void OutMD(unsigned int i) //发数据i到主窗口
{
A0=1;
delay(5);
E1=1; //左页
delay(10);
P1=i;
delay(5);
E1=0;
}
void OutSI(unsigned int i) //发指令i到从窗口
{
A0=0;
delay(5);
E2=1; //右页
delay(10);
P1=i;
delay(5);
E2=0;
}
void OutSD(unsigned int i) //发数据i到从窗口
{
A0=1;
delay(5);
E2=1; //右页
delay(10);
P1=i;
delay(5);
E2=0;
}
void lcdini(void) //12232点阵液晶初始化
{
OutMI(0XE2);OutSI(0XE2); //复位
OutMI(0XAE);OutSI(0XAE); //POWER SAVE
OutMI(0XA4);OutSI(0XA4); //动态驱动
OutMI(0XA9);OutSI(0XA9); //1/32占空比
OutMI(0XA0);OutSI(0XA0); //时钟线输出
OutMI(0XEE);OutSI(0XEE); //写模式
OutMI(0X00);OutSI(0X00); //设置起始列
OutMI(0XC0);OutSI(0XC0); //设置起始行
OutMI(0XAF);OutSI(0XAF); //开显示
void SetPage(uchar page0,uchar page1) //同时设置主从显示页为0~`3页
{
OutMI(0xB8|page1);OutSI(0xB8|page0);
}
void SetAddress(uchar address0,uchar address1) //同时设置主从列地址为0~121
{
OutMI(address1);OutSI(address0);
}
void config(void){
WDTCN=0xDE; //看门狗禁止
WDTCN=0xAD;
XBR0=0x00;
XBR1=0x00;
XBR2=0x40; //Crossbar交叉开关配置使能
P1MDOUT=0x00; //端口配置,P1,P2为开漏
P2MDOUT=0x00;
P1MDIN=0xFF; //P1,P2端口为数字输入
P2MDIN=0xFF;
CLKSEL=0x00;
OSCXCN=0x00;
OSCICN=0x84; //采用内部晶振,为2 MHz
}
void PutCharR(uchar ch) //左页当前地址
{
OutSD(ch);
}
void PutCharL(uchar ch) //右页当前地址
{
OutMD(ch);
}
void clrscr(void) //清屏
{
uchar i;
uchar page;
for(page=0;page<4;page++)
{
SetPage(page,page);
SetAddress(0,0);
for(i=0;i<61;i++){
PutCharR(0);PutCharL(0);
}
}
}
void Draw_word(uchar d_where,unit x_add,bit layer,uchar width)
{
uchar x,i=0,address; //address表示显存的物理地址
uchar page=0; //page表示上下两页
bit window=0; //window表示左右两页
//putcharR //右边
//putcharL //左边
d_where=d_where*32;
for (x=width;x>1;x--)
{
if (x_add>60) {windows=1;address=x_add%61;}
else address=x_add;
if(layer=0) //显示一行八个字
{
SetPage(0,0);
SetAddress(address,address);
if(windows=1)PutCharR(bmp001[d_where]); //右边
else PutCharL(bmp001[d_where]); //左边
SetPage(1,1);
SetAddress(address,address);
if(windows=1)PutCharR(bmp001[d_where+width]);
else PutCharL(bmp001[d_where+width]);
}
else //显示第二行八个汉字
{
SetPage(2,2);
SetAddress(address,address);
if(windows=1)PutCharR(bmp001[d_where]); //右边
else PutCharL(bmp001[d_where]); //左边
SetPage(3,3);
SetAddress(address,address);
if(windows=1)PutCharR(bmp001[d_where+width]);
else PutCharL(bmp001[d_where+width]);
}
x_add++;
d_where++;
}
}
void main()
{
lcdini(void);
clrscr(void);
config(void)
Draw_word();
while(1);
}
unsigned char code bmp001[]=
{
/----文字 :天--- /
/ --- 宋体12;此字体下对应的点阵为:宽*高=16*16--- /
0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,
/---文字 :天---* /
/ *---- 宋体12;此字体下对应的点阵为:宽*高=16*16---* /
0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -