用51单片机4位数码管显示"H38C”,"L25C",C语言程序分别怎么写?P1口是段码输出口,P2.7-P2.4口是扫描口。

作者&投稿:双欣 (若有异议请与网页底部的电邮联系)
AT89c51单片机实现4*4拨号输入,并用6位数码管显示,从右往左依次显示,求大神c语言指教,如~

/
#include
#include
#define uchar unsigned char
#define uint unsigned int
/************* 12864LCD引脚定义 *************/
#define LCD_data P0 //数据口
sbit LCD_RS = P2^6; //寄存器选择输入
sbit LCD_RW = P2^5; //液晶读/写控制
sbit LCD_EN = P2^7; //液晶使能控制
sbit LCD_PSB = P3^2; //串/并方式控制
sbit LCD_RST = P3^7; //液晶复位端口
#define NOP(); {_nop_();_nop_();_nop_();_nop_();};
/*********************************************************/
uchar xdata DIS1[] ={"机组及装架号 "};
uchar xdata DIS2[] ={"输入及存储成功 "};
uchar a;
uchar asc2[]={"123A456B789C*0#D"};//asc2码4*4键盘显示专用
uchar keydat[6]=0;
uchar keycache;
uchar keycache1;
/* 延时函数 */
void delay(int ms)
{unsigned int i;
while( ms-- != 0)
{
for(i = 0; i < 600; i++);
}
}
/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
bit lcd_busy()
{ bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
NOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
NOP();
LCD_EN = 1;
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/*******************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
NOP();
LCD_EN = 1;
NOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式

LCD_RST = 0; //液晶复位
delay(3);
LCD_RST = 1;
delay(3);
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //显示开,关光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*********************************************************/
/* */
/* 设定显示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //显示地址
}
/*********************************************************
* *
* 清屏函数 *
* *
*********************************************************/
void clr_screen()
{
lcd_wcmd(0x34); //扩充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x01); //清屏
delay(5);
}
/**************************************************************
* 名称:KeyRvs()
* 功能:P2外接4×4按键, 按照反转法读出键值
* 输出:按键值0~15/如无键按下, 返回16
***************************************************************/
uchar KeyRvs(void)
{
uchar temH, temL, key;
P1 = 0xf0; //低四位先输出0
temH = P1;//读入,高四位含有按键信息
P1 = 0x0f; //然后反转输出0
temL = P1;//读入,低四位含有按键信息
switch(temH)
{
case 0xe0: key = 0; break;
case 0xd0: key = 1; break;
case 0xb0: key = 2; break;
case 0x70: key = 3; break;
default: return 16;//按下的不是上述按键,就当是没有按键
}
switch(temL) {
case 0x0e: return key;
case 0x0d: return key + 4;
case 0x0b: return key + 8;
case 0x07: return key + 12;
default: return 16;//按下的不是上述按键,就当是没有按键
}
}
/***************************************************************************************
函数名:UART串口初始化函数
调 用:UART_init();
结 果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备 注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
//EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
//ES = 1; //允许UART串口的中断
TMOD = 0x20; //定时器T/C1工作方式2
SCON = 0x40; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
TH1 = 0xF3; //定时器初值高8位设置
TL1 = 0xF3; //定时器初值低8位设置
PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400)
TR1 = 1; //定时器启动
}
/***************************************************************************************
函数名:UART串口发送函数
调 用:UART_T (?);
参 数:需要UART串口发送的数据(8位/1字节)
结 果:将参数中的数据发送给UART串口,确认发送完成后退出
/**********************************************************************************************/
void UART_T (unsigned char UART_data){ //定义串口发送数据变量
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
uchar i;
/*********************************************************
*
* 主函数 好难!!!!!!!!基本功能实现
功能1键盘输入6个值,显示在12864上
功能2 *键修改
* 功能3 #键串口输出对应6个asc2码 并退出
*********************************************************/
void main()
{
delay(100); //上电,等待稳定
lcd_init(); //初始化LCD
UART_init ();
a=0;
lcd_pos(1,1); //设置显示位置为第一行
for(i=0;i<16;i++)
{
lcd_wdat(DIS1[i]);
while(lcd_busy());
}
while(1)
{
uchar kkey;
do{keycache=KeyRvs(); }
while(keycache==16);
delay(20);
do{keycache1=KeyRvs(); }
while(keycache1==16);
if(keycache1==keycache){kkey=keycache1;}
do{keycache=KeyRvs();}
while(keycache!=16);
if(a<=5&&(kkey!=14&&kkey!=12))
{ keydat[a]=keycache1;
lcd_pos(2,(a+1));
while(lcd_busy());
lcd_wdat(asc2[keydat[a]]);
a++;
}
if(a>=1&&kkey==12)
{ lcd_pos(2,a);
while(lcd_busy());
lcd_wdat(asc2[0x20]);
keydat[a]=0;
a--;
continue;
}
if(a>5&&kkey==14)
{
UART_T (asc2[keydat[0]]);
UART_T (asc2[keydat[1]]);
UART_T (asc2[keydat[2]]);
UART_T (asc2[keydat[3]]);
UART_T (asc2[keydat[4]]);
UART_T (asc2[keydat[5]]);
lcd_pos(2,0);
for(i=0;i<16;i++)
{
lcd_wdat(DIS2[i]);
while(lcd_busy());
}
delay(1000);
break;
}
}

}

参考:

http://hi.baidu.com/do_sermon/item/8176362f549ffd896f2cc32a

#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
typedef unsigned int uint;
//共阳数码管
uchar code table[] = { 0x89,0xb0,0x80,0xc6, //H38C的编码
0xc7,0xa4,0x92,0xc6}; //L25C的编码
//延时函数
void delay(uchar t)
{
uchar i;
while(t--)
{
for(i = 0;i = 50;i++);
}
}

void main()
{
uchar i,j,m,n,a;
P1 = 0xff;
P2 = 0xff;
while(1)
{
for(m = 0;m<10;m++)//显示10次h38c
{
P2 = 0x10;
for(i = 0;i<3;i++)//依次显示h38c 通过控制时间 是他们同时被显示在数码管上
{
P1 = table[i];
delay(2);
P2= _crol_(P2,1);

}
}

for(n = 0;n<10;n++)//显示10次L25C
{
P2 = 0x10;
for(j = 0;j<3;j++)//依次显示L25C 通过控制时间 是他们同时被显示在数码管上
{
P1 = table[j+4];
delay(2);
P2 = _crol_(P2,1);
}
}
}
}

共阴还共阳,高电平选通还是低电平?


运用51单片机实现4位8段LED数码管的动态数字显示,写出C语言程序_百度...
include<reg52.h> define uchar unsigned char define uint unsigned int uchar count;uint disnum;sbit dula=P2^6;sbit wela=P2^7;uchar code tabledu[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};display(uchar,uchar,uchar);delay(...

51单片机怎样用8个IO口控制4位数码管
每个数码管都要用8个信号来控制,你要控制4位数码管就还需要4个片选,所以你可以用一个8位的移位寄存器,可以用74HC164,8位串行输入,2转8;或者用3转8译码器,74LS138;

51单片机4个数码管显示程序
include<reg52.h> \/\/52系列单片机头文件 define uchar unsigned char \/\/宏定义 define uint unsigned int sbit dula=P2^6; \/\/申明u1锁存器的锁存端 sbit wela=P2^7; \/\/ u2 uchar num1,num2;uchar code table[]={ \/\/数组定义 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,...

51单片机 4位数码管可调的定时器C程序编写,请帮忙给个编程思路或相关程...
include<reg51.h> define uchar unsigned char uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};\/\/0-9 unsigned char sec=0,min=0,hour=12,scanled;unsigned char key,flashbit,dot,time,times=0;tflash;unsigned char disdat[4];sbit keyqt=P3^0;sbit...

51单片机4位数码管电子时钟,为什么分和时不会跳动?
循环执行这个显示程序,应该可以看到有4个数在显示;没看到你的循环过程代码;

51单片机4位数码管的最下面一段不亮,重复焊接、反复摸背后的引脚都不亮...
这是一般4位数码管的引脚图,你说的应该是d段不亮,可以在输出显示时,测下d引脚和其在电路板上焊点电压,引脚正确就是内部问题,如果引脚不正确,就是焊接问题

51单片机内部eeprom存储4位数码管数据
void write_51eeprom_1byte(uint eeprom_addr,uchar w_data)调用写入一个数据 write_51eeprom_1byte(0x1000,0xaa);要写4个数据 调用4次不就可以了。

...为什么不能点亮。求高手解答。C51单片机 C语言
更重要的问题出在主程序,主程序没有while(1)语句,肯定是错误的。主程序问题太多了,自己看吧。还有那两个计数i和b,计数到9999的要用整型的,才能计到9999,而你有char型的,最大才是255。再看一下你的仿真图中的数码管,确定是共阳的吗。看下图中的4位一体的数码管元件的名称是什么,与你用...

51单片机4位数码管逐个递增程序,第一位0-9加,然后归0,第二位开始从0...
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};\/\/数码管代码表 void display(qian_c,bai_c,shi_c,ge_c)\/\/4位显示程序 { P0=table[qian_c]; \/\/显示千位 P0是数据输出口 dula=1;dula=0;P0=0xfb;wela=1;wela=0;delay(2);P0=table[bai_c]; \/\/显示百位 dula=1...

运用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=(...

官渡区18032877928: 运用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=(...

官渡区18032877928: 51单片机控制4位一体的数码管显示的驱动问题!急急急!!! -
阚京富尔: 共阳极数码管的点亮,应该是断码送低电平而数位送高电平点亮,正常驱动时4个数位端应该加三极管分别驱动,4个7段(或8段)并联后直接接入一个P口即可,如果P口需要上拉时应加入10K的排阻.

官渡区18032877928: 51单片机四位数码管可切换显示程序 -
阚京富尔: 其实只写一个显示函数就行,不用a,b两个函数. 比较容易理解的方法是显示函数带四个形参.这样,调用时,带四个参数就行了. 再定义一个变量,用来控制带哪组参数,用if 语句判断,变量=1,调显示程序时带第一组参数.变量=2,带第二组参数. 下面是按键处理,按第一个键,变量赋1,按第二个键,变量斌2.

官渡区18032877928: 怎样用51单片机P3.3口外部电平变化做一个4位数码管显示的计数器?要求用C语言编写 -
阚京富尔: /*p0口接段选,p1口接位选*/#include"reg51.h"#define uchar unsigned char#define uint unsigned int uchar qian,bai,shi,ge; uint num=0; uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管的编码 void ISR(void)//中断...

官渡区18032877928: 51单片机(四位数码管的显示)程序基于单片机V1或V2实验系统,
阚京富尔: 下面这个程序是4x4距阵键盘,LED数码管显示,一共可以到0-F显示,你可以稍微改一下就可以实现你的功能了,如还有问题请发信息,希望能帮上你!#includeunsigned ...

官渡区18032877928: 51单片机问题 编写4个LED数码管循环显示2008的程序. 用C语言写.. -
阚京富尔: #include<reg51.h> //----------------------------------------------- void delay(unsigned int i) //延时 {unsigned char j;while(i--) for(j = 0; j < 115; j++); } //----------------------------------------------- void main(void) {unsigned char n1;unsigned char code SEG[] = {0xc0, ...

官渡区18032877928: AT89C51单片机怎么用汇编语言让4个数码管同时显示1234? -
阚京富尔: 1、首先我们先打开keil. 2、接着,我们要定义好库函数,void main(){while(1)//不断循环显示{dispaly();}}void dispaly(){P0=smg[1];//选择显示数字几,P1=0x7f;//控制是否点亮数码管. 3、接着,我们加上一条循环语句.delay(5);//显示5...

官渡区18032877928: at89c51单片机实现LED数码管显示四位数,两个开关进行加和减.求硬件搭建图和C语言程序. -
阚京富尔: 这个设计其实是很基础的一个小系统:最小系统、按键电路、LED驱动电路基本就可以满足你的要求了;如果打算每个数码管可调节,那么再加一个按键切换或者说移位;如果不想加按键数目,那么可以采用按键复用:长按,短按完成.

官渡区18032877928: 用单片机89C51实现数码管的显示,要求0 - F任意按下一个键,用4个数码管显示它的二进制值,并滚动显示 -
阚京富尔: 这个很容易,我不给你程序,给你 个建议吧,设置是十六个键,设一个变量'i'每个键按下要存储'i'值,分别为0000,0001......1111.按下k1之后判断前面所存储的值是多少然后给显示出来 显示数码应该会的吧,用动态扫描数码管,四个就可以了,k2更好办,按k2之后执行将i值清零.这个是入门,入门之后你就会喜欢编程了

官渡区18032877928: 基于51单片机数码管动态显示程序 -
阚京富尔: P2.7-P2.4为选择数码管,P1口接数码管8个笔画#include<xxxxx.H> //你所用单片机的型号 main() { while(1) { P2 = 0x1F; P1 = SEG_TAB[a/1000]; //送A的最高位代码,求段码后送显//示,要求A值不要大于4位数 delay_ms(2); //延时2ms,延时函...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网