|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
感觉老板是在为难我= = ,我刚才刚看懂了hello world的程序OTL
#include "LCD12864.H"
#include "base.h"
#include "FONTZK.H"
//*********************************************************************************************************
//** 函数名称 :delay(void)
//** 函数功能 :us级延时
//** 入口参数 :延时长短
//** 出口参数 :无
//*********************************************************************************************************
void delay(uint8 value)
{
uint8 i;
uint32 j;
for(i=1; i<value; i++)
for(j=1; j<5000; j++);
}
//*********************************************************************************************************
//** 函数名称 :delayNS(void)
//** 函数功能 :NS级延时
//** 入口参数 :延时长短 NS
//** 出口参数 :无
//*********************************************************************************************************
void delayNS(uint8 value)
{
uint8 i;
uint16 j;
for(i=1; i<value; i++)
for(j=1; j<50; j++);
}
//*********************************************************************************************************
//** 函数名称 :SendData(uint8 d)
//** 函数功能 :总线数据发送
//** 入口参数 :d 上传数据
//** 出口参数 :无
//*********************************************************************************************************
void SendData(uint8 d)
{
IO1CLR= LCD_S8;
delayNS(0);
IO1SET= LCD_S8 & (d<<18);
delayNS(0);
}
//*********************************************************************************************************
//** 函数名称 :LCDWrite(uint8 side, uint8 flag, uint8 d)
//** 函数功能 :写控制字,数据
//** 入口参数 :side:左=1,右=0; flag:控制=1,数据=0; d:数据字
//** 出口参数 :无
//*********************************************************************************************************
void LCDWrite(uint8 side, uint8 flag, uint8 d)
{
if(side) // 左屏幕
{
IO0SET = LCD_CS1;
delayNS(0);
IO0CLR = LCD_CS2;
delayNS(1);
if(flag)
{
IO0CLR = LCD_RS;
delayNS(0);
}
else
{
IO0SET = LCD_RS;
delayNS(0);
}
}
else // 右屏幕
{
IO0CLR = LCD_CS1;
delayNS(0);
IO0SET = LCD_CS2;
delayNS(1); //判断忙比较麻烦,给足够时间让液晶显示完毕
if(flag)
{
IO0CLR = LCD_RS;
delayNS(0);
}
else
{
IO0SET = LCD_RS;
delayNS(0);
}
}
IO0CLR = LCD_RW;
delayNS(0);
SendData(d);
IO0SET = LCD_E; //模拟下降沿触发
delayNS(0);
IO0CLR = LCD_E;
}
//*********************************************************************************************************
//** 函数名称 :ClearPage(uint8 page, uint8 scol, uint8 ecol)
//** 函数功能 :清页函数
//** 入口参数 :page :起始页, scol :起始列, ecol :结束列
//** 出口参数 :无
//*********************************************************************************************************
void ClearPage(uint8 page, uint8 scol, uint8 ecol)
{
uint8 i;
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETPAGE | page); // 设置左屏幕页面
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETPAGE | page); // 设置右屏幕页面
if(ecol < 64) // 左屏幕
{
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW | scol);
}
else if(scol>=64) // 右屏幕
{
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW | (scol-64));
}
else // 跨页
{
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW | scol);
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW);
}
for(i=scol; i<=ecol; i++)
{
if(i<64) // 左屏幕
LCDWrite(LCD_LEFT, LCD_DATA, 0);
else // 右屏幕
LCDWrite(LCD_RIGHT, LCD_DATA, 0);
}
}
//*********************************************************************************************************
//** 函数名称 :ClearScreen(void)
//** 函数功能 :清屏函数
//** 入口参数 :无
//** 出口参数 :无
//*********************************************************************************************************
void ClearScreen(void)
{
uint8 i;
for(i=0; i<8; i++)
{
ClearPage(i, 0, 127);
}
}
//*********************************************************************************************************
//** 函数名称 :LCDInit(void)
//** 函数功能 :初始化液晶
//** 入口参数 :无
//** 出口参数 :无
//*********************************************************************************************************
void LCDInit(void)
{
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SWITCH); // 关闭左屏幕
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SWITCH); // 关闭右屏幕
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETLINE); // 设置左屏幕起始行 = 0
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETLINE); // 设置右屏幕起始行 = 0
ClearScreen(); // 清屏
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETPAGE); // 设置左屏幕页面
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETPAGE); // 设置右屏幕页面
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW); // 设置左屏幕列
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW); // 设置右屏幕列
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SWITCH | 0x01); // 开左屏幕
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SWITCH | 0x01); // 开右屏幕
}
//*********************************************************************************************************
//** 函数名称 :PrintPage(uint8 flag, uint8 page, uint8 col, uint8 cnt, char *d)
//** 函数功能 :打印字符到指定页面上
//** 入口参数 :flag:正显反显标志 page:页面 col:列 cnt:字符的行占 *d 数据指针
//** 出口参数 :无
//*********************************************************************************************************
void PrintPage(uint8 flag, uint8 page, uint8 col, uint8 cnt, char *d)
{
uint8 i;
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETPAGE | page); // 设置左屏幕页面
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETPAGE | page); // 设置右屏幕页面
if(col < 64) // 左, 跨页 屏幕
{
LCDWrite(LCD_LEFT, LCD_CTL, LCD_SETROW | col);
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW);
}
else // 右屏幕
{
LCDWrite(LCD_RIGHT, LCD_CTL, LCD_SETROW | (col-64));
}
for(i=0; i<cnt; i++, col++)
{
if(col<64) // 左屏幕
{
if(flag)
LCDWrite(LCD_LEFT, LCD_DATA, d[i]);
else
LCDWrite(LCD_LEFT, LCD_DATA, ~d[i]);
}
else // 右屏幕
{
if(flag)
LCDWrite(LCD_RIGHT, LCD_DATA, d[i]);
else
LCDWrite(LCD_RIGHT, LCD_DATA, ~d[i]);
}
}
}
//*********************************************************************************************************
//** 函数名称 :PrintChar_6x8(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 6X8 字模
//** 入口参数 :flag:正显反显标志 page:页面 col:列 *d 数据指针
//** 出口参数 :无
//*********************************************************************************************************
void PrintChar_6x8(uint8 flag, uint8 page, uint8 col, char *d)
{
PrintPage(flag, page, col, 6, d);
}
//*********************************************************************************************************
//** 函数名称 :PrintChar_4X8(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 6X8 字模
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************
void PrintChar_4X8(uint8 flag, uint8 page, uint8 col, char *d)
{
PrintPage(flag, page, col, 4, d);
}
//*********************************************************************************************************
//** 函数名称 :PrintChar_16X16(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 6X8 字模
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************
void PrintChar_16X16(uint8 flag, uint8 page, uint8 col, char *d)
{
PrintPage(flag, page, col, 16, &d[0]);
PrintPage(flag, page+1, col, 16, &d[16]);
}
//*********************************************************************************************************
//** 函数名称 :PrintChar_12x16(uint8 flag, uint8 page, uint8 col, char *d)
//** 函数功能 :指定位置输入 12X16字符
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************
void PrintChar_8x16(uint8 flag, uint8 page, uint8 col, char *d)
{
PrintPage(flag, page, col, 8, &d[0]);
PrintPage(flag, page+1, col, 8, &d[8]);
}
//*********************************************************************************************************
//** 函数名称 :DrawIcon(uint8 flag, uint8 spage, uint8 scol, uint8 pagecnt, uint8 colcnt, char *d)
//** 函数功能 :显示图标
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :无
//*********************************************************************************************************
void DrawIcon(uint8 flag, uint8 spage, uint8 scol, uint8 pagecnt, uint8 colcnt, char *d)
{
uint8 i;
for(i=0; i<pagecnt; i++) // 页
{
PrintPage(flag, spage+i, scol, colcnt, &d[i*colcnt]);
}
}
//*********************************************************************************************************
//** 函数名称 :Print_Chinese(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
//** 函数功能 :显示中文字符串 16X16
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :字符串长度
//*********************************************************************************************************
uint8 Print_Chinese(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
{
va_list arg_ptr;
char c1[2];
char tmpBuf[40]; // LCD显示数据缓冲区
uint8 offset=0, i, j, uLen;
va_start(arg_ptr, fmt);
uLen = (uint8)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
for(i=0; i<uLen; i=i+2)
{
c1[0] = tmpBuf[i]; // 取字符索引
c1[1] = tmpBuf[i+1];
for(j=0; j<sizeof(CHI16X16)/sizeof(CHI16X16[0]); j++) // 索引字模
{
if((c1[0] == CHI16X16[j].Index[0])&(c1[1] == CHI16X16[j].Index[1])) break;
}
PrintChar_16X16(flag, page, col+offset, (char*)CHI16X16[j].Msk); // 显示字符
offset = offset+16; // 显示完一个字符,列上移动1格
}
return uLen;
}
//*********************** 修改 大字符 8*16 *************
//*********************************************************************************************************
//** 函数名称 :Print_Large(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
//** 函数功能 :显示大字符串 12X16
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :字符串长度
//*********************************************************************************************************
uint8 Print_Large(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
{
va_list arg_ptr;
char c1;
char tmpBuf[40]; // LCD显示数据缓冲区
uint8 offset=0, i, j, uLen;
va_start(arg_ptr, fmt);
uLen = (uint8)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
for(i=0; i<uLen; i++)
{
c1 = tmpBuf[i]; // 取字符索引
if((c1<0x20) || (c1>0x7E)) c1 = 0x20; // 超出显示范围,显示空格
for(j=0; j<sizeof(NUM_8x16)/sizeof(NUM_8x16[0]); j++) // 索引字模
{
if(c1 == NUM_8x16[j].Index) break;
}
PrintChar_8x16(flag, page, col+offset, (char*)NUM_8x16[j].Msk); // 显示字符
offset = offset+8; // 显示完一个字符,列上移动1格
}
return uLen;
}
//*********************************************************************************************************
//** 函数名称 :Print_Char(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
//** 函数功能 :显示小字符串模 6X8
//** 入口参数 :一堆 常用的(同前)
//** 出口参数 :字符串长度
//*********************************************************************************************************
uint8 Print_Char(uint8 flag, uint8 page, uint8 col, char *fmt, ...)
{
va_list arg_ptr;
char c1;
char tmpBuf[40]; // LCD显示数据缓冲区
uint8 offset=0, i, j, uLen;
va_start(arg_ptr, fmt);
uLen = (uint8)vsprintf(tmpBuf, fmt, arg_ptr);
va_end(arg_ptr);
for(i=0; i<uLen; i++)
{
c1 = tmpBuf[i]; // 取字符索引
if((c1<0x20) || (c1>0x7E)) c1 = 0x20; // 超出显示范围,显示空格
for(j=0; j<sizeof(ASC_6x8)/sizeof(ASC_6x8[0]); j++) // 索引字模
{
if(c1 == ASC_6x8[j].Index) break;
}
PrintChar_6x8(flag, page, col+offset, (char*)ASC_6x8[j].Msk); // 显示字符
offset = offset+6; // 显示完一个字符,列上移动1格
}
return uLen;
}
按照你这么说,首先可以确定他是在为难你
至于你应该如何做,由你自己决定
|
|