📄 tt.c
字号:
/*******************************************************************
注意: 此文档为仿真程序,若要在试验板上验证,需要须改一下函数
void lcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY)
/*{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}*//*
LCM_EN=0;
}■○
地址:01000000 数据:00001110 图示:○○○○■■■○
01000001 00010001 ○○○■○○○■
01000010 00010000 ○○○■○○○○
01000011 00010000 ○○○■○○○○
01000100 00010000 ○○○■○○○○
01000101 00010000 ○○○■○○○○
01000110 00010001 ○○○■○○○■
01000111 00001110 ○○○○■■■○
0x80,0x00, 0x44,0x41, 0x24,0x42, 0x14,0x44,
0x08,0x9C, 0x0C,0xF4, 0x1B,0x28, 0x29,0x60,
0x48,0xA0, 0x09,0x68, 0x0B,0x26, 0x0E,0x32,
0x08,0xA8, 0x18,0x64, 0x20,0x02, 0x40,0x01,
*******************************************************************/
#include<reg51.h>
#include<intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*uchar table[]={0x06,0x09,0x09,0x06,0x00,0x00,0x00,0x00,
0x0e,0x11,0x10,0x10,0x10,0x11,0x0e,0x00};//字符℃*/
uchar table[]={0x00,0x01,0x09,0x12,0x24,0x50,0x90,0x11,
0x00,0x00,0x00,0xfe,0x02,0x44,0x40,0x50,
0x12,0x14,0x10,0x10,0x11,0x10,0x00,0x00,
0x48,0x40,0x40,0x40,0x40,0xb0,0x00,0x00};
/*uchar table[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,
0x10,0x18,0x1c,0x1E,0x1E,0x1E,0x1E,0x1E,
0x0f,0x07,0x03,0x01,0x00,0x00,0x00,0x00,
0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x07,0x01,
0x1f,0x1f,0x1f,0x1f,0x1f,0x1c,0x18,0x00,
0x1c,0x18,0x10,0x00,0x00,0x00,0x00,0x00};//心图案 */
#define BUSY 0x80 //lcd忙检测标志
#define DATAPORT P0 //定义P0口为LCD通讯端口
sbit LCM_RS=P2^0; //数据/命令端
sbit LCM_RW=P2^1; //读/写选择端
sbit LCM_EN=P2^2;
sbit sda=P2^3; //IO口定义
sbit scl=P2^4; //LCD使能信号
sbit ad_busy=P3^2; //adc中断方式接口
uchar ad_data; //ad采样值存储
uchar seconde; //定义并初始化时钟变量
uchar minite;
uchar hour;
uchar mstcnt=0;
uchar temp1,temp2,temp; //温度显示变量
uchar t,set;
uchar K;
bit ON_OFF=0;
bit outflag;
bit write=0;
uchar code str0[]={"LCD TEST "};
uchar code str1[]={"SUCCESSFUL "};
void delay_LCM(uint); //LCD延时子程序
void initLCM(void); //LCD初始化子程序
void lcd_wait(void); //LCD检测忙子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //写指令到ICM子函数
void WriteDataLCM(uchar WDLCM); //写数据到LCM子函数
void DisplayOneChar(uchar X,uchar Y,uchar DData); //显示指定坐标的一个字符子函数
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //显示指定坐标的一串字符子函数
/*********延时K*1ms,12.000mhz**********/
void delay_LCM(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++)
{;}
}
}
/**********写指令到LCM子函数************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC)lcd_wait();
DATAPORT=WCLCM;
LCM_RS=0; // 选中指令寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/**********写数据到LCM子函数************/
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //检测忙信号
DATAPORT=WDLCM;
LCM_RS=1; // 选中数据寄存器
LCM_RW=0; // 写模式
LCM_EN=1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
/***********lcm内部等待函数*************/
void lcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY)
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
/**********LCM初始化子函数***********/
void initLCM( )
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,1); //8bit数据传送,2行显示,5*7字型,检测忙信号
WriteCommandLCM(0x08,1); //关闭显示,检测忙信号
WriteCommandLCM(0x01,1); //清屏,检测忙信号
WriteCommandLCM(0x06,1); //显示光标右移设置,检测忙信号
WriteCommandLCM(0x0c,1); //显示屏打开,光标不显示,不闪烁,检测忙信号
}
/****************显示指定坐标的一个字符子函数*************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y&=1;
X&=15;
if(Y)X|=0x40; //若y为1(显示第二行),地址码+0X40
X|=0x80; //指令码为地址码+0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/***********显示指定坐标的一串字符子函数***********/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y&=0x01;
X&=0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
/***********the main funtion*************/
void main(void)
{
unsigned char a,b,c,tmp;
P1=0xff; //初始化p1口,全设为1
delay_LCM(500); //延时500ms启动
initLCM( ); //LCD初始化
tmp=0x40;//设置CGRAM地址的格式字
c=0;
for(a=0;a<4;a++)
{
for(b=0;b<8;b++)
{
WriteCommandLCM(tmp+b,1); // 设置自定义字符的 CGRAM 地址
delay_LCM(2);
WriteDataLCM(table[c]); // 向CGRAM写入自定义字符表的数据
c++;
delay_LCM(2);
}
tmp=tmp+8;
}
//DisplayListChar(0,0,str0);
//DisplayListChar(0,1,str1);
for(a=0;a<2;a++)
{
DisplayOneChar(1+a,0,a);//在第一行第11列位置显示心图案的上半部(列数,行数,数据地址)
}
for(a=2;a<4;a++)
{
DisplayOneChar(1+a-2,1,a);//在第一行第11列位置显示心图案的上半部(列数,行数,数据地址)
}
while (1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -