时间:
2023年9月21日
学习目标:
数码管程序and矩阵键盘程序
学习内容:
数码管原理图:俩个74hc573芯片,俩个四位数码管,电阻
数码管动态显示原理:首先u7芯片控制的是数码管段选部分,该部分控制数码管的显示内容;8芯片控制数码管的位选部分,该部分具体控制点亮哪一位数码管;在u7芯片输出段码是,其实所有数码管都接收到了,只是某些的位选没有打开,我们可以让每一位都显示1-2ms,就可以全部点亮。
矩阵键盘原理图:一个j5控制是独立按键还是矩阵键盘,行线是P34,P35,P42,P44,其余为列线。
矩阵键盘的常用实现原理:行扫描法,逐行输出0,检查列线电平有没有被拉低,有的话,则该行有按键按下,根据输出0的行线和读到0的列线就能判断位置。
代码部分示例:
数码管的转化和显示函数
void seg_tran(unsigned char *pucseg_buf,unsigned char *pucseg_code)
{
unsigned char i,j=0,temp;
for(i=0;i<8;j++,i++)
{
switch(pucseg_buf[j])
{
case '0':temp=0xc0;break;
case '1':temp=0xf9;break;
case '2':temp=0xa4;break;
case '3':temp=0xb0;break;
case '4':temp=0x99;break;
case '5':temp=0x92;break;
case '6':temp=0x82;break;
case '7':temp=0xf8;break;
case '8':temp=0x80;break;
case '9':temp=0x90;break;
case 'A':temp=0x88;break;
case 'B':temp=0x83;break;
case 'C':temp=0xc6;break;
case 'D':temp=0xa1;break;
case 'E':temp=0x86;break;
case 'F':temp=0x8e;break;
case 'H':temp=0x89;break;
case 'L':temp=0xc7;break;
case 'N':temp=0xc8;break;
case 'P':temp=0x8c;break;
case 'U':temp=0xc1;break;
case '-':temp=0xbf;break;
case ' ':temp=0xff;break;
default:temp=0xff;
}
if(pucseg_buf[j+1]=='.')
{
temp=temp&0x7f;
j++;
}
pucseg_code[i]=temp;
}
}
void seg_disp(unsigned char *pucseg_code,unsigned char ucseg_pos)
{
P0=0XFF;
P2=P2&0X1F|0XE0;
P2&=0X1F;
P0=1<<ucseg_pos;
P2=P2&0x1F|0Xc0;
P2&=0X1F;
P0=pucseg_code[ucseg_pos];
P2=P2&0x1F|0XE0;
P2&=0X1F;
读取按键函数
unsigned char key_rade()
{
unsigned int key_pos;
unsigned char key_val;
P44=0;P42=1;P35=1;P34=1;
key_pos=P3;
P44=1;P42=0;P35=1;P34=1;
key_pos=(key_pos<<4)|(P3&0x0f);
P44=1;P42=1;P35=0;P34=1;
key_pos=(key_pos<<4)|(P3&0x0f);
P44=1;P42=1;P35=1;P34=0;
key_pos=(key_pos<<4)|(P3&0x0f);
switch(~key_pos)
{
case 0x8000:key_val=4;break;
case 0x4000:key_val=5;break;
case 0x2000:key_val=6;break;
case 0x1000:key_val=7;break;
case 0x0800:key_val=8;break;
case 0x0400:key_val=9;break;
case 0x0200:key_val=10;break;
case 0x0100:key_val=11;break;
case 0x0080:key_val=12;break;
case 0x0040:key_val=13;break;
case 0x0020:key_val=14;break;
case 0x0010:key_val=15;break;
case 0x0008:key_val=16;break;
case 0x0004:key_val=17;break;
case 0x0002:key_val=18;break;
case 0x0001:key_val=19;break;
default:key_val=0;
}
return key_val;
}
总结:
今天又学了数码管和矩阵按键俩个模块的原理,也跟着范例敲了一遍,虽然没有自己敲,我的想法是先了解完全部模块的原理,大致的敲一下,最后在自己敲,总结出自己的模板!每天学的的模块虽然不多,但是官方代码还是有点不好理解,对我来说,相信会越来越好!