单片机8051缓存显示
调试的结果不对,显示很乱~
不知道什么原因?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ledk=P2^5; //锁存口
sbit d0=P1^0; //锁存口
sbit wela=P2^7; //使能口
sbit dula=P2^6; //使能口
uchar count;
uchar displaybufpoint; //当前显示位
uchar displaybuf []={0xff,0xff,0xff,0xff,0xff,0xff};//显示缓存区
void display_smg(uchar we,uchar du);
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for (y=110;y>0;y--);
}
//判断是否有键按下
uchar key_press()
{
uchar key;
P3=0xf0;
key=P3;
key=key&0xf0;
if(key==0xf0)
{
return 0;
}
else
{
return 1; //有键被按下
}
}
//键盘扫描
uchar key_scan()
{
uchar key;
if(key_press()) //是否有键按下
{
P3=0xfe;
key=P3;
switch (key)
{
case 0xee:return 0;break;
case 0xde:return 1;break;
case 0xbe:return 2;break;
case 0x7e:return 3;break;
}
P3=0xfd;
key=P3;
switch (key)
{
case 0xed:return 4;break;
case 0xdd:return 5;break;
case 0xbd:return 6;break;
case 0x7d:return 7;break;
}
P3=0xfb;
key=P3;
switch (key)
{
case 0xeb:return 8;break;
case 0xdb:return 9;break;
case 0xbb:return 10;break;
case 0x7b:return 11;break;
}
P3=0xf7;
key=P3;
switch (key)
{
case 0xe7:return 12;break;
case 0xd7:return 13;break;
case 0xb7:return 14;break;
case 0x77:return 15;break;
}
} //if end
}
//写显存
void write_dispalybuf(uchar x)
{
if (displaybufpoint==6) return; //6个数码管
displaybufpoint++;
displaybuf[displaybufpoint]=x;
}
void display()
{
uint i;
uchar du;
for(i=1;i<= displaybufpoint;i++)
{
du=displaybuf[i];
display_smg(i,du);
}
}
void display_smg(uchar we,uchar du)
{
uchar code tablewe []={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位 0xfe 第1个数码
uchar code tabledu []={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d ,
0x7d , 0x07 , 0x7f , 0x6f , 0x77 ,
0x7c , 0x39 , 0x5e , 0x79 , 0x71 };
wela=1;
P0=tablewe[we];
wela=0;
P0=0x00;
dula=1;
P0=tabledu[du];
dula=0;
delay(2);
P0=0xff;
}
void main()
{
uchar key;
ledk=0;
displaybufpoint=0;
while(1)
{
if( key_press() )
{
key=key_scan();
write_dispalybuf(key); //写显存
display();
}
}
}
相关推荐
51单片机16x16点阵移动显示程序设计代码.zip
51单片机16x16点阵移动显示,该项目也是当时看到点阵显示数字文字符号都很好奇,就决定自己仿真制作一个,也是练练手,还挺强大的。 原理:这个是利用人眼视觉暂留的,点阵其实是动态扫描的,也就是分很多时间间隙,每个间隙只对其中一排led进行显示操作,下一刻第二排操作,第一排灭,依次显示。因为刷新的很快,所以人眼看到好像是同时显示一样。这里使用51单片机进行控制,使用了最少的引脚控制16x16点阵的显示,仅用3个引脚而已。这也是利用了74HC595芯片的io拓展功能,让一个595能控制8个引脚,还可以级联,从而4个595控制32个引脚,刚好是横总向各16个。设计有六个按键来控制整体的显示特效切换。 这首先是使用全部引脚实现了对点阵的整体控制,以及多种特效的实现,了解了595控制原理,进行程序的移植,尝试了很多次,终于实现了,这样还能继续扩展显示更大的点阵。最上面的按键是控制切换显示内容的,下边5个按键,中间按键控制逐页显示特效的,就是显示内容逐个显示出来。剩下四个方向的按键是控制点阵内容上下左右平移特效的。显示内容中有长汉字、以及数字等,后续可继续开发。
基于C8051F266单片机的段式LCD显示系统的设计与实现-论文
基于C8051F266单片机的段式LCD显示系统的设计与实现
基于C8051F023单片机的OLED显示实现方案
本文利用单片机C8051F023作为128×64单色OLED的控制核心器件,采用的是维信诺公司的一款屏VGG12864G,它利用Solomon公司的SSD1303为专用驱动IC。实现文字显示及图像的动静态显示。
基于C8051F340 单片机的OV7670不带FIFO的程F序 TFT液晶显示
基于C8051F340 单片机的OV7670不带FIFO的C程序 TFT液晶显示,程序已经实现,是你使用OV7670 TFT C8051F340 的最好选择,绝对对得起这个分数。
Protues仿真实例(8051)-Max7221动态显示.zip
全国大学生电子设计竞赛(National Undergraduate Electronics Design Contest)备赛资料包,计划或参加电赛的同学可以用来学习提升和参考。源码均是实战案例,个个精品!


单片机/工控
