运行的时候keil2提示..EX9_1.C(237): error C187: not an lvalue
..EX9_1.C(242): error C187: not an lvalue
..EX9_1.C(264): error C187: not an lvalue
..EX9_1.C(269): error C187: not an lvalue
..EX9_1.C(274): error C187: not an lvalue,请问大家如何解决,详细的程序
//***************************数字钟程序********************************//
//程序:ex9_1.c
//功能:数字钟程序
//****************************编译预处理语句****************************//
#pragma SMALL
#include "REG51.H"
#include "absacc.h"
//******************************函数声明*******************************//
void display(unsigned char *p); //6位LED扫描函数,指针p为显示数据区首地址
unsigned char keytest(); //测试键盘有无键按下
unsigned char search(); //键盘扫描程序
void al
ARM(); //闹钟程序
void f
tion0(); //时钟修改程序
void ftion1(); //闹钟修改程序
void cum(); //增1程序
//********************************端口定义******************************//
sbit P2_7=P2^7; //定义蜂鸣器控制端口
//*******************************全局变量定义***************************//
unsigned char clockbuf[3]={0,0,0}; // 存放时分秒的十进制数
unsigned char bellbuf[3]={0,0,0}; // 存放闹钟时分秒的十进制数
unsigned char msec1; // 10毫秒中断次数
unsigned char msec2; // 1秒循环次数
unsigned char timdata,rtimdata; // 时钟和闹钟修改位置标志
unsigned char count; // 闹钟启动后10秒计时单元
unsigned char *dis_p; // 显示缓冲区指针
bit armbit; //闹钟标志,armbit=0,闹钟没有设定,armbit=1,闹钟已设定
bit rtimbit; //闹钟是否启动标志,rtimbit=1,闹钟已启动
bit rhourbit; //闹钟小时修改标志,rhourbit=1,正在修改闹钟小时
bit rminbit; //闹钟分修改标志,rminbit=1,正在修改闹钟分钟
bit hourbit; //时钟小时修改标志,hourbit=1,正在修改时钟小时
bit minbit; //时钟分修改标志,minbit=1,正在修改时钟分钟
bit secbit; //时钟秒修改标志
//*********************************主函数********************************//
void main()
{
unsigned char a;
armbit=0; //清零闹钟标识位
msec1=0; //设置10毫秒中断次数初值
msec2=0; //设置1秒中断次数初值
timdata=0; //时钟内容修改位置记忆单元清零
rtimdata=0; //闹钟内容修改位置记忆单元清零
count=0; //闹钟启动后保持10秒计时单元清零
TMOD=0x02; //初始化定时器,定时器T0方式2
TL0=0x06; //定时250μs初始值
TH0=0x06;
EA=1; //中断允许控制断
ET0=1; //定时器1开中断
TR0=1; //启动定时器0
dis_p=clockbuf; //将时钟值所在地址送入显示指针
while(1)
{
a=keytest(); //调用判别键入测试程序
if(a==0x0f)
{
display(dis_p); //无键输入调用显示程序
if(armbit==1)alarm(); //判别闹钟设定否,若设定了,则调闹钟程序
}
else
{
display(dis_p); //调用显示程序作为延时去抖动
a=keytest();
if(a!=0x0f) // 没有抖动,则表示有键按下
{
a=search(); // 调用键号测试程序
switch (a) {
case 0x00:ftion0();break; //是时钟参数修改功能键,调用时钟修改
case 0x01:ftion1();break; //是闹钟参数修改功能键,调用闹钟设定
case 0x02:cum();break; //是加1功能键,则调用加1修改程序
default:break; }
}
}
}
}
//****************************6位LED扫描函数**************************/
//函数名:display
//函数功能:6位LED扫描函数
//形式参数:指向时、分、秒计时单元数据首地址的指针
//返回值:无
void display(unsigned char *p)
{
unsigned char buffer[]={0,0,0,0,0,0};
unsigned char k,i,j,m,temp;
unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9的显示码
buffer[0]=p[0]/10; // 将缓冲区中的数的十位和个位分开
buffer[1]=p[0]%10;
buffer[2]=p[1]/10;
buffer[3]=p[1]%10;
buffer[4]=p[2]/10;
buffer[5]=p[2]%10;
for(k=0;k<3;k++)
{
temp=0x01;
for(i=0;i<6;i++)
{
P1=0xff; //关显示
j=buffer[i];
P1=led[j]; //P1送段码
P0&=~temp; //P0对应端口低电平选位
temp<<=1;
for(m=0;m<100;m++); //每一位显示延时
}
}
}
//*****************************键盘测试函数*************************//
//函数名:keytest
//函数功能:6位LED扫描函数
//形式参数:读出行输入按键状态码,用于测试是否有按键按下
//返回值:键盘行输入按键状态码,unsigned char类型
unsigned char keytest()
{
unsigned char c;
P0=0xf0;
c=P2;
c=c&0x07; //按键行输入为P2.0~P2.2,屏蔽无关位
return(c);
}
//****************************扫描键盘得到键值函数*********************//
//函数名:search
//函数功能:键盘扫描函数
//形式参数:无
//返回值:行列式按键的键码,unsigned char类型
unsigned char search()
{
unsigned char a,b,c,d,e;
c=0xfe; //首列扫描字送变量c
a=0; //首列号送a
while(1)
{
P0=c; //列扫描字送P0口
d=P2; //读入P2口的行状态
if(d&0x01==0){ b=0;break;} //第0行有键按下,第0行行首号送b
else if(d&0x02==0){ b=4;break;} //第1行有键按下,第1行行首号送b
else if(d&0x04==0){ b=8;break;} //第2行有键按下,第1行行首号送b
a++; //扫描列号加1
c<<=1;
c++; //修改列扫描字,扫描下一列
}
c=a+b; //将行首号与列号相加,求键号
do {
display(dis_p);
} while((d=keytest())!=0x07); //等待释放按键
return(c);
}
//*******************************闹钟函数******************************//
//函数名:alarm
//函数功能:启动闹钟10秒
//形式参数:无
//返回值:无
void alarm()
{
if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1]))
{
P2_7=0;
rtimbit=1; //设置闹钟计时标志,时钟将进行10秒计时志
}
else
{
if(count==10) //判断闹钟保持10秒时间到否
{
count=0; //清除闹钟保持10秒计时
P2_7=1; //清除闹钟
armbit=0; //清闹钟标识,否则闹钟设置将继续保持有效
rtimbit=0;
}
}
}
//*******************时钟修改函数*****************//
//函数名:ftion0
//函数功能:时钟修改,根据按键次数,修改时、分、秒修改标志全局变量
//形式参数:无
//返回值:无
void ftion0()
{
TR0=0; // 关定时器
rhourbit=0; // 禁止闹钟时间参数修改,清闹钟修改标识
rminbit=0;
dis_p=clockbuf; // 将时钟缓冲区首地址送显示指针
rtimdata=0; // 清闹钟修改位置标识记录
timdata++; // 将时钟修改记录值加1
switch (timdata) {
case 0x01:secbit=1;break; //记录值为1,则将时钟秒修改标识置1
case 0x02:secbit=0;minbit=1;break; //记录值为2,则将时钟分修改标识置1
case 0x03:minbit=0;hourbit=1;break; //记录值为3,则将时钟时修改标识置1
case 0x04:timdata=0;hourbit=0;TR0=1;break; //按4次则清时钟单元修改位置记录,定时器重新启动
default:break;
}
}
//*******************************闹钟修改函数*************************//
//函数名:ftion1
//函数功能:闹钟修改,根据按键次数,修改时、分修改标志全局变量
//形式参数:无
//返回值:无
void ftion1()
{
secbit=0; //禁止时钟时间修改
minbit=0;
hourbit=0;
dis_p=bellbuf; //设置闹钟显示标志
timdata=0; //清时钟修改位置标识记录
rtimdata++; //将闹钟修改记录值加1
switch (rtimdata)
{
case 0x01:rminbit=1;break; //若记录值为1,则将闹钟分修改标识置1
case 0x02:rminbit=0;rhourbit=1;break; //记录值为2,则将时钟分修改标识置1
case 0x03:rtimdata=0;rhourbit=0; // 若按3次则清闹钟单元修改位置记录
armbit=1; // 设置闹钟已设定标志位
dis_p=clockbuf; // 恢复时钟显示标志
break;
default:break;
}
}
//************************************增1函数***************************//
//函数名:cum
//函数功能:根据标志位对相应时、分、秒单元增1
//形式参数:无
//返回值:无
void cum()
{
if(secbit==1) // 若时钟秒修改标识为1则秒单元内容加1
{
if(clockbuf[2]==59) clockbuf[2]=0;
else clock buf[2]++;
}
else if(minbit==1) // 若时钟分修改标识为1则分单元内容加1
{
if(clockbuf[1]==59)clockbuf[1]=0;
else clockbuf[1]++;
}
else if(hourbit==1) // 若时钟小时修改标识为1则小时单元内容加1
{
if(clockbuf[0]==23)clockbuf[0]=0;
else clockbuf[0]++;
}
else if(rminbit==1) // 若闹钟分修改标识为1则分单元内容加1
{
if(bellbuf[1]==59)bellbuf[1]=0;
else bellbuf[1]++;
}
else if(rhourbit==1)
{ // 闹钟小时修改标识为1则小时单元内容加1
if(bellbuf[0]==23)bellbuf[0]=0;
else bellbuf[0]++;
}
}
//***************************定时器0中断函数****************************/
//函数名:clock
//函数功能:定时器T0定时中断,interrupt 1
//形式参数:无
//返回值:无
void clock() interrupt 1
{
EA=0; //关中断
if(msec1!=0x28)
msec1++; //到10毫秒否,不到则msec1加1
else
{
msec1=0;
if(msec2!=100)msec2++; //到1秒否,不到则msec2加1
else
{
if(rtimbit==1)count++;
msec2=0;
if(clockbuf[2]!=59)
clockbuf[2]++; //到1分否,不到则clockbuf[2]加1
else
{
clockbuf[2]=0;
if(clockbuf[1]!=59)
clockbuf[1]++; // 到1小时否,不到则clockbuf[1]加1
else
{
clockbuf[1]=0;
if(clockbuf[0]!=23)
clockbuf[0]++; // 到24时否,不到则clockbuf[0]加1
else clockbuf[0]=0;
}
}
}
}
EA=1; //开中断
}
-
-
ex9_1.rar
下载积分: 积分 -1 分
3.08 KB, 下载次数: 6, 下载积分: 积分 -1 分
一周热门 更多>