利用AT89C51单片机结合字符型LCD显示器设计一个简易的倒数计数器

作者&投稿:嵇姬 (若有异议请与网页底部的电邮联系)
用汇编语言编程。。。。 设计:带有LCD显示的音乐倒数计数器~

用汇编来实现复杂功能,
确实考验功力。

汇编很麻烦的 几乎在实际生产与研发过程中很少用了 看来你只能局限在学校里面找了

参考:ks1208+12864lcd屏幕控制电机,#include<avr/io.h>
#include<avr/delay.h>
#include<string.h>
#define INT8U unsigned char#define lcd_starthang 0b11000000 // 起始行
#define lcd_ye 0XB8 // 页指令
#define lcd_lie 0X40 // 列指令
#define RW PD0
#define DI PD1
#define E PD2
#define CS1 PD3
#define CS2 PD4
#define RST PD5#define lcd_port PORTC //液晶排线
#define lcd_ctrl PORTD //控制端口
#define lcd_ddr DDRC //输入输出
#define lcd_pin PINC //控制状态的数据
#define RW1() lcd_ctrl |=_BV(RW);
#define RW0() lcd_ctrl &=~_BV(RW);//数据总线#define DI1() lcd_ctrl |=_BV(DI);
#define DI0() lcd_ctrl &=~_BV(DI);#define CS11() lcd_ctrl |=_BV(CS1);
#define CS10() lcd_ctrl &=~_BV(CS1);//片选信号
#define CS21() lcd_ctrl |=_BV(CS2);
#define CS20() lcd_ctrl &=~_BV(CS2);#define E1() lcd_ctrl |=_BV(E);
#define E0() lcd_ctrl &=~_BV(E);//使能#define RST1() lcd_ctrl |=_BV(RST);
#define RST0() lcd_ctrl &=~_BV(RST);/复位char fxshow=0;
void wait_lcd_ready()
{ check_busy:
lcd_ddr =0X00;
lcd_port=0Xff;
RW1();asm ("nop"); DI0();
E1(); asm ("nop"); E0();
if (lcd_pin & 0x80) goto check_busy;

}
//lcd控制指令函数
void write_lcd_command(INT8U ABC)
{wait_lcd_ready();<br> lcd_ddr =0XFF; <br> lcd_port=0XFF;<br> RW0();asm ("nop");DI0();<br> lcd_port=ABC;<br> E1();asm ("nop");E0();<br>} void writedata(INT8U dat)
{ wait_lcd_ready();
lcd_ddr =0XFF;
lcd_port=0XFF;
RW0();asm ("nop");DI1();

if(!fxshow) lcd_port=dat;else lcd_port=~dat;
E1();asm ("nop");E0();
}
//-----------------------------------------------------初始化
void lcd_chushihua(){ write_lcd_command(0x3f);_delay_ms(15);}//void lcd_show(INT8U y,INT8U l,INT8U j,INT8U *r)//几页 y 、几列 l、几个字符 j、
{INT8U i;<br> if(l<64)<br> {CS11();CS20(); <br> write_lcd_command(lcd_ye+y);<br> write_lcd_command(lcd_lie+l);</p><p> if(l+j<64)<br> {<br> for (i=0;i<j;i++) writedata(r[i]);<br> }
else
{for (i=0;i<64-l;i++)writedata(r[i]);//zuo半瓶显示<br> CS10();CS21();<br> write_lcd_command(lcd_ye+y);<br> write_lcd_command(lcd_lie);<br> for (i=64-l;i<j;i++) writedata(r[i]);//有半瓶显示<br> <br> }
}

else{ CS10();CS21();
write_lcd_command(lcd_ye+y);
write_lcd_command(lcd_lie+l-64);
for (i=0;i<j;i++) writedata(r[i]);
}
}
void qingping()
{ INT8U i,j;
CS11();CS21();
write_lcd_command(lcd_ye);
write_lcd_command(lcd_lie);
for (i=0;i<8;i++)
{ write_lcd_command(lcd_ye+i);
for(j=0;j<128;j++)
{write_lcd_command(lcd_lie+j);<br> writedata(0x00);}
}
}
//-----------------------------8*16void display816(INT8U y,INT8U l,INT8U *r){ lcd_show(y, l,8, r );//几页 y 、几列 l、几个字符 j、
lcd_show(y+1,l,8,r+8 );} //--------------------------------一串8*16void display8161(INT8U y,INT8U l,INT8U D,INT8U *r){INT8U i;<br> for(i=0;i<D;i++)<br> { display816(y,l+i*8,r+16*i);}}//------------------------------8*16void display1616(INT8U y,INT8U l,INT8U *r){ lcd_show(y, l,16, r );//几页 y 、几列 l、几个字符 j、
lcd_show(y+1,l,16,r+16);
}void display16161(INT8U y,INT8U l,INT8U D,INT8U *r){INT8U i;<br> for(i=0;i<D;i++)<br> { display1616(y,l+i*16,r+32*i);}
}
//----------------------------------------------------
void guang(INT8U i,INT8U j)
{
CS11();CS21();
write_lcd_command(lcd_ye);
write_lcd_command(lcd_lie);
write_lcd_command(i);
write_lcd_command(j);
writedata(0x00);
}//------------------------------------------------
//---------------------------------------------------
//----------------------------------------------------
#include<avr/io.h>
#include<avr/delay.h>
#include<string.h>
#include<avr/interrupt.h>
#define INT8U unsigned char
#define INT16U unsigned int
//-------------------------------------按键定义
#define k1() ((PINA & (1<<PA0))==0x00)
#define k2() ((PINA & (1<<PA1))==0x00)
#define k3() ((PINA & (1<<PA2))==0x00)
#define k4() ((PINA & (1<<PA3))==0x00)
#define k5() ((PINA & (1<<PA4))==0x00)
#define k6() ((PINA & (1<<PA5))==0x00)
#define k7() ((PINA & (1<<PA6))==0x00)
#define k8() ((PINA & (1<<PA7))==0x00)
//-----------------------------------------------------
#define RST PB2
#define SLCK PB1
#define IO PB0 #define DDR_ DDRB
#define PORT_ PORTB
#define io() (PINB & (1<<IO))
#define DDR_1() DDR_|=(1<<IO)
#define DDR_0() DDR_&= ~(1<<IO)
#define SLCK1() PORT_ |=(1<<SLCK)
#define SLCK0() PORT_ &=~(1<<SLCK)#define IO1() PORT_ |=(1<<IO)
#define IO0() PORT_ &=~(1<<IO)
#define RST1() PORT_ |=(1<<RST)
#define RST0() PORT_ &=~(1<<RST)
INT8U time[];//----------------------------------------------------------------------
//-------------------------------------------------------------------
//-------------------------------------------------------------------
const INT8U timeword[]=
};
const INT8U number[]={
/};
const INT8U number1[]={
//--------------------------写入dat
void write(char dat)
{ DDR_1();
char i;
for (i=0;i<8;i++)
{
if(dat & 0x01) IO1();else IO0() ;
dat=dat>>1;
SLCK0();
SLCK1();
}
}
//--------------------------------------------------------
//----------------------------输出dat
char read11()
{ char dat=0x00;
DDR_0();
char i;
for (i=0;i<8;i++)
{SLCK1(); <br> SLCK0();<br> if(io()) dat |=(1<<i);<br> }
return dat/16*10+dat%16;//--------转换为十进制
}//--------------------------------------------读取指定地址adress中的dat--------
char readadress(INT8U adress)
{ INT8U dat;
RST1();
write(adress);
dat=read11();
RST0();
return dat;
}
//-----------------------------------------------------------
//------------------------------------------在指定地址adress写入dat-----------
void wadress(char adress ,char dat)
{ RST1();
write(adress) ;

write(dat);
RST0();
}//------------------------------------------------读取时间
//-------------------------------------------------
void readtime()
{

INT8U i ,adress=0x81;
for (i=0;i<7;i++)
{
time[i]=readadress(adress);
adress += 2;}
}
//------------------------------------------------设置时间
//-----------------------------------------------------
void set()
{
INT8U i;
wadress(0x8E ,0x00);
for (i=0;i<3;i++)
{
wadress(0X80+2*i ,(time[i]/10<<4 )| (time[i]%10));
} wadress(0x8E ,0x80);
}
//--------------------------------------------四相步进八拍方式
//-------------正转励磁序列为A->AB->B->BC->C->CD->D->DA
const INT8U zheng[]={0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x09};//------------------反转励磁序列为A->AD->D->CD->C->BC->B->AB
//--------------------------------------
const INT8U fan[]={0x01,0x09,0x08,0x0C,0x04,0x06,0x02,0x03};
//-----------------------------------------------------------------
// 步进电机正转或反转n圈
//-----------------------------------------------------------------
void STEP_MOTOR_RUN(INT8U Direction,INT8U n)
{
INT8U i,j;
for (i=0;i<n;i++)
{
for(j=0;j<8;j++)
{
if(k3()) return;
if(Direction==0) PORTB=zheng[j];
if(Direction==1) PORTB= fan[j];
_delay_ms(200);
}
PORTB=0x01;

}
}
//--------------------------------------------
extern void lcd_chushihua(); //定义在别的文件中
extern void qingping();
extern void display16161(INT8U y,INT8U l,INT8U C,INT8U *m);
extern void display8161(INT8U y,INT8U l,INT8U D,INT8U *r);
extern void display1616(INT8U y,INT8U l,INT8U *r);
extern void display816(INT8U y,INT8U l,INT8U *r);
//-----------------------------------------------------------------------void reshtime()
{ INT8U s,h,m,d,m1,w,y;
s=time[0]; m=time[1]; h=time[2];d=time[3];m1=time[4];w=time[5];y=time[6];
display816(1,1,(INT8U*) (number+h/10*16)); //------时
display816(1,9,(INT8U*) (number+h%10*16)); //
display816(1,17,(INT8U*) (number+m/10*16)); //------分
display816(1,25,(INT8U*) (number+m%10*16)); //
display816(1,33,(INT8U*) (number+s/10*16)); //------秒
display816(1,41,(INT8U*) (number+s%10*16)); //

display816(3,17,(INT8U*) (number+d/10*16)); //------日
display816(3,25,(INT8U*) (number+d%10*16)); //
display816(3,1,(INT8U*) (number+m1/10*16)); //------月
display816(3,9,(INT8U*) (number+m1%10*16)); //
display816(3,33,(INT8U*) (number+y/10*16)); //------年
display816(3,41,(INT8U*) (number+y%10*16)); //
display816(3,49,(INT8U*) (number+2*16)); //------20
display816(3,57,(INT8U*) (number)); //------20
display816(5,1,(INT8U*) (number+w*16)); //------周

}int main(){INT8U r=5,i=0,j=0,k=0;</p><p><br> DDRA=0X00;PORTA=0XFF;<br> DDRB=0XFF;<br> DDRD=0XFF;PORTD=0XFF; <br> TCCR0=0x05;<br> TCNT0=256-1000000/1024*0.05;<br> <br> TIMSK =0x01;<br> sei();<br> //--------------------------------------------------------------<br> //----------------------------------固定年、月、日、时、分、秒、<br> //-----------------------------------------------------------------------<br> display1616(1,26,(INT8U*) timeword); //几页 y 、几列 l、几个字符 j、<br> display1616(1,58,(INT8U*) (timeword+32));<br> display1616(1,90,(INT8U*) (timeword+64));<br> display1616(4,26,(INT8U*) (timeword+96)); //几页 y 、几列 l、几个字符 j、<br> display1616(4,58,(INT8U*) (timeword+128));<br> display1616(4,90,(INT8U*) (timeword+160));<br> while(1)<br> { readtime();<br> <br> if(k1())<br> { <br> <br> while(k1());<br> j=(j+1)%7;<br> display816(1+i*3,42+j*8,(INT8U*) number1);<br> // while(k1());STEP_MOTOR_RUN(0,r);//STEP_MOTOR_RUN(INT8U Direction,INT8U n)<br> <br> }
if(k2())
{while(k2());<br> display816((1+i*3),(26+j*32),(INT8U*) (number+k*16));<br> k=(k+1)%10;<br> //;STEP_MOTOR_RUN(1,r);<br> } if (k3())
{
display816((1+i*3),(26+j*32),(INT8U*) (number+k*16));
j=(j+1)%10;
}
}} ISR(TIMER0_OVF_vect) {
TCNT0=256-1000000/1024*0.05;
reshtime();

}


用AT89C51单片机定时\/计数器0的定时功能可构成一简单的方波发生器,实现...
ORG 0000H ;复位启动 LJMP START ;ORG 000BH ;T0中断 LJMP T0INT ;ORG 0100H ;LJMP START ;YSJS EQU 30H ;;主控程序 START: MOV SP,#80H ;初始堆栈值 MOV TMOD,#01H ;定时器0工作于方式1 MOV TH0,#0ECH ;定时器0定时时间=5000uS MOV TL0,#78H ;SETB ET0 ;使能定时器0中断 SETB...

单片机at89c51 如何使之单口产生vdd 1\/2vdd 0的输出?
at89C51单片机的一个I\/O位,只能输出高\/低两种状态。若可以利用2个I\/O引脚,配合搭建外部电路是可以实现题目要求的功能的。但如果使用的是采购的成品单片机模块,追加外部扩展电路会要增加一起工作。如果是完全自己设计单片机电话,有一个简单可行的办法。现在一些厂家出产的51系列兼容单片机,在芯片内部中集...

AT89C51单片机比其他单片机的优点
AT89C51是Atmel公司生产的51系列单片机的早期版本,说到优点最突出的就是其认知普及率高,由于是N多年来教科书推荐的案例入门型单片机,提到51基本上就是指的这种单片机,由于普及率高其累积的各种资料也是在众多单片机中名列前茅且最易获得的。

AT89C51和LPC2148使用区别
选择使用at89c51单片机有如下优势:指令简单,易学易懂,外围电路简单,硬件设计方便,io口操作简单,无方向寄存器,资源丰富,一般设计足够用了,价格便宜、容易购买,资料丰富容易查到,程序烧写简单,这些优势对开发者非常方便,提高开发效率。

如何显示proteus中at89c51的接地和电源引脚?
1、点击下图中箭头所指的图标。2、在跳开的界面中需要点击“P”字按钮。3、可以看到界面中的数字,输入“AT89C51”就会出现各种51单片专机。4、接下来是一系列的数子,用鼠标双击。5、然后快捷小窗就会出现选好的单片机,选中放置到编辑区即可。单片机就显示接地和电源管脚。

用AT89C51单片机和温度传感器DS18B20S设计数字式温度计
用AT89C51单片机和温度传感器DS18B20S设计数字式温度计 15 温度显示采用4位LED数码管显示,三位整数,一位小数,具有键盘输入上下限功能,超过上下限温度时,进行声音报警,DS18B20为检测器件,进行单点温度检测,检测精度为+-0.5℃急求,今天... 温度显示采用4位LED数码管显示,三位整数,一位小数,具有键盘输入上下限功能,...

用AT89C51单片机实现直流电机PWM调速原理图
2.1 单闭环直流调速系统5 2.2 闭环系统静特性7 2.3 比例积分单闭环脉宽控制系统9 3 微机控制双闭环可逆直流PWM调速系统原理11 3.1 转速、电流双闭环调速系统及其静特性11 3.2 双闭环脉宽调速系统的动态性能13 3.3 电流调节器和转速调节器的设计16 3.4 可逆PWM变换器18 3.5 脉宽...

AT89C51单片机指令及其工作周期
AT89C51单片机指令系统完全和mcs-51一样,共111条,有 单周期指令,比如:MOV A,#01H 双周期指令,比如:SJMP 四周期指令,比如:DIV AB

at89c51单个按键控制四种流水灯切换
void time() interrupt 0 {delay(10);kc++;if(kc==4);kc=0;switch(kc){case 0:mm=0xff;break;case 1:mm=0xfe;break;case 2:mm=0xf7;break;case 3:mm=0xfc;break;default:break;} IE0 = 0; \/* 清除多余的中断标志 *\/ } ...

求比较清晰的AT89C51单片机引脚图和单个LED数码管相关图
上图为共阳数码管,共阴数码管就是将接地端连在一起。、此图为at89c52单片机引脚图,希望能帮到你!

土默特右旗15046436236: AT89c51单片机如何让液晶显示两个字符 -
勾空硝酸: 定义字符串,然后用for语句逐个输出显示

土默特右旗15046436236: 如何用at89c51单片机8*8矩阵·显示英文字母how are you? 程序 -
勾空硝酸: #include <avr/io.h> #include <avr/interrupt.h>#define uchar unsigned char #define uint unsigned int #define LED_ctrl PORTB //列开关 #define LED_code PORTD //行扫描代码uchar code[8];uchar str[]={0x00,0x90,0x90,0xF0,0x90,0x90,0x90,0x...

土默特右旗15046436236: 用汇编语言,利用AT89C51单片机结合8个发光二极管L0~L7,要求每间隔0.5秒 -
勾空硝酸: ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01HMOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0SETB ET0SETB EAMOV A,#0FEHMOV P1,AMOV R2,#24...

土默特右旗15046436236: 利用AT89C51单片机实现两个共阳数码管倒数计时99秒,求程序!!要求是C语言的 -
勾空硝酸: 这是正时,改动一下 #include unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00}; unsigned char second; unsigned char keycnt; unsigned int tcnt; void main(void) { unsigned...

土默特右旗15046436236: 如何使用单片机at89c51驱动4位8段数码管,如果用到芯片来驱动的,电路图如何连接? -
勾空硝酸: 看你将四位数码管接在单片机的哪一组输出口 例如51单片机一般都是四组八位输i/o口P0,P1,P2,P3口 一般P0口是三态i/o是要接上拉电阻的.其他接口是不用接上拉电阻的.上拉电阻一般选用1k~4k7都可以保证各管脚输出的电流小于500mA就可...

土默特右旗15046436236: 用AT89C51单片机编写一个C语言程序实现2个数码管秒计数器,用4个按键分别控制暂停、加一秒、减一秒和继续 -
勾空硝酸: #include<reg51.h>#define uchar unsigned char; uchar LED1,LED2; uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar num=0;sec,key; void delay(unsigned int a) { unsigned int i,j; for(i=0;i<a;i++) for(j=0;j<120;j++); } void ...

土默特右旗15046436236: 关于单片机AT89C51程序,利用两个数码管,利用按键控制实现“数字减一”显示99到00. -
勾空硝酸: #include "reg52.h" #include<intrins.h> #define uchar unsigned char uchar code LED_TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; unsigned int x=9999; void delay(unsigned int z) { unsigned int x,y; for(x=z;x>0;x--) for(y=110;y>...

土默特右旗15046436236: 基于at89c51单片机 led液晶动态显示 最好有图
勾空硝酸:#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include<intrins.h> sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=...

土默特右旗15046436236: 汇编语言,利用AT89C51单片机结合8个发光二极管L0~L7,要求每间隔0.5秒依次点亮一盏灯, -
勾空硝酸: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV R2,#3 MOV A,#0FEH LOOP: MOV P1,A LCALL DELAY RL A DJNZ R2,LOOP MOV P1,#0FFH SJMP $ DELAY: MOV R3,#10 DLY1: MOV R4,#100 DLY2: MOV R5,#250 DJNZ R5,$ DJNZ R4,DLY2 DJNZ R3,DLY1 RET END

土默特右旗15046436236: 基于at89c51数字温度计c语言程序 -
勾空硝酸: /名称:18B20温度传感器 日期:2009.5 修改:无 内容:18B20单线温度检测的应用样例程序,请将18b20插紧, 然后在...

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