📄 1335c51.c
字号:
{
PutCdotInGraph(0,0,15,16);
PutCdotInGraph(2,0,31,16);
PutCdotInGraph(4,0,32,16);
PutCdotInGraph(6,0,29,16);
PutCdotInGraph(8,0,33,16);
PutCdotInGraph(10,0,34,16);
PutCdotInGraph(12,0,35,16);
PutCdotInGraph(14,0,7,16);
PutCdotInGraph(16,0,8,16);
PutCdotInGraph(18,0,11,16);
PutCdotInGraph(20,0,12,16); //第2行
PutCdotInGraph(0,32,26,16); // 通
PutCdotInGraph(2,32,27,16); //道
/*
PutCdotInGraph(5,32,36,16);
PutCdotInGraph(7,32,37,16);
PutCdotInGraph(9,32,19,16); //标称 值
*/
PutCdotInGraph(14,32,38,16);
PutCdotInGraph(16,32,7,16);
dprintf(18,32,DanWei5); //实测值
PutCdotInGraph(26,24,21,16);
PutCdotInGraph(28,24,22,16);
PutCdotInGraph(26,40,23,16);
dprintf(28,40,DanWei5); //绝对误差
PutCdotInGraph(34,24,25,16);
PutCdotInGraph(36,24,22,16);
PutCdotInGraph(34,40,23,16); //相对误差
dprintf(36,40,DanWei4);
}
void PutWord24InGraph( void ) {
//x坐标以半个汉字定位左起0开始计算
//y坐标以像素行定位,顶部0开始计算
//汉字码以点阵码列表所对应32字节位单位进界,从0开始计算
PutCdotInGraph( 13, 100, 0, 24 ); // 调汉字写入子程序
PutCdotInGraph( 16, 100, 1, 24 ); // 调汉字写入子程序
PutCdotInGraph( 19, 100, 2, 24 ); // 调汉字写入子程序
PutCdotInGraph( 22, 100, 3, 24 ); // 调汉字写入子程序
PutCdotInGraph( 25, 100, 4, 24 ); // 调汉字写入子程序
DelayMs(50);
}
//--------延时子程序--------------------------
void Delay( Uint tt ) {
while( tt-- );
}
// 显示三区闪烁
/*========================================================
; 直接访问方式的驱动子程序
; 程序口地址设置CWADD1,DWADD1,CRADD1,DRADD1
; 占用内部资源DAT1,A,COM
; 程序输入变量: DAT1,,COM
;===============直接访问方式驱动子程序==================*/
// 判忙标志BF子程序pr0
/*void WaitForBusy( void ) {
while ( LcmStatusPort & Busy );
}
*/
//---------------------------
// 写指令代码子程序pr1
void WriteCommand( Uchar CommandByte ) {
LcmCmdPort = CommandByte;
}
//---------------------------
// 写参数及显示数据子程序
void WriteData( Uchar dataW ) {
LcmWdataPort = dataW;
}
//---------------------------
// 读参数及显示数据子程序
Uchar ReadDataLcm( void ) {
return LcmRdataPort;
}
/*=====================================
初始化子程序
======================================*/
void LcmInition( void ) {
Uchar i;
WriteCommand( SystemSet ); // 系统参数设置
for (i=0;i<8;i++) {
WriteData( ParaSysTable8[i] ); //
}
WriteCommand( Scroll ); //设定显示区域起始地址
for (i=0;i<10;i++) {
WriteData( ParaScrTableA[i] );
}
WriteCommand( HdotScr ); // 写入点位移指令代码
WriteData( 0 ); // 写入P1参数
WriteCommand( Ovlay ); // 显示合成方式设置
WriteData( 0 ); // 0000 0100 显示一区文本,三区文本属性,二重"或"合成
WriteCommand( CsrForm ); // 光标形状设置,代码0x5d
WriteData( 0x07 ); // 设置光标水平点为CSX=8
WriteData( 0x87 ); // 光标为块状形式,垂直点为CSY=8
}
/*============================================
建立 cgram,将显示字符送入cgram中
入口参数约定:Base.... 起始
=============================================*/
void BuildCgram( Uchar Base, Uchar EndlCode ) {
Uchar iCgram,ii,ij;
WriteCommand( CgramAdr ); // CGRAMADR 代码
WriteData( 0 ); // 设置SAG=0C000H
WriteData( 0x70 ); // 汉字模在cgram中的编码0x70~0x73
WriteCommand( CsrW ); // CSRW 代码,光标指针设置
WriteData( 0 ); // 设置CSR=0C400H(字符代码=80H)
WriteData( 0x74 ); // 汉字模在cgram中的编码0x70~0x73
WriteCommand( CsrDirR ); // CSRDIR 代码
WriteCommand( mWrite ); // 代码0x42,数据写入指令
for (ii=0;ii<EndlCode;ii++){
for (ij=0;ij<2;ij++){
for (iCgram=0;iCgram<32;iCgram+=2)
WriteData( Cdotlib[Base+ii].Msk[ij+iCgram] ); // 将制定的数据块写入 cgram
}
}
}
/*==============================================================================
; 汉字写入子程序(图形方式)。每次调用输出一个汉字 写入一区
; 支持图形方式使用,完成汉字点阵码的输出。
; 携入参数: Ox,Oy....写入显示的左上角坐标,Ox是以字节单位,Oy以行扫描线单位
Ptr......汉字码,库内的排列编码,大型程序时请改用unsigned int类型
; 无返回数据。
==============================================================================*/
void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs )
{
Uint tempPtr,Optr;
Uchar tempCount1,tempCount2,nByte;
Optr = (Uint)Oy * paraP9 + Ox;
if(attribs)Optr += BasePart2*256;
nByte = DotWidth/8;
WriteCommand( CsrDirD ); // 自动右移。
tempPtr = (Uint)Cnumber * DotWidth*nByte;
for (tempCount1=0;tempCount1<nByte;tempCount1++)
{
WriteCommand( CsrW ); // 光标定位指令
WriteData( (Uchar)(Optr &0xff) ); // 设置光标地址CSR
WriteData( (Uchar)(Optr /256 ) );
WriteCommand( mWrite ); // ram写指令
switch(DotWidth)
{
case 16: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdotlib[Cnumber].Msk[tempCount2*2+tempCount1] ); // 写入数据
}
break;
case 24: for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdot24lib[tempPtr] ); // 写入数据
tempPtr += nByte;
}
break;
}
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
}
}
/*
void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs ) {
Uint tempPtr,Optr;
Uchar tempCount1,tempCount2,nByte;
Optr = (Uint)Oy * paraP9 + Ox;
nByte = DotWidth/8;
WriteCommand( CsrDirD ); // 自动右移。
if(attribs)Optr += BasePart2*256;
WriteCommand( CsrW ); // 光标定位指令
WriteData( (Uchar)(Optr &0xff) ); // 设置光标地址CSR
WriteData( (Uchar)(Optr /256 ) );
WriteCommand( mWrite ); // ram写指令
for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdotlib[Cnumber].Msk[tempCount2*2] ); // 写入数据
}
tempPtr = Cnumber * DotWidth*nByte + tempCount1 + 1;
Optr++;
if(attribs)Optr += BasePart2*256;
WriteCommand( CsrW ); // 光标定位指令
WriteData( (Uchar)(Optr &0xff) ); // 设置光标地址CSR
WriteData( (Uchar)(Optr /256 ) );
WriteCommand( mWrite ); // ram写指令
for(tempCount2=0;tempCount2<DotWidth;tempCount2++) {
WriteData( Cdotlib[Cnumber].Msk[tempCount2*2+1] ); // 写入数据
}
}
*/
/*============================================================================
汉字写入子程序(文本方式)
在文本方式下显示汉字, 首先要建立汉字Cgram, 要定义汉字代码.
在文本方式下写汉字需要写入4 个代码以组成一个汉字
每8字节组成一个点阵Ascii小区,4个小区组合成一个汉字所以需要4个代码
============================================================================*/
void PutCdotInAlpha( Uchar Ox, Uchar Oy, Uchar Cnumber) {
Uint tempPtr;
Uchar tempCount;
tempPtr = (Uint)Oy * paraP9 + Ox;
WriteCommand( CsrDirD ); // CSRDIR 代码(下移)
for(tempCount=0;tempCount<2;tempCount++) {
WriteCommand( CsrW ); // CSRW 代码,光标指针设置
WriteData( (Uchar)(tempPtr &0xff) ); // 设置光标地址CSR
WriteData( tempPtr /256 + BasePart3 );
WriteCommand( mWrite ); // 代码0x42,数据写入指令
WriteData( Cnumber++ ); // 写入汉字代码
WriteData( Cnumber++ ); // 写入汉字代码
tempPtr++; // 修正光标地址
}
}
/*======================== 清显示 32K RAM区(清屏)子程序 ======================*/
void LcmClear( void ) {
Uint i1=32768;
WriteCommand( CsrDirR ); // 光标移动方向定义:自动右移
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( 0 ); // 写入参数CSRL设置参数光标指针低8位
WriteData( 0 ); // 写入参数CSRH设置参数光标指针高8位
WriteCommand( mWrite ); // 数据写入指令,代码0x42
while(i1--) {
WriteData( 0x0 ); // 写入数据0
}
}
/*============================================================================
光标位定位,用于在1区图形方式下。
输入参数约定: x...水平方向字节单位坐标,即可以以半个汉字宽度设定水平坐标。
y...垂直方向以行线定位的坐标,可以定位到点单位。
左上角约定坐标为( 0, 0 )
============================================================================*/
void Locatexy(Uchar x,Uchar y, Uchar attribs) {
Uint temp;
temp = (Uint)y*paraP9+x;
if(attribs)temp += BasePart2*256; // 如果需要就指向第二区,加上第二区首地址
WriteCommand( CsrW ); // 光标Locate,定位
WriteData( (Uchar)(temp & 0xff) ); // 写入参数CSRL设置参数光标指针低8位
WriteData( (Uchar)(temp /256 ) ); // 写入参数CSRH设置参数光标指针高8位
}
/*=============================================================================
ASCII(8*16) 及 汉字(16*16) 混合字符串显示函数
输入参数约定:
x,y显示字符串的左上角xy坐标.x..8点一字节位置; y..一条扫描线定位
*ptr...字符串指针,本函数所指的是flash字串
att....显示区标志,0...第一区;1...第二区
返回参数:输出字串长度,留意汉字一个算两个
其它假定:调用时汉字必须在字库数组中已经存在,否则将输出不正确的结果
==============================================================================*/
Uchar dprintf(Uchar x,Uchar y, char code *ptr, Uchar att)
{
Uchar c1,c2;
Uchar i,j,uLen,uRow,uCol,temp;
Uint k;
uRow = x;
uCol = y;
uLen=0;
WriteCommand( CsrDirD ); // 光标移动方向定义:自动下移
Locatexy(uRow,uCol,att); //起点定位
while ( (Uchar)ptr[uLen] >= 0x10 ){uLen++;}; //探测字串长度
i=0;
while(i<uLen)
{
c1 = ptr[i];
c2 = ptr[i+1];
//ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
if(c1 <=128) // ASCII
{
if (c1 >= 0x10) {
WriteCommand( mWrite ); // 写数据(命令)
for(j=0;j<16;j++) WriteData( ASC_MSK[(c1-0x20)*16 +j ]);
}
uRow++; // 列数加1
}
else // 中文
{
for(j=0;j<sizeof(Cdotlib)/sizeof(Cdotlib[0]);j++) // 查找定位
{
if((c1 == Cdotlib[j].Index[0]) && (c2 == Cdotlib[j].Index[1]))
break;
}
for(k=0;k<2;k++) // 分16行输出
{
Locatexy(uRow+k,uCol,att);
WriteCommand( mWrite ); // 写数据(命令)
for(temp=0;temp<16;temp++) WriteData( Cdotlib[j].Msk[temp*2 + k]);
}
uRow +=2; // 光标右移一大格
i++;
}
if(uRow >= 40) // 光标后移
{
uCol += 16; // Y坐标
uRow = 0; // X坐标
if( uCol >= 240 ) uCol = 0;
}
Locatexy(uRow,uCol,att);
i++;
}
return uLen; //返回字串长度,汉字按2字节计算
}
/*================================================
在定时器中断
================================================*/
void timers0() interrupt 1 using 1 {
TH0 = 0x80;
TL0 = 0x00;
if (timer1)timer1--;
if (timer2)timer2--;
}
/*================================================
使用定时中断的长延时程序
===============================================*/
void DelayMs(Uint tt) {
timer1=tt;
while(timer1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -