标题:
基于mega16单片机1602LCD显示程序,定时亮灯装置
[打印本页]
作者:
malidong2022
时间:
2022-10-24 19:48
标题:
基于mega16单片机1602LCD显示程序,定时亮灯装置
电路图.JPG
(42.22 KB, 下载次数: 103)
下载附件
2022-10-24 19:47 上传
自制定时亮灯装置。单片机程序如下。
// Target : M16
// Crystal: 12.000Mhz
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 1000000
//12000000
//8000000
#pragma interrupt_handler uart_rx:12
#define key_port PORTD
#define key_port_ddr DDRD
#define key_port_pin PIND
uchar WENZI1[]="JIESHOUDAOD: ...."; //WENZI1
uchar WENZI2[]="receiving ... ..."; //WENZI2
uint FASONGSHUZU[10]; //SHUJU1
uint x=9;
uchar temn,count;
uchar temtab;
long int i,w,e;
long int jd,k,sz;
int g,s;
uchar rdata,flag=0;//baocun jieshoudao d shuju
void delay (uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for (j=0;j<1141;j++);
}
}
void DelaymS (uint i)
{
uint j;
for(;i!=0;i--)
{
for (j=20;j!=0;j--);
}
}
void uart_init(uint baud)
{
PORTA = 0x00;
DDRA = 0x01;
UCSRB=0X00;
UCSRA=0X00;//
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);//选择UCSRC,异步模式,禁止校验,1位停止位,8为数据位。
baud=mclk/16/baud-1;
UBRRL=baud;
UBRRH=baud>>8;
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);//接收、发送使能,接收中断使能。
SREG=BIT(7);
DDRD = 0x3F;//portd6输入,其他输出,显示程序//pd7shuru
DDRB = 0XFF; //输出,显示程序
//DDRD|=0X02;//配置pd1,TXD为输出,通信
DDRC = 0xFF;//配置C为输出,通信
}
void uart_rx()
{
UCSRB&=~BIT(RXCIE);//jieshou zhongduan guanbi ,
rdata=UDR;
flag=1;
UCSRB|=BIT(RXCIE);//DAKAI JIESHOU ZHOGNDUAN HANSHU
}
void uart_sendB(uchar data)
{
while(!(UCSRA&(BIT(UDRE))));//di5wei=1;DENGDAI JICUNQI WEIKONG
UDR=data;
while(!UCSRA&(BIT(TXC)));//fasong jieshu
UCSRA|=BIT(TXC);
}
void write_com(uchar com)
{
PORTD &= ~BIT(4);
PORTD &= ~BIT(5); //KONGZHIKOU,PD4,5,3 为RS,R/W,EA。数据位为PB口
PORTB = com; //SHUJUKOU
PORTD |= BIT(3); //
delay(1);
PORTD &= ~BIT(3); //
}
void write_data(uchar data)
{
PORTD |= BIT(4);
PORTD &= ~BIT(5);
PORTB = data;
PORTD |= BIT(3); //
delay(1);
PORTD &= ~BIT(3);//
}
void shujuchuli(long int count)
{
uint i,j1,j2,j3,j4,j5,j6;
count=count%100000;
j1=count/100000;
j2=count/10000;count=count%10000; //小数点后第一位 + '0'
j3=count/1000;count=count%1000; //小数点后第一位 + '0'
j4=count/100;count=count%100;
j5=count/10;count=count%10;
j6=count;
FASONGSHUZU[0]=j1+0x30;
FASONGSHUZU[1]=j2+0x30;
FASONGSHUZU[2]=j3+0x30;
FASONGSHUZU[3]=j4+0x30;
FASONGSHUZU[4]=j5+0x30;
FASONGSHUZU[5]=j6+0x30;
}
void xianshi1(uchar tab)
{
uint i;
write_com(0X38);
delay(5);
write_com(0X01);
delay(5);
write_com(0X0C);
delay(5);
write_com(0X06);
delay(5);
write_com(0X80+0);
delay(5);
for(i=0;i<16;i++)
{
write_data(WENZI1[i]);
delay(5);
}
}
void DISSHUJU(uint num)
{
uint i;
write_com(0X80+0X40);
delay(5);
for(i=0;i<6;i++)
{
write_data(FASONGSHUZU[i]);
delay(5);
}
}
void xianshi2(uchar tab)
{
uint i;
write_com(0X38);
delay(5);
write_com(0X01);
delay(5);
write_com(0X0C);
delay(5);
write_com(0X06);
delay(5);
write_com(0X80+0);
delay(5);
for(i=0;i<16;i++)
{
write_data(WENZI2[i]);
delay(5);
}
}
void YANSHIMIN(uint i)
{
uint j;
for(;i!=0;i--)
{
for (j=60;j!=0;j--)
{
DelaymS (5000);
DelaymS (5000);
}
}
}
//************************main***********************
void main (void) //程序主函数
{
uint k,i=8;
uint j=20;
unsigned char tem;
uart_init(1200);//初始化端口。同时打开串口。可接收串口数据。
//uart_sendB(i);
//delay(10);
//uart_sendB(j);
//delay(10);
DelaymS (5000);
PORTA=0X00;//DENGMIE
DelaymS (5000);
PORTA=0XFF;//DENGMIE
//以下,接收按键调整延时时间
PORTD=PORTD|0X80;//ZHI 1,pd7
for(j;j!=0;j--)
{
tem=key_port_pin&0x80;
if( tem==0x00)
i=i++;
DelaymS (5000);
}
//以下,显示,延时
xianshi1(WENZI1[i]);
for(i;i!=0;i--)
{
PORTA=0XFF;//DENGMIE
xianshi2(WENZI2[i]);
shujuchuli(i);
xianshi1(WENZI1[i]);
DISSHUJU(FASONGSHUZU[i]);
DelaymS (5000);
YANSHIMIN(60);
}
PORTA=0X00;//
DelaymS (5000);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1