📄 main.c
字号:
#include <c8051f020.h>
#include <absacc.h>
extern void config (void);
//////////////////////////////////////////////
#define UINT8 unsigned char
#define INT8 char
#define UINT16 unsigned int
#define INT16 int
#define FP32 float
////////////////////////////////////
#define DAT_ADDR 0xFC00
#define COD_ADDR 0xFD00
#define LCD_DAT XBYTE[DAT_ADDR] //数据接口
#define LCD_CODE XBYTE[COD_ADDR] //指令接口
// T6963C 命令定义
#define LCD_CUR_POS 0x21 // 光标位置设置
#define LCD_CGR_POS 0x22 // CGRAM偏置地址设置
#define LCD_ADDR_POS 0x24 // 地址指针位置
#define LCD_TXT_STP 0x40 // 文本区首址
#define LCD_TXT_WID 0x41 // 文本区宽度
#define LCD_GRH_STP 0x42 // 图形区首址
#define LCD_GRH_WID 0x43 // 图形区宽度
#define LCD_MOD_OR 0x80 // 显示方式:逻辑"或"
#define LCD_MOD_XOR 0x81 // 显示方式:逻辑"异或"
#define LCD_MOD_AND 0x82 // 显示方式:逻辑"与"
#define LCD_MOD_TCH 0x83 // 显示方式:文本特征
#define LCD_DIS_SW 0x90 // 显示开关:D0=1/0:光标闪烁启用/禁用;
// D1=1/0:光标显示启用/禁用;
// D2=1/0:文本显示启用/禁用;
// D3=1/0:图形显示启用/禁用;
#define LCD_CUR_SHP 0xA0 // 光标形状选择:0xA0-0xA7 表示光标占的行数
#define LCD_AUTO_WR 0xB0 // 自动写设置
#define LCD_AUTO_RD 0xB1 // 自动读设置
#define LCD_AUTO_OVER 0xB2 // 自动读/写结束
#define LCD_INC_WR 0xC0 // 数据一次写,地址加1
#define LCD_INC_RD 0xC1 // 数据一次读,地址加1
#define LCD_DEC_WR 0xC2 // 数据一次写,地址减1
#define LCD_DEC_RD 0xC3 // 数据一次读,地址减1
#define LCD_NOC_WR 0xC4 // 数据一次写,地址不变
#define LCD_NOC_RD 0xC5 // 数据一次读,地址不变
#define LCD_SCN_RD 0xE0 // 屏读
#define LCD_SCN_CP 0xE8 // 屏拷贝
#define LCD_BIT_OP 0xF0 // 位操作:D0-D2:定义D0-D7 位;D3:1 置位;0:清除
////////////////////////////////////////////////////////////////////
#define MAX_VERTICAL_DOT 128
#define MAX_HORIZON_DOT 150
#define MAX_SAMPLE 255
///////////////////////////////////////////////////////////////////
UINT8 code DIS_CTRL[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
///////////////////////////////////////////////////////////////////
UINT8 code A[16] = {
/*a */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x1E,0x22,0x42,0x42,0x3F,0x00,0x00
};
extern void config (void);
//**********************************************************
//********子函数**************
//判断状态为STA0(指令读写)和STA1(数据读写)
void LcdRWCheck()
{
while((LCD_CODE&0X03)!=0X03)
{;}
}
//判断自动读状态STA2
void LcdAutoRCheck()
{
while((LCD_CODE&0X04)!=0X04)
{;}
}
//判断自动写状态STA3
void LcdAutoWCheck()
{
while((LCD_CODE&0X08)!=0X08)
{;}
}
//写无参数命令
void WrCmdNoP(UINT8 cmd)
{
LcdRWCheck();
LCD_CODE=cmd;
}
//写一个参数的命令
void WrCmdOneP(UINT8 dat,UINT8 cmd)
{
LcdRWCheck();
LCD_DAT=dat;
LcdRWCheck();
LCD_CODE=cmd;
}
//写两个参数的命令
void WrCmdTwoP(UINT8 dat1,UINT8 dat2,UINT8 cmd)
{
LcdRWCheck();
LCD_DAT=dat1;
LcdRWCheck();
LCD_DAT=dat2;
LcdRWCheck();
LCD_CODE=cmd;
}
//自动写
void DatAutoWr(UINT8 dat)
{
LcdAutoWCheck();
LCD_DAT=dat;
}
//数据自动读
UINT8 DatAutoRd()
{
UINT8 dat;
LcdAutoRCheck();
dat=LCD_DAT;
return dat;
}
//清屏
void ClearDisplay()
{
UINT16 i;
WrCmdTwoP(0,0,LCD_ADDR_POS);
WrCmdNoP(LCD_AUTO_WR);
for(i=0;i<30*128;i++)
{
DatAutoWr(0x00);
}
WrCmdNoP(LCD_AUTO_OVER);
}
//读任意处的值
UINT8 ReadAny(UINT8 v_Row, UINT8 v_Col)
{
UINT8 v_Dat;
UINT16 v_Addr;
v_Addr=v_Row*30+v_Col;
WrCmdTwoP(v_Addr&0xff,v_Addr/256,LCD_ADDR_POS);
(LCD_NOC_RD);
v_Dat=LCD_DAT;
return v_Dat;
}
//在任意处显示任意值
void DisplayAny(UINT8 v_Row,UINT8 v_Col,UINT8 v_Dat)
{
UINT16 v_Addr;
v_Addr=v_Row*30+v_Col;
WrCmdTwoP(v_Addr&0xff,v_Addr/256,LCD_ADDR_POS);
WrCmdOneP(v_Dat,LCD_NOC_WR);
}
//显示英文字母(8*16)
void DisplayChar(UINT8 row,UINT8 col,UINT8 *ch,UINT8 height)
{
UINT8 i;
UINT16 addr;
addr=row*30+col;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
for(i=0;i<height;i++)
{
WrCmdOneP(ch[i],LCD_NOC_WR);
addr+=30;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
}
}
//显示汉字
void DisplayChn(UINT8 row,UINT8 col,UINT8 *chn)
{
UINT8 i;
UINT16 addr;
addr=row*30+col;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
for(i=0;i<16;i++)
{
WrCmdOneP(chn[i],LCD_NOC_WR);
addr+=30;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
}
addr=row*30+col+1;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
for(i=0;i<16;i++)
{
WrCmdOneP(chn[i+16],LCD_NOC_WR);
addr+=30;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
}
}
//画坐标系
/*void DisplayXY(UINT8 row,UINT8 col)
{
//先画竖线
UINT8 i;
UINT16 addr;
addr=row*30+col;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
for(i=0;i<MAX_VERTICAL_DOT;i++)
{
WrCmdOneP(0x80,LCD_NOC_WR);
addr=addr-30;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
}
//写Ic
DisplayChar(row+11-MAX_VERTICAL_DOT,col-3,CHAR_I);
DisplayChar(row+11-MAX_VERTICAL_DOT,col-2,CHAR_c);
DisplayChar(18,10,CHAR_uu);
DisplayChar(18,11,CHAR_AA);
//画横线
addr=row*30+col;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
for(i=0;i<(MAX_HORIZON_DOT/8);i++)
{
WrCmdOneP(0xff,LCD_INC_WR);
}
//写Uce
DisplayChar(row-15,col+MAX_HORIZON_DOT/8-3,CHAR_U);
DisplayChar(row-15,col+MAX_HORIZON_DOT/8-2,CHAR_c);
DisplayChar(row-15,col+MAX_HORIZON_DOT/8-1,CHAR_e);
DisplayChar(116,28,CHAR_VV);
//写B=
DisplayChar(46,3,CHAR_beta);
DisplayChar(46,4,CHAR_equ);
DisplayChar(46,5,CHAR_11);
DisplayChar(46,6,CHAR_00);
DisplayChar(46,7,CHAR_00);
//坐标点
DisplayChar(118,11,CHAR_00);
DisplayChar(118,14,CHAR_99);
DisplayChar(118,16,CHAR_11);
DisplayChar(118,17,CHAR_88);
DisplayChar(118,19,CHAR_22);
DisplayChar(118,20,CHAR_77);
DisplayChar(118,22,CHAR_33);
DisplayChar(118,23,CHAR_66);
DisplayChar(118,25,CHAR_44);
DisplayChar(118,26,CHAR_55);
/*DisplayChar(98,11,CHAR_22);
DisplayChar(78,11,CHAR_44);
DisplayChar(58,11,CHAR_66);
DisplayChar(38,11,CHAR_88);*/
/*DisplayChar(18,8,CHAR_55);
DisplayChar(18,9,CHAR_55);
DisplayChar(18,12,CHAR_L);
}*/
//画波形
void DisplayWave(UINT8 v_OriginRow,UINT8 v_OriginCol,UINT8 v_Num,UINT8 v_CurSample,UINT8 v_PreSample)
{
UINT8 i;
UINT8 v_VolAddition;
UINT8 v_Dat;
FP32 v_Temp;
v_Temp=(FP32)(v_PreSample)/MAX_SAMPLE*MAX_VERTICAL_DOT;
v_PreSample=(UINT8)v_Temp;
v_Temp=(FP32)(v_CurSample)/MAX_SAMPLE*MAX_VERTICAL_DOT;
v_CurSample=(UINT8)v_Temp;
v_VolAddition=v_Num/8;
if(v_CurSample>v_PreSample)
{
for(i=v_OriginRow-v_CurSample;i<(v_OriginRow-v_PreSample);i++)
{
UINT16 addr;
addr=i*30+v_OriginCol+v_VolAddition;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
WrCmdNoP(0xff-v_Num%8);
}
}
if(v_CurSample<v_PreSample)
{
for(i=v_OriginRow-v_CurSample;i>v_OriginRow-v_PreSample;i--)
{
UINT16 addr;
addr=i*30+v_OriginCol+v_VolAddition;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
WrCmdNoP(0xff-v_Num%8);
}
}
if(v_CurSample==v_PreSample)
{
UINT16 addr;
addr=(v_OriginRow-v_CurSample)*30+v_OriginCol+v_VolAddition;
WrCmdTwoP(addr&0xff,addr/256,LCD_ADDR_POS);
WrCmdNoP(0xff-v_Num%8);
}
}
///初始化液晶
void LcdInitial()
{
//全部显示区为图形显示区
WrCmdTwoP(0x00,0x00,LCD_GRH_STP);
WrCmdTwoP(30,0,LCD_GRH_WID);
//设置光标形状
WrCmdNoP(0xa0);
//显示方式
WrCmdNoP(0x80);
//关闭光标显示,关闭文本显示,打开图形显示
WrCmdNoP(0x98);
ClearDisplay();
}
void delay(unsigned int n)
{
unsigned int i,j;
i = 0;
j = 0;
while(j<n)
{
i = 0;
while(i<20) i++;
j++;
}
}
///////////////////////////////////////////////////
void main()
{
//WrCmdTwoP(0x00,0x00,LCD_TXT_STP);
//WrCmdTwoP(30,0,LCD_TXT_WID);
UINT8 i;
UINT8 temp[60]={10,15,25,35,45,55,65,75,85,95,105,110,111,113,115,118,120,122,125,126,126 ,126,126,126,126,126,126,126 ,126,126 ,127,127,127,127,127,128,128,128,128,128,129,129,129,129,129,130,130,130,130,130,131,131,131,131,131,132,132,132,132,132
};
config ();
P1 = 0xff;
while(1)
{
LCD_DAT=0x01;
LCD_CODE=0x00;
P1 = 0xff - P1;
}
config();
WrCmdTwoP(0x00,0x00,LCD_GRH_STP);
WrCmdTwoP(30,0,LCD_GRH_WID);
WrCmdNoP(0xa0);
WrCmdNoP(0x80); //显示方式
WrCmdNoP(0x98); //关闭光标显示,关闭文本显示,打开图形显示
ClearDisplay();
WrCmdTwoP(0x00,0x00,LCD_ADDR_POS);
WrCmdOneP(0xff,LCD_INC_WR);
//menu1();
ClearDisplay();
// menu2();
do{
ClearDisplay();
DisplayChar(1,1,&A[0],16);
}
// DisplayXY(117,12);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -