void SetSMGDisplayPosition(u8 position) { LSA = position & (1<<0); LSB = position & (1<<1); LSC = position & (1<<2); }
时间: 2024-04-25 16:23:33 浏览: 17
这段代码是用于设置数码管的位选位置的函数,名为SetSMGDisplayPosition,输入参数为一个8位无符号整型变量position。
函数中的三个变量LSA、LSB、LSC分别代表数码管的三个位选线。
通过按位与运算和位移操作,将position的每一位与相应位选线进行匹配,从而设置数码管的位选位置。
LSA = position & (1<<0) 表示将position的最低位与1左移0位后的值进行按位与运算,结果赋给LSA。
LSB = position & (1<<1) 表示将position的第二低位与1左移1位后的值进行按位与运算,结果赋给LSB。
LSC = position & (1<<2) 表示将position的第三低位与1左移2位后的值进行按位与运算,结果赋给LSC。
通过这样的操作,可以根据传入的position参数,动态设置数码管的位选线状态,从而实现对应位置的数码管显示。
相关问题
#include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; u8 code smgduan[17]={0x06,0x06}; void delay(u16 i) { while(i--); } void DigDisplay() { u8 i; for(i=0;i<8;i++) { switch(i) { case(0): LSA=1;LSB=1;LSC=1; break; case(1): LSA=0;LSB=1;LSC=1; break; case(2): LSA=1;LSB=0;LSC=1; break; case(3): LSA=0;LSB=0;LSC=1; break; case(4): LSA=1;LSB=1;LSC=0; break; case(5): LSA=0;LSB=1;LSC=0; break; case(6): LSA=1;LSB=0;LSC=0; break; case(7): LSA=0;LSB=0;LSC=0; break; } P0=smgduan[i]; delay(100); P0=0x00; } } void main() { while(1) { DigDisplay(); } }添加注释
// 引入头文件 reg52.h
#include "reg52.h"
// 定义数据类型
typedef unsigned int u16;
typedef unsigned char u8;
// 定义数码管引脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
// 定义数码管显示字符集
u8 code smgduan[17]={0x06,0x06};
// 延时函数
void delay(u16 i) {
while(i--);
}
// 数码管显示函数
void DigDisplay() {
u8 i;
for(i=0;i<8;i++) {
switch(i) {
case(0): LSA=1;LSB=1;LSC=1; break;
case(1): LSA=0;LSB=1;LSC=1; break;
case(2): LSA=1;LSB=0;LSC=1; break;
case(3): LSA=0;LSB=0;LSC=1; break;
case(4): LSA=1;LSB=1;LSC=0; break;
case(5): LSA=0;LSB=1;LSC=0; break;
case(6): LSA=1;LSB=0;LSC=0; break;
case(7): LSA=0;LSB=0;LSC=0; break;
}
P0=smgduan[i];
delay(100);
P0=0x00;
}
}
// 主函数
void main() {
while(1) {
DigDisplay();
}
}
#include <reg51.h> #define SMG P0 //定义数码管段数据接口P0 typedef unsigned long ulong; //对数据类型进行声明定义 typedef unsigned int uint; typedef unsigned char uchar; sbit LSA=P2^2; //74hc138的A B C引脚定义 sbit LSB=P2^3; sbit LSC=P2^4; uchar buff[8]; //显示缓冲数组 uchar a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管 void delayms(uchar ms) { uchar i; while(ms--) for(i=0; i<123; i++); } void update(ulong val) //更新缓冲数组 { //分离各位数据 buff[0]=val/10000000%10; //12345678/10000000%10=1; buff[1]=val/1000000%10; //12345678/1000000%10=2; buff[2]=val/100000%10; //12345678/100000%10=3; buff[3]=val/10000%10; //12345678/10000%10=4; buff[4]=val/1000%10; //12345678/1000%10=5; buff[5]=val/100%10; //12345678/100%10=6; buff[6]=val/10%10; //12345678/10%10=7; buff[7]=val%10; //12345678%10=8; } void display(void) //显示函数 { uchar n; for(n=0; n<8; n++) { switch(n) //先位选 { case 0:LSC=0;LSB=0;LSA=0;break; case 1:LSC=0;LSB=0;LSA=1;break; case 2:LSC=0;LSB=1;LSA=0;break; case 3:LSC=0;LSB=1;LSA=1;break; case 4:LSC=1;LSB=0;LSA=0;break; case 5:LSC=1;LSB=0;LSA=1;break; case 6:LSC=1;LSB=1;LSA=0;break; case 7:LSC=1;LSB=1;LSA=1;break; } SMG=a[buff[n]]; //后发送段数据 delayms(1); //小延时,显示更稳定 } } void main(void) { ulong num=0; //要显示的数据 uchar t; //延时用 while(1) { update(num); //更新显示缓冲数组 for(t=0; t<50; t++) //用for循环来延时不然显示不正常 { display(); //显示缓冲数组 } num++; //显示数据自加 } }
要将该代码改为只显示最右边三位数码管,可以修改 update 函数如下:
```c
void update(ulong val)
{
buff[0] = val / 100 % 10; // 百位数
buff[1] = val / 10 % 10; // 十位数
buff[2] = val % 10; // 个位数
}
```
同时,修改 display 函数如下:
```c
void display(void)
{
uchar n;
for (n = 0; n < 3; n++) // 只显示最右边三个数码管
{
switch (n)
{
case 0: LSC = 0; LSB = 0; LSA = 0; break;
case 1: LSC = 0; LSB = 0; LSA = 1; break;
case 2: LSC = 0; LSB = 1; LSA = 0; break;
}
SMG = a[buff[n]];
delayms(1);
}
}
```
这样,程序就只会显示最右边三个数码管了。