📄 ks0108.c
字号:
#include "msp430x14x.h" // Standard Equations
//#include "math.h"
#include "fontlib.h"//显示字符库。
#include <stdarg.h>
#include <stdio.h>
//**********************************************
//cs1:p2.0
//cs2:p2.2
//d/i:p4.5
//r/w:p4.6
//e: p4.7
//d0-d7:p5
#define CS1_1 P2OUT|=BIT0
#define CS1_0 P2OUT&=~BIT0
#define CS2_1 P2OUT|=BIT2
#define CS2_0 P2OUT&=~BIT2
#define RS_1 P4OUT|=BIT5//寄存器选择信号
#define RS_0 P4OUT&=~BIT5
#define RW_1 P4OUT|=BIT6//读/写选择信号
#define RW_0 P4OUT&=~BIT6
#define E_1 P4OUT|=BIT7//使能信号
#define E_0 P4OUT&=~BIT7
#define D_PDIR P5DIR
#define D_PIN P5IN
#define D_POUT P5OUT
//数据线:p4口 ,控制线: p5口
#define ON 1
#define on 1
#define OFF 0
#define off 0
//**********************************************
char revfonthead,revfontnum;
void CheckLcmState(void)
{
char cradd1;
RS_0;
RW_1;
D_PDIR=0x00;
do
{
E_1;
cradd1=D_PIN;
E_0;
}
while((cradd1&0x80)!=0);
}
//**************************************************
void WriteCode(char code)// 写指令代码子程序
{
CheckLcmState();
RW_0;
D_POUT=code;
D_PDIR=0xff;
E_1;
E_0;
}
//**************************************************
void WriteData(char data)// 写显示数据子程序
{
CheckLcmState();
RS_1;
RW_0;
D_PDIR=0xff;
D_POUT=data;
E_1;
E_0;
}
//****************************************************
char ReadData(void)//读显示数据子程序
{
char data;
CheckLcmState();
RS_1;
E_1;
data=D_PIN;
E_0;
return data;
}
//****************************************************
void SetRow(char row)//设定行地址(页)--X 0-7
{
row=row & 0x07; // 0<=row<=7
row=row|0xb8; //1011 1xxx
WriteCode(row);
}
void SetCol(char column)//设定列地址--Y 0-63
{
column=column & 0x3f; // 0=<column<=63
column=column | 0x40; //01xx xxxx
WriteCode(column);
}
//设定显示开始行--XX
void SetStartRow(char startrow) //0--63
{
startrow=startrow & 0x07;
startrow=startrow|0xc0; //1100 0000
WriteCode(startrow);
}
//开关显示
void SetOnOff(char onoff)
{
onoff=0x3e | onoff; //0011 111x
WriteCode(onoff);
}
//选择屏幕
//screen: 0-全屏,1-左屏,2-右屏
void SelectScreen(char screen)
{
switch(screen)
{
case 0: CS1_0;CS2_0;break;
case 1: CS1_0;CS2_1;break;
case 2: CS1_1;CS2_0;break;
}
}
//---------------------------------------------------
void Cls(void) //清屏
{
char i,j;
SelectScreen(0);
for(i=0;i<8;i++)
{
SetRow(i);
SetCol(0);
for(j=0;j<64;j++) //设置列地址
{
WriteData(0x00);
}
}
}
//
void LcmInit(void)
{
SelectScreen(0);
SetOnOff(off);
Cls();
SetOnOff(on);
SetStartRow(0);
}
//反显字符,head:反显字符相对位置,num:反显字符个数。
void RevPos(char head,char num){revfonthead=head;revfontnum=num;}
//显示8*8点阵 与原先显示数据重叠(或)。
//旋转90度:字模被竖着切分
//row:行(0-7), column: 列(0-15), addr : 字模区首地址, revflag: 取反标志位
void Show88(char row,char col,char const *addr,char revflag)
{
char i,data;
row%=8;
col%=16;
if(col<8) SelectScreen(1);
else SelectScreen(2);
col*=8;
SetRow(row);
for(i=0;i<8;i++)
{
SetCol(col+i+1);
data=ReadData();
if(revflag)data|=~*addr;
else data|=*addr;
SetCol(col+i);
WriteData(data);
addr++;
}
}
//row:行(0-7), column: 列(0-15) 字符(字模被竖着切分):8*16;, 汉字(字模被竖着切分):16*16;,
char Dprintf(char urow,char ucol,char *fmt, ...)
{
va_list arg_ptr;
signed char c1,c2;
char tmpBuf[128];
char i=0,j,uLen;
const char *p;
va_start(arg_ptr, fmt);
uLen = (char)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
if(c1 >= 0)
{
if(c1<STARTNUM)c1=STARTNUM;
p=(const char *)&ASC_MSK[(c1-STARTNUM)*16];
if( revfontnum >0 && revfonthead <= i+1)
{
Show88(urow,ucol,p,ON);
Show88(urow+1,ucol,p+8,ON);
revfontnum--;
}
else
{
Show88(urow,ucol,p,OFF);
Show88(urow+1,ucol,p+8,OFF);
}
ucol++;
}
else
{
for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)
{
if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
break;
}
if(j < sizeof(GB_16)/sizeof(GB_16[0]))
{
p=(const char *)&GB_16[j].Msk[0];
if( revfontnum >0 && revfonthead <= i+1)
{
Show88(urow,ucol,p,ON);
Show88(urow,ucol+1,p+8,ON);
Show88(urow+1,ucol,p+16,ON);
Show88(urow+1,ucol+1,p+24,ON);
revfontnum--;
}
else
{
Show88(urow,ucol,p,OFF);
Show88(urow,ucol+1,p+8,OFF);
Show88(urow+1,ucol,p+16,OFF);
Show88(urow+1,ucol+1,p+24,OFF);
}
}
ucol += 2;
i++;
}
if(ucol >= 16)
{
urow +=2;
if(urow < 8) ucol -= 16;
else {urow = 0;ucol = 0;}
}
i++;
}
return uLen;
}
//***************************************************
//init_xt2; 初始化XT2 晶振为4MHZ
//*****************************************************
void init_xt2(void)
{
unsigned int iq0;
//使用XT2振荡器
BCSCTL1&=~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
} while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2,
BCSCTL2 |=DIVM_1; //MCLK 2分频SMCLK=MCLK=2MHZ
}
//**************** 画水平直线(首列坐标)
//row:0~64; 行;col1:0~128起始列,col:0~128 终止列
void Line(char row,char col1,char col2)
{
char i,bit,data;
bit=row%8;
row/=8;
SelectScreen(0);
SetRow(row);
for(i=col1;i<=col2;i++)
{
if(i<64) SelectScreen(1);
else SelectScreen(2);
SetCol(i+1);
data=ReadData();
SetCol(i);
data|=0x01<<bit;
WriteData(data);
}
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
init_xt2();
P4DIR=0xe0;
P4OUT=0xe0;
P2DIR=0x05;
P2OUT=0x05;
LcmInit();
do
{
Cls(); // clear screen
Dprintf(0,0,"!abcdefg1234567890");
Line(2,1,127);
Dprintf(4,1,"abcdefg1234567890");
RevPos(1,1);
Dprintf(0,0,"电力电力监测仪电力电力监测仪");
}
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -