实验四键盘显示电路驱动程序设计实验目的1、了解ARMC语言程序的结构特点2、了解ARMC语言程序的编写方法3、掌握用ARM编写HD7279控制程序方法实验仪器设备及软件ARM实验箱,计算机,ADS程序开发软件实验原理HD7279A 专用键盘显示电路,真正的单片LED数码管显示和键盘接口芯片,无需外围电路,只需要外接少量的电阻等,即可构成完善的显示、键盘接口电路。
而与CPU的接口采用SPI串行接口方式,使用方便。
可方便的构成64按键,8位数码显示电路(共阴极结构) HD7279A内部含有译码器,可直接受BCD码或16进制数据或七段显示码数据。
此外,还具有多种控制指令,如消隐,闪烁,左移,右移,段寻址等。
具有片选信号,可方便地实现多于8位的显示或多于64键的键盘接口。
HD7279的纯指令:1、复位指令(A4H)当HD7279A收到该指令后,将所有显示清除,所有设置的字符消隐、闪烁等属性也被一起清除。
执行后,芯片的状态与上电时一样。
2、测试指令(BFH)该指令使所有的LED全部点亮,并处于闪烁状态,主要用于测试(检查LED是否坏)3、左移指令(A1H)使所有显示左移一位,消隐及闪烁属性不移位,最右边一位为空(暗)。
如:4、右移指令(A0H)使所有显示右移一位,消隐及闪烁属性不移位,最左边一位为空(暗)。
如:5、循环左移指令(A3H)使所有显示右移一位,消隐及闪烁属性不移位,最左边一位移到最右边。
如:6、循环右移指令(A2H)使所有显示右移一位,消隐及闪烁属性不移位,最右边一位移到最左边。
如:HD7279带数据的指令:1、下载数据按方式0译码命令由两字节构成,前半部为指令。
a2,a1,a0为位地址,D3-D0为数据,译码值如图所示。
当前位小数点由DP控制,DP=1,小数点亮,DP=0,小数点暗。
2、下载数据按方式1译码指令格式与指令1相同,译码表如下所示。
3、下载数据但不译码指令格式如上图所示。
当指令第二字节的位为1时,相应段点亮。
4、闪烁控制88H此命令控制各数码管的闪烁情况。
D8-D1中的位为1时,对应位闪烁。
上电默认不闪烁。
5、消隐控制98HD8-D1控制数码管的消隐状态。
为1时,数码管消隐,为0时,正常显示。
输入的数据至少有一位为0。
输入全为0时,命令将被忽略。
6、读键盘命令该指令从HD7279中读出当前按键编码。
编码范围是0-3FH。
当HD7279收到读指令时,此时按键无效,将返回0FFH。
实验内容1、编写程序控制HD7279显示学号HD7279驱动程序包含接口读写程序、HD7279发命令、收数据程序、初始化程序等,在ARM7279.C文件中给出。
在HD7279显示学号功能,只要往7279数据存储器中写入数据即可。
程序如下:write7279(decode1+p,i & 0x0f); //i为显示的内容, p为显示的位置0-72、编写程序控制HD7279芯片,根据当前按键情况,改变显示内容按键信息在中断服务程序读取,主程序根据到的数据,向7279发送命令或数据,改变显示内容。
keylast=key_number; //从键值缓冲中读取键值key_number=0xff; //键缓冲重置switch(keylast) //根据键值,执行不同功能{case 1:send_byte(disp_lsl); //左移一位break;case 2:send_byte(disp_lsr); //右移一位break;。
default:break;}实验步骤1、连接实验箱与计算机的串口线,打开计算机超级终端,并设定为com1,115200,8,1,0N2、连接仿真调试电缆(并口JTAG)3、实验箱上电,并在vivi的指示下,按任意键,进入调试程序状态4、打开ARM集成开发环境ADS,按要求编写或打开实验程序。
5、按内容要求编写,调试程序,并记录调试过程和数据。
6、调试完毕,整理实验箱,并切断实验箱电源。
实验程序1、显示学号程序#include "..\INC\config.h"//显示学号函数void dispstu_number(void){//请在这里编写显示学号程?write7279(disp_f,0xff); //no flashwrite7279(disp_hide,0xff);//no hidewrite7279(decode1+0,8 & 0x0f);write7279(decode1+1,0 & 0x0f);write7279(decode1+2,4 & 0x0f);write7279(decode1+3,9 & 0x0f);write7279(decode1+4,8 & 0x0f);write7279(decode1+5,1 & 0x0f);write7279(decode1+6,0 & 0x0f);write7279(decode1+7,2 & 0x0f);}void Main(){unsigned char p,keylast;Target_Init(); //目标初始化dispstu_number();//显示学号while(1); //程序运行到这行时,停止运行。
while(1){keylast=key_number; //取出按键值key_number=0xff; //按键值重置为无按键switch(keylast){case 0:write7279(cmd_test,cmd_test); //测试键write7279(disp_f,0xff); //no flashwrite7279(disp_hide,0xff);//no hidefor(p=0;p<8;p++) //display 0-7write7279(decode1+p,p & 0x0f);p=0;break;case 1:write7279(disp_lsl,disp_lsl); //logic shift left 1 databreak;case 2:write7279(disp_lsr,disp_lsr); //logic shift right 1 databreak;case 3:write7279(disp_rol,disp_rol); //循环左移break;case 4:write7279(disp_ror,disp_ror); //循环右移break;case 5:if (p>7)p=0;write7279(disp_hide,~(1<<p));//hide data according pp++;break;case 6:if (p>7)p=0;write7279(disp_f,~(1<<(p)));p++;break;case 7:if (p>0x40)p=0;write7279(disp_bit,p);p++;break;case 8:if (p>0x40)p=0;write7279(disp_offb,p);p++;break;case 9:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 10:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 11:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 12:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 13:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 14:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 15:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;default:break;}keylast=0xff;Delay(50);}}2、数码管上显示输入的键值#include "..\INC\config.h"//显示学号函数void dispstu_number(void){//请在这里编写显示学号程?write7279(disp_f,0xff); //no flashwrite7279(disp_hide,0xff);//no hidewrite7279(decode1+0,8 & 0x0f);write7279(decode1+1,0 & 0x0f);write7279(decode1+2,4 & 0x0f);write7279(decode1+3,9 & 0x0f);write7279(decode1+4,8 & 0x0f);write7279(decode1+5,1 & 0x0f);write7279(decode1+6,0 & 0x0f);write7279(decode1+7,2 & 0x0f);}void Main(){unsigned char p,keylast;Target_Init(); //目标初始化dispstu_number();//显示学号//while(1); //程序运行到这行时,停止运行。
while(1){keylast=key_number; //取出按键值key_number=0xff; //按键值重置为无按键switch(keylast){case 0:write7279(cmd_test,cmd_test); //测试键write7279(disp_f,0xff); //no flashwrite7279(disp_hide,0xff);//no hidefor(p=0;p<8;p++) //display 0-7write7279(decode1+p,p & 0x0f);p=0;break;case 1:write7279(disp_lsl,disp_lsl); //logic shift left 1 databreak;case 2:write7279(disp_lsr,disp_lsr); //logic shift right 1 databreak;case 3:write7279(disp_rol,disp_rol); //循环左移break;case 4:write7279(disp_ror,disp_ror); //循环右移break;case 5:if (p>7)p=0;write7279(disp_hide,~(1<<p));//hide data according pp++;break;case 6:if (p>7)p=0;write7279(disp_f,~(1<<(p)));p++;break;case 7:if (p>0x40)p=0;write7279(disp_bit,p);p++;break;case 8:if (p>0x40)p=0;write7279(disp_offb,p);p++;break;case 9:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 10:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 11:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 12:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 13:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 14:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;case 15:if (p>0x7)p=0;write7279(decode1+p,keylast);p++;break;default:break;}keylast=0xff;Delay(50);}}实验思考题1、编写程序,在数码管上显示输入的键值。