- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件设计调试结论范例
4 软件设计
4.1 主程序设计
软件设计主要包括主程序,键盘扫描程序,电机驱动程序,LCD显示程序,4.1所示。
图4.1 主程序流程图2 键盘软件设计
本设计实验采用4×4键盘,选择P0口来分时控制键盘的行和列键盘扫描程序流程如图4.2所示VCC,在没有任何按键按下时,P0低4位能始终保持为高电平,送入扫描信号中只有一个为低电平,其余为高电平。
图4.2 键盘扫描流程图int Getkey()
{ char col,row; //行列
char scan,keyin,kcode; //扫描信号 列按键值 扫描码
scan=0xef;
for(col=0;col4;col++) //开始行扫描
{ P0=scan;
keyin=rowkey();
if(keyin!=0) //有键按下
{ for(row=0;row4;row++)
{ if(keyin==(0x01row)) //只有第row列按下
{ kcode=row+4*col; //计算出键码
break;
}
}
while(rowkey()!=0);
debouncer(); //防抖动函数
}
scan=(scan1)|0x01; //产生左移一位扫描信号
}
return(kcode);
}
rowkey()为(~P0)0x0f,也就是将P0读入的按键状态反向,再与0x0f进行AND运算,其目的是屏蔽高4位(使之为0),而低4位(按键状态)保持原状。
在if(keyin==(0x01row))指令中,(0x01row)是把0x01左移row位,也就是判断第row列,就先把0x01左移row位。若输入的按键状态与0x01左移row位的状态一样,表示该列的按键被按下。
kcode=row+4*col指令是将当时扫描的列值(row),加上4倍的行(col)值,作为定位按键的方法。
指令是将扫描码左移一位,而其最右边填入1.例如原本扫描码左移一位变再与0x01进行OR运算,就变
4.3 中断程序设计
中断是暂时放下目前所执行的程序,先去执行特定的程序(即中断子程序),待完成特定的程序后,再返回执行刚才放下的程序。因为键盘扫描常以中断的形式出现。8051提供5个中断服务,即外部中断INT0,外部中断INT1,定时器/计数器中断TF0,定时器/计数器中断TF1与串行口中断UART(RI/TI).中断常用到3个寄存器:
中断启用寄存器IE:开闭中断功能的开关,可位寻址的8位寄存器。
中断优先级寄存器IP:判断各中断优先级的开关,可位寻址的8位寄存器。
定时器/计数器控制寄存器TCON:是一个8位的可位寻址寄存器,其中IT0,IT1两位分别为INT0,INT1的采样信号设置位。若要采用负边缘触发信号,则可将它设定为1;若要采用低电平动作信号,则可将它设定为0.
中断的应用包括中断向量的设置以及中断子程序的编写。
(1)中断设定:
中断的设定包括开启中断开关(即IE寄存器的设定),中断优先级的设定(即IP寄存器的设定),中断信号的设定(即TCON寄存器的设定)。我们可以在程序中直接设定IE寄存器,IP寄存器及TCON寄存器,例如要开启“总开关”,“INT0”开关,可以使用以下命令:
IE=0x80; //启用INT0中断
其中0x80就相当于把IE寄存器中的EA与EX0设定为1.同理,若要开启“总开关”,“INT0开关”及“INT1开关”,我们可以使用下面的命令:
IE=0x85; //启用INT0,INT1中断
对于中断优先级的设定,也使用类似的命令,只是操作的对象为IP寄存器,例如要提高INT1的优先级,可以使用以下命令:
IP=0x04; //设定INT1中断具最高优先级
而外部中断信号的种类,可在TCON寄存器里设定,例如INT1中断采用负边缘触发方式,可以使用以下命令:
TCON=0x08; //设定INT1采用负边缘触发
(2)中断子程序;
中断子程序是一种特殊的子程序(函数),其第一行的格式如下:
void 中断子程序名称(void)interrupt中断编号 using 寄存器组
例如要定义一个INT1(其中断编号为2)的中断子程序,其名称定义为“song”,而在该中断子程序中使用RB1寄存器组,则应作如下声明:
void song(void) int
文档评论(0)