导航:首页 > 操作系统 > 51单片机4位数分离

51单片机4位数分离

发布时间:2024-12-21 10:23:17

⑴ 想在51单片机上用矩阵键盘实现四位数的显示 可是键盘根本没用 直接显示的数

你提问过,四位数码管的显示程序,现在又增加了矩阵键盘。现在的功能增加了,可主程序却没有变,那怎么可能行呢?你这些程序在编译时,就没有提示你有错误吗?或者警告什么的?
原来只是四位数码管显示固定的 数,可现在即有键盘了,又要随时改变显示的数了,主程序要重写了。
void main()
{
while(1) //必须要这么写了
{ //这才是主循环程序开始
DigDisplay(); //要把显示程序放在第一行
qian=; //这样,四位数码管显示的数,像计算器一样,从右向左移动
=shi;
shi=ge;
ge=display();
//以后再增加程序功能,要在这下面增加
}//最后必须要有两个大括号
}
unsigned char display() //扫描次数,这数据类型要改
{
unsigned char i,b; //不要用int 型
for(i=0;i<4;i++)
{
b= keydown();
}

return b;
}

⑵ 51单片机C语言程序4个独立按键实现对数码管数字显示的加减清零等

#include<reg52.h>
//P0是数码管。P1是LED.P2是按键
sbitKEY_OUT_1=P2^3;
sbitKEY_OUT_2=P2^2;
sbitKEY_OUT_3=P2^1;
sbitKEY_OUT_4=P2^0;

#defineucharunsignedchar
#defineulintunsignedlong
#defineFrequency10//定时器中断时间=f*T
#defineTime1//一个周期1ms
#defineTubeNumber6//数码管个数
#defineKeyLine4//矩阵按键行数
#defineKeyColumn4//矩阵按键列数
//数码管真值表
ucharcodeLED_Number[]={0x0C,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//ucharcodeLED_Alphabet[]={0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0x8C,0xC1,0x91,0x9C};
/*0~9
A~F(b、d为小写)HLPUyo*/
ucharLED_Buff[TubeNumber]={0xff,0xff,0xff,0xff,0xff,0xff};
/*数码管显示缓冲区,0xff确保初始时都不亮.
不可写成ucharcodeLED_Buff[]。code定义变量写入room,不可修改*/
//矩阵按键编号到标准盘码的映射表
ucharcodeKeyCodeMap[4][4]={
(0x31,0x32,0x33,0x26),//数字键1、数字键2、数字键3、向上键
(0x34,0x35,0x36,0x25),//数字键4、数字键5、数字键6、向左键
(0x37,0x38,0x39,0x28),//数字键7、数字键8、数字键9、向下键
(0x30,0x1B,0x0D,0x27)};//数字键0、ESC键、回车键、向右键
ucharStaFlag[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键是否稳定标志
voidStartTime0();
voidTubeDisplay(ulintsec);
ulintpow(x,y);
voidTubeScan();
voidKeyAction(ucharkeycode);
voidKeyDriver();
voidKeyScan();
voidmain()
{
P1=0x08;//使能U3,选择数码管。
StartTime0();
while(1)KeyDriver();
}
//定时器0启动函数
voidStartTime0()
{
EA=1;
ET0=1;
TMOD=0x01;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
PT0=1;
/*定时器0优先中断控制位。
IP这个寄存器的每一位,表示对应中断的抢占优先级,每一位的复值都是0,当我们把某一位设置为1的时候,这一位优先级就比其它位的优先级高了。
比如我们设置了PT0位为1后,当单片机在主循环或其他中断程序执行时,一旦TO发生中断,作为更高优先级,程序马上执行T0.若在T0程序执行时,
其他中断程序发生中断,仍执行TO直到T0中断结束后再执行其他程序。
*/
}
//中断服务函数
voidTo_time0()interrupt1using0
{
staticucharcnt;//记录TO中断次数
// staticulintsec;//记录经过秒速
//判断是否溢出
if(TF0==1)
{
TF0=0;
TH0=(65536-Time*100)/256;
TL0=(65536-Time*100)%256;
}

if(cnt>=Frequency)
{
cnt=0;
//sec++;
// Tube_Display(sec);
TubeScan();
KeyScan();
}
}
//数码管显示函数
voidTubeDisplay(ulintnom)
{
ucharm=2;//小数部分位数
uchari;//传输索引
//秒速达到上限清零
if(nom>pow(10,TubeNumber-m))nom=0;
//分别传输小数部分和整数部分
for(i=0;i<m;i++)
LED_Buff[i]=LED_Number[nom/pow(10,i)%10];
for(i=0;i<(TubeNumber-m);i++)
LED_Buff[i+m]=LED_Number[nom/pow(10,i)%10];
//点亮小数点
LED_Buff[m]&=0x7f;
}
//平方运算函数
ulintpow(x,y)//x为底,为幂
{
ulintp,i=1;
//平方运算
for(i=1;i<=y;i++)
p*=x;
//输出结果
returnp;
}
//数码管动态函数
voidTubeScan()
{
staticuchari=0;//动态扫描索引
//关闭所有段选位,数码管消隐
P0=0xff;
//for(i=0;i<Tube_number;i++)
P1=(P1&0xf8)|i;//位选索引赋值到P1口低3位
P0=LED_Buff[i];//缓冲区中的索引位置数据传输到P0口
if(++i>=TubeNumber)i=0;//索引递增循环,遍历整个缓冲区
}
//矩阵按键动作函数
voidKeyAction(ucharkeycode)
{
staticulintresult;
ulintnom=0;
//输入数字0~9
if((keycode>=0x30)&&(keycode<=39))
{
nom=(nom*10)+(keycode-0x30);//十进制整体左移,新数进入各位
TubeDisplay(nom);
}
//输入方向键
if((keycode>=0x25)&&(keycode<=28))
switch(keycode)
{
case0x26:result+=nom;nom=0;TubeDisplay(result);
case0x28:result-=nom;nom=0;TubeDisplay(result);
case0x25:result=1;result*=nom;nom=0;TubeDisplay(result);
case0x27:result=1;result/=nom;nom=0;TubeDisplay(result);
}
elseif(keycode==0x0d)TubeDisplay(result);//输入回车键,输出最终结果
elseif(keycode==0x1b)//输入ESC键,清零
{
nom=result=0;
TubeDisplay(nom);
}
}
//矩阵按键驱动函数
voidKeyDriver()
{
ucharl,c;
staticucharbackup[KeyLine][KeyColumn]={(1,1,1,1),(1,1,1,1),(1,1,1,1),(1,1,1,1)};//按键值备份,保存前一次值
for(l=0;l<KeyLine;l++)
{
for(c=0;c<KeyColumn;c++)
{
if(backup[l][c]!=StaFlag[l][c])
{//检测按键动作
if(backup[l][c]==1)//按键按下时执行
KeyAction(KeyCodeMap[l][c]);//调用动作函数
backup[l][c]=StaFlag[l][c];//刷新前一次备份值
}
}
}
}
//矩阵按键扫描函数
voidKeyScan()
{
ucharl=0;//矩阵按键扫描输出索引
ucharc=0;//矩阵按键扫描列索引
ucharkeybuff[KeyLine][KeyColumn]={(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff),
(0xff,0xff,0xff,0xff),(0xff,0xff,0xff,0xff)};//矩阵按键扫描缓冲区
//将一行的四个按键移入缓冲区
for(l=0;l<KeyColumn;l++)
keybuff[l][c]=((0xfe|(P2>>(4+l))&0x01));
//按键消抖
for(l=0;l<KeyLine;l++)
{
if((keybuff[l][c]&0x0f)==0x00)//连续4次扫描都为0,判断4*4ms内都是按下状态,可认为按键已稳定按下
StaFlag[l][c]=0;
elseif((keybuff[l][c]&0x0f)==0x0f)//连续4次扫描都为1,判断4*4ms内都是弹起状态,可认为按键已稳定弹起
StaFlag[l][c]=1;
}
for(c=0;c<KeyColumn;c++)
{
switch(c)//根据索引,释放当前输出脚拉低下次的根据索引
{
case0:KEY_OUT_4=1;KEY_OUT_1=0;break;
case1:KEY_OUT_1=1;KEY_OUT_2=0;break;
case2:KEY_OUT_2=1;KEY_OUT_3=0;break;
case3:KEY_OUT_3=1;KEY_OUT_4=0;break;
default:break;
}
}
}

⑶ 51单片机如何利用4个七段数码管采用动态显示显示4位数字,如2035

不停地利用人的视觉暂留,在一个合适的速度下依次显示1个2,1个0,1个3,1个5.

当显示一个“2”的时候,其他三位都是空的,以此类推。

但人眼是看不到短时间内这些变化的,假如这个行为不断循环,那么人看到的就是“2035”,而不是单个的数字。

比如说吧:

...

P1=num[2];//假设num[2]是0x5b,即"2"
P20=1;//假设使能端是高有效,按实际情况来。
delay();//延长50ms应该可以把,不能太长(过0.1秒就能看出来了),最好也不要太短
P1=num[0];
P21=1;
delay();

...

⑷ 运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序

#include<reg51.h>
#define uchar unsigned char;
uchar distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //0到f
uchar number,nn=0;
uchar dat[]={2,0,1,2,1,1,4,5,8,2};
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
number++;
number%=4;
switch(number)
{
case 0:P2=0x08;P0=distab[nn];
break;
case 1:P2=0x04;P0=distab[nn+1];
break;
case 2:P2=0x02;P0=distab[nn+2];
break;
case 3:P2=0x01;P0=distab[nn+3];
break;
default:break;
}
nn++;
nn%=7;
}
main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}

阅读全文

与51单片机4位数分离相关的资料

热点内容
微博这个相机在哪个文件夹 浏览:343
钢筋笼焊接区域箍筋加密吗 浏览:401
apriori算法报告 浏览:304
iphone编程入门 浏览:139
php网页开发环境 浏览:479
暗黑破坏神2大背包解压 浏览:633
腾讯视频为什么连接不了苹果手机服务器 浏览:382
pdf截几页 浏览:750
星图app怎么发布任务 浏览:166
python如何引入包 浏览:235
面向对象函数式编程 浏览:601
命令行参数解析 浏览:268
红米2a下载的刷机包要解压吗 浏览:463
pdf打印原理 浏览:396
手机双清显示无命令复制 浏览:380
cnc编程助手电脑版 浏览:944
影音先锋播放后文件夹无法删除 浏览:469
大数据编译视频教程 浏览:594
爱江湖怎么换服务器 浏览:922
苹果手机sim卡如何放到安卓手机 浏览:795