📄 kszong.c
字号:
/**函数名称有修改**/
#include<stdio.h>
#include"KSzong.h"
#include"absacc.h"
#define RSL XBYTE[0XF6FF]
#define RSR XBYTE[0XFaFF]
#define WI1 XBYTE[0XF4FF]
#define WD1 XBYTE[0XF5FF]
#define RW1 XBYTE[0XF7FF]
#define WI2 XBYTE[0XF8FF]
#define WD2 XBYTE[0XF9FF]
#define RW2 XBYTE[0XFBFF]
void Delay_us(unsigned int DelayTime)
{
while(DelayTime) DelayTime--;
}
void Delay_x10ms(unsigned char DelayTime) //***************10ms延时**********//
{
unsigned char i,j,k;
for(i=0;i<DelayTime;i++)
for(j=0;j<10;j++)
for(k=0;k<120;k++) {;}
}
/*----------------------------------------------------------------------------
下面这个函数用于液晶模块的忙信号检测。
----------------------------------------------------------------------------*/
/*void LCD_Check_Busy(void)
{
uchar a=0;
uchar b=0;
while(1)
{ a=RS;
b=a&0x80;
if(b==0x80) break;
}
//
}*/
/*----------------------------------------------------------------------------
下面这个函数用于向液晶模块写入控制指令代码。
函数入口参数:Command ------ 向液晶模块写入的控制指令代码 。
CS_Num ------ 左右半屏的选数值
----------------------------------------------------------------------------*/
void LCD_WriteCommand(uchar Command, uchar CS_Num)
{
if(CS_Num==1) /*选择左半屏*/
{ while(0x80&RSL);WI1=Command;
}
else if(CS_Num==2) /*选择右半屏*/
{ while(0x80&RSR);WI2=Command;
}
}
/*----------------------------------------------------------------------------
下面这个函数用于向液晶模块写入显示数据。
函数入口参数:Data------ 向液晶模块写入的显示数据 。
CS_Num-------左右半屏的选数值
----------------------------------------------------------------------------*/
void LCD_WriteData(uchar Data,uchar CS_Num)
{
//LCD_Check_Busy();
if(CS_Num==1) /*选择左半屏*/
{while(0x80&RSL);WD1=Data;
}
else if(CS_Num==2) /*选择右半屏*/
{ while(0x80&RSR);WD2=Data;
}
}
/*---------------------------------------------------------------------------
下面这个函数用于向液晶模块初始化。
如果没有写完一个半屏的数据就要充分结合此函数来达到要显示的效果
---------------------------------------------------------------------------*/
void LCD_Initial(void)
{
//LCD_RST = 0; /* 置复位信号为低电平 */
//Delay_us(2);
//LCD_RST = 1; /* 置复位信号为高电平 */
LCD_WriteCommand(0x3F,Left); /*显示开*/
LCD_WriteCommand(0x3F,Right);
LCD_WriteCommand(0xC0,Left); /*起始行*/
LCD_WriteCommand(0xC0,Right);
LCD_WriteCommand(0xB8,Left); /*起始页*/
LCD_WriteCommand(0xB8,Right);
LCD_WriteCommand(0x40,Left); /*起始列*/
LCD_WriteCommand(0x40,Right);
}
/*---------------------------------------------------------------------------
*下面这个函数用于向液晶模块左右半屏写入图象显示数据。
*函数入口参数:DisBuf-----向液晶模块写入的图象显示数据
Side_Num-----液晶模块左右半屏的选择
---------------------------------------------------------------------------*/
void LCD_Graph_Play(uchar *DisBuf,uchar Side_Num)
{
uchar i,k,COM;
for(i=0;i<8;i++)
{
COM=0xB8+i;
LCD_WriteCommand(COM,Side_Num);
COM=0x40;
LCD_WriteCommand(COM,Side_Num);
for(k=0;k<64;k++)
{
LCD_WriteData(DisBuf[i*64+k],Side_Num);
}
}
Delay_us(2);
}
/*---------------------------------------------------------------------------
*下面这个函数用于向液晶模块左右半屏写入汉字显示数据。
*函数入口参数:DisBuf-----向液晶模块写入的汉字显示数据
Side_Num------液晶模块左右半屏的选择数
Page_Num------开始显示页数(0----7),共八页
Clm_Num------开始显示列数 (16的倍数),共64列
Word_Num------每页显示的汉字个数(最多为4个)
注意:输入字应该是16*16
---------------------------------------------------------------------------*/
void LCD_Play(uchar Page_Num,uchar Clm_Num,uchar Word_Num,uchar *DisBuf,uchar Side_Num)
{
uchar i,k,COM;
COM=0xB8+Page_Num;
LCD_WriteCommand(COM,Side_Num);
COM=0x40+Clm_Num;
LCD_WriteCommand(COM,Side_Num);
for(i=0;i<Word_Num;i++)
{
for(k=0;k<16;k++)
{
LCD_WriteData(DisBuf[k+32*i],Side_Num); /*显示一个汉字需要16*16bit,
一个汉字上/下半部各占一页
32个字节的数据*/
}
}
Page_Num++;
COM=0xB8+Page_Num;
LCD_WriteCommand(COM,Side_Num);
COM=0x40+Clm_Num;
LCD_WriteCommand(COM,Side_Num);
for(i=0;i<Word_Num;i++)
{
for(k=16;k<32;k++)
{
LCD_WriteData(DisBuf[k+32*i],Side_Num);
}
}
Delay_us(2);
}
/**************************输出宋体的数字8*16***********************/
void LCD_Num(uchar Page_Num,uchar Clm_Num,uchar count,uchar *DisBuf,uchar Side_Num)
{
uchar k,COM;
COM=0xB8+Page_Num;
LCD_WriteCommand(COM,Side_Num);
COM=0x40+Clm_Num;
LCD_WriteCommand(COM,Side_Num);
for(k=0;k<8;k++)
{
LCD_WriteData(DisBuf[k+16*count],Side_Num);
}
Page_Num++;
COM=0xB8+Page_Num;
LCD_WriteCommand(COM,Side_Num);
COM=0x40+Clm_Num;
LCD_WriteCommand(COM,Side_Num);
for(k=8;k<16;k++)
{
LCD_WriteData(DisBuf[k+16*count],Side_Num);
}
Delay_us(2);
}
/**************************输出英文字母8*8**************************
功能:下面这个函数用于向液晶模块左右半屏写入~~一个字母~~的显示数据。
备注:@@@@@~~~~~~There is a super secret in 'Table13[]'~~~~~~@@@@@;
一个字母,数字,标点都可以由八个字节的数据确定;
*函数入口参数:DisBuf-----向液晶模块写入英文字母的显示数据
Side_Num------液晶模块左右半屏的选择数
Page_Num------开始显示页数(0----7),共八页
Clm_Num------开始显示列数 (8的倍数),共64列
Count-----@@@@@~~~~~Table13[]里面的行号~~~~~@@@@@
****************************************************************/
void LCD_English(uchar Page_Num,uchar Clm_Num,uchar Count,uchar *DisBuf,uchar Side_Num)
{
uchar k,COM;
COM=0xB8+Page_Num;
LCD_WriteCommand(COM,Side_Num);
COM=0x40+Clm_Num;
LCD_WriteCommand(COM,Side_Num);
for(k=0;k<8;k++)
{
LCD_WriteData(DisBuf[k+8*Count],Side_Num);
}
}
/******************************输出单个点******************************
功能:在第Page_Num页第Clm_Num列显示数组DisBuf第boxing+1个数即DisBuf[boxing];
“设置了页地址和列地址就唯一确定了显示RAM中的一个单元这样MPU 就可以
用读写指令读出该单元中的内容或向该单元写进一个字节数据”
入口参数:Page_Num
Clm_Num
*DisBuf:
boxing
Side_Num ;
*************************************************************************/
void lcds(uchar Page_Num,uchar Clm_Num,uchar *DisBuf,uchar boxing,uchar Side_Num)
{
uchar COM;
COM=0xB8+Page_Num;
LCD_WriteCommand(COM,Side_Num);
COM=0x40+Clm_Num;
LCD_WriteCommand(COM,Side_Num);
LCD_WriteData(DisBuf[boxing],Side_Num);
}
/*---------------------------------------------------------------------------
下面这个函数用于液晶模块的清屏。
---------------------------------------------------------------------------*/
void LCD_CLR(uchar Side_Num)
{
uchar i,k,COM;
for(i=0;i<8;i++)
{
COM=0xB8+i;
LCD_WriteCommand(COM,Side_Num);
COM=0x40;
LCD_WriteCommand(COM,Side_Num);
for(k=0;k<64;k++)
{
LCD_WriteData(0x00,Side_Num);
}
}
Delay_us(2);
}
/*---------------------------------------------------------------------------
下面这个函数为主函数,根据程序要实现的功能写相应的应用程序
---------------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -