关于52单片机驱动74HC595控制LCD1602的程序文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于52单片机驱动74HC595控制LCD1602的程序谁能帮忙写个52单片机驱动74hc595控制LCD1602的程序
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LcdBus P0
sbit LED1602_RS=P2^6; //LCD端口定义
sbit LED1602_RW=P2^5 ;
sbit LED1602_EN=P2^4 ;
void LcdIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void print_LCD(uchar disp[],uchar num);
//延时n ms子程序
void delayms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<120;j++);
}
main()
{
uchar disp1[16]={'S','u','n','J','i','e',' ','m','a','d','e',' ','a','t',' ',' '};
uchar disp2[16]={'2','0','0','8',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};
while(1)
{
LcdIni();
WrOp(0x80); //数据指针地址第一行
print_LCD(disp1,16);
WrOp(0xc0); //第二行
print_LCD(disp2,4);
delayms(3000);
WrOp(0x01);
}
}
/**************************************************************************************** **
名称:led1602显示程序模块
功能:驱动1602 包括数据口P1 三个控制口
编译:keil
杰
时间:2008-8-9
**************************************************************************************** ***/
void print_LCD(uchar disp[],uchar num) //显示数组disp 显示长度为num {
uchar i;
for(i=0;i<num;i++)
{
WrDat(disp[i]);
delayms(300);
}
}
void LcdIni()
{
WrOp(0x38);
WrOp(0x06); //光标加1
WrOp(0x0f); //开显示光标闪烁
// WrOp(0x0c); //开显示光标不闪烁
}
void WrOp(uchar dat)
{
//uchar i;
ChkBusy();
LED1602_RS=0; //RS=0
LED1602_RW=0; //RW=0
LED1602_EN=0; //EN=0
LcdBus=dat; //送数据
LED1602_EN=1; //EN=1
delayms(10); //延时
LED1602_EN=0; //EN=0
}
void WrDat(uchar dat)
{
//uchar i;
ChkBusy();
LED1602_RS=1; //rs=1
LED1602_RW=0; //rw=0
LED1602_EN=0; //en=0
LcdBus=dat; //送数据
LED1602_EN=1; //en=1
delayms(10);; //延时
LED1602_EN=0; //en=0
}
void ChkBusy()
{
LED1602_RS=0; //RS=0
LED1602_RW=1; //RW=1
LED1602_EN=1; //EN=1
while(LcdBus&0x80); //送数据
LED1602_EN=0; //en=0
}
74hc595驱动问题
#define uc unsigned char
#define ui unsigned int
#include<iom128v.h>
uc Bmp[]=
{
/*------------------------------------------------------------------------------ ; 源文件/ 文字:
; 宽×高(像素): 64×8
; 字模格式/大小: 单色点阵液晶字模,横向取模,字节正序/64字节
; 数据转换日期: 2009-4-7 11:11:41
------------------------------------------------------------------------------*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10, 0x10,0x10,
0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04, 0x04,0x04,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01
};
uc B1[8]={0};
uc B2[8]={0};
void delay(ui n) //延时函数
{
ui j;
ui i;
for(i=0;i<n;i++)
for(j=0;j<20;j++);
}
void H_B1(uc h) //十六进制转换为二进制,转换后放在数组B1中
{
B1[7]=h&0x01;
B1[6]=h&0x02;
B1[5]=h&0x04;
B1[4]=h&0x08;
B1[3]=h&0x10;
B1[2]=h&0x20;
B1[1]=h&0x40;
B1[0]=h&0x80;
}
void H_B2(uc h) //十六进制转换为二进制,转换后放在数组B2中
{
B2[0]=h&0x01;
B2[1]=h&0x02;
B2[2]=h&0x04;
B2[3]=h&0x08;
B2[4]=h&0x10;
B2[5]=h&0x20;
B2[6]=h&0x40;
B2[7]=h&0x80;
}
void print(void) //扫描函数
{
uc byte=0;
uc j=0;
uc row=7; //扫第一行
uc column;
uc bit=0;
uc h=0;
PORTD=row; //行数赋给PD
H_B1(Bmp[0]);
while(1)
{
for(row=7;row!=0xff;row--)
{
PORTD=row; //行数赋给PD
PORTF=0X00; //给一个扫描点
PORTC=0xff;
PORTC=0x00;
PORTF=0XFF;
for(byte=0;byte<8;byte++)
{
H_B1(Bmp[byte+j]);
for(bit=0;bit<8;bit++)
{
//delay(2000);
PORTC=0xff; //时钟上升沿
//delay(1000);
if(B1[bit]==0) PORTE=0Xff;//如果该点不应亮则74_138输出高阻
else {PORTE=0X00; delay(40);}//否则输出低电平
PORTF=0XFF; //扫描点后面通通熄灭
//delay(2000);
PORTC=0x00; //时钟下降沿
}
PORTG=0Xff;//delay(2000);
PORTG=0X00;
//bit=0;
}
j+=8;
byte=0;
}
j=0;
}
}
void main(void)
{
DDRC=0XFF; //PC口为时钟输出
DDRD=0XFF; //PD为行选,连74_138的ABC输入端DDRF=0XFF; //PF为列选,扫描点,接74_595的DS端DDRE|=0X80; //PE7为输出,74_138使能控制,低电平有效
DDRG =0Xff;
PORTG=0X00;
PORTE=0XFF; delay(5000); PORTE=0X00; //开机信号
//PORTE=0X00;
print();
}
这是我刚写的一个64*8的点阵扫描程序用74HC595做行选,但是没用锁存,可以显示,但亮度很低。
一直在找595的中文资料,不知到怎么用输出锁存。
有的话希望能分享一下
74HC595驱动数码管问题
浏览次数:634次悬赏分:20|解决时间:2010-6-6 15:49 |提问者:futureyuanjian|检举
用74HC595驱动数码管显示有问题,亮度不均匀而且亮度比较低,请教高手啊!以下是程序:
#include "STC12C5410AD.h"
#include"math.h"
#include"intrins.h"
sbit DAT = P1^3 ;
sbit SCLK = P1^4 ;
sbit SRCLK = P1^5 ;
unsigned long xdata Range;
unsigned long xdata AD_data;
unsigned long xdata Dis5_data,Dis3_data;
unsigned char xdata WW,QW,BW,SW,GW; //五位数码管的每一位unsigned char xdata BW_3,SW_3,GW_3; // 三位数码管的每一位
unsigned char xdata Led[10] =
{ 0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6 };
unsigned char xdata Wei[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; void In_595(unsigned char Shu)
{
unsigned char n;
for(n = 0; n < 8; n++) //循环8次,刚好移完8位
{
DAT = Shu & 0x01; //取数据的最低位
Shu >>= 1; //将数据的次低位移到最低位
SRCLK = 0; //先将移位寄存器控制引脚置为低
_nop_();
SRCLK = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
_nop_();
}
}
void Out_595(void)
{
SCLK = 0; //先将存储寄存器引脚置为低
_nop_();
SCLK = 1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
}
void Display(void)
{
In_595(Led[WW]);
In_595(Wei[0]);
Out_595();
In_595(Led[QW]);
In_595(Wei[1]);
Out_595();
In_595(Led[BW]);
In_595(Wei[2]);
Out_595();
In_595(Led[SW]);
In_595(Wei[3]);
Out_595();
In_595(Led[GW]);
In_595(Wei[4]);
Out_595();
In_595(Led[BW_3]);
In_595(Wei[5]);
Out_595();
In_595(Led[SW_3]);
In_595(Wei[6]);
Out_595();
In_595(Led[GW_3]);
In_595(Wei[7]);
Out_595();
}
unsigned long Hex_B(void)
{
unsigned long B_data;
B_data=((AD_data>>9)&0x001)*512+((AD_data>>8)&0x001)*256+((AD_data >>7)&0x001)*128+((AD_data>>6)&0x001)*64+((AD_data>>5)&0x001)*32
+((AD_data>>4)&0x001)*16+((AD_data>>3)&0x001)*8+((AD_data>>2)&0x00 1)*4+((AD_data>>1)&0x001)*2+(AD_data&0x001);
return(B_data);
}
main ()
{
unsigned char a;
while(1)
{
Range=1000; //最大量程目前(0520)为7000kg
AD_data = 0x0ff;
D_data = Hex_B();
Dis5_data = 0.009765625*Range*D_data+0.5;
a = Dis5_data/10000;
WW = 1+a;
QW = 1+a;
BW = 1+a;
SW = 1+a;
GW = 1+a;
BW_3 = 1+a;
SW_3 = 1+a;
GW_3 = 1+a;
Display();
}
}
问题补充:
如果直接给WW,QW,BW,SW,GW, BW_3,SW_3,GW_3赋常数值,没有问题,亮度也很好,但是给他们赋变量值就出现问题!!
错误!未找到引用源。
错误!未找到引用源。
错误!未找到引用源。
错误!未找到引用源。
错误!未找到引用源。
错误!未找到引用源。
错误!未找到引用源。
最佳答案
看了你的程序,你用什么单片机?51的话速度很慢!!你又用xdata,而且有如此大的浮点Dis5_data = 0.009765625*Range*D_data+0.5;!!又有乘法!速度会很慢!直接付值根本没有经过上述过程,所以速度很快,扫描的速度就快,Display(); 函数执行的次数就多!所以亮度应该比较好!你可以在Display(); 加上for()循环,数码管多循环几次!!!这样就够亮了,不亮的原因是每个数码管亮的时间太短。
我的看法是这样的。