📄 1335c51.c
字号:
//#pragma src
#include <reg52.h>
#include <stdlib.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>
#include"zimo.h"
#include"define.h"
//================================= 演示主程序 =================================
Uchar keyscan(void) ;
void PutCdotInGraph( Uint Ox, Uchar Oy, Uchar Cnumber, Uchar DotWidth,Uchar attribs ) ;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P3_3=P3^3; //kk标志位,平时为低,记数完毕后为高,数被读走后又为低
void Main( void )
{
Uchar b,c,k;
Uchar rval;
Uchar m;
// Uchar i,j;
Delay(32768); // 足够的延时确保lcm已经准备好
LcmInition();
LcmClear();
PutWordInGraph();
dprintf(1,56,ASC0,1); //8个通道的通道号
dprintf(1,74,ASC1,1);
dprintf(1,92,ASC2,1);
dprintf(1,110,ASC3,1);
dprintf(1,128,ASC4,1);
dprintf(1,146,ASC5,1);
dprintf(1,164,ASC6,1);
dprintf(1,182,ASC7,1);
dprintf(0,222,BenDi,1);
WriteCommand( DispOn ); // 写入指令代码
WriteData( 0x16 );
WriteCommand( CsrDirR ); // 自动右移光标指向
WriteCommand( CsrW ); // 制定光标位置
WriteData(0x04); // 设置光标地址CSR
WriteData(0x00);
WriteCommand( mWrite );
WriteData(0x59);
WriteData(0x45);
WriteData(0x57);
WriteData(0x45);
WriteData(0x49);
// while(1);
// PutWordInGraph(); //继电器菜单
// while(1);
do //以keyscan为主线的循环
{
b=keyscan();
if(b==2)
{
dprintf(0,0,TestJi,1); //测继电器界面的提示菜单
dprintf(5,32,SheZhi,1);
dprintf(5,222,JiDianQi,1);
}
else if(b==3)
{
dprintf(0,0,TestJing,1); //测晶振界面的提示菜单
dprintf(5,32,BiaoCheng,1);
dprintf(5,222,JingZheng,1);
}
else if(b==1) //设置分频,对分频好之后用变量m记录下来
{
DelayMs(10);
if(b==1)
{
c++;
if(c==9)c=0;
// while(b==2);
}
switch(c)
{
case 1:dprintf(18,222,Period0,1); m=0x10;break;
case 2:dprintf(18,222,Period1,1);m=0x11;break;
case 3:dprintf(18,222,Period2,1);m=0x12; break;
case 4:dprintf(18,222,Period3,1);m=0x13; break;
case 5:dprintf(18,222,Period4,1);m=0x14; break;
case 6:dprintf(18,222,Period5,1);m=0x15; break;
case 7:dprintf(18,222,Period6,1);m=0x16; break;
case 8:dprintf(18,222,Period7,1);m=0x17; break;
case 0: dprintf(18,222,Next,1); break;
}
}
else if(b==6) //在分频的基础上送一个启动信号,开始进行测量 所以要先设置再启动。
{
XBYTE[0X8010]=m&0xf7;
XBYTE[0X8010]=m|0x08;
XBYTE[0X8010]=m&0xf7;
while(P3_3==0) ;
DATARD0();
TestDisplay();
TryDisplay13(24,56,Rslt0);
}
// else{;}
}while(1);
}
/************************键盘扫描***************************************/
Uchar keyscan(void)
{
Uchar i,a=0;
for(i=0;i<8;i++)
{
P1_0=1;
P1_1=0;
P1_1=1;
}
P1_0=0;
P1_1=0;
P1_1=1;
for(i=0;i<9;i++)
{
if(P1_2==0)
{ //i代表0的移位
if (i==1) a=1; //i=1~4,负责两行键盘,要用端口线判别一下
else if (i==2) a=2;
else if (i==3) a=3;
else if (i==4) a=4;
else if (i==5) a=5;
else if (i==6) a=6;
else if (i==7) a=7;
else if (i==8) a=8;
else {;}
}
if(P1_3==0)
{
if (i==1) a=9;
else if (i==2) a=10;
else if (i==3) a=11;
else if (i==4) a=12;
else {;}
}
P1_1=0;
P1_0=1;
P1_1=1;
}
// return a;
}
/**********************读数据********************************/
void DATARD0()
{
Uchar dat;
dat=DATARD00;
temp[0]=dat&0x0f;
temp[1]=(dat&0xf0)/16;
dat=DATARD01;
temp[2]=dat&0x0f;
temp[3]=(dat&0xf0)/16;
dat=DATARD02;
temp[4]=dat&0x0f;
temp[5]=(dat&0xf0)/16;
dat=DATARD03;
temp[6]=dat&0x0f;
temp[7]=(dat&0xf0)/16;
dat=DATARD04;
temp[8]=dat&0x0f;
temp[9]=(dat&0xf0)/16;
dat=DATARD05;
temp[10]=dat&0x0f;
temp[11]=(dat&0xf0)/16;
}
/***************************************/
void TestDisplay()
{
Uchar i;
for(i=0;i<12;i++) //目前测脉冲个数,所以是12,真正测多少秒时,换成13
{
Rslt0[i]=temp[i];
}
}
/*************************转换成ASC码************************/
void TryDisplay(Uchar x,Uchar y,Uchar*ptr)
{
Uchar i,c1;
/* if(ptr=SET0) c1=6;
else if(ptr=Rslt0) c1=13;
else c1=7;
*/
// c1=sizeof(ptr)/sizeof(Uchar);
for(i=0;i<6;i++)
{
switch(ptr[i])
{
case 0:dprintf(x,y,ASC0,0); break;
case 1:dprintf(x,y,ASC1,0); break;
case 2:dprintf(x,y,ASC2,0); break;
case 3:dprintf(x,y,ASC3,0); break;
case 4:dprintf(x,y,ASC4,0); break;
case 5:dprintf(x,y,ASC5,0); break;
case 6:dprintf(x,y,ASC6,0); break;
case 7:dprintf(x,y,ASC7,0); break;
case 8:dprintf(x,y,ASC8,0); break;
case 9:dprintf(x,y,ASC9,0); break;
default: dprintf(x,y,ASCdot,0);
}
x++;
}
}
void TryDisplay13(Uchar x,Uchar y,Uchar*ptr)
{
Uchar i,c1;
// c1=sizeof(ptr);
for(i=0;i<13;i++)
{
switch(ptr[i])
{
case 0:dprintf(x,y,ASC0,0); break;
case 1:dprintf(x,y,ASC1,0); break;
case 2:dprintf(x,y,ASC2,0); break;
case 3:dprintf(x,y,ASC3,0); break;
case 4:dprintf(x,y,ASC4,0); break;
case 5:dprintf(x,y,ASC5,0); break;
case 6:dprintf(x,y,ASC6,0); break;
case 7:dprintf(x,y,ASC7,0); break;
case 8:dprintf(x,y,ASC8,0); break;
case 9:dprintf(x,y,ASC9,0); break;
default: dprintf(x,y,ASCdot,0);
}
x--;
}
}
/*******************************keytest*************/
void KeyDisplay(Uchar x,Uchar y,Uchar val)
{
// Uchar i,c1;
/* if(ptr=SET0) c1=6;
else if(ptr=Rslt0) c1=13;
else c1=7;
*/
// c1=sizeof(ptr)/sizeof(Uchar);
switch(val)
{
case 0:dprintf(x,y,ASC0,0); break;
case 1:dprintf(x,y,ASC1,0); break;
case 2:dprintf(x,y,ASC2,0); break;
case 3:dprintf(x,y,ASC3,0); break;
case 4:dprintf(x,y,ASC4,0); break;
case 5:dprintf(x,y,ASC5,0); break;
case 6:dprintf(x,y,ASC6,0); break;
case 7:dprintf(x,y,ASC7,0); break;
case 8:dprintf(x,y,ASC8,0); break;
case 9:dprintf(x,y,ASC9,0); break;
default: dprintf(x,y,ASCdot,0);
}
x--;
}
//============================== 西文显示演示程序 ==============================
// 仅仅用于文本方式下的西文字符串显示,本函数只写入第3显示区
void TextDisp( Uchar Ox,Uchar Oy, Uchar code *ptr ) {
Uchar TexLength=0,ii;
Uint iTemp;
while(ptr[TexLength]>0x1f) {TexLength++;}; // 获取字串长度
iTemp = Oy*paraP9+Ox;
WriteCommand( CsrForm ); // 光标形状设置,代码0x5d
WriteData( 0x07 ); // 设置光标水平点为CSX=8
WriteData( 0x07 ); // 光标为块状形式,垂直点为CSY=8
WriteCommand( Ovlay ); // 显示合成方式设置.代码0x5b
WriteData( 0x01 ); // 设置参数:显示3区为文本属性,二重xor合成
WriteCommand( DispOn ); // 写入指令DISP ON/OFF代码,后续参数:
WriteData( 0x56 ); // 01 01 01 10显示1~4区开显示,光标闪烁显示
iTemp = (Uint)Oy * paraP9 + Ox; // 光标位置到实际ram地址换算
WriteCommand( CsrDirR ); // 自动右移光标指向
WriteCommand( CsrW ); // 制定光标位置
WriteData( (Uchar)(iTemp &0xff) ); // 设置光标地址CSR
WriteData( (Uchar)(iTemp /256 + BasePart3) ); // 加入显示三区起始地址SAD2H
WriteCommand( mWrite ); // 当前位置写入数据指令
for(ii=0;ii < TexLength;ii++) {
WriteData( ptr[ii] ); // 写入显示字符代码
}
DelayMs(350);
}
/*==============================================================================
; 该汉字字模是根据清华蓬远公司提供的PICKHZ.EXE软件从计算机中提取的汉字 16x16
点阵字模, 其排列顺序是: 前16字节为汉字左半部分(自上而下), 后16字节为汉字右
半部分(自上而下). 下面提供的在文本方式下汉字的写入子程序可以在文本显示区任意
地方写入汉字. 程序如下:
;------------ 文本方式下汉字写入子程序 ------------
; 在文本方式下汉字显示演示程序段
==============================================================================*/
void PutWordInAlpha( void ) {
// return; // 首先建立CGRAM,
WriteCommand( Ovlay ); // 显示合成方式设置.代码0x5b
WriteData( 0x01 ); // 设置参数:显示3区为文本属性,二重xor合成
BuildCgram( 0,8 ); // 调建立CGRAM子程序设置写入字模量八个汉字模
// 开始调用显示cgram内所建立的汉字模
PutCdotInAlpha(28,24,0x88); // 调文本方式下汉字写入子程序,88H= "文"
PutCdotInAlpha(30,24,0x8c); // 调文本方式下汉字写入子程序,8cH= "本"
PutCdotInAlpha(32,24,0x90); // 调文本方式下汉字写入子程序,90H= "方"
PutCdotInAlpha(34,24,0x94); // 调文本方式下汉字写入子程序,94H= "式"
PutCdotInAlpha(36,24,0x80); // 调文本方式下汉字写入子程序,80H= "测"
PutCdotInAlpha(38,24,0x84); // 调文本方式下汉字写入子程序,84H= "试"
DelayMs(50);
}
//; 图形方式下汉字显示方法,x方向2字节一个汉字
void PutWordInGraph( void ) {
//x坐标以半个汉字定位左起0开始计算
//y坐标以像素行定位,顶部0开始计算
//汉字码以点阵码列表所对应32字节位单位进界,从0开始计算
/* PutCdotInGraph(0,0,30,16);
PutCdotInGraph(2,0,0,16);
PutCdotInGraph(4,0,2,16);
PutCdotInGraph(6,0,3,16);
PutCdotInGraph(8,0,4,16);
PutCdotInGraph(10,0,7,16);
PutCdotInGraph(12,0,8,16);
PutCdotInGraph(14,0,11,16); //延时继电器测试状态
PutCdotInGraph(16,0,12,16);
*/
PutCdotInGraph(0,32,26,16,1); // 通
PutCdotInGraph(2,32,27,16,1); //道
/* PutCdotInGraph(5,32,17,16);
PutCdotInGraph(7,32,18,16);
PutCdotInGraph(9,32,19,16); //设置值
*/
PutCdotInGraph(14,32,38,16,1); //实测值
PutCdotInGraph(16,32,7,16,1);
dprintf(18,32,DanWei1,1);
PutCdotInGraph(26,24,21,16,1); //绝对误差
PutCdotInGraph(28,24,22,16,1);
PutCdotInGraph(26,40,23,16,1);
dprintf(28,40,DanWei3,1);
PutCdotInGraph(34,24,25,16,1);
PutCdotInGraph(36,24,22,16,1);
PutCdotInGraph(34,40,23,16,1); //相对误差
dprintf(36,40,DanWei4,1);
}
void PutWordInGraph1( void )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -