📄 ad.c
字号:
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define IMR *(int *)0x0
#define IFR *(int *)0x1
#define PMST *(int *)0x1d
ioport unsigned int port3,port4,port2;
#define AD_DATA port2
#define AD_SEL port3
#define AD_HOLD port4
void interrupt time(void);
int *ptr,k0,k1,value;
signed int uWork0,uWork,uWork1;
#define LCDDELAY 1
#define LCDCMDTURNON 0x3f
#define LCDCMDTURNOFF 0x3e
#define LCDCMDSTARTLINE 0xc0
#define LCDCMDPAGE 0xb8
#define LCDCMDVERADDRESS 0x40
#define REGISTERCLKMD (*(unsigned int *)0x58)
#define WAITSTATUS (*(unsigned int *)0x28)
ioport unsigned int port8000;
ioport unsigned int port8001;
ioport unsigned int port8002;
ioport unsigned int port8003;
ioport unsigned int port8004;
ioport unsigned int port8007;
void Delay(unsigned int nTime); // 延时子程序
void TurnOnLCD(); // 打开显示
void LCDCLS(); // 清除屏幕显示内容
void zyxdisplay(int value); //显示子程序
unsigned char ledkey[10][8]=
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00}, //0
{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00}, //1
{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00}, //2
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00}
};
main()
{
int i,j;
asm(" ssbx INTM"); // 关闭可屏蔽中断
k0=k1=0;
ptr=(int *)0x3000; // 转换数据的保存区,从数据区3000H开始
// 3000H-3200H保存第1通道(AIN1)的转换结果
// 3200H-3400H保存第2通道(AIN2)的转换结果
for(i=0;i<0x400;i++) // 将转换数据的保存区清0
*(ptr+i)=0;
j= PMST;
PMST = j&0xff;
IMR = 0x8;
TCR = 0x411; // 计数器分频系数=2
TIM = 0;
PRD = 0x100; // 定时器周期=256,采样周期=周期*分频系数*时钟周期
TCR = 0x421; // =512时钟=64us
IFR = 0x100; // 其中,时钟周期为8MHz
AD_SEL=6; // 通道选择 A0,A1
asm(" rsbx INTM"); // 开中断进行转换
while ( 1 );
}
// 定时器中断服务程序,完成:保存转换结果、启动下次转换
void interrupt time(void)
{
uWork0=AD_DATA; // 从FIFO中读取转换结果
uWork1=AD_DATA; // 从FIFO中读取转换结果
uWork=uWork0&0x0f000;
if ( uWork==0x8000 )
{
uWork0<<=4; // 去掉高4位
uWork0>>=4; // 取低4位有效值
*(ptr+k0)=uWork0; // 保存结果
//////////////////////////////////////////////////////////////////////////
if (*(ptr+k0)>0x0f)
value=1;
else value=0;
zyxdisplay(value);
//////////////////////////////////////////////////////////////////////
k0++;
if ( k0>=0x200 )
{
k0=0; // 软中断位置
}
}
else if ( uWork==0x9000 )
{
uWork0<<=4; // 去掉高4位
uWork0>>=4; // 取低4位有效值
*(ptr+k1+0x200)=uWork0; // 保存结果
k1++; k1%=0x200;
}
uWork=uWork1&0x0f000;
if ( uWork==0x8000 )
{
uWork1<<=4; // 去掉高4位
uWork1>>=4; // 取低4位有效值
*(ptr+k0)=uWork1; // 保存结果
k0++;
if ( k0>=0x200 )
{
k0=0; // 软中断位置
}
}
else if ( uWork==0x9000 )
{
uWork1<<=4; // 去掉高4位
uWork1>>=4; // 取低4位有效值
*(ptr+k1+0x200)=uWork1; // 保存结果
k1++; k1%=0x200;
}
AD_HOLD =0; // 送转换信号
for ( uWork=0;uWork<10;uWork++ );
AD_HOLD=1;
}
void zyxdisplay(int value)
{ int i,nCount=value,nBW=0;
asm(" ssbx INTM"); // 关闭可屏蔽中断
REGISTERCLKMD=0;
port8000=0; // 初始化ICETEK-CTR
Delay(LCDDELAY);
port8000=0x80;
Delay(LCDDELAY);
port8000=0;
Delay(LCDDELAY);
port8007=0; // 关闭东西方向的交通灯
Delay(LCDDELAY);
port8007=0x40; // 关闭南北方向的交通灯
Delay(LCDDELAY);
TurnOnLCD(); // 打开显示
LCDCLS(); // 清除显示内存
port8001=LCDCMDSTARTLINE; // 设置显示起始行
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
{
port8001=LCDCMDPAGE; // 设置操作页=0
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
port8001=LCDCMDVERADDRESS; // 起始列=0
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
port8003=( nBW==0 )?(ledkey[nCount][i]):(~ledkey[nCount][i]); // 屏幕左侧第1至8行第i列赋值
port8002=0; // (赋值后当前操作列自动加1,所以不需设置)
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
}
asm(" rsbx INTM"); // 开中断进行转换
//nCount++;
//if ( nCount==10 )
//{
// nCount=0;
// nBW=1-nBW;
//}
}
}
void Delay(unsigned int nDelay)
{
int ii,jj,kk=0;
for ( ii=0;ii<nDelay;ii++ )
{
for ( jj=0;jj<1024;jj++ )
{
kk++;
}
}
}
void TurnOnLCD()
{
port8001=LCDCMDTURNON;
Delay(LCDDELAY);
port8002=0;
Delay(1024);
port8001=LCDCMDSTARTLINE;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
}
void LCDCLS()
{
int i,j;
port8001=LCDCMDSTARTLINE;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
for ( i=0;i<8;i++ )
{
port8001=LCDCMDPAGE+i;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
port8001=LCDCMDVERADDRESS;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
for ( j=0;j<64;j++ )
{
port8003=0;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
}
port8001=LCDCMDPAGE+i;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
port8001=LCDCMDVERADDRESS;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
for ( j=0;j<64;j++ )
{
port8004=0;
Delay(LCDDELAY);
port8002=0;
Delay(LCDDELAY);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -