单片机键盘显示程序设计
实验四 键盘显示程序设计
09电信一斑叶晓伟 学号:20094081007 实验目的
1、理解串行接口键盘单片机汇编语言程序的基本结构
2、了解单片机汇编语言程序的设计和调试
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
3、掌握几个的基本的传送类、控制类指令的使用方法
实验仪器
单片机开发板、万利仿真机、稳压电源、计算机
实验原理
1、 键盘接口电路工作原理
串行接口键盘盘电路如图4-15所示。键盘扫描线与显示位选扫描信号共用。键盘输入只需要一根线,电路简单。键盘扫描信号从74LS164输出,低电平有效。当扫描到某个键时,若按键按下,在KEY端得到低电平,否则得到高电平。通过判断KEY的电平就可以知道相应键盘是否按下。
图4-15 键盘接口电路图
2、 读键盘程序设计
从上面工作原理分析可知,读键程序可以和显示程序结合在一起,也可以单独设计。这种结构的键盘同样存在抖动问题。为了减少程序误动作,程序设计时也要考虑去抖动问题。这里设计一个把键值显示在LED上的程序。为了简化问题,把读键程序与显示结合起来。程序流程图如图4-16所示。
主程序 键盘显示程序
…… 初值化,显示缓冲
区,键值暂存,键盘显示程序 缓存 延时程序执行后
读当前扫描的键状态,并调用键盘显示程序 存入键值暂存寄存器
N N 显示计数为0 键值相同
图4-16 键盘扫描程序流程图 实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
1、 设计程序把键值显示在数码管。
2、设计程序按不同键时实现不同功能。
按最左边按键:小数点循环移位
按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0
按向下键:最右边一位数码管数值减加1(9-0),到0时减1回到9
按向左键:显示数字左移一位
按向右键:显示数字右移一位
答:#include
#define uint unsigned int #define uchar unsigned char sbit CLK=P3^4;
sbit DIN=P2^3;
sbit key=P1^0;
bit flag;
uchar a,b,c;
char num,d,e;
uint f;
char code
table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x7
1,0xFe };//0到F的代码
void init_164()
{
uchar i;
for(i=0;i<8;i++)
{
DIN=1;
CLK=0;
CLK=1;
}
}
void delay(uint t) //延时函数 {
uint i,j;
for(i=t;i>0;i--)
for(j=125;j>0;j--);
}
void key_num() {
uchar i;
DIN=0;
flag=0;
for(i=0;i<8;i++)
{
CLK=0;
CLK=1;
if(flag==0)
{
if(key==0)
{
delay(10);
if(key==0)
{
ehile(!key)
{
a=i;
flag=1;
}
if(a==7)
{
b++;
if(b>8)
b=1;
}
if(a==3)
{
num++;
if(num>9)
num=0;
}
if(a==4)
{
num--;
if(num<0)
num=9;
}
if(a==0)
{ c--;
if(c<1)
c=8;
}
if(a==6)
{ c++;
if(c>8)
c=1;
}
}
}
}
}
}
void disp(uchar x,uchar n)
{
uchar y,z;
for(y=8;y>9-x;y--)
{
DIN=1;
CLK=0;
CLK=1;
}
DIN=0;
CLK=0;
CLK=1;
for(z=8;z>x;z--)
{
DIN=1;
CLK=0;
CLK=1;
}
P0=table[n]; //送数据显示
delay(1); //延时
P0=0xff; //消隐 }
思考题
1、 当按加1键时,每按一次数码管值变化可能超过1,是什么原因,
答:因为按键会抖动。
2、 如何实现长按键处理。当长按最左键时(约2秒),显示学号后8位。
答:void init() //初始化函数 {
TMOD=0x11; //定时器0工作方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器中断
TR0=1; //定时器0开始工作
}
void main()
{
key=1;
b=1;
c=8;
init();
ehile(1)
{
init_164();
key_num();
if(f<100)
{
f=0;
disp(c,num);
disp(b,16);
}
if(f>=100)
{
TR0=0;
for(d=0;d<100;d++)
for(e=0;e<10;e++)
{ disp(1,9);
disp(2,4);
disp(3,0);
disp(4,8);
disp(5,1);
disp(6,0);
disp(7,3);
disp(8,3);
}
f=0;
TR0=1;
}
}
}
void time0() interrupt 1
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
if(a==7)
{
f++;
}
}