电子电路设计实验报告汇总文档格式.docx
- 文档编号:8350344
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:37
- 大小:28.74KB
电子电路设计实验报告汇总文档格式.docx
《电子电路设计实验报告汇总文档格式.docx》由会员分享,可在线阅读,更多相关《电子电路设计实验报告汇总文档格式.docx(37页珍藏版)》请在冰点文库上搜索。
i<
0x10;
<
=1)//i的低4位为行数位,行依次检测循环4次
{
ptr=0x8fff;
*ptr=i;
temp=*ptr;
//取键盘IO口的值
temp&
=0x0f;
//屏蔽高四位
if(temp!
=0x00)//是否有有效键值
{
key=i<
4;
//取行数位的值并将其放入返回值高4位
key|=temp;
//列数位的值放入返回值低4位
break;
}
}
returnkey;
//返回行位(高四)和列位(低四)
//取键值,长按无效
unsignedcharGetKey(void)
unsignedcharkey,temp;
if(!
bKeyUp_Flag)//判断标志,是0执行
/***按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序,
长按键无效返回无效值,直至按键无效返回无效按键值,
置"
1"
标志位。
按键输入恢复有效。
屏蔽这部分则长按键有效***/
key=GetScanKey();
if(key==0xff)//没有按键,置标志位
bKeyUp_Flag=1;
else//保持按键
return0xff;
//因为0xff大于15,故为无效键值,实现长按键无效
key=GetScanKey();
if(key==0xff)//没有按键
returnkey;
else//有按键有效
temp=key;
//取键值
Delay_ms(20);
//延时20ms消抖
//键盘扫描
if(key!
=temp)//判断两次键值是否相同,排除干扰信号影响确认有效信号
else//取键值
/*这部分主要作用是软件抗干扰*/
temp=Key_Value_Table[key>
>
4];
//见说明
/*行值有效位(键盘的4个行SEL返回的值含有的有效位"
)有且只有一位键值才有效否则返回无效键值*/
if(temp==0xff)
{
key=0xff;
returnkey;
}
temp=Key_Value_Table[key&
0x0f];
/*列值有效位(键盘的4个列RL返回的值含有的有效位"
key=Key_Value_Table[key>
4]*4+Key_Value_Table[key&
//行对应的中间值的四倍与列对应的中间值之和即为按键编号0~15
/*行列组合后的值大于15无效*/
if(key>
15)
bKeyUp_Flag=0;
}
//获得键盘输入字符
intGetChar(void)
unsignedcharkey=0xff;
while(key==0xff)key=GetKey();
/*waitinputfix*/
return((int)key_arrenge[key]);
/*changetoASCIIcodeandreturn*/
//获得键盘输入整数
longGetDec(void)
longout_dec=0;
/*result(decimalnumber)数值范围0~99999*/
unsignedchari,j;
/*variableforcharactercount*/
inttemp=0;
intkey;
for(i=0;
i<
6;
)
key=GetChar();
/*获取键值’0’-’9’*/
if((key<
='
9'
)&
&
(key>
='
0'
))
temp=key-'
;
/*获取数值0-9*/
out_dec=out_dec*10+(long)temp;
if(out_dec==0)
{
continue;
/*首位数据输入为0时,显示不变*/
}
i++;
LCD__putchar(key);
/*显示当前输入的数据*/
continue;
if('
E'
==key)/*当前输入清零*/
out_dec=0;
back_cursol(i);
/*清显示区*/
for(j=0;
j<
i;
j++)
LCD__putchar('
'
);
F'
==key)/*ENTER键,数值确认*/
returnout_dec;
}
C'
==key)/*撤销最近一个输入数字*/
out_dec=out_dec/10;
back_cursol
(1);
2.LED模块
通过送字形码和字位码可以点亮对应的一个8段LED。
8个LED的同时显示通过循环扫描显示实现,即每次在一个LED上显示设定的数字,延时显示一段时间(延时越长,亮度越好),然后切换显示下一个,依次轮换。
unsignedcharLed_table[16]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay_us1(intt)
while(t-->
=0);
//函数功能描述:
给显示数组赋初始值;
voidLed_Init(unsignedchar*show)
unsignedchari;
for(i=0;
8;
i++)
//在此处给显示数组赋值
*show=0x00;
show++;
在LED上显示;
voiddisplay(unsignedchar*show)
unsignedchari=1,j;
unsignedcharxdata*ptr;
for(j=0;
j<
j++)//八个数码管全部显示
ptr=0x8fff;
//段选地址
*ptr=i;
ptr=0x9fff;
//位选地址
//在此给*ptr赋值送字形码
*ptr=Led_table[show[j]];
Delay_us1(30);
*ptr=0x00;
i<
=1;
//下一位
//数字转led字形码
unsignedcharasc2led(unsignedchara)
return*(Led_table+a);
3.LCD显示模块
设计思路:
LCD的显示通过给LCD写命令和数据实现。
写数据与写指令时各控制引脚的电平不同,对应了不同的地址。
先构造写数据和写命令函数(与硬件相关操作),已经检测LCD是否忙的函数(当处于忙状态时不能写数据,否则硬件会工作不正常),在此接口的基础上构造库(与硬件无关操作,通过调用写数据和写命令函数实现),实现各种不同的功能,包括初始化设定工作方式,显示字符,显示字符串,显示数字(0~99999),清屏,设定光标的位置等。
这里的显示字符,显示整数和键盘检测模块的读入字符,读入整数对应起来,可以合作使用。
使用时先调用初始化函数初始化LCD,设定工作方式,然后可以调用不同的函数实现不同的显示。
/*=====definevariable=====*/
unsignedcharcursol_x;
/*cursorposition(horizontal)*/
unsignedcharcursol_y;
/*cursorpositon(vertical)*/
//指向XDATA的指针(访问片外地址)
unsignedcharcodeASC2_Value_Table[16]=
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,
0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
//===========向1602指令寄存器写指令=============
voidWriteW(unsignedchara)
ptr=0xAFF0;
//RS=0,R/W=0
*ptr=a;
//==============向1602指令寄存器写指数据============
voidWriteD(unsignedcharkey_asc2)
CheckBF();
ptr=0xAF02;
*ptr=key_asc2;
//===========检查忙标志位BF=============
voidCheckBF(void)
unsignedinti;
while
(1)
ptr=0xAFF1;
//RS=0,R/W=1
i=*ptr;
i&
=0x80;
if(i==0)
break;
//==========LCD初始化==========
voidLCD_Init(void)
WriteW(0x38);
CheckBF();
WriteW(0x01);
//Cleardisplay清显示
WriteW(0x06);
//Entrymodeset:
I/D=1,S=0[I:
Increase,D:
Decline,S:
Shift]
WriteW(0x0F);
//Dislpayon/offcontrolD=1,C=1,B=1[D:
Display,C:
Cursor,B:
Blink]
WriteW(0x80);
//Dislpayon/offcontrolD=0,C=0,B=0[D:
//======设定光标所在位置==========
voidLCD__setcursol(unsignedcharx,unsignedchary)
cursol_x=x;
cursol_y=y;
CheckBF();
/*waitLCDprocess*/
WriteW(0x80|y*0x40+x);
/*addressofthesecondline0x40-0x4f*/
//======后移光标=======
voidmove_cursol(void)
if(++cursol_x>
0x0f)
{/*movecursortoright,ifgettoendoftheline*/
cursol_x=0;
/*movetobeginoftheline*/
if(++cursol_y>
=2)
{/*return,ifoverthesecondline*/
cursol_y=0;
/*returntobeginoftheline*/
LCD__setcursol(cursol_x,cursol_y);
/*setcursor*/
//======前移光标=======
voidback_cursol(inti)
cursol_x-=i;
LCD__setcursol(cursol_x,cursol_y);
//======清屏=======
voidLCD__clear(void)
/*waitLCDprocess*/
WriteW(0x01);
/*cleardisplay*/
//=======写字符==========
voidLCD__putchar(intc)
if((c=='
\n'
)||(c=='
\r'
))/*linefeedcode*/
cursol_x=0;
cursol_y^=1;
LCD__setcursol(cursol_x,cursol_y);
/*setcursor*/
CheckBF();
/*waitLCDprocess*/
WriteD(c);
/*writeData-Register*/
move_cursol();
/*movecursorposition*/
//=========写字符串========
voidLCD__puts(constunsignedchar*s)
for(;
\0'
!
=*s;
s++)
{/*loopbeforenullcode*/
LCD__putchar(*s);
/*displaycharacteronLCD*/
//=========写整数=======
voidLCD__putdec(longdec)/*可打印的数据小于99999*/
longnum;
/*numbertobedisplayed*/
inti;
/*loopcounter*/
unsignedcharstr_buf[5];
/*bufferfordatadisplay*/
num=dec;
/*savenumbertobedisplayed*/
for(i=0;
num!
=0;
i++)
{/*confirmdigit*/
str_buf[i]=num%10;
/*geteverydigitnumberandsaveinbuffer*/
num=num/10;
if(i==0)
{/*ifnumberis0*/
/*display'
inLCD*/
else
{/*ifnumberisnot0*/
for(--i;
i>
i--)
{/*looptimesofdigits*/
LCD__putchar(str_buf[i]+'
/*aftertransferedintoASCIIcode*/
}/*displayinLCD*/
}
//十六进制码转换为ascii码
unsignedcharKey_ASC2(unsignedcharkey)
unsignedcharkey_asc2;
key_asc2=ASC2_Value_Table[key];
returnkey_asc2;
4.I2C总线协议
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:
开始信号、结束信号和应答信号。
开始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:
SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:
接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
协议代码:
sbitSCL=P1^0;
sbitSDA=P1^1;
//***************************************
//*功能:
启动I2C总线
//****************************************
voidi2c_start()
SDA=1;
SCL=1;
_nop_();
SDA=0;
SCL=0;
//*************************************************************************
停止I2C总线
//**************************************************************************
voidi2c_stop()
//*************************************************
应答I2C总线
biti2c_rec_ack()
bitack_flag;
SDA=1;
_nop_();
SCL=1;
if(SDA==0)
ack_flag=1;
}
ack_flag=0;
SCL=0;
returnack_flag;
voidi2c_send_ack(void)
SDA=0;
//******************************************
无应答I2C总线
voidi2c_send_noack()
_nop_()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 电路设计 实验 报告 汇总