📄 t6963c.c
字号:
{
DDRA = 0xFF; // 数据方向为输出
// PORTA = 0xFF; // 使能内部上拉电阻
DDRB = 0x0F; // 数据方向为输出
if(fnST3() == 0)
return 1;
PORTB &= ~(1 << CD) ; // CD (PB2) 赋值0,低电平表示数据
// _NOP();
// lcd_delay(1);
PORTA = uData;
// _NOP();
// lcd_delay(1);
PORTB &= ~(1 << WR); // WR (PB0) 赋值0,低电平写操作有效
// _NOP();
// lcd_delay(1);
PORTB |= (1 << WR); // WR (PB0) 赋值1,高电平写操作无效
return 0; // 返回0成功
}
/************************************************************************************/
/* 函数名称:fnCWD */
/* 输入参数:uchar uData 数据 */
/* 输出参数:uchar 0 成功,否则失败 */
/* 函数功能:写命令 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
uchar fnCWD(uchar uData)
{
DDRA = 0xFF; // 数据方向为输出
PORTA = 0xFF; // 使能内部上拉电阻
DDRB = 0x0F; // 数据方向为输出
if(fnST01() == 0)
return 1;
PORTB |= (1 << CD) ; // CD (PB2) 赋值1,高电平表示命令
PORTA = uData;
// lcd_delay(1);
PORTB &= ~(1 << WR); // WR (PB0) 赋值0,低电平写操作有效
// _NOP();
// lcd_delay(1);
PORTB |= (1 << WR); // WR (PB0) 赋值1,高电平写操作无效
return 0; // 返回0成功
}
/************************************************************************************/
/* 函数名称:fnDRD */
/* 输入参数:void */
/* 输出参数:uchar 成功,返回数据;失败返回1 */
/* 函数功能:读数据 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
uchar fnDRD(void)
{
uchar data;
DDRA = 0xFF; // 数据方向为输出
// PORTA = 0x00; // 禁止内部上拉电阻
DDRB = 0x0F; // 数据方向为输出
if(fnST01() == 0)
return 1;
PORTB &= ~(1 << CD); // CD (PB2) 赋值0,低电平表示数据
PORTB &= ~(1 << RD); // RD (PB1) 赋值0,低电平表示读操作有效
// _NOP();
// lcd_delay(1); // 延时
data = PINA;
// _NOP();
PORTB |= (1 << RD); // RD (PB1) 赋值1,高电平表示读操作无效
return data;
}
/************************************************************************************/
/* 函数名称:fnSetPos */
/* 输入参数:uchar urow, 欲设置的行 */
/* uchar ucol,欲设置的列 */
/* 行的定义为,从上到下为行;列的定义为从左到右为列,类似矩阵中行列 */
/* 输出参数:void */
/* 函数功能:设置当前任意地址,每水平8像素为一字节 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
void fnSetPos(uchar urow, uchar ucol)
{
uint iPos;
iPos =( (urow << 4) + (ucol >> 3) ); // iPos =urow *16 + ucol /8 ;
fnCW2P(LC_ADD_POS,iPos & 0xFF,iPos >> 8);
}
/************************************************************************************/
/* 函数名称:cursor */
/* 输入参数:uchar uRow, uchar uCol 当前行、列 */
/* 输出参数:void */
/* 函数功能:设置当前显示行、列 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
void cursor(uchar uRow, uchar uCol)
{
gCurRow = uRow;
gCurCol = uCol;
fnSetPos(gCurRow,gCurCol);
}
/************************************************************************************/
/* 函数名称:cls */
/* 输入参数:void */
/* 输出参数:void */
/* 函数功能:清屏 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
void cls(void)
{
uint i;
fnSetPos(0,0);
fnCW0P(LC_AUT_WR); // 自动写
for(i=0;i<LCM_HEIGHT *(LCM_WIDTH/8);i++) // 将所有单元内容都写1
{
fnST3();
fnDWD(0x00);
// _NOP();
} // 写数据
// lcd_delay(15);
fnCW0P(LC_AUT_OVR); // 自动写结束
fnCW2P(LC_ADD_POS,0x00,0x00); // 重置地址指针
}
/************************************************************************************/
/* 函数名称:fnLCMInit */
/* 输入参数:void */
/* 输出参数:char */
/* 函数功能:LCM 初始化 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
char fnLCMInit(void)
{
if(fnCW2P(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
return -1;
fnCW2P(LC_TXT_WID,LCM_WIDTH/8,0x00); // 文本显示区宽度
fnCW2P(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
fnCW2P(LC_GRH_WID,LCM_WIDTH/8,0x00); // 图形显示区宽度
fnCW0P(LC_CUR_SHP | 0x01); // 光标形状
fnCW0P(LC_MOD_OR); // 显示方式设置
fnCW0P(LC_DIS_SW | 0x08); // 显示开关设置
// lcd_delay(15);
return 0;
}
void lcd_delay(uint time)
{
int i;
while(time--)
{
i = 1000;
while(i--);
}
}
/******************************************************************************/
/************************************************************************************/
/* 函数名称:dprintf */
/* 输入参数:uchar * fmt 欲显示字符串 */
/* 输出参数:uchar uLen 字符串长度 */
/* 函数功能:字符显示 */
/* 作 者 :安车科技大灯仪开发小组 许孝刚 */
/* 开发日期: 2005.08 */
/* 版 本 : v1.0 */
/************************************************************************************/
uchar dprintf(uchar *ptr)
{
uchar c1,c2;
uchar *tmpBuf; // LCD显示数据缓冲区
uchar i=0,j=0,j1=0,k,uLen=0,uRow,uCol,uVal=0;
const typFNT_GB12 data ;
uchar uIndex1,uIndex2; // 存储汉字的索引
uchar uMask1,uMask2; // 1个字横向字模信息的2个字节
uchar k1,k2;
while (ptr[uLen]!=0)
{
uLen++; ////探测字串长度
};
tmpBuf = ptr;
i = 0;
while(i<uLen)
{
c1 = tmpBuf[i];
c2 = tmpBuf[i+1];
uRow = fnGetRow();
uCol = fnGetCol();
if(c1 >= 0x20 && c1 <= 0x7f) // 0x20---0x7f
{ // ASCII 的 12行 * 6列 字符显示
for( j = 0; j < 12; j++) // 逐行显示
{
for ( k = 0; k < 6; k++) // 逐列显示
{
cursor(uRow + j,uCol + k); // 置当前显示地址
k1 = (uCol + k) & 0x07 ; // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
// 每字节8个像素点,从左到右为01234567点,
// 对应数据的76543210位
k2 = 7 - k1; // 当前屏幕点属于的字节单元的位
k1 = BIT(7-k); // 当前屏幕点属于的字节单元的数据的第7-k个数据位置1,其余置0
uVal = pgm_read_byte(ASCII_TBL+(c1-0x20)*12 + j);
k1 = ( uVal & k1 ) == k1 ? 1 : 0; // 测试对应字库中字的第j行1字节数据中的7-k个数据位是否为1
if(k1 == 1)
fnCW0P(LC_BIT_OP | 0x08 | k2 ); // 是1
else
fnCW0P(LC_BIT_OP | k2 ); // 是0
}
}
cursor(uRow ,uCol + 6); // 下一个字符
i++;
}
else // 0x80 -- 0xff
{ // 中文12行*12列汉字显示
for(j1 = 0; j1 < sizeof(GB_12)/sizeof(GB_12[0]);j1 ++) // 找字
{
memcpy_P(&data, &GB_12[j1], sizeof(typFNT_GB12)); // 从程序区拷贝一个结构体数据
uIndex1 = data.Index[0];
uIndex2 = data.Index[1];
if(c1 == uIndex1 && c2 == uIndex2)
break;
}
if(j1 >= sizeof(GB_12)/sizeof(GB_12[0]) ) // 找不到,屏幕就是空白
return 0;
for( j=0;j<12;j++) // 逐行显示
{
for ( k = 0; k < 8; k++) // 逐列显示
{
cursor(uRow + j,uCol + k); // 置当前显示地址
k1 = (uCol + k) & 0x07 ; // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
// 每字节8个像素点,从左到右为01234567点,
// 对应数据的76543210位
k2 = 7 - k1; // 当前屏幕点属于的字节单元的位
k1 = BIT(7 - (k & 0x07)); // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
memcpy_P(&data, &GB_12[j1], sizeof(typFNT_GB12));
uMask1 = data.Msk[2*j];
k1 = (uMask1 & k1 ) == k1 ? 1 : 0; // 汉字左边部分
if(k1 == 1) // 为 1
fnCW0P(LC_BIT_OP | 0x08 | k2 );
else
fnCW0P(LC_BIT_OP | k2 ); // 为 0
}
for ( k = 0; k < 4; k++) // 逐列显示
{
cursor(uRow + j,uCol + k +8); // 置当前显示地址
k1 = (uCol + k + 8) & 0x07 ; // 当前屏幕点属于的字节单元的像素点;水平共16字节单元,
// 每字节8个像素点,从左到右为01234567点,
// 对应数据的76543210位
k2 = 7 - k1; // 当前屏幕点属于的字节单元的位
k1 = BIT(7 - (k & 0x07)); // 当前屏幕点属于的字节单元的数据的第7 - k & 0x07个数据位置1,其余置0
uMask2 = data.Msk[2*j+1];
k1 = (uMask2 & k1 ) == k1 ? 1 : 0; // 汉字右边部分
if(k1 == 1) // 为 1
fnCW0P(LC_BIT_OP | 0x08 | k2 );
else
fnCW0P(LC_BIT_OP | k2 ); // 为 0
}
}
cursor(uRow ,uCol + 13); // 下一个汉字
i +=2; // 在字符串中一个汉字占2个字节
}
}
return uLen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -